File indexing completed on 2024-12-01 10:29:13

0001 /* This file is part of the KDE project
0002    Copyright (C) 2006-2015 Jarosław Staniek <staniek@kde.org>
0003 
0004    This library is free software; you can redistribute it and/or
0005    modify it under the terms of the GNU Library General Public
0006    License as published by the Free Software Foundation; either
0007    version 2 of the License, or (at your option) any later version.
0008 
0009    This library is distributed in the hope that it will be useful,
0010    but WITHOUT ANY WARRANTY; without even the implied warranty of
0011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0012    Library General Public License for more details.
0013 
0014    You should have received a copy of the GNU Library General Public License
0015    along with this library; see the file COPYING.LIB.  If not, write to
0016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0017  * Boston, MA 02110-1301, USA.
0018  */
0019 
0020 #ifndef KDB_LOOKUPFIELDSCHEMA_H
0021 #define KDB_LOOKUPFIELDSCHEMA_H
0022 
0023 #include <QMap>
0024 
0025 #include "kdb_export.h"
0026 
0027 class QStringList;
0028 class QDomElement;
0029 class QDomDocument;
0030 class QVariant;
0031 
0032 //! default value for KDbLookupFieldSchema::columnHeadersVisible()
0033 #define KDB_LOOKUP_FIELD_DEFAULT_HEADERS_VISIBLE false
0034 
0035 //! default value for KDbLookupFieldSchema::maxVisibleRecords()
0036 #define KDB_LOOKUP_FIELD_DEFAULT_MAX_VISIBLE_RECORDS 8
0037 
0038 //! upper limit for KDbLookupFieldSchema::maxVisibleRecords()
0039 #define KDB_LOOKUP_FIELD_LIMIT_MAX_VISIBLE_RECORDS 100
0040 
0041 //! default value for KDbLookupFieldSchema::limitToList()
0042 #define KDB_LOOKUP_FIELD_DEFAULT_LIMIT_TO_LIST true
0043 
0044 //! default value for KDbLookupFieldSchema::displayWidget()
0045 #define KDB_LOOKUP_FIELD_DEFAULT_DISPLAY_WIDGET KDbLookupFieldSchema::DisplayWidget::ComboBox
0046 
0047 //! Record source information that can be specified for the lookup field schema
0048 //! @since 3.1
0049 class KDB_EXPORT KDbLookupFieldSchemaRecordSource
0050 {
0051 public:
0052     //! Record source type
0053     enum class Type {
0054         None,         //!< used for invalid schema
0055         Table,        //!< table as lookup record source
0056         Query,        //!< named query as lookup record source
0057         SQLStatement, //!< anonymous query as lookup record source
0058         ValueList,    //!< a fixed list of values as lookup record source
0059         KDbFieldList     //!< a list of column names from a table/query will be displayed
0060     };
0061 
0062     KDbLookupFieldSchemaRecordSource();
0063 
0064     KDbLookupFieldSchemaRecordSource(const KDbLookupFieldSchemaRecordSource& other);
0065 
0066     ~KDbLookupFieldSchemaRecordSource();
0067 
0068     /*! @return record source type: table, query, anonymous; in the future it will
0069      be also fixed value list and field list. The latter is basically a list
0070      of column names of a table/query, "Field List" in MSA. */
0071     Type type() const;
0072 
0073     /*! Sets record source type to @a type. */
0074     void setType(Type type);
0075 
0076     /*! @return record source type name. @see setTypeByName() */
0077     QString typeName() const;
0078 
0079     /*! Sets record source type by name using @a typeName. Accepted (case sensitive)
0080      names are "table", "query", "sql", "valuelist", "fieldlist".
0081      For other value NoType type is set. */
0082     void setTypeByName(const QString& typeName);
0083 
0084     /*! @return a string for record source: table name, query name or anonymous query
0085      provided as KDbSQL string. If recordSourceType() is a ValueList,
0086      recordSourceValues() should be used instead. If recordSourceType() is a KDbFieldList,
0087      recordSource() should return table or query name. */
0088     QString name() const;
0089 
0090     /*! Sets record source value. @see value() */
0091     void setName(const QString& name);
0092 
0093     /*! @return record source values specified if type() is ValueList. */
0094     QStringList values() const;
0095 
0096     /*! Sets record source values used if type() is ValueList.
0097      Using it clears name (see name()). */
0098     void setValues(const QStringList& values);
0099 
0100     //! Assigns @a other to this record source and returns a reference to this record source.
0101     KDbLookupFieldSchemaRecordSource& operator=(const KDbLookupFieldSchemaRecordSource& other);
0102 
0103     //! @return @c true if this record source is equal to @a other; otherwise returns @c false.
0104     //! @since 3.1
0105     bool operator==(const KDbLookupFieldSchemaRecordSource &other) const;
0106 
0107     //! @return @c true if this record source is not equal to @a other; otherwise returns @c false.
0108     //! @since 3.1
0109     inline bool operator!=(const KDbLookupFieldSchemaRecordSource &other) const { return !operator==(other); }
0110 
0111 private:
0112     class Private;
0113     Private * const d;
0114 };
0115 
0116 //! @short Provides information about lookup field's setup.
0117 /*!
0118  KDbLookupFieldSchema object is owned by KDbTableSchema and created upon creating or retrieving the table schema
0119  from the database metadata.
0120 
0121  @see KDbLookupFieldSchema *KDbTableSchema::lookupFieldSchema( KDbField& field ) const
0122 */
0123 class KDB_EXPORT KDbLookupFieldSchema
0124 {
0125 public:
0126     KDbLookupFieldSchema();
0127 
0128     KDbLookupFieldSchema(const KDbLookupFieldSchema &schema);
0129 
0130     ~KDbLookupFieldSchema();
0131 
0132     /*! @return record source information for the lookup field schema */
0133     KDbLookupFieldSchemaRecordSource recordSource() const;
0134 
0135     /*! Sets record source for the lookup field schema */
0136     void setRecordSource(const KDbLookupFieldSchemaRecordSource& recordSource);
0137 
0138     /*! @return bound column: an integer specifying a column that is bound
0139      (counted from 0). -1 means unspecified value. */
0140 //! @todo in later implementation there can be more columns
0141     int boundColumn() const;
0142 
0143     /*! Sets bound column number to @a column. @see boundColumn() */
0144     void setBoundColumn(int column);
0145 
0146     /*! @return a list of visible columns: a list of integers specifying indices (counted from 0)
0147      of columns within the row source that are visible in the combo box.
0148      Empty list means unspecified value. */
0149     QList<int> visibleColumns() const;
0150 
0151     /*! Sets a list of visible columns to \a list. @see visibleColumns() */
0152     void setVisibleColumns(const QList<int>& list);
0153 
0154     /*! A helper method.
0155      If index >= visibleColumns().count(), -1 is returned,
0156      else \a index is returned. */
0157     int visibleColumn(int index) const;
0158 
0159     /*! @return a number of ordered integers specifying column widths;
0160      -1 means 'default width' for a given column. */
0161     QList<int> columnWidths() const;
0162 
0163     /*! Sets column widths. @see columnWidths() */
0164     void setColumnWidths(const QList<int>& widths);
0165 
0166     /*! @return true if column headers are visible in the associated
0167      combo box popup or the list view. The default is false. */
0168     bool columnHeadersVisible() const;
0169 
0170     /*! Sets "column headers visibility" flag. @see columnHeadersVisible() */
0171     void setColumnHeadersVisible(bool set);
0172 
0173     /*! @return integer property specifying a maximum number of records
0174      that can be displayed in a combo box popup or a list box. The default is
0175      equal to KDB_LOOKUP_FIELD_DEFAULT_MAX_VISIBLE_RECORD_COUNT constant. */
0176     int maxVisibleRecords() const;
0177 
0178     /*! Sets maximum number of records that can be displayed in a combo box popup
0179      or a list box. If @a count is 0, KDB_LOOKUP_FIELD_DEFAULT_MAX_VISIBLE_RECORD_COUNT is set.
0180      If @a count is greater than KDB_LOOKUP_FIELD_MAX_LIST_ROWS,
0181      KDB_LOOKUP_FIELD_MAX_LIST_ROWS is set. */
0182     void setMaxVisibleRecords(int count);
0183 
0184     /*! @return true if , only values present on the list can be selected using
0185      the combo box. The default is true. */
0186     bool limitToList() const;
0187 
0188     /*! Sets "limit to list" flag. @see limitToList() */
0189     void setLimitToList(bool set);
0190 
0191     //! used in displayWidget()
0192     enum class DisplayWidget {
0193         ComboBox = 0, //!< (the default) combobox widget should be displayed in forms for this lookup field
0194         ListBox = 1   //!< listbox widget should be displayed in forms for this lookup field
0195     };
0196 
0197     /*! @return the widget type that should be displayed within
0198      the forms for this lookup field. The default is ComboBox.
0199      For the Table View, combo box is always displayed. */
0200     DisplayWidget displayWidget() const;
0201 
0202     /*! Sets type of widget to display within the forms for this lookup field. @see displayWidget() */
0203     void setDisplayWidget(DisplayWidget widget);
0204 
0205     /*! Loads data of lookup column schema from DOM tree.
0206      The data can be outdated or invalid, so the app should handle such cases.
0207      @return a new KDbLookupFieldSchema object even if lookupEl contains no valid contents. */
0208     static KDbLookupFieldSchema* loadFromDom(const QDomElement& lookupEl);
0209 
0210     /*! Saves data of lookup column schema to @a parentEl DOM element of @a doc document.
0211      Does nothing if @a doc or @a parentEl is @c nullptr. */
0212     void saveToDom(QDomDocument *doc, QDomElement *parentEl);
0213 
0214     /*! Gets property values for the lookup schema.
0215      @a values is cleared before filling.
0216      This function is used e.g. for altering table design. */
0217     void getProperties(QMap<QByteArray, QVariant> *values) const;
0218 
0219     /*! Sets property of name @a propertyName and value @a value for the lookup schema @a lookup
0220      @return true on successful set and false on failure because of invalid value or invalid property name. */
0221     bool setProperty(const QByteArray& propertyName, const QVariant& value);
0222 
0223     /*! Sets property values for the lookup schema.
0224      Properties coming from extended schema are also supported.
0225      Properties not listed are kept untouched.
0226      This function is used e.g. for altering table design.
0227      @return true on successful set and false on failure because of invalid value or invalid property name. */
0228     bool setProperties(const QMap<QByteArray, QVariant>& values);
0229 
0230     //! Assigns @a other to this lookup schema and returns a reference to this lookup schema.
0231     KDbLookupFieldSchema& operator=(const KDbLookupFieldSchema& other);
0232 
0233     //! @return @c true if this lookup schema is equal to @a other; otherwise returns @c false.
0234     //! @since 3.1
0235     bool operator==(const KDbLookupFieldSchema &other) const;
0236 
0237     //! @return @c true if this lookup schema is not equal to @a other; otherwise returns @c false.
0238     //! @since 3.1
0239     inline bool operator!=(const KDbLookupFieldSchema &other) const { return !operator==(other); }
0240 
0241 private:
0242     class Private;
0243     Private * const d;
0244 };
0245 
0246 //! Sends lookup field schema's record source information @a source to debug output @a dbg.
0247 KDB_EXPORT QDebug operator<<(QDebug dbg, const KDbLookupFieldSchemaRecordSource& source);
0248 
0249 //! Sends lookup field schema information @a lookup to debug output @a dbg.
0250 KDB_EXPORT QDebug operator<<(QDebug dbg, const KDbLookupFieldSchema& lookup);
0251 
0252 #endif