/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */

#pragma once

#include "propertyinfo.hxx"
#include "enumrepresentation.hxx"


namespace pcr
{


    struct OPropertyInfoImpl;


    //= OPropertyInfoService

    class OPropertyInfoService final
                :public IPropertyInfoService
    {
        static std::size_t              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 OUString& _rName) const override;
        virtual OUString                       getPropertyTranslation(sal_Int32 _nId) const override;
        virtual OUString                       getPropertyHelpId(sal_Int32 _nId) const override;
        virtual sal_Int16                      getPropertyPos(sal_Int32 _nId) const override;
        virtual sal_uInt32                     getPropertyUIFlags(sal_Int32 _nId) const override;
        virtual std::vector< OUString >      getPropertyEnumRepresentations(sal_Int32 _nId) const override;

        bool                                   isComposeable( const OUString& _rPropertyName ) const;

    private:
        static const OPropertyInfoImpl* getPropertyInfo();

        static const OPropertyInfoImpl* getPropertyInfo(const OUString& _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:
        const IPropertyInfoService& m_rMetaData;
        css::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 css::uno::Type& _rType, sal_Int32 _nPropertyId );

    protected:
        virtual ~DefaultEnumRepresentation() override;

    protected:
        // IPropertyEnumRepresentation implementqation
        virtual std::vector< OUString >
                                    getDescriptions() const override;
        virtual void                getValueFromDescription( const OUString& _rDescription, css::uno::Any& _out_rValue ) const override;
        virtual OUString            getDescriptionForValue( const css::uno::Any& _rEnumValue ) const override;

    private:
        DefaultEnumRepresentation( const DefaultEnumRepresentation& ) = delete;
        DefaultEnumRepresentation& operator=( const DefaultEnumRepresentation& ) = delete;
    };


    //= UI flags (for all browsable 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 configuration
                                                // option
#define PROP_FLAG_REPORT_INVISIBLE  0x00000200  // the property should not appear in the Report Designer UI


    //= property ids (for all browsable 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_GROUP_NAME           23
    #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
    #define PROPERTY_ID_SCROLL_WIDTH                203
    #define PROPERTY_ID_SCROLL_HEIGHT               204
    #define PROPERTY_ID_SCROLL_TOP                  205
    #define PROPERTY_ID_SCROLL_LEFT                 206
    #define PROPERTY_ID_TYPEDITEMLIST               207
    #define PROPERTY_ID_SELECTIONMODEL              208
    #define PROPERTY_ID_USEGRIDLINE                 209
    #define PROPERTY_ID_GRIDLINECOLOR               210
    #define PROPERTY_ID_SHOWCOLUMNHEADER            211
    #define PROPERTY_ID_SHOWROWHEADER               212
    #define PROPERTY_ID_HEADERBACKGROUNDCOLOR       213
    #define PROPERTY_ID_HEADERTEXTCOLOR             214
    #define PROPERTY_ID_ACTIVESELECTIONBACKGROUNDCOLOR 215
    #define PROPERTY_ID_ACTIVESELECTIONTEXTCOLOR    216
    #define PROPERTY_ID_INACTIVESELECTIONBACKGROUNDCOLOR 217
    #define PROPERTY_ID_INACTIVESELECTIONTEXTCOLOR  218
    #define PROPERTY_ID_URL                         219
    #define PROPERTY_ID_AUTOGROW                    220


} // namespace pcr


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