blob: 8775a3b4b1fd050afc3a91a825099f2045e3c685 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2011 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$
** GNU Lesser General Public License Usage
** 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.
**
** 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $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