| 1 | /****************************************************************************
|
|---|
| 2 | **
|
|---|
| 3 | ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
|---|
| 4 | ** All rights reserved.
|
|---|
| 5 | ** Contact: Nokia Corporation ([email protected])
|
|---|
| 6 | **
|
|---|
| 7 | ** This file is part of the Qt3Support module of the Qt Toolkit.
|
|---|
| 8 | **
|
|---|
| 9 | ** $QT_BEGIN_LICENSE:LGPL$
|
|---|
| 10 | ** Commercial Usage
|
|---|
| 11 | ** Licensees holding valid Qt Commercial licenses may use this file in
|
|---|
| 12 | ** accordance with the Qt Commercial License Agreement provided with the
|
|---|
| 13 | ** Software or, alternatively, in accordance with the terms contained in
|
|---|
| 14 | ** a written agreement between you and Nokia.
|
|---|
| 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 | ** GNU General Public License Usage
|
|---|
| 29 | ** Alternatively, this file may be used under the terms of the GNU
|
|---|
| 30 | ** General Public License version 3.0 as published by the Free Software
|
|---|
| 31 | ** Foundation and appearing in the file LICENSE.GPL included in the
|
|---|
| 32 | ** packaging of this file. Please review the following information to
|
|---|
| 33 | ** ensure the GNU General Public License version 3.0 requirements will be
|
|---|
| 34 | ** met: http://www.gnu.org/copyleft/gpl.html.
|
|---|
| 35 | **
|
|---|
| 36 | ** If you have questions regarding the use of this file, please contact
|
|---|
| 37 | ** Nokia at [email protected].
|
|---|
| 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
|
|---|