/**************************************************************************** ** ** 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 "qdesigneraxwidget.h" #include #include #include #include #include #include #include #include enum { debugAxWidget = 0 }; QT_BEGIN_NAMESPACE /* XPM */ const char *widgetIconXPM[]={ "22 22 6 1", "a c #000000", "# c #808080", "+ c #aaa5a0", "b c #dddddd", "* c #d4d0c8", ". c none", ".........#aa#...#aa#..", ".........abba...abba..", ".........abba...abba..", ".........#aa#...#aa#..", "..........aa.....aa...", "..........aa.....aa...", "..........aa.....aa...", ".......aaaaaaaaaaaaaaa", ".......a*************a", ".......a************#a", ".......a***********+#a", ".......a***********+#a", ".......a***********+#a", "#aa#...a***********+#a", "abbaaaaa***********+#a", "abbaaaaa***********+#a", "#aa#...a***********+#a", ".......a***********+#a", ".......a***********+#a", ".......a**++++++++++#a", ".......a*############a", ".......aaaaaaaaaaaaaaa"}; QDesignerAxWidget::QDesignerAxWidget(QWidget *parent) : QWidget(parent), m_defaultSize(80, 70), m_drawFlags(DrawIndicator|DrawFrame|DrawControl), m_axobject(0), m_axImage(widgetIcon()) { } QDesignerAxWidget::~QDesignerAxWidget() { delete m_axobject; } QPixmap QDesignerAxWidget::widgetIcon() { return QPixmap(widgetIconXPM); } QString QDesignerAxWidget::control() const { if (m_axobject) return m_axobject->control(); return QString(); } void QDesignerAxWidget::setControl(const QString &clsid) { if (clsid == control()) return; if (clsid.isEmpty()) { resetControl(); } else { loadControl(clsid); } } void QDesignerAxWidget::resetControl() { if (!m_axobject) return; delete m_axobject; m_axobject = 0; update(); } bool QDesignerAxWidget::loadControl(const QString &clsid) { if (clsid.isEmpty()) return false; if (m_axobject) resetControl(); m_axobject = new QAxWidget(); if (!m_axobject->setControl(clsid)) { delete m_axobject; m_axobject = 0; return false; } update(); return true; } QSize QDesignerAxWidget::sizeHint() const { if (m_axobject) return m_axobject->sizeHint(); return m_defaultSize; } QSize QDesignerAxWidget::minimumSizeHint() const { if (m_axobject) return m_axobject->minimumSizeHint(); return QWidget::minimumSizeHint(); } void QDesignerAxWidget::paintEvent(QPaintEvent * /*event */) { QPainter p(this); const QRect r = contentsRect(); const int contentsWidth = r.width(); const int contentsHeight= r.height(); if (m_axobject) { // QAxWidget has no concept of sizeHint() if (m_drawFlags & DrawControl) { m_axobject->resize(size()); m_axobject->render(&p); } if (m_drawFlags & DrawIndicator) { static const QString loaded = tr("Control loaded"); QColor patternColor(Qt::green); if (m_drawFlags & DrawControl) patternColor.setAlpha(80); p.setBrush(QBrush(patternColor, Qt::BDiagPattern)); p.setPen(Qt::black); if (r.height() > 5) p.drawText(5,contentsHeight - 5, loaded); } } if (m_drawFlags & DrawFrame) { p.drawRect(r.adjusted(0, 0, -1, -1)); } if (m_drawFlags & DrawIndicator) { if (contentsWidth > m_axImage.width() && contentsHeight > m_axImage.height()) p.drawPixmap((contentsWidth - m_axImage.width()) / 2, (contentsHeight-m_axImage.height()) / 2, m_axImage); } } // --------- QDesignerAxPluginWidget QDesignerAxPluginWidget::QDesignerAxPluginWidget(QWidget *parent) : QDesignerAxWidget(parent) { } QDesignerAxPluginWidget::~QDesignerAxPluginWidget() { } const QMetaObject *QDesignerAxPluginWidget::metaObject() const { if (const QAxWidget *aw = axobject()) return aw->metaObject(); return QDesignerAxWidget::metaObject(); } static QString msgComException(const QObject *o, const QMetaObject::Call call, int index) { return QDesignerAxWidget::tr("A COM exception occurred when executing a meta call of type %1, index %2 of \"%3\"."). arg(call).arg(index).arg(o->objectName()); } int QDesignerAxPluginWidget::qt_metacall(QMetaObject::Call call, int signal, void **argv) { QAxWidget *aw = axobject(); if (!aw) return QDesignerAxWidget::qt_metacall(call,signal,argv); const QMetaObject *mo = metaObject(); // Have base class handle inherited stuff (geometry, enabled...) const bool inherited = call == QMetaObject::InvokeMetaMethod ? (signal < mo->methodOffset()) : (signal < mo->propertyOffset()); if (inherited) return QDesignerAxWidget::qt_metacall(call, signal, argv); int rc = -1; #ifndef QT_NO_EXCEPTIONS try { #endif if (debugAxWidget) if (call != QMetaObject::InvokeMetaMethod) qDebug() << objectName() << call << signal << mo->property(signal).name(); switch (call) { case QMetaObject::QueryPropertyStored: // Pretend all changed properties are stored for them to be saved if (m_propValues.contains(signal)) if (argv[0]) *reinterpret_cast< bool*>(argv[0]) = true; break; case QMetaObject::ResetProperty: rc = aw->qt_metacall(call, signal, argv); update(); m_propValues.remove(signal); break; case QMetaObject::WriteProperty: rc = aw->qt_metacall(call, signal, argv); update(); m_propValues.insert(signal, true); break; default: rc = aw->qt_metacall(call, signal, argv); break; } #ifndef QT_NO_EXCEPTIONS } catch(...) { qWarning(msgComException(this, call, signal).toUtf8()); } #endif return rc; } QT_END_NAMESPACE