libqutim  0.3.2.0
dataforms.h
Go to the documentation of this file.
00001 /****************************************************************************
00002 **
00003 ** qutIM - instant messenger
00004 **
00005 ** Copyright © 2011 Ruslan Nigmatullin <euroelessar@yandex.ru>
00006 **
00007 *****************************************************************************
00008 **
00009 ** $QUTIM_BEGIN_LICENSE$
00010 ** This program is free software: you can redistribute it and/or modify
00011 ** it under the terms of the GNU General Public License as published by
00012 ** the Free Software Foundation, either version 3 of the License, or
00013 ** (at your option) any later version.
00014 **
00015 ** This program is distributed in the hope that it will be useful,
00016 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
00017 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00018 ** See the GNU General Public License for more details.
00019 **
00020 ** You should have received a copy of the GNU General Public License
00021 ** along with this program.  If not, see http://www.gnu.org/licenses/.
00022 ** $QUTIM_END_LICENSE$
00023 **
00024 ****************************************************************************/
00025 #ifndef DATAFORMS_H
00026 #define DATAFORMS_H
00027 
00028 #include "localizedstring.h"
00029 #include <QSharedPointer>
00030 #include <QVariant>
00031 #include <QFrame>
00032 #include <QDateTime>
00033 #include <QDate>
00034 #include <QPixmap>
00035 #include <QImage>
00036 #include <QIcon>
00037 
00038 class QValidator;
00039 
00040 namespace qutim_sdk_0_3
00041 {
00042 
00043 class DataItemPrivate;
00044 
00216 class LIBQUTIM_EXPORT DataItem
00217 {
00218 public:
00223     DataItem();
00227     DataItem(const QString &name, const LocalizedString &title, const QVariant &data);
00231     DataItem(const LocalizedString &title, const QVariant &data = QVariant());
00239     DataItem(const DataItem &other);
00243     ~DataItem();
00247     DataItem &operator=(const DataItem &other);
00252     QString name() const;
00257     void setName(const QString &itemName);
00262     LocalizedString title() const;
00267     void setTitle(const LocalizedString &itemTitle);
00271     QVariant data() const;
00276     template<typename T>
00277     T data(const T &def = T()) const;
00281     void setData(const QVariant &itemData);
00285     bool isNull() const;
00290     QList<DataItem> subitems() const;
00294     void setSubitems(const QList<DataItem> &newSubitems);
00298     DataItem subitem(const QString &name, bool recursive = false) const;
00299 
00300     int removeSubitems(const QString &name, bool recursive = false);
00301     bool removeSubitem(const QString &name, bool recursive = false);
00302     DataItem takeSubitem(const QString &name, bool recursive = false);
00307     void addSubitem(const DataItem &subitem);
00311     bool hasSubitems() const;
00318     void allowModifySubitems(const DataItem &defaultSubitem, int maxSubitemsCount = -1);
00323     bool isAllowedModifySubitems() const;
00329     int maxSubitemsCount() const;
00334     DataItem defaultSubitem() const;
00339     bool isReadOnly() const;
00344     void setReadOnly(bool readOnly = true);
00353     void setDataChangedHandler(QObject *receiver, const char *method);
00357     QObject *dataChangedReceiver() const;
00361     const char *dataChangedMethod() const;
00366     DataItem &operator<<(const DataItem &subitem);
00372     QVariant property(const char *name, const QVariant &def = QVariant()) const;
00378     template<typename T>
00379     T property(const char *name, const T &def = T()) const;
00384     void setProperty(const char *name, const QVariant &value);
00385     QList<QByteArray> dynamicPropertyNames() const;
00386 protected:
00387 #ifndef Q_QDOC
00388     friend class DataItemPrivate;
00389     QSharedDataPointer<DataItemPrivate> d;
00390 #endif
00391 };
00392 
00393 template<typename T>
00394 T DataItem::property(const char *name, const T &def) const
00395 {
00396     QVariant var = property(name, QVariant::fromValue<T>(def));
00397     return var.value<T>();
00398 }
00399 
00400 class LIBQUTIM_EXPORT ReadOnlyDataItem : public DataItem
00401 {
00402 public:
00403     ReadOnlyDataItem(const LocalizedString &title, const QStringList &data);
00404     ReadOnlyDataItem(const LocalizedString &title, const LocalizedStringList &data);
00405     ReadOnlyDataItem(const LocalizedString &title, bool data);
00406     ReadOnlyDataItem(const LocalizedString &title, const QDate &data);
00407     ReadOnlyDataItem(const LocalizedString &title, const QDateTime &data);
00408     ReadOnlyDataItem(const LocalizedString &title, int data);
00409     ReadOnlyDataItem(const LocalizedString &title, uint data);
00410     ReadOnlyDataItem(const LocalizedString &title, double data);
00411     ReadOnlyDataItem(const LocalizedString &title, const QIcon &data);
00412     ReadOnlyDataItem(const LocalizedString &title, const QImage &data);
00413     ReadOnlyDataItem(const LocalizedString &title, const QPixmap &data);
00414     ReadOnlyDataItem(const LocalizedString &title, const QString &data);
00415     ReadOnlyDataItem(const LocalizedString &title, const LocalizedString &data);
00416 };
00417 
00418 class LIBQUTIM_EXPORT StringListDataItem : public DataItem
00419 {
00420 public:
00421     StringListDataItem(const QString &name, const LocalizedString &title,
00422                        const QStringList &data = QStringList(),
00423                        int maxStringsCount = -1);
00424     StringListDataItem(const QString &name, const LocalizedString &title,
00425                        const LocalizedStringList &data = LocalizedStringList(),
00426                        int maxStringsCount = -1);
00427 };
00428 
00429 class LIBQUTIM_EXPORT IntDataItem : public DataItem
00430 {
00431 public:
00432     IntDataItem(const QString &name, const LocalizedString &title, int data,
00433                 int minValue = 0, int maxValue = 100);
00434 };
00435 
00436 class LIBQUTIM_EXPORT DoubleDataItem : public DataItem
00437 {
00438 public:
00439     DoubleDataItem(const QString &name, const LocalizedString &title, double data,
00440                    double minValue = 0, double maxValue = 100);
00441 };
00442 
00443 class LIBQUTIM_EXPORT IconDataItem : public DataItem
00444 {
00445 public:
00446     IconDataItem(const QString &name, const LocalizedString &title,
00447                  const QIcon &data = QIcon(),
00448                  const QSize &imageSize = QSize(32, 32),
00449                  const QList<QIcon> &alternatives = QList<QIcon>());
00450 };
00451 
00452 class LIBQUTIM_EXPORT ImageDataItem : public DataItem
00453 {
00454 public:
00455     ImageDataItem(const QString &name, const LocalizedString &title,
00456                   const QImage &data = QImage(),
00457                   const QSize &imageSize = QSize(32, 32),
00458                   const QList<QImage> &alternatives = QList<QImage>());
00459 };
00460 
00461 class LIBQUTIM_EXPORT PixmapDataItem : public DataItem
00462 {
00463 public:
00464     PixmapDataItem(const QString &name, const LocalizedString &title,
00465                    const QPixmap &data = QPixmap(),
00466                    const QSize &imageSize = QSize(128, 128),
00467                    const QList<QPixmap> &alternatives = QList<QPixmap>());
00468 };
00469 
00470 class LIBQUTIM_EXPORT StringChooserDataItem : public DataItem
00471 {
00472 public:
00473     StringChooserDataItem(const QString &name, const LocalizedString &title,
00474                           const QStringList &alternatives, const QString &data = QString(),
00475                           bool editable = false, QValidator *validator = 0);
00476     StringChooserDataItem(const QString &name, const LocalizedString &title,
00477                           const QStringList &alternatives, const QString &data,
00478                           bool editable, QRegExp validator);
00479     StringChooserDataItem(const QString &name, const LocalizedString &title,
00480                           const LocalizedStringList &alternatives,
00481                           const LocalizedString &data,
00482                           bool editable = false, QValidator *validator = 0);
00483     StringChooserDataItem(const QString &name, const LocalizedString &title,
00484                           const LocalizedStringList &alternatives,
00485                           const LocalizedString &data,
00486                           bool editable, QRegExp validator);
00487 };
00488 
00489 class LIBQUTIM_EXPORT MultiLineStringDataItem : public DataItem
00490 {
00491 public:
00492     MultiLineStringDataItem(const QString &name, const LocalizedString &title,
00493                             const QString &data = QString());
00494     MultiLineStringDataItem(const QString &name, const LocalizedString &title,
00495                             const LocalizedString &data);
00496 };
00497 
00498 class LIBQUTIM_EXPORT StringDataItem : public DataItem
00499 {
00500 public:
00501     StringDataItem(const QString &name, const LocalizedString &title,
00502                    const QString &data = QString(),
00503                    QValidator *validator = 0, bool password = false);
00504     StringDataItem(const QString &name, const LocalizedString &title,
00505                    const QString &data, QRegExp validator,
00506                    bool password = false);
00507     StringDataItem(const QString &name, const LocalizedString &title,
00508                    const LocalizedString &data, QValidator *validator = 0,
00509                    bool password = false);
00510     StringDataItem(const QString &name, const LocalizedString &title,
00511                    const LocalizedString &data, QRegExp validator,
00512                    bool password = false);
00513 };
00514 
00515 class LIBQUTIM_EXPORT AbstractDataForm : public QWidget
00516 {
00517     Q_OBJECT
00518 public:
00519     enum ButtonRole {
00520         InvalidRole = -1,
00521         AcceptRole,
00522         RejectRole,
00523         DestructiveRole,
00524         ActionRole,
00525         HelpRole,
00526         YesRole,
00527         NoRole,
00528         ResetRole,
00529         ApplyRole,
00530 
00531         NRoles
00532     };
00533     Q_DECLARE_FLAGS(ButtonRoles, ButtonRole)
00534     enum StandardButton {
00535         NoButton           = 0x00000000,
00536         Ok                 = 0x00000400,
00537         Save               = 0x00000800,
00538         SaveAll            = 0x00001000,
00539         Open               = 0x00002000,
00540         Yes                = 0x00004000,
00541         YesToAll           = 0x00008000,
00542         No                 = 0x00010000,
00543         NoToAll            = 0x00020000,
00544         Abort              = 0x00040000,
00545         Retry              = 0x00080000,
00546         Ignore             = 0x00100000,
00547         Close              = 0x00200000,
00548         Cancel             = 0x00400000,
00549         Discard            = 0x00800000,
00550         Help               = 0x01000000,
00551         Apply              = 0x02000000,
00552         Reset              = 0x04000000,
00553         RestoreDefaults    = 0x08000000
00554     };
00555     Q_DECLARE_FLAGS(StandardButtons, StandardButton)
00556     struct Button
00557     {
00558         LocalizedString name;
00559         ButtonRole role;
00560     };
00561     typedef QList<Button> Buttons;
00562 public:
00563     virtual DataItem item() const = 0;
00570     virtual bool isChanged() const = 0;
00578     virtual bool isComplete() const = 0;
00582     virtual void clearState() = 0;
00589     virtual void setData(const QString &fieldName, const QVariant &data) = 0;
00590     static AbstractDataForm *get(const DataItem &item,
00591                                  StandardButtons standartButtons = NoButton,
00592                                  const Buttons &buttons = Buttons());
00593 public slots:
00594     void accept();
00595     void reject();
00596 signals:
00597     void accepted();
00598     void rejected();
00599     void helpRequested();
00600     void clicked(int buttonIndex);
00601     void clicked(qutim_sdk_0_3::AbstractDataForm::StandardButton standartButton);
00606     void changed();
00613     void completeChanged(bool complete);
00614 protected:
00615     virtual void virtual_hook(int id, void *data);
00616 };
00617 
00618 class LIBQUTIM_EXPORT DataFormsBackend : public QObject
00619 {
00620     Q_OBJECT
00621 public:
00622     virtual AbstractDataForm *get(const DataItem &item,
00623                                   AbstractDataForm::StandardButtons standartButtons = AbstractDataForm::NoButton,
00624                                   const AbstractDataForm::Buttons &buttons = AbstractDataForm::Buttons()) = 0;
00625     static DataFormsBackend *instance();
00626 };
00627 
00628 template<typename T>
00629 T DataItem::data(const T &def) const
00630 {
00631     QVariant d = data();
00632     return d.canConvert<T>() ? d.value<T>() : def;
00633 }
00634 
00635 #ifndef Q_QDOC
00636 Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractDataForm::ButtonRoles)
00637 Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractDataForm::StandardButtons)
00638 #endif
00639 }
00640 
00641 #ifndef Q_QDOC
00642 Q_DECLARE_METATYPE(qutim_sdk_0_3::DataItem)
00643 Q_DECLARE_METATYPE(QList<qutim_sdk_0_3::DataItem>)
00644 #endif
00645 
00646 #endif // DATAFORMS_H
00647