/*************************************************************************
 *
 * 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 _EXTENSIONS_PROPCTRLR_FORMMETADATA_HXX_
#define _EXTENSIONS_PROPCTRLR_FORMMETADATA_HXX_

#include "propertyinfo.hxx"
#ifndef _EXTENSIONS_PROPCTRLR_MODULEPRC_HXX_
#include "modulepcr.hxx"
#endif
#include "enumrepresentation.hxx"
#include <comphelper/composedprops.hxx>

//............................................................................
namespace pcr
{
//............................................................................

    struct OPropertyInfoImpl;

    //========================================================================
    //= OPropertyInfoService
    //========================================================================
    class OPropertyInfoService
                :public IPropertyInfoService
                ,public ::comphelper::IPropertySetComposerCallback
                ,public PcrClient
    {
    protected:
        static sal_uInt16               s_nCount;
        static OPropertyInfoImpl*       s_pPropertyInfos;
        // TODO: a real structure which allows quick access by name as well as by id

    public:
        // IPropertyInfoService
        virtual sal_Int32                           getPropertyId(const String& _rName) const;
        virtual String                              getPropertyTranslation(sal_Int32 _nId) const;
        virtual sal_Int32                           getPropertyHelpId(sal_Int32 _nId) const;
        virtual sal_Int16                           getPropertyPos(sal_Int32 _nId) const;
        virtual sal_uInt32                          getPropertyUIFlags(sal_Int32 _nId) const;
        virtual ::std::vector< ::rtl::OUString >    getPropertyEnumRepresentations(sal_Int32 _nId) const;
        virtual String                              getPropertyName( sal_Int32 _nPropId );

        // IPropertySetComposerCallback
        virtual sal_Bool                isComposeable( const ::rtl::OUString& _rPropertyName ) const;

    protected:
        static const OPropertyInfoImpl* getPropertyInfo();

        static const OPropertyInfoImpl* getPropertyInfo(const String& _rName);
        static const OPropertyInfoImpl* getPropertyInfo(sal_Int32 _nId);
    };

    //========================================================================
    //= DefaultEnumRepresentation
    //========================================================================
    /** an implementation of the IPropertyEnumRepresentation

        To be used with properties which, in formmetadata.cxx, are declared as ENUM.
    */
    class DefaultEnumRepresentation : public IPropertyEnumRepresentation
    {
    private:
        oslInterlockedCount         m_refCount;
        const IPropertyInfoService& m_rMetaData;
        ::com::sun::star::uno::Type m_aType;
        const sal_Int32             m_nPropertyId;

    public:
        /** constructs an instance

            @param _rInfo
                An instance implementing IPropertyInfoService. Must live at least as
                long as the DefaultEnumRepresentation should live.
        */
        DefaultEnumRepresentation( const IPropertyInfoService& _rInfo, const ::com::sun::star::uno::Type& _rType, sal_Int32 _nPropertyId );

    protected:
        ~DefaultEnumRepresentation();

    protected:
        // IPropertyEnumRepresentation implementqation
        virtual ::std::vector< ::rtl::OUString >
                                    SAL_CALL getDescriptions() const;
        virtual void                SAL_CALL getValueFromDescription( const ::rtl::OUString& _rDescription, ::com::sun::star::uno::Any& _out_rValue ) const;
        virtual ::rtl::OUString     SAL_CALL getDescriptionForValue( const ::com::sun::star::uno::Any& _rEnumValue ) const;

        // IReference implementqation
        virtual oslInterlockedCount SAL_CALL acquire();
        virtual oslInterlockedCount SAL_CALL release();

    private:
        DefaultEnumRepresentation();                                                // never implemented
        DefaultEnumRepresentation( const DefaultEnumRepresentation& );              // never implemented
        DefaultEnumRepresentation& operator=( const DefaultEnumRepresentation& );   // never implemented
    };

    //========================================================================
    //= UI flags (for all browseable properties)
    //========================================================================

#define PROP_FLAG_NONE              0x00000000  // no special flag
#define PROP_FLAG_FORM_VISIBLE      0x00000001  // the property is visible when inspecting a form object
#define PROP_FLAG_DIALOG_VISIBLE    0x00000002  // the property is visible when inspecting a dialog object
#define PROP_FLAG_DATA_PROPERTY     0x00000004  // the property is to appear on the "Data" page
#define PROP_FLAG_ENUM              0x00000020  // the property is some kind of enum property, i.e. its
                                                // value is chosen from a fixed list of possible values
#define PROP_FLAG_ENUM_ONE          0x00000060  // the property is an enum property starting with 1
                                                //  (note that this includes PROP_FLAG_ENUM)
