/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * Copyright 2000, 2010 Oracle and/or its affiliates.
 *
 * OpenOffice.org - a multi-platform office productivity suite
 *
 * This file is part of OpenOffice.org.
 *
 * OpenOffice.org is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * OpenOffice.org is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details
 * (a copy is included in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with OpenOffice.org.  If not, see
 * <http://www.openoffice.org/license.html>
 * for a copy of the LGPLv3 License.
 *
 ************************************************************************/

#ifndef _RSCDB_HXX
#define _RSCDB_HXX

#include <rscall.h>
#include <rsckey.hxx>
#include <rscconst.hxx>
#include <rscflag.hxx>
#include <rscrange.hxx>
#include <rscstr.hxx>
#include <rscarray.hxx>
#include <rscdef.hxx>
#include <tools/string.hxx>

#include <vector>
#include <map>

class RscError;
class RscTupel;
class RscCont;
class RscCmdLine;

struct WriteRcContext
{
    FILE *              fOutput;
    rtl::OString        aOutputRc;
    rtl::OString        aOutputSysList;
    RscCmdLine*         pCmdLine;
};

/****************** R s c T y p C o n ************************************/
// Liste die alle Basistypen enthaelt
typedef ::std::vector< RscTop* > RscBaseList;

// Tabelle fuer Systemabhaengige Resourcen
struct RscSysEntry
{
    sal_uInt32      nKey;
    sal_uInt32      nRscTyp;
    rtl::OString    aFileName;
    sal_uInt32      nTyp;
    sal_uInt32      nRefId;
};

typedef ::std::vector< RscSysEntry* > RscSysList;

class RscTypCont
{
    CharSet             nSourceCharSet;
    sal_uInt32          nMachineId;         // Globaler Maschinentyp
    RSCBYTEORDER_TYPE   nByteOrder;         // Intel oder
    rtl::OString        aLanguage;          // output language
    std::vector< sal_uInt32 > aLangFallbacks;   // language fallback list (entry 0 is language itself)
    rtl::OString        aSearchPath;        // Suchen der Bitmap, Icon, Pointer
    rtl::OString        aSysSearchPath;     // aSearchPath plus language specific paths
    sal_uInt32          nUniqueId;          // eindeutiger Id fuer Systemresourcen
    sal_uLong           nFilePos;           // Position in der Datei ( MTF )
    sal_uInt32          nPMId;              // eindeutiger Id fuer PM-Rseourcefile
                                            // muss groesser als RSC_VERSIONCONTROL_ID sein
    RscTop  *           pRoot;              // Zeiger auf die Wurzel vom Typenbaum
    RSCINST             aVersion;           // Versionskontrollinstanz

    RscBaseList         aBaseLst;           // Liste der einfachen Resourceklasse
    RscSysList          aSysLst;            // Liste der Systemresourcen

    Atom                nWinBitVarId;       // Name der Winbitvariablen
    Atom                nBorderId;
    Atom                nHideId;
    Atom                nClipChildrenId;
    Atom                nSizeableId;
    Atom                nMoveableId;
    Atom                nMinimizeId;
    Atom                nMaximizeId;
    Atom                nCloseableId;
    Atom                nStdPopupId;
    Atom                nAppId;
    Atom                nTabstopId;
    Atom                nGroupId;
    Atom                nSysmodalId;
    Atom                nLeftId;
    Atom                nCenterId;
    Atom                nRightId;
    Atom                nTopId;
    Atom                nVCenterId;
    Atom                nBottomId;
    Atom                nHScrollId;
    Atom                nVScrollId;
    Atom                nSortId;
    Atom                nDefaultId;
    Atom                nSVLookId;
    Atom                nRepeatId;
    Atom                nDropDownId;
    Atom                nPassWordId;
    Atom                nReadOnlyId;
    Atom                nAutoSizeId;
    Atom                nSpinId;
    Atom                nTabControlId;
    Atom                nSimpleModeId;
    Atom                nDragId;
    Atom                nScrollId;
    Atom                nZoomableId;
    Atom                nHideWhenDeactivateId;
    Atom                nAutoHScrollId;
    Atom                nAutoVScrollId;
    Atom                nDDExtraWidthId;
    Atom                nWordBreakId;
    Atom                nLeftLabelId;
    Atom                nHasLinesId;
    Atom                nHasButtonsId;
    Atom                nRectStyleId;
    Atom                nLineSpacingId;
    Atom                nSmallStyleId;
    Atom                nEnableResizingId;
    Atom                nDockableId;
    Atom                nScaleId;
    Atom                nIgnoreTabId;
    Atom                nNoSplitDrawId;
    Atom                nTopImageId;
    Atom                nNoLabelId;
    Atom                nVertId;
    Atom                nSysWinId;

    void        Init();         // Initialisiert Klassen und Tabelle
    void        SETCONST( RscConst *, const char *, sal_uInt32 );
    void        SETCONST( RscConst *, Atom, sal_uInt32 );
    RscEnum *   InitLangType();
    RscEnum *   InitFieldUnitsType();
    RscEnum *   InitTimeFieldFormat();
    RscEnum *   InitColor();
    RscEnum *   InitMapUnit();
    RscEnum *   InitKey();
    RscEnum *   InitTriState();
    RscEnum *   InitMessButtons();
    RscEnum *   InitMessDefButton();
    RscTupel *  InitGeometry();
    RscArray *  InitLangGeometry( RscTupel * pGeo );
    RscArray *  InitSystemGeometry( RscTupel * pGeo );
    RscCont  *  InitStringList();
    RscArray *  InitLangStringList( RscCont * pStrLst );
    RscTupel *  InitStringTupel();
    RscTupel *  InitStringLongTupel();
    RscCont  *  InitStringTupelList( RscTupel * pStringTupel );
    RscCont  *  InitStringLongTupelList( RscTupel * pStringLongTupel );
    RscArray *  InitLangStringTupelList( RscCont * pStrTupelLst );
    RscArray *  InitLangStringLongTupelList( RscCont * pStrLongTupelLst );

    RscTop *    InitClassMgr();
    RscTop *    InitClassString( RscTop * pSuper );
    RscTop *    InitClassBitmap( RscTop * pSuper );
    RscTop *    InitClassColor( RscTop * pSuper, RscEnum * pColor );
    RscTop *    InitClassImage( RscTop * pSuper, RscTop *pClassBitmap,
                                RscTop * pClassColor );
    RscTop *    InitClassImageList( RscTop * pSuper,
                                    RscTop * pClassColor, RscCont * pStrLst );
    RscTop *    InitClassWindow( RscTop * pSuper, RscEnum * pMapUnit,
                                 RscArray * pLangGeo );
    RscTop *    InitClassSystemWindow( RscTop * pSuper );
    RscTop *    InitClassWorkWindow( RscTop * pSuper );
    RscTop *    InitClassModalDialog( RscTop * pSuper );
    RscTop *    InitClassModelessDialog( RscTop * pSuper );
    RscTop *    InitClassControl( RscTop * pSuper );
    RscTop *    InitClassCheckBox( RscTop * pSuper );
    RscTop *    InitClassPushButton( RscTop * pSuper );
    RscTop *    InitClassTriStateBox( RscTop * pSuper, RscEnum * pTriState );
    RscTop *    InitClassMenuButton( RscTop * pSuper, RscTop * pClasMenu );
    RscTop *    InitClassImageButton( RscTop * pSuper, RscTop * pClassImage,
                                    RscEnum * pTriState );
    RscTop *    InitClassEdit( RscTop * pSuper );
    RscTop *    InitClassMultiLineEdit( RscTop * pSuper );
    RscTop *    InitClassScrollBar( RscTop * pSuper );
    RscTop *    InitClassListBox( RscTop * pSuper, RscArray * pStrLst );
    RscTop *    InitClassMultiListBox( RscTop * pSuper );
    RscTop *    InitClassComboBox( RscTop * pSuper, RscArray * pStrLst );
    RscTop *    InitClassFixedText( RscTop * pSuper );
    RscTop *    InitClassFixedBitmap( RscTop * pSuper, RscTop * pClassBitmap );
    RscTop *    InitClassFixedImage( RscTop * pSuper, RscTop * pClassImage );
    RscTop *    InitClassRadioButton( RscTop * pSuper );
    RscTop *    InitClassImageRadioButton( RscTop * pSuper, RscTop * pClassImage );
    RscTop *    InitClassKeyCode( RscTop * pSuper, RscEnum * pKey );
    RscTop *    InitClassAccelItem( RscTop * pSuper, RscTop * pKeyCode );
    RscTop *    InitClassAccel( RscTop * pSuper, RscTop * pClassAccelItem );
    RscTop *    InitClassMenuItem( RscTop * pSuper, RscTop * pClassBitmap,
                                   RscTop * pClassKeyCode );
    RscTop *    InitClassMenu( RscTop * pSuper, RscTop * pMenuItem );
    RscTop *    InitClassMessBox( RscTop * pSuper,
                                  RscEnum * pMessButtons,
                                  RscEnum * pMessDefButton );
    RscTop *    InitClassSplitter( RscTop * pSuper );
    RscTop *    InitClassSplitWindow( RscTop * pSuper );
    RscTop *    InitClassTime( RscTop * pSuper );
    RscTop *    InitClassDate( RscTop * pSuper );

    RscTop *    InitClassPatternFormatter( RscTop * pSuper );
    RscTop *    InitClassNumericFormatter( RscTop * pSuper );
    RscTop *    InitClassMetricFormatter( RscTop * pSuper,
                                          RscEnum * pFieldUnits );
    RscTop *    InitClassCurrencyFormatter( RscTop * pSuper );
    RscTop *    InitClassDateFormatter( RscTop * pSuper, RscTop * pClassDate );
    RscTop *    InitClassTimeFormatter( RscTop * pSuper, RscTop * pClassTime,
                                        RscEnum * pTimeFieldFormat );

    RscTop *    InitClassSpinField( RscTop * pSuper );
    RscTop *    InitClassPatternField( RscTop * pSuper );
    RscTop *    InitClassNumericField( RscTop * pSuper );
    RscTop *    InitClassMetricField( RscTop * pSuper );
    RscTop *    InitClassCurrencyField( const char * pClassName, sal_uInt32 nRT,
                                        RscTop * pSuper );
    RscTop *    InitClassDateField( RscTop * pSuper, RscTop * pClassDate );
    RscTop *    InitClassTimeField( RscTop * pSuper, RscTop * pClassTime );
    RscTop *    InitClassPatternBox( RscTop * pSuper );
    RscTop *    InitClassNumericBox( RscTop * pSuper );
    RscTop *    InitClassMetricBox( RscTop * pSuper );
    RscTop *    InitClassCurrencyBox( const char * pClassName, sal_uInt32 nRT,
                                        RscTop * pSuper );
    RscTop *    InitClassDateBox( RscTop * pSuper );
    RscTop *    InitClassTimeBox( RscTop * pSuper );

    RscTop *    InitClassDockingWindow( RscTop * pSuper,
                                        RscEnum * pMapUnit );
    RscTop *    InitClassToolBoxItem( RscTop * pSuper, RscTop * pClassBitmap,
                                      RscTop * pClassImage,
                                      RscEnum * pTriState );
    RscTop *    InitClassToolBox( RscTop * pSuper, RscTop * pClassToolBoxItem,
                                  RscTop * pClassImageList );
    RscTop *    InitClassStatusBar( RscTop * pSuper );
    RscTop *    InitClassMoreButton( RscTop * pSuper, RscEnum * pMapUnit );
    RscTop *    InitClassFloatingWindow( RscTop * pSuper,
                                         RscEnum * pMapUnit );
    RscTop *    InitClassTabControlItem( RscTop * pSuper );
    RscTop *    InitClassTabControl(  RscTop * pSuper,
                                     RscTop * pClassTabControlItem );
    RscTop *    InitClassSfxStyleFamilyItem( RscTop * pSuper,
                                             RscTop * pClassBitmap,
                                             RscTop * pClassImage,
                                             RscArray * pStrLst );
    RscTop *    InitClassSfxTemplateDialog(  RscTop * pSuper,
                                             RscTop * pStyleFamily );
    RscTop *    InitClassSfxSlotInfo( RscTop * pSuper );

    void        InsWinBit( RscTop * pClass, const rtl::OString& rName,
                           Atom nVal );
    void        WriteInc( FILE * fOutput, sal_uLong lKey );

public:
    RscBool             aBool;
    RscRange            aShort;
    RscRange            aUShort;
    RscLongRange        aLong;
    RscLongEnumRange    aEnumLong;
    RscIdRange          aIdUShort;
    RscIdRange          aIdNoZeroUShort;
    RscBreakRange       aNoZeroShort;
    RscRange            a1to12Short;
    RscRange            a0to23Short;
    RscRange            a1to31Short;
    RscRange            a0to59Short;
    RscRange            a0to99Short;
    RscRange            a0to9999Short;
    RscIdRange          aIdLong;
    RscString           aString;
    RscString           aStringLiteral;
    RscFlag             aWinBits;
    RscLangEnum         aLangType;
    RscLangArray        aLangString;
    RscLangArray        aLangShort;

    Atom                nAcceleratorType;

    RscError*           pEH;        // Fehlerhandler
    RscNameTable        aNmTb;      // Tabelle fuer Namen
    RscFileTab          aFileTab;   // Tabelle der Dateinamen
    sal_uInt32              nFlags;
    std::map<sal_uInt64, sal_uLong> aIdTranslator; //Ordnet Resourcetypen und Id's einen Id zu
                                       //(unter PM), oder eine Dateiposition (MTF)

    RscTypCont( RscError *, RSCBYTEORDER_TYPE, const rtl::OString& rSearchPath, sal_uInt32 nFlags );
    ~RscTypCont();

    Atom AddLanguage( const char* );

    sal_Bool            IsPreload() const
                    { return (nFlags & PRELOAD_FLAG) ? sal_True : sal_False; }
    sal_Bool            IsSmart() const
                    { return (nFlags & SMART_FLAG) ? sal_True : sal_False; }
    sal_Bool            IsSysResTest() const
                    { return (nFlags & NOSYSRESTEST_FLAG) ? sal_False : sal_True; }
    sal_Bool            IsSrsDefault() const
                    { return (nFlags & SRSDEFAULT_FLAG) ? sal_True : sal_False; }
    rtl::OString ChangeLanguage(const rtl::OString & rNewLang);
    const std::vector< sal_uInt32 >& GetFallbacks() const
    { return aLangFallbacks; }

    RSCBYTEORDER_TYPE GetByteOrder() const { return nByteOrder; }
    CharSet         GetSourceCharSet() const { return nSourceCharSet; }
    CharSet         SetSourceCharSet( CharSet aCharSet )
    {
        CharSet aOld = nSourceCharSet;
        nSourceCharSet = aCharSet;
        return aOld;
    }
    void            SetSearchPath( const rtl::OString& rStr) { aSearchPath = rStr; }
    rtl::OString    GetSearchPath() const { return aSearchPath; }
    void            SetSysSearchPath( const rtl::OString& rStr ) { aSysSearchPath = rStr; }
    void        InsertType( RscTop * pType )
                {
                    aBaseLst.push_back( pType );
                }
    RscTop  *   SearchType( Atom nTypId );
                // loescht alle Resourceobjekte diese Datei
    void        Delete( sal_uLong lFileKey );
    RscTop  *   GetRoot()         { return( pRoot ); };
    sal_uInt32      PutSysName( sal_uInt32 nRscTyp, char * pName, sal_uInt32 nConst,
                            sal_uInt32 nId, sal_Bool bFirst );
    void        ClearSysNames();
    ERRTYPE     WriteRc( WriteRcContext& rContext );
    void        WriteSrc( FILE * fOutput, sal_uLong nFileIndex,
                          sal_Bool bName = sal_True );
    ERRTYPE     WriteHxx( FILE * fOutput, sal_uLong nFileKey);
    ERRTYPE     WriteCxx( FILE * fOutput, sal_uLong nFileKey,
                          const rtl::OString& rHxxName );
    void        WriteSyntax( FILE * fOutput );
    void        WriteRcCtor( FILE * fOutput );
    sal_uInt32      PutTranslatorKey( sal_uInt64 nKey );
    void        IncFilePos( sal_uLong nOffset ){ nFilePos += nOffset; }
};

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
