tools/designer/src/components/signalsloteditor/connectdialog.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/designer/src/components/signalsloteditor/connectdialog.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,335 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "connectdialog_p.h"
+#include "signalslot_utils_p.h"
+
+#include <signalslotdialog_p.h>
+#include <metadatabase_p.h>
+
+#include <QtDesigner/QDesignerFormWindowInterface>
+#include <QtDesigner/QDesignerFormEditorInterface>
+#include <QtDesigner/QDesignerWidgetDataBaseInterface>
+#include <QtDesigner/QExtensionManager>
+#include <QtDesigner/QDesignerLanguageExtension>
+
+#include <QtGui/QPushButton>
+
+QT_BEGIN_NAMESPACE
+
+namespace {
+    typedef QList<QListWidgetItem*> ListWidgetItems;
+}
+
+static QString realClassName(QDesignerFormEditorInterface *core, QWidget *widget)
+{
+    QString class_name = QLatin1String(widget->metaObject()->className());
+    const QDesignerWidgetDataBaseInterface *wdb = core->widgetDataBase();
+    const int idx = wdb->indexOfObject(widget);
+    if (idx != -1)
+        class_name = wdb->item(idx)->name();
+    return class_name;
+}
+
+static QString widgetLabel(QDesignerFormEditorInterface *core, QWidget *widget)
+{
+    return QString::fromUtf8("%1 (%2)")
+            .arg(qdesigner_internal::realObjectName(core, widget))
+            .arg(realClassName(core, widget));
+}
+
+namespace qdesigner_internal {
+
+ConnectDialog::ConnectDialog(QDesignerFormWindowInterface *formWindow,
+                             QWidget *source, QWidget *destination,
+                             QWidget *parent) :
+    QDialog(parent),
+    m_source(source),
+    m_destination(destination),
+    m_sourceMode(widgetMode(m_source, formWindow)),
+    m_destinationMode(widgetMode(m_destination, formWindow)),
+    m_formWindow(formWindow)
+{
+    m_ui.setupUi(this);
+
+    setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
+
+    connect(m_ui.signalList, SIGNAL(itemClicked(QListWidgetItem*)),
+            this, SLOT(selectSignal(QListWidgetItem*)));
+    connect(m_ui.slotList, SIGNAL(itemClicked(QListWidgetItem*)),
+            this,  SLOT(selectSlot(QListWidgetItem*)));
+    m_ui.slotList->setEnabled(false);
+
+    QPushButton *ok_button = okButton();
+    ok_button->setDefault(true);
+    ok_button->setEnabled(false);
+
+    connect(m_ui.showAllCheckBox, SIGNAL(toggled(bool)), this, SLOT(populateLists()));
+
+    QDesignerFormEditorInterface *core = m_formWindow->core();
+    m_ui.signalGroupBox->setTitle(widgetLabel(core, source));
+    m_ui.slotGroupBox->setTitle(widgetLabel(core, destination));
+
+    m_ui.editSignalsButton->setEnabled(m_sourceMode != NormalWidget);
+    connect(m_ui.editSignalsButton, SIGNAL(clicked()), this, SLOT(editSignals()));
+
+    m_ui.editSlotsButton->setEnabled(m_destinationMode != NormalWidget);
+    connect(m_ui.editSlotsButton,   SIGNAL(clicked()), this, SLOT(editSlots()));
+
+    populateLists();
+}
+
+ConnectDialog::WidgetMode ConnectDialog::widgetMode(QWidget *w,  QDesignerFormWindowInterface *formWindow)
+{
+    QDesignerFormEditorInterface *core = formWindow->core();
+    if (qt_extension<QDesignerLanguageExtension*>(core->extensionManager(), core))
+        return NormalWidget;
+
+    if (w == formWindow || formWindow->mainContainer() == w)
+        return MainContainer;
+
+    if (isPromoted(formWindow->core(), w))
+        return PromotedWidget;
+
+    return NormalWidget;
+}
+
+QPushButton *ConnectDialog::okButton()
+{
+    return m_ui.buttonBox->button(QDialogButtonBox::Ok);
+}
+
+void ConnectDialog::setOkButtonEnabled(bool e)
+{
+    okButton()->setEnabled(e);
+}
+
+void ConnectDialog::populateLists()
+{
+    populateSignalList();
+}
+
+void ConnectDialog::setSignalSlot(const QString &signal, const QString &slot)
+{
+    ListWidgetItems sigItems = m_ui.signalList->findItems(signal, Qt::MatchExactly);
+
+    if (sigItems.empty()) {
+        m_ui.showAllCheckBox->setChecked(true);
+        sigItems = m_ui.signalList->findItems(signal, Qt::MatchExactly);
+    }
+
+    if (!sigItems.empty()) {
+        selectSignal(sigItems.front());
+        ListWidgetItems slotItems = m_ui.slotList->findItems(slot, Qt::MatchExactly);
+        if (slotItems.empty()) {
+            m_ui.showAllCheckBox->setChecked(true);
+            slotItems = m_ui.slotList->findItems(slot, Qt::MatchExactly);
+        }
+        if (!slotItems.empty())
+            selectSlot(slotItems.front());
+    }
+}
+
+bool ConnectDialog::showAllSignalsSlots() const
+{
+    return m_ui.showAllCheckBox->isChecked();
+}
+
+void ConnectDialog::setShowAllSignalsSlots(bool showIt)
+{
+    m_ui.showAllCheckBox->setChecked(showIt);
+}
+
+void ConnectDialog::selectSignal(QListWidgetItem *item)
+{
+    if (item) {
+        m_ui.signalList->setCurrentItem(item);
+        populateSlotList(item->text());
+        m_ui.slotList->setEnabled(true);
+        setOkButtonEnabled(!m_ui.slotList->selectedItems().isEmpty());
+    } else {
+        m_ui.signalList->clearSelection();
+        populateSlotList();
+        m_ui.slotList->setEnabled(false);
+        setOkButtonEnabled(false);
+    }
+}
+
+void ConnectDialog::selectSlot(QListWidgetItem *item)
+{
+    if (item) {
+        m_ui.slotList->setCurrentItem(item);
+    } else {
+        m_ui.slotList->clearSelection();
+    }
+    setOkButtonEnabled(true);
+}
+
+QString ConnectDialog::signal() const
+{
+    const ListWidgetItems item_list = m_ui.signalList->selectedItems();
+    if (item_list.size() != 1)
+        return QString();
+    return item_list.at(0)->text();
+}
+
+QString ConnectDialog::slot() const
+{
+    const ListWidgetItems item_list = m_ui.slotList->selectedItems();
+    if (item_list.size() != 1)
+        return QString();
+    return item_list.at(0)->text();
+}
+
+void ConnectDialog::populateSlotList(const QString &signal)
+{
+    QString selectedName;
+    if (const QListWidgetItem * item = m_ui.slotList->currentItem())
+        selectedName = item->text();
+
+    m_ui.slotList->clear();
+
+    QMap<QString, QString> memberToClassName = getMatchingSlots(m_formWindow->core(), m_destination, signal, showAllSignalsSlots());
+
+    QFont font = QApplication::font();
+    font.setItalic(true);
+    QVariant variantFont = qVariantFromValue(font);
+
+    QListWidgetItem *curr = 0;
+    QMap<QString, QString>::ConstIterator itMember = memberToClassName.constBegin();
+    const QMap<QString, QString>::ConstIterator itMemberEnd = memberToClassName.constEnd();
+    while (itMember != itMemberEnd) {
+        const QString member = itMember.key();
+        const bool qt3Slot = isQt3Slot(m_formWindow->core(), m_destination, member);
+
+        QListWidgetItem *item = new QListWidgetItem(m_ui.slotList);
+        item->setText(member);
+        if (member == selectedName)
+            curr = item;
+
+        if (qt3Slot) {
+            item->setData(Qt::FontRole, variantFont);
+            item->setData(Qt::ForegroundRole, Qt::red);
+        }
+        ++itMember;
+    }
+
+    if (curr)
+        m_ui.slotList->setCurrentItem(curr);
+
+    if (m_ui.slotList->selectedItems().isEmpty())
+        setOkButtonEnabled(false);
+}
+
+void ConnectDialog::populateSignalList()
+{
+    QString selectedName;
+    if (const QListWidgetItem *item = m_ui.signalList->currentItem())
+        selectedName = item->text();
+
+    m_ui.signalList->clear();
+
+    QMap<QString, QString> memberToClassName = getSignals(m_formWindow->core(), m_source, showAllSignalsSlots());
+
+    QFont font = QApplication::font();
+    font.setItalic(true);
+    QVariant variantFont = qVariantFromValue(font);
+
+    QListWidgetItem *curr = 0;
+    QMap<QString, QString>::ConstIterator itMember = memberToClassName.constBegin();
+    const QMap<QString, QString>::ConstIterator itMemberEnd = memberToClassName.constEnd();
+    while (itMember != itMemberEnd) {
+        const QString member = itMember.key();
+        const bool qt3Signal = isQt3Signal(m_formWindow->core(), m_source, member);
+
+        QListWidgetItem *item = new QListWidgetItem(m_ui.signalList);
+        item->setText(member);
+        if (!selectedName.isEmpty() && member == selectedName)
+            curr = item;
+
+        if (qt3Signal) {
+            item->setData(Qt::FontRole, variantFont);
+            item->setData(Qt::ForegroundRole, Qt::red);
+        }
+        ++itMember;
+    }
+
+    if (curr) {
+        m_ui.signalList->setCurrentItem(curr);
+    } else {
+        selectedName.clear();
+    }
+
+    populateSlotList(selectedName);
+    if (!curr)
+        m_ui.slotList->setEnabled(false);
+}
+
+void ConnectDialog::editSignals()
+{
+    editSignalsSlots(m_source, m_sourceMode, SignalSlotDialog::FocusSignals);
+}
+
+void ConnectDialog::editSlots()
+{
+    editSignalsSlots(m_destination, m_destinationMode, SignalSlotDialog::FocusSlots);
+}
+
+void ConnectDialog::editSignalsSlots(QWidget *w, WidgetMode mode, int signalSlotDialogModeInt)
+{
+    const SignalSlotDialog::FocusMode signalSlotDialogMode = static_cast<SignalSlotDialog::FocusMode>(signalSlotDialogModeInt);
+    switch (mode) {
+    case  NormalWidget:
+        break;
+    case MainContainer:
+        if (SignalSlotDialog::editMetaDataBase(m_formWindow, w, this, signalSlotDialogMode))
+            populateLists();
+        break;
+    case PromotedWidget:
+        if (SignalSlotDialog::editPromotedClass(m_formWindow->core(), w, this, signalSlotDialogMode))
+            populateLists();
+        break;
+    }
+}
+
+}
+
+QT_END_NAMESPACE