#define PROP_FLAG_COMPOSEABLE       0x00000080  // the property is "composeable", i.e. an intersection of property
                                                //  sets should expose it, if all elements do
#define PROP_FLAG_EXPERIMENTAL      0x00000100  // the property is experimental, i.e. should not appear in the
                                                // UI, unless experimental properties are enabled by a configuraiton
                                                // option

    //========================================================================
    //= property ids (for all browseable properties)
    //========================================================================

    #define PROPERTY_ID_NAME                  1
    #define PROPERTY_ID_LABEL                 2
    #define PROPERTY_ID_CONTROLLABEL          3
    #define PROPERTY_ID_MAXTEXTLEN            4
    #define PROPERTY_ID_EDITMASK              5
    #define PROPERTY_ID_LITERALMASK           6
    #define PROPERTY_ID_STRICTFORMAT          7
    #define PROPERTY_ID_ENABLED               8
    #define PROPERTY_ID_READONLY              9
    #define PROPERTY_ID_PRINTABLE            10
    #define PROPERTY_ID_CONTROLSOURCE        11
    #define PROPERTY_ID_TABSTOP              12
    #define PROPERTY_ID_TABINDEX             13
    #define PROPERTY_ID_DATASOURCE           14
    #define PROPERTY_ID_COMMAND              15
    #define PROPERTY_ID_COMMANDTYPE          16
    #define PROPERTY_ID_FILTER               17
    #define PROPERTY_ID_SORT                 18
    #define PROPERTY_ID_INSERTONLY           19
    #define PROPERTY_ID_ALLOWADDITIONS       20
    #define PROPERTY_ID_ALLOWEDITS           21
    #define PROPERTY_ID_ALLOWDELETIONS       22
    #define PROPERTY_ID_NAVIGATION           24
    #define PROPERTY_ID_CYCLE                25
    #define PROPERTY_ID_HIDDEN_VALUE         26
    #define PROPERTY_ID_VALUEMIN             27
    #define PROPERTY_ID_VALUEMAX             28
    #define PROPERTY_ID_VALUESTEP            29
    #define PROPERTY_ID_DEFAULT_VALUE        30
    #define PROPERTY_ID_DECIMAL_ACCURACY     31
    #define PROPERTY_ID_SHOWTHOUSANDSEP      32
    #define PROPERTY_ID_REFVALUE             33
    #define PROPERTY_ID_CURRENCYSYMBOL       34
    #define PROPERTY_ID_CURRSYM_POSITION     35
    #define PROPERTY_ID_DATEMIN              36
    #define PROPERTY_ID_DATEMAX              37
    #define PROPERTY_ID_DATEFORMAT           38
    #define PROPERTY_ID_SELECTEDITEMS        39
    #define PROPERTY_ID_DEFAULT_DATE         40
    #define PROPERTY_ID_TIMEMIN              41
    #define PROPERTY_ID_TIMEMAX              42
    #define PROPERTY_ID_TIMEFORMAT           43
    #define PROPERTY_ID_DEFAULT_TIME         44
    #define PROPERTY_ID_EFFECTIVE_MIN        45
    #define PROPERTY_ID_EFFECTIVE_MAX        46
    #define PROPERTY_ID_EFFECTIVE_DEFAULT    47
    #define PROPERTY_ID_FORMATKEY            48
    #define PROPERTY_ID_CLASSID              50
    #define PROPERTY_ID_HEIGHT               51
    #define PROPERTY_ID_WIDTH                52
    #define PROPERTY_ID_BOUNDCOLUMN          53
    #define PROPERTY_ID_LISTSOURCETYPE       54
    #define PROPERTY_ID_LISTSOURCE           55
    #define PROPERTY_ID_LISTINDEX            56
    #define PROPERTY_ID_STRINGITEMLIST       57
    #define PROPERTY_ID_DEFAULT_TEXT         58
    #define PROPERTY_ID_FONT                 59
    #define PROPERTY_ID_ALIGN                60
    #define PROPERTY_ID_ROWHEIGHT            61
    #define PROPERTY_ID_BACKGROUNDCOLOR      62
    #define PROPERTY_ID_FILLCOLOR            63
    #define PROPERTY_ID_ESCAPE_PROCESSING    64
    #define PROPERTY_ID_LINECOLOR            65
    #define PROPERTY_ID_BORDER               66
    #define PROPERTY_ID_DROPDOWN             67
    #define PROPERTY_ID_AUTOCOMPLETE         68
    #define PROPERTY_ID_LINECOUNT            69
    #define PROPERTY_ID_WORDBREAK            70
    #define PROPERTY_ID_MULTILINE            71
    #define PROPERTY_ID_MULTISELECTION       72
    #define PROPERTY_ID_AUTOLINEBREAK        73
    #define PROPERTY_ID_HSCROLL              74
    #define PROPERTY_ID_VSCROLL              75
    #define PROPERTY_ID_SPIN                 76
    #define PROPERTY_ID_BUTTONTYPE           77
    #define PROPERTY_ID_TARGET_URL           78
    #define PROPERTY_ID_TARGET_FRAME         79
    #define PROPERTY_ID_SUBMIT_ACTION        80
    #define PROPERTY_ID_SUBMIT_TARGET        81
    #define PROPERTY_ID_SUBMIT_METHOD        82
    #define PROPERTY_ID_SUBMIT_ENCODING      83
    #define PROPERTY_ID_DEFAULT_STATE        84
    #define PROPERTY_ID_DEFAULTBUTTON        85
    #define PROPERTY_ID_IMAGE_URL            86
    #define PROPERTY_ID_DEFAULT_SELECT_SEQ   87
    #define PROPERTY_ID_ECHO_CHAR            88
    #define PROPERTY_ID_EMPTY_IS_NULL        89
    #define PROPERTY_ID_TRISTATE             90
    #define PROPERTY_ID_MASTERFIELDS         91
    #define PROPERTY_ID_DETAILFIELDS         92
    #define PROPERTY_ID_RECORDMARKER         93
    #define PROPERTY_ID_FILTERPROPOSAL       94
    #define PROPERTY_ID_TAG                  95
    #define PROPERTY_ID_HELPTEXT             96
    #define PROPERTY_ID_HELPURL              97
    #define PROPERTY_ID_HASNAVIGATION        98
    #define PROPERTY_ID_POSITIONX            99
    #define PROPERTY_ID_POSITIONY            100
    #define PROPERTY_ID_TITLE                101
    #define PROPERTY_ID_STEP                 102
    #define PROPERTY_ID_PROGRESSVALUE        103
    #define PROPERTY_ID_PROGRESSVALUE_MIN    104
    #define PROPERTY_ID_PROGRESSVALUE_MAX    105
    #define PROPERTY_ID_SCROLLVALUE          106
    #define PROPERTY_ID_SCROLLVALUE_MAX      107
    #define PROPERTY_ID_LINEINCREMENT        108
    #define PROPERTY_ID_BLOCKINCREMENT       109
    #define PROPERTY_ID_VISIBLESIZE          110
    #define PROPERTY_ID_ORIENTATION          111
    #define PROPERTY_ID_IMAGEPOSITION        112
    #define PROPERTY_ID_DATE                 113
    #define PROPERTY_ID_STATE                114
    #define PROPERTY_ID_TIME                 115
    #define PROPERTY_ID_VALUE                116
    #define PROPERTY_ID_SCALEIMAGE           117
    #define PROPERTY_ID_PUSHBUTTONTYPE       118
    #define PROPERTY_ID_EFFECTIVE_VALUE      119
    #define PROPERTY_ID_TEXT                 120
    #define PROPERTY_ID_BOUND_CELL           121
    #define PROPERTY_ID_LIST_CELL_RANGE      122
    #define PROPERTY_ID_CELL_EXCHANGE_TYPE   123
    #define PROPERTY_ID_SCROLLVALUE_MIN      124
    #define PROPERTY_ID_DEFAULT_SCROLLVALUE  125
    #define PROPERTY_ID_REPEAT_DELAY         126
    #define PROPERTY_ID_SYMBOLCOLOR          127
    #define PROPERTY_ID_SPINVALUE            128
    #define PROPERTY_ID_SPINVALUE_MIN        129
    #define PROPERTY_ID_SPINVALUE_MAX        130
    #define PROPERTY_ID_DEFAULT_SPINVALUE    131
    #define PROPERTY_ID_SPININCREMENT        132
    #define PROPERTY_ID_REPEAT               133
    #define PROPERTY_ID_SHOW_SCROLLBARS      134
    #define PROPERTY_ID_ICONSIZE             135
    #define PROPERTY_ID_SHOW_POSITION        136
    #define PROPERTY_ID_SHOW_NAVIGATION      137
    #define PROPERTY_ID_SHOW_RECORDACTIONS   138
    #define PROPERTY_ID_SHOW_FILTERSORT      139
    #define PROPERTY_ID_TEXTTYPE             140
    #define PROPERTY_ID_LINEEND_FORMAT       141
    #define PROPERTY_ID_TOGGLE               142
    #define PROPERTY_ID_FOCUSONCLICK         143
    #define PROPERTY_ID_HIDEINACTIVESELECTION 144
    #define PROPERTY_ID_VISUALEFFECT         145
    #define PROPERTY_ID_BORDERCOLOR          146
    #define PROPERTY_ID_XML_DATA_MODEL       147
    #define PROPERTY_ID_BIND_EXPRESSION      148
    #define PROPERTY_ID_XSD_REQUIRED         149
    #define PROPERTY_ID_XSD_RELEVANT         150
    #define PROPERTY_ID_XSD_READONLY         151
    #define PROPERTY_ID_XSD_CONSTRAINT       152
    #define PROPERTY_ID_XSD_CALCULATION      153
    #define PROPERTY_ID_XSD_DATA_TYPE        154
    #define PROPERTY_ID_XSD_WHITESPACES      155
    #define PROPERTY_ID_XSD_PATTERN          156
    #define PROPERTY_ID_XSD_LENGTH           157
    #define PROPERTY_ID_XSD_MIN_LENGTH       158
    #define PROPERTY_ID_XSD_MAX_LENGTH       159
    #define PROPERTY_ID_XSD_TOTAL_DIGITS     160
    #define PROPERTY_ID_XSD_FRACTION_DIGITS  161
    #define PROPERTY_ID_XSD_MAX_INCLUSIVE_INT        162
    #define PROPERTY_ID_XSD_MAX_EXCLUSIVE_INT        163
    #define PROPERTY_ID_XSD_MIN_INCLUSIVE_INT        164
    #define PROPERTY_ID_XSD_MIN_EXCLUSIVE_INT        165
    #define PROPERTY_ID_XSD_MAX_INCLUSIVE_DOUBLE     166
    #define PROPERTY_ID_XSD_MAX_EXCLUSIVE_DOUBLE     167
    #define PROPERTY_ID_XSD_MIN_INCLUSIVE_DOUBLE     168
    #define PROPERTY_ID_XSD_MIN_EXCLUSIVE_DOUBLE     169
    #define PROPERTY_ID_XSD_MAX_INCLUSIVE_DATE       170
    #define PROPERTY_ID_XSD_MAX_EXCLUSIVE_DATE       171
    #define PROPERTY_ID_XSD_MIN_INCLUSIVE_DATE       172
    #define PROPERTY_ID_XSD_MIN_EXCLUSIVE_DATE       173
    #define PROPERTY_ID_XSD_MAX_INCLUSIVE_TIME       174
    #define PROPERTY_ID_XSD_MAX_EXCLUSIVE_TIME       175
    #define PROPERTY_ID_XSD_MIN_INCLUSIVE_TIME       176
    #define PROPERTY_ID_XSD_MIN_EXCLUSIVE_TIME       177
    #define PROPERTY_ID_XSD_MAX_INCLUSIVE_DATE_TIME  178
    #define PROPERTY_ID_XSD_MAX_EXCLUSIVE_DATE_TIME  179
    #define PROPERTY_ID_XSD_MIN_INCLUSIVE_DATE_TIME  180
    #define PROPERTY_ID_XSD_MIN_EXCLUSIVE_DATE_TIME  181
    #define PROPERTY_ID_UNCHECKEDREFVALUE           182
    #define PROPERTY_ID_SUBMISSION_ID               183
    #define PROPERTY_ID_XFORMS_BUTTONTYPE           184
    #define PROPERTY_ID_LIST_BINDING                185
    #define PROPERTY_ID_VERTICAL_ALIGN              186
    #define PROPERTY_ID_BINDING_NAME                187
    #define PROPERTY_ID_DECORATION                  188
    #define PROPERTY_ID_SELECTION_TYPE              189
    #define PROPERTY_ID_ROOT_DISPLAYED              190
    #define PROPERTY_ID_SHOWS_HANDLES               191
    #define PROPERTY_ID_SHOWS_ROOT_HANDLES          192
    #define PROPERTY_ID_EDITABLE                    193
    #define PROPERTY_ID_INVOKES_STOP_NOT_EDITING    194
    #define PROPERTY_ID_NOLABEL                     195
    #define PROPERTY_ID_SCALE_MODE                  196
    #define PROPERTY_ID_INPUT_REQUIRED              197
    #define PROPERTY_ID_WRITING_MODE                198
    #define PROPERTY_ID_ENABLE_VISIBLE              199
    #define PROPERTY_ID_WHEEL_BEHAVIOR              200
    #define PROPERTY_ID_TEXT_ANCHOR_TYPE            201
    #define PROPERTY_ID_SHEET_ANCHOR_TYPE           202

//............................................................................
} // namespace pcr
//............................................................................

#endif // _EXTENSIONS_PROPCTRLR_FORMMETADATA_HXX_

