src/qt3support/sql/q3sqlpropertymap.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the Qt3Support module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "q3sqlpropertymap.h"
       
    43 
       
    44 #ifndef QT_NO_SQL_FORM
       
    45 
       
    46 #include "qwidget.h"
       
    47 #include "q3cleanuphandler.h"
       
    48 #include "qmetaobject.h"
       
    49 #include "qmap.h"
       
    50 
       
    51 QT_BEGIN_NAMESPACE
       
    52 
       
    53 class Q3SqlPropertyMapPrivate
       
    54 {
       
    55 public:
       
    56     Q3SqlPropertyMapPrivate() {}
       
    57     QMap<QByteArray, QByteArray> propertyMap;
       
    58 };
       
    59 
       
    60 /*!
       
    61     \class Q3SqlPropertyMap
       
    62     \brief The Q3SqlPropertyMap class is used to map widgets to SQL fields.
       
    63 
       
    64     \compat
       
    65 
       
    66     The SQL module uses Qt \link properties.html object
       
    67     properties\endlink to insert and extract values from editor
       
    68     widgets.
       
    69 
       
    70     This class is used to map editors to SQL fields. This works by
       
    71     associating SQL editor class names to the properties used to
       
    72     insert and extract values to/from the editor.
       
    73 
       
    74     For example, a QLineEdit can be used to edit text strings and
       
    75     other data types in Q3DataTables or Q3SqlForms. Several properties
       
    76     are defined in QLineEdit, but only the \e text property is used to
       
    77     insert and extract text from a QLineEdit. Both Q3DataTable and
       
    78     Q3SqlForm use the global Q3SqlPropertyMap for inserting and
       
    79     extracting values to and from an editor widget. The global
       
    80     property map defines several common widgets and properties that
       
    81     are suitable for many applications. You can add and remove widget
       
    82     properties to suit your specific needs.
       
    83 
       
    84     If you want to use custom editors with your Q3DataTable or
       
    85     Q3SqlForm, you must install your own Q3SqlPropertyMap for that table
       
    86     or form. Example:
       
    87 
       
    88     \snippet doc/src/snippets/code/src_qt3support_sql_q3sqlpropertymap.cpp 0
       
    89 
       
    90     You can also replace the global Q3SqlPropertyMap that is used by
       
    91     default. (Bear in mind that Q3SqlPropertyMap takes ownership of the
       
    92     new default map.)
       
    93 
       
    94     \snippet doc/src/snippets/code/src_qt3support_sql_q3sqlpropertymap.cpp 1
       
    95 
       
    96     \sa Q3DataTable, Q3SqlForm, Q3SqlEditorFactory
       
    97 */
       
    98 
       
    99 /*!
       
   100 
       
   101 Constructs a Q3SqlPropertyMap.
       
   102 
       
   103 The default property mappings used by Qt widgets are:
       
   104 \table
       
   105 \header \i Widgets \i Property
       
   106 \row \i \l QCheckBox,
       
   107         \l QRadioButton
       
   108      \i checked
       
   109 \row \i \l QComboBox,
       
   110         \l Q3ListBox
       
   111      \i currentItem
       
   112 \row \i \l Q3DateEdit
       
   113      \i date
       
   114 \row \i \l Q3DateTimeEdit
       
   115         \l QDateTimeEdit
       
   116      \i dateTime
       
   117 \row \i \l QTextBrowser
       
   118      \i source
       
   119 \row \i \l QAbstractButton,
       
   120         \l QDial,
       
   121         \l QLabel,
       
   122         \l QLineEdit,
       
   123         \l Q3MultiLineEdit,
       
   124         \l QPushButton,
       
   125         \l QTextEdit,
       
   126      \i text
       
   127 \row \i \l Q3TimeEdit
       
   128      \i time
       
   129 \row \i \l QLCDNumber,
       
   130         \l QScrollBar
       
   131         \l QSlider,
       
   132         \l QSpinBox
       
   133      \i value
       
   134 \endtable
       
   135 */
       
   136 
       
   137 Q3SqlPropertyMap::Q3SqlPropertyMap()
       
   138 {
       
   139     d = new Q3SqlPropertyMapPrivate();
       
   140     const struct MapData {
       
   141         const char *classname;
       
   142         const char *property;
       
   143     } mapData[] = {
       
   144         { "Q3DateEdit", "date" },
       
   145         { "Q3DateTimeEdit", "dateTime" },
       
   146         { "Q3ListBox", "currentItem" },
       
   147         { "Q3TimeEdit", "time" },
       
   148         { "QAbstractButton", "text" },
       
   149         { "QCheckBox", "checked" },
       
   150         { "QRadioButton", "checked" },
       
   151         { "QComboBox", "currentIndex" },
       
   152         { "QDateTimeEdit", "dateTime" },
       
   153         { "QDial", "value" },
       
   154         { "QLabel", "text" },
       
   155         { "QLCDNumber", "value" },
       
   156         { "QLineEdit", "text" },
       
   157         { "QPushButton", "text" },
       
   158         { "QScrollBar", "value" },
       
   159         { "QSlider", "value" },
       
   160         { "QSpinBox", "value" },
       
   161         { "QTabBar", "currentTab" },
       
   162         { "QTabWidget", "currentPage" },
       
   163         { "QTextBrowser", "source" },
       
   164         { "QTextEdit", "text" },
       
   165         { "QGroupBox", "checked" }
       
   166     };
       
   167 
       
   168     const MapData *m = mapData;
       
   169     for (uint i = 0; i < sizeof(mapData)/sizeof(MapData); i++, m++)
       
   170         d->propertyMap.insert(m->classname, m->property);
       
   171 }
       
   172 
       
   173 /*!
       
   174     Destroys the Q3SqlPropertyMap.
       
   175 
       
   176     Note that if the Q3SqlPropertyMap is installed with
       
   177     installPropertyMap() the object it was installed into, e.g. the
       
   178     Q3SqlForm, takes ownership and will delete the Q3SqlPropertyMap when
       
   179     necessary.
       
   180 */
       
   181 Q3SqlPropertyMap::~Q3SqlPropertyMap()
       
   182 {
       
   183     delete d;
       
   184 }
       
   185 
       
   186 /*!
       
   187     Returns the mapped property of \a widget as a QVariant.
       
   188 */
       
   189 QVariant Q3SqlPropertyMap::property(QWidget * widget)
       
   190 {
       
   191     if(!widget) return QVariant();
       
   192     const QMetaObject* mo = widget->metaObject();
       
   193     while (mo && !d->propertyMap.contains(mo->className()))
       
   194         mo = mo->superClass();
       
   195 
       
   196     if (!mo) {
       
   197         qWarning("Q3SqlPropertyMap::property: %s does not exist", widget->metaObject()->className());
       
   198         return QVariant();
       
   199     }
       
   200     return widget->property(d->propertyMap[mo->className()]);
       
   201 }
       
   202 
       
   203 /*!
       
   204     Sets the property of \a widget to \a value.
       
   205 */
       
   206 void Q3SqlPropertyMap::setProperty(QWidget * widget, const QVariant & value)
       
   207 {
       
   208     if(!widget) return;
       
   209 
       
   210     const QMetaObject* mo = widget->metaObject();
       
   211     while (mo && !d->propertyMap.contains(mo->className()))
       
   212         mo = mo->superClass();
       
   213     if (!mo) {
       
   214         qWarning("Q3SqlPropertyMap::setProperty: %s not handled by Q3SqlPropertyMap", widget->metaObject()->className());
       
   215         return;
       
   216     }
       
   217 
       
   218     widget->setProperty(d->propertyMap[mo->className()], value);
       
   219 }
       
   220 
       
   221 /*!
       
   222   Insert a new classname/property pair, which is used for custom SQL
       
   223   field editors. There \e must be a Q_PROPERTY() clause in the \a
       
   224   classname class declaration for the \a property.
       
   225 */
       
   226 void Q3SqlPropertyMap::insert(const QString & classname,
       
   227                               const QString & property)
       
   228 {
       
   229     d->propertyMap[classname.latin1()] = property.latin1();
       
   230 }
       
   231 
       
   232 /*!
       
   233     Removes \a classname from the map.
       
   234 */
       
   235 void Q3SqlPropertyMap::remove(const QString & classname)
       
   236 {
       
   237     d->propertyMap.remove(classname.latin1());
       
   238 }
       
   239 
       
   240 static Q3SqlPropertyMap * defaultmap = 0;
       
   241 static Q3CleanupHandler< Q3SqlPropertyMap > qsql_cleanup_property_map;
       
   242 
       
   243 /*!
       
   244     Returns the application global Q3SqlPropertyMap.
       
   245 */
       
   246 Q3SqlPropertyMap * Q3SqlPropertyMap::defaultMap()
       
   247 {
       
   248     if(defaultmap == 0){
       
   249         defaultmap = new Q3SqlPropertyMap();
       
   250         qsql_cleanup_property_map.add(&defaultmap);
       
   251     }
       
   252     return defaultmap;
       
   253 }
       
   254 
       
   255 /*!
       
   256     Replaces the global default property map with \a map. All
       
   257     Q3DataTable and Q3SqlForm instantiations will use this new map for
       
   258     inserting and extracting values to and from editors.
       
   259     \e{Q3SqlPropertyMap takes ownership of \a map, and destroys it
       
   260     when it is no longer needed.}
       
   261 */
       
   262 void Q3SqlPropertyMap::installDefaultMap(Q3SqlPropertyMap * map)
       
   263 {
       
   264     if(map == 0) return;
       
   265 
       
   266     if(defaultmap != 0){
       
   267         qsql_cleanup_property_map.remove(&defaultmap);
       
   268         delete defaultmap;
       
   269     }
       
   270     defaultmap = map;
       
   271     qsql_cleanup_property_map.add(&defaultmap);
       
   272 }
       
   273 
       
   274 QT_END_NAMESPACE
       
   275 
       
   276 #endif // QT_NO_SQL_FORM