diff options
Diffstat (limited to 'tools/designer/src/plugins/activeqt/qaxwidgetpropertysheet.cpp')
-rw-r--r-- | tools/designer/src/plugins/activeqt/qaxwidgetpropertysheet.cpp | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/tools/designer/src/plugins/activeqt/qaxwidgetpropertysheet.cpp b/tools/designer/src/plugins/activeqt/qaxwidgetpropertysheet.cpp new file mode 100644 index 0000000..f94da88 --- /dev/null +++ b/tools/designer/src/plugins/activeqt/qaxwidgetpropertysheet.cpp @@ -0,0 +1,189 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (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 either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** 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.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qaxwidgetpropertysheet.h" +#include "qdesigneraxwidget.h" + +#include <QtDesigner/QDesignerMemberSheetExtension> +#include <QtDesigner/QDesignerFormWindowInterface> +#include <QtDesigner/QDesignerFormEditorInterface> +#include <QtDesigner/QDesignerPropertyEditorInterface> + +#include <QtDesigner/QExtensionManager> +#include <QtCore/QDebug> +#include <QtCore/QTimer> + +static const char *geometryPropertyC = "geometry"; + +QT_BEGIN_NAMESPACE + +const char *QAxWidgetPropertySheet::controlPropertyName = "control"; + +QAxWidgetPropertySheet::QAxWidgetPropertySheet(QDesignerAxWidget *object, QObject *parent) : + QDesignerPropertySheet(object, parent), + m_controlProperty(controlPropertyName), + m_propertyGroup(QLatin1String("QAxWidget")) +{ + if (!axWidget()->loaded()) { // For some obscure reason.... + const int controlIndex = QDesignerPropertySheet::indexOf(m_controlProperty); + setPropertyGroup(controlIndex, m_propertyGroup); + } +} + +bool QAxWidgetPropertySheet::isEnabled(int index) const +{ + if (propertyName(index) == m_controlProperty) + return false; + return QDesignerPropertySheet::isEnabled(index); +} + +bool QAxWidgetPropertySheet::dynamicPropertiesAllowed() const +{ + return false; +} + +QDesignerAxWidget *QAxWidgetPropertySheet::axWidget() const +{ + return static_cast<QDesignerAxWidget*>(object()); +} + +// Reload as the meta object changes. +bool QAxWidgetPropertySheet::reset(int index) +{ + const QString name = propertyName(index); + QMap<QString, QVariant>::iterator it = m_currentProperties.changedProperties.find(name); + if (it != m_currentProperties.changedProperties.end()) + m_currentProperties.changedProperties.erase(it); + if (name != m_controlProperty) + return QDesignerPropertySheet::reset(index); + axWidget()->resetControl(); + QTimer::singleShot(0, this, SLOT(updatePropertySheet())); + return true; +} + +void QAxWidgetPropertySheet::setProperty(int index, const QVariant &value) +{ + + // take care of all changed properties + const QString name = propertyName(index); + m_currentProperties.changedProperties[name] = value; + if (name != m_controlProperty) { + QDesignerPropertySheet::setProperty(index, value); + return; + } + // Loading forms: Reload + if (name == m_controlProperty) { + const QString clsid = value.toString(); + if (clsid.isEmpty() || !axWidget()->loadControl(clsid)) + reset(index); + else + QTimer::singleShot(100, this, SLOT(updatePropertySheet())); + } +} + +int QAxWidgetPropertySheet::indexOf(const QString &name) const +{ + const int index = QDesignerPropertySheet::indexOf(name); + if (index != -1) + return index; + // Loading before recreation of sheet in timer slot: Add a fake property to store the value + const QVariant dummValue(0); + QAxWidgetPropertySheet *that = const_cast<QAxWidgetPropertySheet *>(this); + const int newIndex = that->createFakeProperty(name, dummValue); + that->setPropertyGroup(newIndex, m_propertyGroup); + return newIndex; +} + +void QAxWidgetPropertySheet::updatePropertySheet() +{ + // refresh the property sheet (we are deleting m_currentProperties) + struct SavedProperties tmp = m_currentProperties; + QDesignerAxWidget *axw = axWidget(); + QDesignerFormWindowInterface *formWin = QDesignerFormWindowInterface::findFormWindow(axw); + Q_ASSERT(formWin != 0); + tmp.widget = axw; + tmp.clsid = axw->control(); + // Delete the sheets as they cache the meta object and other information + delete this; + delete qt_extension<QDesignerMemberSheetExtension *>(formWin->core()->extensionManager(), axw); + reloadPropertySheet(tmp, formWin); +} + +void QAxWidgetPropertySheet::reloadPropertySheet(const struct SavedProperties &properties, QDesignerFormWindowInterface *formWin) +{ + QDesignerFormEditorInterface *core = formWin->core(); + //Recreation of the property sheet + QDesignerPropertySheetExtension *sheet = qt_extension<QDesignerPropertySheetExtension *>(core->extensionManager(), properties.widget); + + bool foundGeometry = false; + const QString geometryProperty = QLatin1String(geometryPropertyC); + const SavedProperties::NamePropertyMap::const_iterator cend = properties.changedProperties.constEnd(); + for (SavedProperties::NamePropertyMap::const_iterator i = properties.changedProperties.constBegin(); i != cend; ++i) { + const QString name = i.key(); + const int index = sheet->indexOf(name); + if (index == -1) + continue; + // filter out geometry as this will resize the control + // to is default size even if it is attached to an layout + // but set the changed flag to work around preview bug... + if (name == geometryProperty) { + sheet->setChanged(index, true); + foundGeometry = true; + continue; + } + if (name == QLatin1String(controlPropertyName)) { + sheet->setChanged(index, !i.value().toString().isEmpty()); + continue; + } + sheet->setChanged(index, true); + sheet->setProperty(index, i.value()); + } + + if (!foundGeometry) // Make sure geometry is always changed in Designer + sheet->setChanged(sheet->indexOf(geometryProperty), true); + + if (core->propertyEditor()->object() == properties.widget) { + formWin->clearSelection(true); + formWin->selectWidget(properties.widget); + } +} + +QT_END_NAMESPACE |