tools/designer/src/lib/shared/signalslotdialog.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
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 Qt Designer 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 "signalslotdialog_p.h"
       
    43 #include "ui_signalslotdialog.h"
       
    44 #include "metadatabase_p.h"
       
    45 #include "widgetdatabase_p.h"
       
    46 
       
    47 #include "qdesigner_formwindowcommand_p.h"
       
    48 #include "iconloader_p.h"
       
    49 
       
    50 #include <QtDesigner/QDesignerMemberSheetExtension>
       
    51 #include <QtDesigner/QExtensionManager>
       
    52 #include <QtDesigner/QDesignerFormEditorInterface>
       
    53 #include <QtDesigner/QDesignerFormWindowInterface>
       
    54 #include <QtDesigner/QDesignerWidgetFactoryInterface>
       
    55 #include <abstractdialoggui_p.h>
       
    56 
       
    57 #include <QtGui/QStandardItemModel>
       
    58 #include <QtGui/QRegExpValidator>
       
    59 #include <QtGui/QItemDelegate>
       
    60 #include <QtGui/QLineEdit>
       
    61 #include <QtGui/QApplication>
       
    62 #include <QtGui/QMessageBox>
       
    63 
       
    64 #include <QtCore/QRegExp>
       
    65 #include <QtCore/QDebug>
       
    66 
       
    67 QT_BEGIN_NAMESPACE
       
    68 
       
    69 // Regexp to match a function signature, arguments potentially
       
    70 // with namespace colons.
       
    71 static const char *signatureRegExp = "^[\\w+_]+\\(([\\w+:]\\*?,?)*\\)$";
       
    72 static const char *methodNameRegExp = "^[\\w+_]+$";
       
    73 
       
    74 static  QStandardItem *createEditableItem(const QString &text)
       
    75 {
       
    76     QStandardItem *rc = new QStandardItem(text);
       
    77     rc->setFlags(Qt::ItemIsEnabled|Qt::ItemIsEditable|Qt::ItemIsSelectable);
       
    78     return rc;
       
    79 }
       
    80 
       
    81 static  QStandardItem *createDisabledItem(const QString &text)
       
    82 {
       
    83     QStandardItem *rc = new QStandardItem(text);
       
    84     Qt::ItemFlags flags = rc->flags();
       
    85     rc->setFlags(flags & ~(Qt::ItemIsEnabled|Qt::ItemIsEditable|Qt::ItemIsSelectable));
       
    86     return rc;
       
    87 }
       
    88 
       
    89 static void fakeMethodsFromMetaDataBase(QDesignerFormEditorInterface *core, QObject *o, QStringList &slotList, QStringList &signalList)
       
    90 {
       
    91     slotList.clear();
       
    92     signalList.clear();
       
    93     if (qdesigner_internal::MetaDataBase *metaDataBase = qobject_cast<qdesigner_internal::MetaDataBase *>(core->metaDataBase()))
       
    94         if (const qdesigner_internal::MetaDataBaseItem *item = metaDataBase->metaDataBaseItem(o)) {
       
    95             slotList = item->fakeSlots();
       
    96             signalList = item->fakeSignals();
       
    97         }
       
    98 }
       
    99 
       
   100 static void fakeMethodsToMetaDataBase(QDesignerFormEditorInterface *core, QObject *o, const QStringList &slotList, const QStringList &signalList)
       
   101 {
       
   102     if (qdesigner_internal::MetaDataBase *metaDataBase = qobject_cast<qdesigner_internal::MetaDataBase *>(core->metaDataBase())) {
       
   103         qdesigner_internal::MetaDataBaseItem *item = metaDataBase->metaDataBaseItem(o);
       
   104         Q_ASSERT(item);
       
   105         item->setFakeSlots(slotList);
       
   106         item->setFakeSignals(signalList);
       
   107     }
       
   108 }
       
   109 
       
   110 static void existingMethodsFromMemberSheet(QDesignerFormEditorInterface *core,
       
   111                                            QObject *o,
       
   112                                            QStringList &slotList, QStringList &signalList)
       
   113 {
       
   114     slotList.clear();
       
   115     signalList.clear();
       
   116 
       
   117     QDesignerMemberSheetExtension *msheet = qt_extension<QDesignerMemberSheetExtension*>(core->extensionManager(), o);
       
   118     if (!msheet)
       
   119         return;
       
   120 
       
   121     for (int i = 0, count = msheet->count(); i < count; ++i)
       
   122         if (msheet->isVisible(i)) {
       
   123             if (msheet->isSlot(i))
       
   124                 slotList += msheet->signature(i);
       
   125             else
       
   126                 if (msheet->isSignal(i))
       
   127                     signalList += msheet->signature(i);
       
   128         }
       
   129 }
       
   130 
       
   131 namespace {
       
   132     // Internal helper class: A Delegate that validates using RegExps and additionally checks
       
   133     // on closing (adds missing parentheses).
       
   134     class SignatureDelegate : public QItemDelegate {
       
   135     public:
       
   136         SignatureDelegate(QObject * parent = 0);
       
   137         virtual QWidget * createEditor (QWidget * parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const;
       
   138         virtual void setModelData (QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
       
   139 
       
   140     private:
       
   141         const QRegExp m_signatureRegexp;
       
   142         const QRegExp m_methodNameRegexp;
       
   143     };
       
   144 
       
   145     SignatureDelegate::SignatureDelegate(QObject * parent) :
       
   146         QItemDelegate(parent),
       
   147         m_signatureRegexp(QLatin1String(signatureRegExp)),
       
   148         m_methodNameRegexp(QLatin1String(methodNameRegExp))
       
   149     {
       
   150         Q_ASSERT(m_signatureRegexp.isValid());
       
   151         Q_ASSERT(m_methodNameRegexp.isValid());
       
   152     }
       
   153 
       
   154     QWidget * SignatureDelegate::createEditor ( QWidget * parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const
       
   155     {
       
   156         QWidget *rc = QItemDelegate::createEditor(parent, option, index);
       
   157         QLineEdit *le = qobject_cast<QLineEdit *>(rc);
       
   158         Q_ASSERT(le);
       
   159         le->setValidator(new QRegExpValidator(m_signatureRegexp, le));
       
   160         return rc;
       
   161     }
       
   162 
       
   163     void SignatureDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
       
   164     {
       
   165         QLineEdit *le = qobject_cast<QLineEdit *>(editor);
       
   166         Q_ASSERT(le);
       
   167         // Did the user just type a name? .. Add parentheses
       
   168         QString signature = le->text();
       
   169         if (!m_signatureRegexp.exactMatch(signature )) {
       
   170             if (m_methodNameRegexp.exactMatch(signature )) {
       
   171                 signature += QLatin1String("()");
       
   172                 le->setText(signature);
       
   173             } else {
       
   174                 return;
       
   175             }
       
   176         }
       
   177         QItemDelegate::setModelData(editor, model, index);
       
   178     }
       
   179 
       
   180     // ------ FakeMethodMetaDBCommand: Undo Command to change fake methods in the meta DB.
       
   181     class FakeMethodMetaDBCommand : public qdesigner_internal::QDesignerFormWindowCommand {
       
   182 
       
   183     public:
       
   184         explicit FakeMethodMetaDBCommand(QDesignerFormWindowInterface *formWindow);
       
   185 
       
   186         void init(QObject *o,
       
   187                   const QStringList &oldFakeSlots, const QStringList &oldFakeSignals,
       
   188                   const QStringList &newFakeSlots, const QStringList &newFakeSignals);
       
   189 
       
   190         virtual void undo() { fakeMethodsToMetaDataBase(core(), m_object, m_oldFakeSlots, m_oldFakeSignals); }
       
   191         virtual void redo() { fakeMethodsToMetaDataBase(core(), m_object, m_newFakeSlots, m_newFakeSignals); }
       
   192 
       
   193     private:
       
   194         QObject *m_object;
       
   195         QStringList m_oldFakeSlots;
       
   196         QStringList m_oldFakeSignals;
       
   197         QStringList m_newFakeSlots;
       
   198         QStringList m_newFakeSignals;
       
   199     };
       
   200 
       
   201     FakeMethodMetaDBCommand::FakeMethodMetaDBCommand(QDesignerFormWindowInterface *formWindow) :
       
   202         qdesigner_internal::QDesignerFormWindowCommand(QApplication::translate("Command", "Change signals/slots"), formWindow),
       
   203         m_object(0)
       
   204      {
       
   205      }
       
   206 
       
   207     void FakeMethodMetaDBCommand::init(QObject *o,
       
   208                                        const QStringList &oldFakeSlots, const QStringList &oldFakeSignals,
       
   209                                        const QStringList &newFakeSlots, const QStringList &newFakeSignals)
       
   210     {
       
   211         m_object = o;
       
   212         m_oldFakeSlots   = oldFakeSlots;
       
   213         m_oldFakeSignals = oldFakeSignals;
       
   214         m_newFakeSlots   = newFakeSlots;
       
   215         m_newFakeSignals = newFakeSignals;
       
   216     }
       
   217 }
       
   218 
       
   219 namespace qdesigner_internal {
       
   220 
       
   221 //  ------ SignalSlotDialogData
       
   222 void SignalSlotDialogData::clear()
       
   223 {
       
   224     m_existingMethods.clear();
       
   225     m_fakeMethods.clear();
       
   226 }
       
   227 
       
   228 // ------ SignatureModel
       
   229 SignatureModel::SignatureModel(QObject *parent) :
       
   230      QStandardItemModel(parent)
       
   231 {
       
   232 }
       
   233 
       
   234 bool SignatureModel::setData(const QModelIndex &index, const QVariant &value, int role)
       
   235 {
       
   236     if (role != Qt::EditRole)
       
   237         return QStandardItemModel::setData(index, value, role);
       
   238     // check via signal (unless it is the same), in which case we can't be bothered.
       
   239     const QStandardItem *item = itemFromIndex(index);
       
   240     Q_ASSERT(item);
       
   241     const QString signature = value.toString();
       
   242     if (item->text() == signature)
       
   243         return true;
       
   244 
       
   245     bool ok = true;
       
   246     emit checkSignature(signature, &ok);
       
   247     if (!ok)
       
   248         return false;
       
   249 
       
   250     return QStandardItemModel::setData(index, value, role);
       
   251 }
       
   252 
       
   253 // ------ SignaturePanel
       
   254 SignaturePanel::SignaturePanel(QObject *parent, QListView *listView, QToolButton *addButton, QToolButton *removeButton, const QString &newPrefix) :
       
   255     QObject(parent),
       
   256     m_newPrefix(newPrefix),
       
   257     m_model(new SignatureModel(this)),
       
   258     m_listView(listView),
       
   259     m_removeButton(removeButton)
       
   260 {
       
   261     m_removeButton->setEnabled(false);
       
   262 
       
   263     connect(addButton, SIGNAL(clicked()), this, SLOT(slotAdd()));
       
   264     connect(m_removeButton, SIGNAL(clicked()), this, SLOT(slotRemove()));
       
   265 
       
   266     m_listView->setModel(m_model);
       
   267     SignatureDelegate *delegate = new SignatureDelegate(this);
       
   268     m_listView->setItemDelegate(delegate);
       
   269     connect(m_model, SIGNAL(checkSignature(QString,bool*)), this, SIGNAL(checkSignature(QString,bool*)));
       
   270 
       
   271     connect(m_listView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
       
   272             this, SLOT(slotSelectionChanged(QItemSelection, QItemSelection)));
       
   273 }
       
   274 
       
   275 void SignaturePanel::slotAdd()
       
   276 {
       
   277     m_listView->selectionModel()->clearSelection();
       
   278     // find unique name
       
   279     for (int i = 1; ; i++) {
       
   280         QString newSlot = m_newPrefix;
       
   281         newSlot += QString::number(i); // Always add number, Avoid setting 'slot' for first entry
       
   282         newSlot += QLatin1Char('(');
       
   283         // check for function name independent of parameters
       
   284         if (m_model->findItems(newSlot, Qt::MatchStartsWith, 0).empty()) {
       
   285             newSlot += QLatin1Char(')');
       
   286             QStandardItem * item = createEditableItem(newSlot);
       
   287             m_model->appendRow(item);
       
   288             const  QModelIndex index = m_model->indexFromItem (item);
       
   289             m_listView->setCurrentIndex (index);
       
   290             m_listView->edit(index);
       
   291             return;
       
   292         }
       
   293     }
       
   294 }
       
   295 
       
   296 int SignaturePanel::count(const QString &signature) const
       
   297 {
       
   298     return m_model->findItems(signature).size();
       
   299 }
       
   300 
       
   301 void SignaturePanel::slotRemove()
       
   302 {
       
   303     const QModelIndexList selectedIndexes = m_listView->selectionModel()->selectedIndexes ();
       
   304     if (selectedIndexes.empty())
       
   305         return;
       
   306 
       
   307     closeEditor();
       
   308     // scroll to previous
       
   309     if (const int row = selectedIndexes.front().row())
       
   310         m_listView->setCurrentIndex (selectedIndexes.front().sibling(row - 1, 0));
       
   311 
       
   312     for (int  i = selectedIndexes.size() - 1; i >= 0; i--)
       
   313         qDeleteAll(m_model->takeRow(selectedIndexes[i].row()));
       
   314 }
       
   315 
       
   316 void SignaturePanel::slotSelectionChanged(const QItemSelection &selected, const QItemSelection &)
       
   317 {
       
   318     m_removeButton->setEnabled(!selected.indexes().empty());
       
   319 }
       
   320 
       
   321 void SignaturePanel::setData(const SignalSlotDialogData &d)
       
   322 {
       
   323     m_model->clear();
       
   324 
       
   325     QStandardItem *lastExisting = 0;
       
   326     foreach(const QString &s, d.m_existingMethods) {
       
   327         lastExisting = createDisabledItem(s);
       
   328         m_model->appendRow(lastExisting);
       
   329     }
       
   330     foreach(const QString &s, d.m_fakeMethods)
       
   331         m_model->appendRow(createEditableItem(s));
       
   332     if (lastExisting)
       
   333         m_listView->scrollTo(m_model->indexFromItem(lastExisting));
       
   334 }
       
   335 
       
   336 QStringList SignaturePanel::fakeMethods() const
       
   337 {
       
   338     QStringList rc;
       
   339     if (const int rowCount = m_model->rowCount())
       
   340         for (int  i = 0; i < rowCount; i++) {
       
   341             const QStandardItem *item =  m_model->item(i);
       
   342             if (item->flags() & Qt::ItemIsEditable)
       
   343                 rc += item->text();
       
   344         }
       
   345     return rc;
       
   346 }
       
   347 
       
   348 void SignaturePanel::closeEditor()
       
   349 {
       
   350     const QModelIndex idx = m_listView->currentIndex();
       
   351     if (idx.isValid())
       
   352         m_listView->closePersistentEditor(idx);
       
   353 }
       
   354 
       
   355 // ------ SignalSlotDialog
       
   356 
       
   357 SignalSlotDialog::SignalSlotDialog(QDesignerDialogGuiInterface *dialogGui, QWidget *parent, FocusMode mode) :
       
   358     QDialog(parent),
       
   359     m_focusMode(mode),
       
   360     m_ui(new Ui::SignalSlotDialogClass),
       
   361     m_dialogGui(dialogGui)
       
   362 {
       
   363     setModal(true);
       
   364     m_ui->setupUi(this);
       
   365 
       
   366     const QIcon plusIcon = qdesigner_internal::createIconSet(QString::fromUtf8("plus.png"));
       
   367     const QIcon minusIcon = qdesigner_internal::createIconSet(QString::fromUtf8("minus.png"));
       
   368     m_ui->addSlotButton->setIcon(plusIcon);
       
   369     m_ui->removeSlotButton->setIcon(minusIcon);
       
   370     m_ui->addSignalButton->setIcon(plusIcon);
       
   371     m_ui->removeSignalButton->setIcon(minusIcon);
       
   372 
       
   373     m_slotPanel = new SignaturePanel(this, m_ui->slotListView, m_ui->addSlotButton, m_ui->removeSlotButton, QLatin1String("slot"));
       
   374     m_signalPanel = new SignaturePanel(this, m_ui->signalListView, m_ui->addSignalButton, m_ui->removeSignalButton, QLatin1String("signal"));
       
   375     connect(m_slotPanel,   SIGNAL(checkSignature(QString,bool*)), this, SLOT(slotCheckSignature(QString,bool*)));
       
   376     connect(m_signalPanel, SIGNAL(checkSignature(QString,bool*)), this, SLOT(slotCheckSignature(QString,bool*)));
       
   377 
       
   378     connect(m_ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
       
   379     connect(m_ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
       
   380 
       
   381     switch(m_focusMode) {
       
   382     case FocusSlots:
       
   383         m_ui->slotListView->setFocus(Qt::OtherFocusReason);
       
   384         break;
       
   385     case  FocusSignals:
       
   386         m_ui->signalListView->setFocus(Qt::OtherFocusReason);
       
   387         break;
       
   388     }
       
   389 }
       
   390 
       
   391 SignalSlotDialog::~SignalSlotDialog()
       
   392 {
       
   393     delete m_ui;
       
   394 }
       
   395 
       
   396 void SignalSlotDialog::slotCheckSignature(const QString &signature, bool *ok)
       
   397 {
       
   398     QString errorMessage;
       
   399     do {
       
   400         if (m_slotPanel->count(signature)) {
       
   401             errorMessage = tr("There is already a slot with the signature '%1'.").arg(signature);
       
   402             *ok = false;
       
   403             break;
       
   404         }
       
   405         if (m_signalPanel->count(signature)) {
       
   406             errorMessage = tr("There is already a signal with the signature '%1'.").arg(signature);
       
   407             *ok = false;
       
   408             break;
       
   409         }
       
   410     } while (false);
       
   411     if (!*ok)
       
   412         m_dialogGui->message(this, QDesignerDialogGuiInterface::SignalSlotDialogMessage,
       
   413                              QMessageBox::Warning, tr("%1 - Duplicate Signature").arg(windowTitle()), errorMessage, QMessageBox::Close);
       
   414 }
       
   415 
       
   416 QDialog::DialogCode SignalSlotDialog::showDialog(SignalSlotDialogData &slotData, SignalSlotDialogData &signalData)
       
   417 {
       
   418     m_slotPanel->setData(slotData);
       
   419     m_signalPanel->setData(signalData);
       
   420 
       
   421     const DialogCode rc = static_cast<DialogCode>(exec());
       
   422     if (rc == Rejected)
       
   423         return rc;
       
   424 
       
   425     slotData.m_fakeMethods   = m_slotPanel->fakeMethods();
       
   426     signalData.m_fakeMethods = m_signalPanel->fakeMethods();
       
   427     return rc;
       
   428 }
       
   429 
       
   430 bool SignalSlotDialog::editMetaDataBase(QDesignerFormWindowInterface *fw, QObject *object, QWidget *parent, FocusMode mode)
       
   431 {
       
   432     QDesignerFormEditorInterface *core = fw->core();
       
   433     SignalSlotDialog dlg(core->dialogGui(), parent, mode);
       
   434     dlg.setWindowTitle(tr("Signals/Slots of %1").arg(object->objectName()));
       
   435 
       
   436     SignalSlotDialogData slotData;
       
   437     SignalSlotDialogData signalData;
       
   438 
       
   439     existingMethodsFromMemberSheet(core, object, slotData.m_existingMethods, signalData.m_existingMethods);
       
   440     fakeMethodsFromMetaDataBase(core, object, slotData.m_fakeMethods, signalData.m_fakeMethods);
       
   441 
       
   442     const QStringList oldSlots =  slotData.m_fakeMethods;
       
   443     const QStringList oldSignals = signalData.m_fakeMethods;
       
   444 
       
   445     if (dlg.showDialog(slotData, signalData) == QDialog::Rejected)
       
   446         return false;
       
   447 
       
   448     if (oldSlots == slotData.m_fakeMethods && oldSignals == signalData.m_fakeMethods)
       
   449         return false;
       
   450 
       
   451     FakeMethodMetaDBCommand *cmd = new FakeMethodMetaDBCommand(fw);
       
   452     cmd->init(object, oldSlots, oldSignals, slotData.m_fakeMethods, signalData.m_fakeMethods);
       
   453     fw->commandHistory()->push(cmd);
       
   454     return true;
       
   455 }
       
   456 
       
   457 bool SignalSlotDialog::editPromotedClass(QDesignerFormEditorInterface *core, const QString &promotedClassName, QWidget *parent, FocusMode mode)
       
   458 {
       
   459     const int index = core->widgetDataBase()->indexOfClassName(promotedClassName);
       
   460     if (index == -1)
       
   461         return false;
       
   462 
       
   463     const QString baseClassName = core->widgetDataBase()->item(index)->extends();
       
   464     if (baseClassName.isEmpty())
       
   465         return false;
       
   466 
       
   467     QWidget *widget = core->widgetFactory()->createWidget(baseClassName, 0);
       
   468     if (!widget)
       
   469         return false;
       
   470     const bool rc = editPromotedClass(core, promotedClassName, widget, parent, mode);
       
   471     widget->deleteLater();
       
   472     return rc;
       
   473 }
       
   474 
       
   475 bool SignalSlotDialog::editPromotedClass(QDesignerFormEditorInterface *core, QObject *baseObject, QWidget *parent, FocusMode mode)
       
   476 {
       
   477     if (!baseObject->isWidgetType())
       
   478         return false;
       
   479 
       
   480     const QString promotedClassName = promotedCustomClassName(core, qobject_cast<QWidget*>(baseObject));
       
   481     if (promotedClassName.isEmpty())
       
   482         return false;
       
   483     return  editPromotedClass(core, promotedClassName, baseObject, parent, mode);
       
   484 }
       
   485 
       
   486 
       
   487 bool SignalSlotDialog::editPromotedClass(QDesignerFormEditorInterface *core, const QString &promotedClassName, QObject *object, QWidget *parent, FocusMode mode)
       
   488 {
       
   489     WidgetDataBase *db = qobject_cast<WidgetDataBase *>(core->widgetDataBase());
       
   490     if (!db)
       
   491         return false;
       
   492 
       
   493     const int index = core->widgetDataBase()->indexOfClassName(promotedClassName);
       
   494     if (index == -1)
       
   495         return false;
       
   496 
       
   497     WidgetDataBaseItem* item = static_cast<WidgetDataBaseItem*>(db->item(index));
       
   498 
       
   499     SignalSlotDialogData slotData;
       
   500     SignalSlotDialogData signalData;
       
   501 
       
   502     existingMethodsFromMemberSheet(core, object, slotData.m_existingMethods, signalData.m_existingMethods);
       
   503     slotData.m_fakeMethods = item->fakeSlots();
       
   504     signalData.m_fakeMethods = item->fakeSignals();
       
   505 
       
   506     const QStringList oldSlots =  slotData.m_fakeMethods;
       
   507     const QStringList oldSignals = signalData.m_fakeMethods;
       
   508 
       
   509     SignalSlotDialog dlg(core->dialogGui(), parent, mode);
       
   510     dlg.setWindowTitle(tr("Signals/Slots of %1").arg(promotedClassName));
       
   511 
       
   512     if (dlg.showDialog(slotData, signalData) == QDialog::Rejected)
       
   513         return false;
       
   514 
       
   515     if (oldSlots == slotData.m_fakeMethods && oldSignals == signalData.m_fakeMethods)
       
   516         return false;
       
   517 
       
   518     item->setFakeSlots(slotData.m_fakeMethods);
       
   519     item->setFakeSignals(signalData.m_fakeMethods);
       
   520 
       
   521     return true;
       
   522 }
       
   523 
       
   524 }
       
   525 
       
   526 QT_END_NAMESPACE