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