File indexing completed on 2024-05-12 16:39:37

0001 /* This file is part of the KDE project
0002    Copyright (C) 2004 Lucijan Busch <lucijan@kde.org>
0003    Copyright (C) 2004-2009 Jarosław Staniek <staniek@kde.org>
0004 
0005    This library is free software; you can redistribute it and/or
0006    modify it under the terms of the GNU Library General Public
0007    License as published by the Free Software Foundation; either
0008    version 2 of the License, or (at your option) any later version.
0009 
0010    This library is distributed in the hope that it will be useful,
0011    but WITHOUT ANY WARRANTY; without even the implied warranty of
0012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0013    Library General Public License for more details.
0014 
0015    You should have received a copy of the GNU Library General Public License
0016    along with this library; see the file COPYING.LIB.  If not, write to
0017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0018  * Boston, MA 02110-1301, USA.
0019 */
0020 
0021 #include "kexiinternalpart.h"
0022 #include "kexipartmanager.h"
0023 #include "KexiWindow.h"
0024 #include "KexiView.h"
0025 #include "KexiMainWindowIface.h"
0026 #include <kexi_global.h>
0027 
0028 #include <KDbMessageHandler>
0029 
0030 #include <KLocalizedString>
0031 
0032 #include <QDebug>
0033 #include <QDialog>
0034 
0035 //----------------------------------------------
0036 
0037 class Q_DECL_HIDDEN KexiInternalPart::Private
0038 {
0039 public:
0040     Private();
0041     ~Private();
0042 
0043     //! Unique widget - we're using guarded ptr for the widget so can know if it has been closed
0044     QPointer<QWidget> uniqueWidget;
0045     bool uniqueWindow; //!< true if createWidgetInstance() should return only one window
0046     bool cancelled; //!< Used in cancelled()
0047 };
0048 
0049 KexiInternalPart::Private::Private() : uniqueWindow(true)
0050                                        ,cancelled(false)
0051 {
0052 }
0053 
0054 KexiInternalPart::Private::~Private()
0055 {
0056 }
0057 
0058 KexiInternalPart::KexiInternalPart(QObject *parent, const QVariantList &list)
0059         : KexiPart::PartBase(parent, list)
0060         , d(new Private)
0061 {
0062 }
0063 
0064 KexiInternalPart::~KexiInternalPart()
0065 {
0066     delete d;
0067 }
0068 
0069 //static
0070 KexiInternalPart* KexiInternalPart::part(KDbMessageHandler *msgHdr, const QString &className)
0071 {
0072     KexiInternalPart *part = Kexi::partManager().internalPartForPluginId(className);
0073     if (!part) {
0074         if (msgHdr) {
0075             msgHdr->showErrorMessage(Kexi::partManager().result());
0076         }
0077     }
0078     return part;
0079 }
0080 
0081 //static
0082 QObject* KexiInternalPart::createObjectInstance(const QString &className,
0083         const char* objectClass, KDbMessageHandler *msgHdr,
0084         QObject *parent, const char *objName, QMap<QString, QString>* args)
0085 {
0086     KexiInternalPart *part = KexiInternalPart::part(msgHdr, className);
0087     if (!part) {
0088         return nullptr; //fatal!
0089     }
0090     return part->createObject(objectClass, parent,
0091                               objName ? objName : qPrintable(className), args);
0092 }
0093 
0094 //static
0095 QWidget* KexiInternalPart::createWidgetInstance(const QString &className,
0096         const char* widgetClass, KDbMessageHandler *msgHdr,
0097         QWidget *parent, const char *objName, QMap<QString, QString>* args)
0098 {
0099     KexiInternalPart *part = KexiInternalPart::part(msgHdr, className);
0100     if (!part)
0101         return 0; //fatal!
0102     return part->createWidget(widgetClass, parent,
0103                               objName ? objName : qPrintable(className), args);
0104 }
0105 
0106 KexiWindow* KexiInternalPart::findOrCreateKexiWindow(
0107     const char *objName)
0108 {
0109     if (d->uniqueWindow && !d->uniqueWidget.isNull())
0110         return dynamic_cast<KexiWindow*>((QWidget*)d->uniqueWidget);
0111     KexiWindow * wnd = new KexiWindow();
0112     KexiView *view = createView(0, objName);
0113     if (!view)
0114         return 0;
0115 
0116     if (d->uniqueWindow)
0117         d->uniqueWidget = wnd; //recall unique!
0118     wnd->addView(view);
0119     wnd->setWindowTitle(view->windowTitle());
0120     wnd->resize(view->sizeHint());
0121     wnd->setMinimumSize(view->minimumSizeHint().width(), view->minimumSizeHint().height());
0122     wnd->setId(KexiMainWindowIface::global()->project()->generatePrivateID());
0123     wnd->registerWindow();
0124     return wnd;
0125 }
0126 
0127 //static
0128 QWidget* KexiInternalPart::createWidgetInstance(const QString &className,
0129                                                 KDbMessageHandler *msgHdr,
0130                                                 QWidget *parent, const char *objName,
0131                                                 QMap<QString, QString>* args)
0132 {
0133     return createWidgetInstance(className, 0, msgHdr, parent, objName, args);
0134 }
0135 
0136 //static
0137 KexiWindow* KexiInternalPart::createKexiWindowInstance(
0138     const QString &className,
0139     KDbMessageHandler *msgHdr, const char *objName)
0140 {
0141     KexiInternalPart *part = KexiInternalPart::part(msgHdr, className);
0142     if (!part) {
0143         qWarning() << "!part";
0144         return 0; //fatal!
0145     }
0146     return part->findOrCreateKexiWindow(objName ? objName : qPrintable(className));
0147 }
0148 
0149 //static
0150 QDialog* KexiInternalPart::createModalDialogInstance(const QString &className,
0151         const char* dialogClass, KDbMessageHandler *msgHdr,
0152         const char *objName, QMap<QString, QString>* args)
0153 {
0154     KexiInternalPart *part = KexiInternalPart::part(msgHdr, className);
0155     if (!part) {
0156         qWarning() << "!part";
0157         return 0; //fatal!
0158     }
0159     QWidget *w;
0160     if (part->createsUniqueWindow() && !part->d->uniqueWidget.isNull())
0161         w = part->d->uniqueWidget;
0162     else
0163         w = part->createWidget(dialogClass, KexiMainWindowIface::global()->thisWidget(),
0164                                objName ? objName : qPrintable(className), args);
0165 
0166     QDialog* dialog = qobject_cast<QDialog*>(w);
0167     if (dialog) {
0168         if (part->createsUniqueWindow())
0169             part->d->uniqueWidget = w;
0170         return dialog;
0171     }
0172     //sanity
0173     if (!(part->createsUniqueWindow() && !part->d->uniqueWidget.isNull()))
0174         delete w;
0175     return 0;
0176 }
0177 
0178 //static
0179 QDialog* KexiInternalPart::createModalDialogInstance(const QString &className,
0180                                                      KDbMessageHandler *msgHdr, const char *objName,
0181                                                      QMap<QString, QString>* args)
0182 {
0183     return createModalDialogInstance(className, 0, msgHdr, objName, args);
0184 }
0185 
0186 //static
0187 bool KexiInternalPart::executeCommand(const QString &className,
0188                                       const char* commandName, QMap<QString, QString>* args)
0189 {
0190     KexiInternalPart *part = KexiInternalPart::part(0, className);
0191     if (!part) {
0192         qWarning() << "!part";
0193         return 0; //fatal!
0194     }
0195     return part->executeCommand(commandName, args);
0196 }
0197 
0198 QObject* KexiInternalPart::createObject(const char* objectClass,
0199                               QObject * parent, const char * objName,
0200                               QMap<QString, QString>* args)
0201 {
0202     Q_UNUSED(objectClass);
0203     Q_UNUSED(parent);
0204     Q_UNUSED(objName);
0205     Q_UNUSED(args);
0206     return 0;
0207 }
0208 
0209 QWidget* KexiInternalPart::createWidget(const char* widgetClass,
0210                                         QWidget * parent, const char * objName, QMap<QString, QString>* args)
0211 {
0212     Q_UNUSED(widgetClass);
0213     Q_UNUSED(parent);
0214     Q_UNUSED(objName);
0215     Q_UNUSED(args);
0216     return 0;
0217 }
0218 
0219 KexiView* KexiInternalPart::createView(QWidget * parent,
0220                                        const char * objName)
0221 {
0222     Q_UNUSED(parent);
0223     Q_UNUSED(objName);
0224     return 0;
0225 }
0226 
0227 bool KexiInternalPart::executeCommand(const char* commandName,
0228                                       QMap<QString, QString>* args)
0229 {
0230     Q_UNUSED(commandName);
0231     Q_UNUSED(args);
0232     return false;
0233 }
0234 
0235 bool KexiInternalPart::createsUniqueWindow() const
0236 {
0237     return d->uniqueWindow;
0238 }
0239 
0240 void KexiInternalPart::setCreatesUniqueWindow(bool set)
0241 {
0242     d->uniqueWindow = set;
0243 }
0244 
0245 bool KexiInternalPart::cancelled() const
0246 {
0247     return d->cancelled;
0248 }
0249 
0250 void KexiInternalPart::setCancelled(bool set)
0251 {
0252     d->cancelled = set;
0253 }
0254