annotate generator/uiconverter.cpp @ 382:1d56b2a2e10c

Fixes to debugging stuff. Added size_t as primitive type to workaround Qwt build failure in debug
author Max Samukha <maxter@spambox.com>
date Mon, 12 Jul 2010 20:36:07 +0300
parents e78566595089
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
e78566595089 initial import
mandel
parents:
diff changeset
1 /****************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
2 **
e78566595089 initial import
mandel
parents:
diff changeset
3 ** Copyright (C) 1992-2008 Nokia. All rights reserved.
e78566595089 initial import
mandel
parents:
diff changeset
4 **
e78566595089 initial import
mandel
parents:
diff changeset
5 ** This file is part of Qt Jambi.
e78566595089 initial import
mandel
parents:
diff changeset
6 **
e78566595089 initial import
mandel
parents:
diff changeset
7 ** * Commercial Usage
e78566595089 initial import
mandel
parents:
diff changeset
8 * Licensees holding valid Qt Commercial licenses may use this file in
e78566595089 initial import
mandel
parents:
diff changeset
9 * accordance with the Qt Commercial License Agreement provided with the
e78566595089 initial import
mandel
parents:
diff changeset
10 * Software or, alternatively, in accordance with the terms contained in
e78566595089 initial import
mandel
parents:
diff changeset
11 * a written agreement between you and Nokia.
e78566595089 initial import
mandel
parents:
diff changeset
12 *
e78566595089 initial import
mandel
parents:
diff changeset
13 *
e78566595089 initial import
mandel
parents:
diff changeset
14 * GNU General Public License Usage
e78566595089 initial import
mandel
parents:
diff changeset
15 * Alternatively, this file may be used under the terms of the GNU
e78566595089 initial import
mandel
parents:
diff changeset
16 * General Public License versions 2.0 or 3.0 as published by the Free
e78566595089 initial import
mandel
parents:
diff changeset
17 * Software Foundation and appearing in the file LICENSE.GPL included in
e78566595089 initial import
mandel
parents:
diff changeset
18 * the packaging of this file. Please review the following information
e78566595089 initial import
mandel
parents:
diff changeset
19 * to ensure GNU General Public Licensing requirements will be met:
e78566595089 initial import
mandel
parents:
diff changeset
20 * http://www.fsf.org/licensing/licenses/info/GPLv2.html and
e78566595089 initial import
mandel
parents:
diff changeset
21 * http://www.gnu.org/copyleft/gpl.html. In addition, as a special
e78566595089 initial import
mandel
parents:
diff changeset
22 * exception, Nokia gives you certain additional rights. These rights
e78566595089 initial import
mandel
parents:
diff changeset
23 * are described in the Nokia Qt GPL Exception version 1.2, included in
e78566595089 initial import
mandel
parents:
diff changeset
24 * the file GPL_EXCEPTION.txt in this package.
e78566595089 initial import
mandel
parents:
diff changeset
25 *
e78566595089 initial import
mandel
parents:
diff changeset
26 * Qt for Windows(R) Licensees
e78566595089 initial import
mandel
parents:
diff changeset
27 * As a special exception, Nokia, as the sole copyright holder for Qt
e78566595089 initial import
mandel
parents:
diff changeset
28 * Designer, grants users of the Qt/Eclipse Integration plug-in the
e78566595089 initial import
mandel
parents:
diff changeset
29 * right for the Qt/Eclipse Integration to link to functionality
e78566595089 initial import
mandel
parents:
diff changeset
30 * provided by Qt Designer and its related libraries.
e78566595089 initial import
mandel
parents:
diff changeset
31 *
e78566595089 initial import
mandel
parents:
diff changeset
32 *
e78566595089 initial import
mandel
parents:
diff changeset
33 * If you are unsure which license is appropriate for your use, please
e78566595089 initial import
mandel
parents:
diff changeset
34 * contact the sales department at qt-sales@nokia.com.
e78566595089 initial import
mandel
parents:
diff changeset
35
e78566595089 initial import
mandel
parents:
diff changeset
36 **
e78566595089 initial import
mandel
parents:
diff changeset
37 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
e78566595089 initial import
mandel
parents:
diff changeset
38 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
e78566595089 initial import
mandel
parents:
diff changeset
39 **
e78566595089 initial import
mandel
parents:
diff changeset
40 ****************************************************************************/
e78566595089 initial import
mandel
parents:
diff changeset
41
e78566595089 initial import
mandel
parents:
diff changeset
42 #include "uiconverter.h"
e78566595089 initial import
mandel
parents:
diff changeset
43 #include "metajava.h"
e78566595089 initial import
mandel
parents:
diff changeset
44
e78566595089 initial import
mandel
parents:
diff changeset
45 #include "reporthandler.h"
e78566595089 initial import
mandel
parents:
diff changeset
46
e78566595089 initial import
mandel
parents:
diff changeset
47 #include <QtCore/QFileInfo>
e78566595089 initial import
mandel
parents:
diff changeset
48 #include <QtXml/QDomDocument>
e78566595089 initial import
mandel
parents:
diff changeset
49
e78566595089 initial import
mandel
parents:
diff changeset
50 void UiConverter::convertToJui(const QString &uiFile, const QString &customWidgetFiles)
e78566595089 initial import
mandel
parents:
diff changeset
51 {
e78566595089 initial import
mandel
parents:
diff changeset
52 ReportHandler::setContext(QLatin1String("UiConverter to .jui"));
e78566595089 initial import
mandel
parents:
diff changeset
53
e78566595089 initial import
mandel
parents:
diff changeset
54 traverseCustomWidgets(customWidgetFiles);
e78566595089 initial import
mandel
parents:
diff changeset
55
e78566595089 initial import
mandel
parents:
diff changeset
56 QFileInfo fileInfo(uiFile);
e78566595089 initial import
mandel
parents:
diff changeset
57
e78566595089 initial import
mandel
parents:
diff changeset
58 if (!fileInfo.exists()) {
e78566595089 initial import
mandel
parents:
diff changeset
59 ReportHandler::warning(QString::fromLatin1("Ui File %1 doesn't exist...\n").arg(uiFile));
e78566595089 initial import
mandel
parents:
diff changeset
60 return;
e78566595089 initial import
mandel
parents:
diff changeset
61 }
e78566595089 initial import
mandel
parents:
diff changeset
62
e78566595089 initial import
mandel
parents:
diff changeset
63 if (fileInfo.suffix() != QLatin1String("ui")) {
e78566595089 initial import
mandel
parents:
diff changeset
64 ReportHandler::warning(QString::fromLatin1("File doesn't have .ui extension: %1")
e78566595089 initial import
mandel
parents:
diff changeset
65 .arg(uiFile));
e78566595089 initial import
mandel
parents:
diff changeset
66 return;
e78566595089 initial import
mandel
parents:
diff changeset
67 }
e78566595089 initial import
mandel
parents:
diff changeset
68
e78566595089 initial import
mandel
parents:
diff changeset
69 QString juiFile = fileInfo.absolutePath() + QLatin1Char('/') + fileInfo.baseName()
e78566595089 initial import
mandel
parents:
diff changeset
70 + QLatin1String(".jui");
e78566595089 initial import
mandel
parents:
diff changeset
71
e78566595089 initial import
mandel
parents:
diff changeset
72 QFile inputFile(uiFile);
e78566595089 initial import
mandel
parents:
diff changeset
73
e78566595089 initial import
mandel
parents:
diff changeset
74 if (!inputFile.open(QFile::ReadOnly | QFile::Text)) {
e78566595089 initial import
mandel
parents:
diff changeset
75 ReportHandler::warning(QString::fromLatin1("Could not open '%1' for reading").arg(uiFile));
e78566595089 initial import
mandel
parents:
diff changeset
76 return;
e78566595089 initial import
mandel
parents:
diff changeset
77 }
e78566595089 initial import
mandel
parents:
diff changeset
78
e78566595089 initial import
mandel
parents:
diff changeset
79 QDomDocument dom;
e78566595089 initial import
mandel
parents:
diff changeset
80 QString error;
e78566595089 initial import
mandel
parents:
diff changeset
81 if (!dom.setContent(&inputFile, false, &error)) {
e78566595089 initial import
mandel
parents:
diff changeset
82 ReportHandler::warning(QString::fromLatin1("Xml loading %1 failed: %2")
e78566595089 initial import
mandel
parents:
diff changeset
83 .arg(uiFile).arg(error));
e78566595089 initial import
mandel
parents:
diff changeset
84 inputFile.close();
e78566595089 initial import
mandel
parents:
diff changeset
85 return;
e78566595089 initial import
mandel
parents:
diff changeset
86 }
e78566595089 initial import
mandel
parents:
diff changeset
87 inputFile.close();
e78566595089 initial import
mandel
parents:
diff changeset
88
e78566595089 initial import
mandel
parents:
diff changeset
89 QDomNodeList customWidgets = dom.documentElement().elementsByTagName("customwidget");
e78566595089 initial import
mandel
parents:
diff changeset
90 for (int i=0; i<customWidgets.size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
91 QDomNode customWidget = customWidgets.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
92
e78566595089 initial import
mandel
parents:
diff changeset
93 QDomElement el = customWidget.toElement();
e78566595089 initial import
mandel
parents:
diff changeset
94 fixCustomWidgetNode(el, &dom);
e78566595089 initial import
mandel
parents:
diff changeset
95 }
e78566595089 initial import
mandel
parents:
diff changeset
96
e78566595089 initial import
mandel
parents:
diff changeset
97 traverse(dom.documentElement(), &dom);
e78566595089 initial import
mandel
parents:
diff changeset
98
e78566595089 initial import
mandel
parents:
diff changeset
99 QFile outputFile(juiFile);
e78566595089 initial import
mandel
parents:
diff changeset
100 if (!outputFile.open(QFile::WriteOnly | QFile::Text)) {
e78566595089 initial import
mandel
parents:
diff changeset
101 ReportHandler::warning(QString::fromLatin1("Could not open '%1' for writing")
e78566595089 initial import
mandel
parents:
diff changeset
102 .arg(juiFile));
e78566595089 initial import
mandel
parents:
diff changeset
103 return;
e78566595089 initial import
mandel
parents:
diff changeset
104 }
e78566595089 initial import
mandel
parents:
diff changeset
105
e78566595089 initial import
mandel
parents:
diff changeset
106 outputFile.write(dom.toByteArray());
e78566595089 initial import
mandel
parents:
diff changeset
107 outputFile.close();
e78566595089 initial import
mandel
parents:
diff changeset
108 }
e78566595089 initial import
mandel
parents:
diff changeset
109
e78566595089 initial import
mandel
parents:
diff changeset
110 void UiConverter::traverseCustomWidgetFile(const QString &customWidgetFile)
e78566595089 initial import
mandel
parents:
diff changeset
111 {
e78566595089 initial import
mandel
parents:
diff changeset
112 if (customWidgetFile.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
113 return;
e78566595089 initial import
mandel
parents:
diff changeset
114
e78566595089 initial import
mandel
parents:
diff changeset
115 QFile file(customWidgetFile);
e78566595089 initial import
mandel
parents:
diff changeset
116 if (!file.open(QIODevice::ReadOnly)) {
e78566595089 initial import
mandel
parents:
diff changeset
117 ReportHandler::warning("Can't read custom widget file '"
e78566595089 initial import
mandel
parents:
diff changeset
118 + customWidgetFile
e78566595089 initial import
mandel
parents:
diff changeset
119 + "'");
e78566595089 initial import
mandel
parents:
diff changeset
120 return;
e78566595089 initial import
mandel
parents:
diff changeset
121 }
e78566595089 initial import
mandel
parents:
diff changeset
122
e78566595089 initial import
mandel
parents:
diff changeset
123 QXmlStreamReader reader(&file);
e78566595089 initial import
mandel
parents:
diff changeset
124 while (!reader.atEnd()) {
e78566595089 initial import
mandel
parents:
diff changeset
125 reader.readNext();
e78566595089 initial import
mandel
parents:
diff changeset
126 if (reader.isStartElement() && reader.name() == "qt-jambi-custom-widget") {
e78566595089 initial import
mandel
parents:
diff changeset
127 QXmlStreamAttributes attributes = reader.attributes();
e78566595089 initial import
mandel
parents:
diff changeset
128 QString className = attributes.value("class").toString();
e78566595089 initial import
mandel
parents:
diff changeset
129
e78566595089 initial import
mandel
parents:
diff changeset
130 int pos = className.lastIndexOf(".");
e78566595089 initial import
mandel
parents:
diff changeset
131 m_custom_widgets.insertMulti(className.mid(pos+1), CustomWidget(className, 0));
e78566595089 initial import
mandel
parents:
diff changeset
132 }
e78566595089 initial import
mandel
parents:
diff changeset
133 }
e78566595089 initial import
mandel
parents:
diff changeset
134
e78566595089 initial import
mandel
parents:
diff changeset
135 if (reader.hasError()) {
e78566595089 initial import
mandel
parents:
diff changeset
136 ReportHandler::warning("Error when parsing custom widget file '"
e78566595089 initial import
mandel
parents:
diff changeset
137 + customWidgetFile
e78566595089 initial import
mandel
parents:
diff changeset
138 + "': "
e78566595089 initial import
mandel
parents:
diff changeset
139 + reader.errorString());
e78566595089 initial import
mandel
parents:
diff changeset
140 }
e78566595089 initial import
mandel
parents:
diff changeset
141 }
e78566595089 initial import
mandel
parents:
diff changeset
142
e78566595089 initial import
mandel
parents:
diff changeset
143 void UiConverter::traverseCustomWidgets(const QString &customWidgetFiles)
e78566595089 initial import
mandel
parents:
diff changeset
144 {
e78566595089 initial import
mandel
parents:
diff changeset
145 #ifdef Q_OS_WIN32
e78566595089 initial import
mandel
parents:
diff changeset
146 char separator = ';';
e78566595089 initial import
mandel
parents:
diff changeset
147 #else
e78566595089 initial import
mandel
parents:
diff changeset
148 char separator = ':';
e78566595089 initial import
mandel
parents:
diff changeset
149 #endif
e78566595089 initial import
mandel
parents:
diff changeset
150
e78566595089 initial import
mandel
parents:
diff changeset
151 QStringList customWidgets = customWidgetFiles.split(separator);
e78566595089 initial import
mandel
parents:
diff changeset
152 foreach (QString customWidget, customWidgets)
e78566595089 initial import
mandel
parents:
diff changeset
153 traverseCustomWidgetFile(customWidget);
e78566595089 initial import
mandel
parents:
diff changeset
154 }
e78566595089 initial import
mandel
parents:
diff changeset
155
e78566595089 initial import
mandel
parents:
diff changeset
156 void UiConverter::traverse(QDomNode node, QDomDocument *doc)
e78566595089 initial import
mandel
parents:
diff changeset
157 {
e78566595089 initial import
mandel
parents:
diff changeset
158 if (node.isNull())
e78566595089 initial import
mandel
parents:
diff changeset
159 return;
e78566595089 initial import
mandel
parents:
diff changeset
160
e78566595089 initial import
mandel
parents:
diff changeset
161 QDomElement element = node.toElement();
e78566595089 initial import
mandel
parents:
diff changeset
162 if (!element.isNull()) {
e78566595089 initial import
mandel
parents:
diff changeset
163 if (element.nodeName() == QLatin1String("ui"))
e78566595089 initial import
mandel
parents:
diff changeset
164 fixUiNode(element, doc);
e78566595089 initial import
mandel
parents:
diff changeset
165 else if (element.nodeName() == QLatin1String("set"))
e78566595089 initial import
mandel
parents:
diff changeset
166 fixSetNode(element, doc);
e78566595089 initial import
mandel
parents:
diff changeset
167 else if (element.nodeName() == QLatin1String("enum"))
e78566595089 initial import
mandel
parents:
diff changeset
168 fixEnumNode(element, doc);
e78566595089 initial import
mandel
parents:
diff changeset
169 else if (element.nodeName() == QLatin1String("connection"))
e78566595089 initial import
mandel
parents:
diff changeset
170 fixConnectionNode(element, doc);
e78566595089 initial import
mandel
parents:
diff changeset
171 else if (element.nodeName() == QLatin1String("widget"))
e78566595089 initial import
mandel
parents:
diff changeset
172 fixWidgetNode(element, doc);
e78566595089 initial import
mandel
parents:
diff changeset
173 }
e78566595089 initial import
mandel
parents:
diff changeset
174
e78566595089 initial import
mandel
parents:
diff changeset
175 QDomNodeList list = node.childNodes();
e78566595089 initial import
mandel
parents:
diff changeset
176 for (int i=0; i<list.size(); ++i)
e78566595089 initial import
mandel
parents:
diff changeset
177 traverse(list.at(i), doc);
e78566595089 initial import
mandel
parents:
diff changeset
178 }
e78566595089 initial import
mandel
parents:
diff changeset
179
e78566595089 initial import
mandel
parents:
diff changeset
180
e78566595089 initial import
mandel
parents:
diff changeset
181 void UiConverter::fixUiNode(QDomElement el, QDomDocument *)
e78566595089 initial import
mandel
parents:
diff changeset
182 {
e78566595089 initial import
mandel
parents:
diff changeset
183 el.setAttribute("language", "jambi");
e78566595089 initial import
mandel
parents:
diff changeset
184 }
e78566595089 initial import
mandel
parents:
diff changeset
185
e78566595089 initial import
mandel
parents:
diff changeset
186 void UiConverter::fixCustomWidgetNode(QDomElement el, QDomDocument *)
e78566595089 initial import
mandel
parents:
diff changeset
187 {
e78566595089 initial import
mandel
parents:
diff changeset
188 QDomNodeList classes = el.elementsByTagName("class");
e78566595089 initial import
mandel
parents:
diff changeset
189 if (classes.size() < 1) {
e78566595089 initial import
mandel
parents:
diff changeset
190 ReportHandler::warning("Custom widget missing 'class' child");
e78566595089 initial import
mandel
parents:
diff changeset
191 return;
e78566595089 initial import
mandel
parents:
diff changeset
192 }
e78566595089 initial import
mandel
parents:
diff changeset
193
e78566595089 initial import
mandel
parents:
diff changeset
194 QDomNodeList extendss = el.elementsByTagName("extends");
e78566595089 initial import
mandel
parents:
diff changeset
195 if (extendss.size() < 1) {
e78566595089 initial import
mandel
parents:
diff changeset
196 ReportHandler::warning("Custom widget missing 'extends' child");
e78566595089 initial import
mandel
parents:
diff changeset
197 return;
e78566595089 initial import
mandel
parents:
diff changeset
198 }
e78566595089 initial import
mandel
parents:
diff changeset
199
e78566595089 initial import
mandel
parents:
diff changeset
200 QString className = classes.at(0).toElement().text();
e78566595089 initial import
mandel
parents:
diff changeset
201 QString extends = extendss.at(0).toElement().text();
e78566595089 initial import
mandel
parents:
diff changeset
202
e78566595089 initial import
mandel
parents:
diff changeset
203 AbstractMetaClass *javaClass = m_java_classes.findClass(extends);
e78566595089 initial import
mandel
parents:
diff changeset
204 if (javaClass == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
205 ReportHandler::warning("Couldn't find super class for custom widget: '" + extends + "'");
e78566595089 initial import
mandel
parents:
diff changeset
206 return;
e78566595089 initial import
mandel
parents:
diff changeset
207 }
e78566595089 initial import
mandel
parents:
diff changeset
208
e78566595089 initial import
mandel
parents:
diff changeset
209 QList<CustomWidget> fullNames = m_custom_widgets.values(className);
e78566595089 initial import
mandel
parents:
diff changeset
210 if (fullNames.size() == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
211 ReportHandler::warning("Couldn't find custom widget entry for '" + className + "'."
e78566595089 initial import
mandel
parents:
diff changeset
212 " You need to specify this class in a custom widget file and"
e78566595089 initial import
mandel
parents:
diff changeset
213 " pass the file name on the command line using the --custom-widgets option.");
e78566595089 initial import
mandel
parents:
diff changeset
214 return;
e78566595089 initial import
mandel
parents:
diff changeset
215 }
e78566595089 initial import
mandel
parents:
diff changeset
216
e78566595089 initial import
mandel
parents:
diff changeset
217 if (fullNames.size() > 1) {
e78566595089 initial import
mandel
parents:
diff changeset
218 ReportHandler::warning("More than custom widget type matching '" + className + "'. "
e78566595089 initial import
mandel
parents:
diff changeset
219 + "Will use first seen entry: '" + fullNames.at(0).first + "'");
e78566595089 initial import
mandel
parents:
diff changeset
220 }
e78566595089 initial import
mandel
parents:
diff changeset
221
e78566595089 initial import
mandel
parents:
diff changeset
222 QString fullName = fullNames.at(0).first;
e78566595089 initial import
mandel
parents:
diff changeset
223 classes.at(0).namedItem("#text").toText().setData(fullName);
e78566595089 initial import
mandel
parents:
diff changeset
224
e78566595089 initial import
mandel
parents:
diff changeset
225 QMap<QString, CustomWidget>::iterator it;
e78566595089 initial import
mandel
parents:
diff changeset
226 for (it=m_custom_widgets.begin(); it!=m_custom_widgets.end(); ++it) {
e78566595089 initial import
mandel
parents:
diff changeset
227 if (it.key() == className)
e78566595089 initial import
mandel
parents:
diff changeset
228 (*it).second = javaClass;
e78566595089 initial import
mandel
parents:
diff changeset
229 }
e78566595089 initial import
mandel
parents:
diff changeset
230 }
e78566595089 initial import
mandel
parents:
diff changeset
231
e78566595089 initial import
mandel
parents:
diff changeset
232 void UiConverter::fixSetNode(QDomElement el, QDomDocument *)
e78566595089 initial import
mandel
parents:
diff changeset
233 {
e78566595089 initial import
mandel
parents:
diff changeset
234 QStringList cppSet = el.firstChild().nodeValue().split(QLatin1Char('|'));
e78566595089 initial import
mandel
parents:
diff changeset
235
e78566595089 initial import
mandel
parents:
diff changeset
236 QStringList javaSet;
e78566595089 initial import
mandel
parents:
diff changeset
237 for (int i=0; i<cppSet.size(); ++i)
e78566595089 initial import
mandel
parents:
diff changeset
238 javaSet << translateEnumValue(cppSet.at(i));
e78566595089 initial import
mandel
parents:
diff changeset
239
e78566595089 initial import
mandel
parents:
diff changeset
240 el.firstChild().setNodeValue(javaSet.join(QLatin1String("|")));
e78566595089 initial import
mandel
parents:
diff changeset
241 }
e78566595089 initial import
mandel
parents:
diff changeset
242
e78566595089 initial import
mandel
parents:
diff changeset
243
e78566595089 initial import
mandel
parents:
diff changeset
244 void UiConverter::fixEnumNode(QDomElement el, QDomDocument *)
e78566595089 initial import
mandel
parents:
diff changeset
245 {
e78566595089 initial import
mandel
parents:
diff changeset
246 QDomNode valueNode = el.firstChild();
e78566595089 initial import
mandel
parents:
diff changeset
247 if (valueNode.isNull()) {
e78566595089 initial import
mandel
parents:
diff changeset
248 ReportHandler::warning(QString::fromLatin1("Bad enum value at '%1'").arg(el.nodeValue()));
e78566595089 initial import
mandel
parents:
diff changeset
249 return;
e78566595089 initial import
mandel
parents:
diff changeset
250 }
e78566595089 initial import
mandel
parents:
diff changeset
251
e78566595089 initial import
mandel
parents:
diff changeset
252 QString cppEnumValue = valueNode.nodeValue();
e78566595089 initial import
mandel
parents:
diff changeset
253 QString javaEnumValue = translateEnumValue(cppEnumValue);
e78566595089 initial import
mandel
parents:
diff changeset
254 valueNode.setNodeValue(javaEnumValue);
e78566595089 initial import
mandel
parents:
diff changeset
255 }
e78566595089 initial import
mandel
parents:
diff changeset
256
e78566595089 initial import
mandel
parents:
diff changeset
257
e78566595089 initial import
mandel
parents:
diff changeset
258 void UiConverter::fixConnectionNode(QDomElement el, QDomDocument *)
e78566595089 initial import
mandel
parents:
diff changeset
259 {
e78566595089 initial import
mandel
parents:
diff changeset
260 QString senderName = el.namedItem("sender").firstChild().nodeValue();
e78566595089 initial import
mandel
parents:
diff changeset
261 AbstractMetaClass *senderClass = m_named_widgets[senderName];
e78566595089 initial import
mandel
parents:
diff changeset
262 if (!senderClass) {
e78566595089 initial import
mandel
parents:
diff changeset
263 ReportHandler::warning(QString::fromLatin1("sender unknown '%1'").arg(senderName));
e78566595089 initial import
mandel
parents:
diff changeset
264 return;
e78566595089 initial import
mandel
parents:
diff changeset
265 }
e78566595089 initial import
mandel
parents:
diff changeset
266 QDomNode signalSignatureNode = el.namedItem("signal").toElement().firstChild();
e78566595089 initial import
mandel
parents:
diff changeset
267 QString signalSignature = signalSignatureNode.nodeValue();
e78566595089 initial import
mandel
parents:
diff changeset
268 const AbstractMetaFunction *signalFunction = findFunction(senderClass,
e78566595089 initial import
mandel
parents:
diff changeset
269 signalSignature,
e78566595089 initial import
mandel
parents:
diff changeset
270 SignalSearch);
e78566595089 initial import
mandel
parents:
diff changeset
271 if (!signalFunction) {
e78566595089 initial import
mandel
parents:
diff changeset
272 ReportHandler::warning(QString::fromLatin1("Signal not found '%1' in '%2'")
e78566595089 initial import
mandel
parents:
diff changeset
273 .arg(signalSignature).arg(senderClass->qualifiedCppName()));
e78566595089 initial import
mandel
parents:
diff changeset
274 return;
e78566595089 initial import
mandel
parents:
diff changeset
275 }
e78566595089 initial import
mandel
parents:
diff changeset
276 signalSignatureNode.setNodeValue(signalFunction->modifiedName());
e78566595089 initial import
mandel
parents:
diff changeset
277
e78566595089 initial import
mandel
parents:
diff changeset
278 QString receiverName = el.namedItem("receiver").firstChild().nodeValue();
e78566595089 initial import
mandel
parents:
diff changeset
279 AbstractMetaClass *receiverClass = m_named_widgets[receiverName];
e78566595089 initial import
mandel
parents:
diff changeset
280 if (!receiverClass) {
e78566595089 initial import
mandel
parents:
diff changeset
281 ReportHandler::warning(QString::fromLatin1("receiver unknown '%1'").arg(receiverName));
e78566595089 initial import
mandel
parents:
diff changeset
282 return;
e78566595089 initial import
mandel
parents:
diff changeset
283 }
e78566595089 initial import
mandel
parents:
diff changeset
284
e78566595089 initial import
mandel
parents:
diff changeset
285 QDomNode slotSignatureNode = el.namedItem("slot").firstChild();
e78566595089 initial import
mandel
parents:
diff changeset
286 QString slotSignature = slotSignatureNode.nodeValue();
e78566595089 initial import
mandel
parents:
diff changeset
287 const AbstractMetaFunction *slotFunction = findFunction(receiverClass, slotSignature, SlotSearch);
e78566595089 initial import
mandel
parents:
diff changeset
288 if (!signalFunction) {
e78566595089 initial import
mandel
parents:
diff changeset
289 ReportHandler::warning(QString::fromLatin1("Slot not found '%1' in '%2'")
e78566595089 initial import
mandel
parents:
diff changeset
290 .arg(slotSignature).arg(receiverClass->qualifiedCppName()));
e78566595089 initial import
mandel
parents:
diff changeset
291 return;
e78566595089 initial import
mandel
parents:
diff changeset
292 }
e78566595089 initial import
mandel
parents:
diff changeset
293
e78566595089 initial import
mandel
parents:
diff changeset
294 slotSignatureNode.setNodeValue(slotFunction->targetLangSignature(true));
e78566595089 initial import
mandel
parents:
diff changeset
295 }
e78566595089 initial import
mandel
parents:
diff changeset
296
e78566595089 initial import
mandel
parents:
diff changeset
297
e78566595089 initial import
mandel
parents:
diff changeset
298 void UiConverter::fixWidgetNode(QDomElement el, QDomDocument *)
e78566595089 initial import
mandel
parents:
diff changeset
299 {
e78566595089 initial import
mandel
parents:
diff changeset
300 QString className = el.attribute(QLatin1String("class"));
e78566595089 initial import
mandel
parents:
diff changeset
301 QList<CustomWidget> customWidgetNames = m_custom_widgets.values(className);
e78566595089 initial import
mandel
parents:
diff changeset
302 QString customWidgetName = customWidgetNames.size() > 0 ? customWidgetNames.at(0).first : QString();
e78566595089 initial import
mandel
parents:
diff changeset
303
e78566595089 initial import
mandel
parents:
diff changeset
304 AbstractMetaClass *javaClass = customWidgetName.isEmpty() ? m_java_classes.findClass(className) : customWidgetNames.at(0).second;
e78566595089 initial import
mandel
parents:
diff changeset
305 if (!javaClass) {
e78566595089 initial import
mandel
parents:
diff changeset
306 ReportHandler::warning(QString::fromLatin1("Class '%1' is unknown").arg(className));
e78566595089 initial import
mandel
parents:
diff changeset
307 return;
e78566595089 initial import
mandel
parents:
diff changeset
308 }
e78566595089 initial import
mandel
parents:
diff changeset
309
e78566595089 initial import
mandel
parents:
diff changeset
310 if (!customWidgetName.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
311 el.setAttribute(QLatin1String("class"), customWidgetName);
e78566595089 initial import
mandel
parents:
diff changeset
312 else if (javaClass->package() != QLatin1String("qt.gui"))
e78566595089 initial import
mandel
parents:
diff changeset
313 el.setAttribute(QLatin1String("class"), javaClass->fullName());
e78566595089 initial import
mandel
parents:
diff changeset
314
e78566595089 initial import
mandel
parents:
diff changeset
315 m_named_widgets.insert(el.attribute(QLatin1String("name")), javaClass);
e78566595089 initial import
mandel
parents:
diff changeset
316 }
e78566595089 initial import
mandel
parents:
diff changeset
317
e78566595089 initial import
mandel
parents:
diff changeset
318
e78566595089 initial import
mandel
parents:
diff changeset
319 QString UiConverter::translateEnumValue(const QString &cppEnumValue) {
e78566595089 initial import
mandel
parents:
diff changeset
320 if (!cppEnumValue.contains(QLatin1String("::"))) {
e78566595089 initial import
mandel
parents:
diff changeset
321 ReportHandler::warning(QString::fromLatin1("Expected '::' in enum value '%1'")
e78566595089 initial import
mandel
parents:
diff changeset
322 .arg(cppEnumValue));
e78566595089 initial import
mandel
parents:
diff changeset
323 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
324 }
e78566595089 initial import
mandel
parents:
diff changeset
325
e78566595089 initial import
mandel
parents:
diff changeset
326 QStringList names = cppEnumValue.split(QLatin1String("::"));
e78566595089 initial import
mandel
parents:
diff changeset
327 AbstractMetaClass *javaClass = m_java_classes.findClass(names.at(0));
e78566595089 initial import
mandel
parents:
diff changeset
328
e78566595089 initial import
mandel
parents:
diff changeset
329 if (!javaClass) {
e78566595089 initial import
mandel
parents:
diff changeset
330 ReportHandler::warning(QString::fromLatin1("Class '%1' is unknown").arg(names.at(0)));
e78566595089 initial import
mandel
parents:
diff changeset
331 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
332 }
e78566595089 initial import
mandel
parents:
diff changeset
333
e78566595089 initial import
mandel
parents:
diff changeset
334 AbstractMetaEnum *javaEnum = javaClass->findEnumForValue(names.at(1));
e78566595089 initial import
mandel
parents:
diff changeset
335 if (!javaEnum) {
e78566595089 initial import
mandel
parents:
diff changeset
336 ReportHandler::warning(QString::fromLatin1("Enum value '%1' was not found in '%2'")
e78566595089 initial import
mandel
parents:
diff changeset
337 .arg(names.at(1)).arg(names.at(0)));
e78566595089 initial import
mandel
parents:
diff changeset
338 return QString();
e78566595089 initial import
mandel
parents:
diff changeset
339 }
e78566595089 initial import
mandel
parents:
diff changeset
340
e78566595089 initial import
mandel
parents:
diff changeset
341 AbstractMetaEnumValueList enumValues = javaEnum->values();
e78566595089 initial import
mandel
parents:
diff changeset
342 AbstractMetaEnumValue *enumValue = enumValues.find(names.at(1));
e78566595089 initial import
mandel
parents:
diff changeset
343 int value = enumValue->value();
e78566595089 initial import
mandel
parents:
diff changeset
344
e78566595089 initial import
mandel
parents:
diff changeset
345 if (javaEnum->typeEntry()->isEnumValueRejected(enumValue->name())) {
e78566595089 initial import
mandel
parents:
diff changeset
346 for (int i=0; i<enumValues.size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
347 AbstractMetaEnumValue *ev = enumValues.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
348 if (ev->value() == value) {
e78566595089 initial import
mandel
parents:
diff changeset
349 enumValue = ev;
e78566595089 initial import
mandel
parents:
diff changeset
350 break;
e78566595089 initial import
mandel
parents:
diff changeset
351 }
e78566595089 initial import
mandel
parents:
diff changeset
352 }
e78566595089 initial import
mandel
parents:
diff changeset
353 }
e78566595089 initial import
mandel
parents:
diff changeset
354
e78566595089 initial import
mandel
parents:
diff changeset
355 return javaEnum->fullName() + QLatin1String(".") + enumValue->name();
e78566595089 initial import
mandel
parents:
diff changeset
356 }
e78566595089 initial import
mandel
parents:
diff changeset
357
e78566595089 initial import
mandel
parents:
diff changeset
358 const AbstractMetaFunction *UiConverter::findFunction(AbstractMetaClass *javaClass,
e78566595089 initial import
mandel
parents:
diff changeset
359 const QString &signature,
e78566595089 initial import
mandel
parents:
diff changeset
360 SearchType type)
e78566595089 initial import
mandel
parents:
diff changeset
361 {
e78566595089 initial import
mandel
parents:
diff changeset
362 AbstractMetaFunctionList senderFunctions = javaClass->functions();
e78566595089 initial import
mandel
parents:
diff changeset
363 foreach (const AbstractMetaFunction *f, senderFunctions) {
e78566595089 initial import
mandel
parents:
diff changeset
364 if (type == SignalSearch && !f->isSignal())
e78566595089 initial import
mandel
parents:
diff changeset
365 continue;
e78566595089 initial import
mandel
parents:
diff changeset
366
e78566595089 initial import
mandel
parents:
diff changeset
367 QString fsig = f->minimalSignature();
e78566595089 initial import
mandel
parents:
diff changeset
368
e78566595089 initial import
mandel
parents:
diff changeset
369
e78566595089 initial import
mandel
parents:
diff changeset
370 int pos = 0;
e78566595089 initial import
mandel
parents:
diff changeset
371 while (pos < signature.length()
e78566595089 initial import
mandel
parents:
diff changeset
372 && fsig.constData()[pos] == signature.constData()[pos]) ++pos;
e78566595089 initial import
mandel
parents:
diff changeset
373
e78566595089 initial import
mandel
parents:
diff changeset
374 if (pos == signature.length()
e78566595089 initial import
mandel
parents:
diff changeset
375 || (type == SignalSearch
e78566595089 initial import
mandel
parents:
diff changeset
376 && pos == signature.length() - 1
e78566595089 initial import
mandel
parents:
diff changeset
377 && signature.constData()[pos] == QLatin1Char(')'))) {
e78566595089 initial import
mandel
parents:
diff changeset
378 return f;
e78566595089 initial import
mandel
parents:
diff changeset
379 }
e78566595089 initial import
mandel
parents:
diff changeset
380 }
e78566595089 initial import
mandel
parents:
diff changeset
381
e78566595089 initial import
mandel
parents:
diff changeset
382 return 0;
e78566595089 initial import
mandel
parents:
diff changeset
383 }