File indexing completed on 2024-12-08 12:23:09
0001 /* This file is part of the KDE libraries 0002 Copyright (C) 2005, 2006 Ian Reinhart Geiser <geiseri@kde.org> 0003 Copyright (C) 2005, 2006 Matt Broadstone <mbroadst@gmail.com> 0004 Copyright (C) 2005, 2006 Richard J. Moore <rich@kde.org> 0005 Copyright (C) 2005, 2006 Erik L. Bunce <kde@bunce.us> 0006 0007 This library is free software; you can redistribute it and/or 0008 modify it under the terms of the GNU Library General Public 0009 License as published by the Free Software Foundation; either 0010 version 2 of the License, or (at your option) any later version. 0011 0012 This library is distributed in the hope that it will be useful, 0013 but WITHOUT ANY WARRANTY; without even the implied warranty of 0014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0015 Library General Public License for more details. 0016 0017 You should have received a copy of the GNU Library General Public License 0018 along with this library; see the file COPYING.LIB. If not, write to 0019 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0020 Boston, MA 02110-1301, USA. 0021 */ 0022 #include "qwidget_binding.h" 0023 #include "static_binding.h" 0024 #include "qpainter_binding.h" 0025 #include "kjseglobal.h" 0026 0027 #include <kjs/object.h> 0028 #include <QDebug> 0029 0030 #include <QWidget> 0031 #include <QAction> 0032 #include <QLayout> 0033 #include <QtUiTools/QUiLoader> 0034 0035 #include <QFile> 0036 0037 namespace KJSEmbed 0038 { 0039 static QUiLoader *gUiLoader = nullptr; 0040 0041 QUiLoader *uiLoader() 0042 { 0043 if (gUiLoader == nullptr) { 0044 gUiLoader = new QUiLoader(); 0045 } 0046 return gUiLoader; 0047 } 0048 } 0049 0050 using namespace KJSEmbed; 0051 0052 namespace WidgetNS 0053 { 0054 0055 START_QOBJECT_METHOD(adjustSize, QWidget) 0056 object->adjustSize(); 0057 END_QOBJECT_METHOD 0058 START_QOBJECT_METHOD(grabMouse, QWidget) 0059 object->grabMouse(); 0060 END_QOBJECT_METHOD 0061 START_QOBJECT_METHOD(grabKeyboard, QWidget) 0062 object->grabKeyboard(); 0063 END_QOBJECT_METHOD 0064 START_QOBJECT_METHOD(releaseMouse, QWidget) 0065 object->releaseMouse(); 0066 END_QOBJECT_METHOD 0067 START_QOBJECT_METHOD(releaseKeyboard, QWidget) 0068 object->releaseKeyboard(); 0069 END_QOBJECT_METHOD 0070 START_QOBJECT_METHOD(childAt, QWidget) 0071 QPoint pt = KJSEmbed::extractVariant<QPoint>(exec, args, 0); 0072 int x, y; 0073 QWidget *child = nullptr; 0074 if (pt.isNull()) 0075 { 0076 x = KJSEmbed::extractVariant<int>(exec, args, 0); 0077 y = KJSEmbed::extractVariant<int>(exec, args, 1); 0078 child = object->childAt(x, y); 0079 } else 0080 { 0081 child = object->childAt(pt); 0082 } 0083 result = new QWidgetBinding(exec, child); 0084 END_QOBJECT_METHOD 0085 START_QOBJECT_METHOD(focusWidget, QWidget) 0086 result = KJSEmbed::createQObject(exec, object->focusWidget()); 0087 END_QOBJECT_METHOD 0088 START_QOBJECT_METHOD(heightForWidth, QWidget) 0089 // qDebug() << "heightForWidth() object=" << object << " imp=" << imp; 0090 int width = KJSEmbed::extractInt(exec, args, 0); 0091 result = KJS::jsNumber(object->heightForWidth(width)); 0092 END_QOBJECT_METHOD 0093 START_QOBJECT_METHOD(mapFrom, QWidget) 0094 QWidget *w = KJSEmbed::extractObject<QWidget>(exec, args, 0, nullptr); 0095 QPoint pt = KJSEmbed::extractVariant<QPoint>(exec, args, 1); 0096 result = KJSEmbed::createVariant(exec, "QPoint", object->mapFrom(w, pt)); 0097 END_QOBJECT_METHOD 0098 START_QOBJECT_METHOD(mapFromGlobal, QWidget) 0099 QPoint pt = KJSEmbed::extractVariant<QPoint>(exec, args, 0); 0100 result = KJSEmbed::createVariant(exec, "QPoint", object->mapFromGlobal(pt)); 0101 END_QOBJECT_METHOD 0102 START_QOBJECT_METHOD(mapFromParent, QWidget) 0103 QPoint pt = KJSEmbed::extractVariant<QPoint>(exec, args, 0); 0104 result = KJSEmbed::createVariant(exec, "QPoint", object->mapFromParent(pt)); 0105 END_QOBJECT_METHOD 0106 START_QOBJECT_METHOD(mapTo, QWidget) 0107 QWidget *w = KJSEmbed::extractObject<QWidget>(exec, args, 0, nullptr); 0108 QPoint pt = KJSEmbed::extractVariant<QPoint>(exec, args, 1); 0109 result = KJSEmbed::createVariant(exec, "QPoint", object->mapTo(w, pt)); 0110 END_QOBJECT_METHOD 0111 START_QOBJECT_METHOD(mapToParent, QWidget) 0112 QPoint pt = KJSEmbed::extractVariant<QPoint>(exec, args, 0); 0113 result = KJSEmbed::createVariant(exec, "QPoint", object->mapToParent(pt)); 0114 END_QOBJECT_METHOD 0115 START_QOBJECT_METHOD(mapToGlobal, QWidget) 0116 QPoint pt = KJSEmbed::extractVariant<QPoint>(exec, args, 0); 0117 result = KJSEmbed::createVariant(exec, "QPoint", object->mapToGlobal(pt)); 0118 END_QOBJECT_METHOD 0119 0120 } 0121 0122 START_METHOD_LUT(QWidgetBinding) 0123 {"adjustSize", 0, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::adjustSize}, 0124 {"grabMouse", 0, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::grabMouse}, 0125 {"grabKeyboard", 0, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::grabKeyboard}, 0126 {"releaseMouse", 0, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::releaseMouse}, 0127 {"releaseKeyboard", 0, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::releaseKeyboard}, 0128 {"childAt", 1, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::childAt}, 0129 {"focusWidget", 0, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::focusWidget}, 0130 {"heightForWidth", 1, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::heightForWidth}, 0131 {"mapFrom", 2, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::mapFrom}, 0132 {"mapFromGlobal", 1, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::mapFromGlobal}, 0133 {"mapFromParent", 1, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::mapFromParent}, 0134 {"mapTo", 2, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::mapTo}, 0135 {"mapToParent", 1, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::mapToParent}, 0136 {"mapToGlobal", 1, KJS::DontDelete | KJS::ReadOnly, &WidgetNS::mapToGlobal} 0137 END_METHOD_LUT 0138 0139 NO_ENUMS(QWidgetBinding) 0140 NO_STATICS(QWidgetBinding) 0141 0142 KJSO_SIMPLE_BINDING_CTOR(QWidgetBinding, QWidget, QObjectBinding) 0143 KJSO_QOBJECT_BIND(QWidgetBinding, QWidget) 0144 0145 KJSO_START_CTOR(QWidgetBinding, QWidget, 0) 0146 //qDebug() << "QWidgetBinding::CTOR args.size()=" << args.size(); 0147 if (args.size() > 0) 0148 { 0149 QString widgetName = toQString(args[0]->toString(exec)); 0150 QWidget *parentWidget = nullptr; 0151 KJSEmbed::QObjectBinding *parentImp = KJSEmbed::extractBindingImp<KJSEmbed::QObjectBinding>(exec, args[1]); 0152 if (parentImp) { 0153 parentWidget = parentImp->object<QWidget>(); 0154 } 0155 0156 QWidget *widget = uiLoader()->createWidget(widgetName, parentWidget, "QWidget"); 0157 if (widget) { 0158 return new QWidgetBinding(exec, widget); 0159 } 0160 0161 return KJS::throwError(exec, KJS::TypeError, toUString(i18n("'%1' is not a valid QWidget.", widgetName))); 0162 } else 0163 { 0164 QWidget *widget = new QWidget(); 0165 if (widget) { 0166 return new QWidgetBinding(exec, widget); 0167 } 0168 } 0169 0170 return KJS::throwError(exec, KJS::GeneralError, toUString(i18n("Must supply a widget name."))); 0171 END_CTOR 0172