1
/****************************************************************************
3
** Copyright (C) 1992-2005 Trolltech AS. All rights reserved.
5
** This file is part of the tools applications of the Qt Toolkit.
7
** This file may be distributed under the terms of the Q Public License
8
** as defined by Trolltech AS of Norway and appearing in the file
9
** LICENSE.QPL included in the packaging of this file.
11
** This file may be distributed and/or modified under the terms of the
12
** GNU General Public License version 2 as published by the Free Software
13
** Foundation and appearing in the file LICENSE.GPL included in the
14
** packaging of this file.
16
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
17
** information about Qt Commercial License Agreements.
18
** See http://www.trolltech.com/qpl/ for QPL licensing information.
19
** See http://www.trolltech.com/gpl/ for GPL licensing information.
21
** Contact info@trolltech.com if any conditions of this licensing are
24
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
25
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27
****************************************************************************/
29
#include "writeinitialization.h"
34
#include "databaseinfo.h"
35
#include "globaldefs.h"
37
#include <qtextstream.h>
42
WriteInitialization::WriteInitialization(Uic *uic)
43
: driver(uic->driver()), output(uic->output()), option(uic->option()),
44
m_defaultMargin(INT_MIN), m_defaultSpacing(INT_MIN),
45
refreshOut(&m_delayedInitialization, QIODevice::WriteOnly),
46
actionOut(&m_delayedActionInitialization, QIODevice::WriteOnly)
51
void WriteInitialization::acceptUI(DomUI *node)
53
m_registeredImages.clear();
54
m_actionGroupChain.push(0);
55
m_widgetChain.push(0);
56
m_layoutChain.push(0);
58
acceptLayoutDefault(node->elementLayoutDefault());
59
acceptLayoutFunction(node->elementLayoutFunction());
61
if (node->elementCustomWidgets())
62
TreeWalker::acceptCustomWidgets(node->elementCustomWidgets());
64
if (node->elementImages())
65
TreeWalker::acceptImages(node->elementImages());
67
if (option.generateImplemetation)
68
output << "#include <" << driver->headerFileName() << ">\n\n";
71
if (node->hasAttributeStdSetDef())
72
m_stdsetdef = node->attributeStdSetDef();
74
QString className = node->elementClass() + option.postfix;
75
m_generatedClass = className;
77
QString varName = driver->findOrInsertWidget(node->elementWidget());
78
m_registeredWidgets.insert(varName, node->elementWidget()); // register the main widget
80
QString widgetClassName = node->elementWidget()->attributeClass();
82
output << option.indent << "void " << "setupUi(" << widgetClassName << " *" << varName << ")\n"
83
<< option.indent << "{\n";
85
QStringList connections = uic->databaseInfo()->connections();
86
for (int i=0; i<connections.size(); ++i) {
87
QString connection = connections.at(i);
89
if (connection == QLatin1String("(default)"))
92
QString varConn = connection + QLatin1String("Connection");
93
output << option.indent << varConn << " = QSqlDatabase::database(" << fixString(connection) << ");\n";
96
acceptWidget(node->elementWidget());
98
for (int i=0; i<m_buddies.size(); ++i) {
99
const Buddy &b = m_buddies.at(i);
101
if (!m_registeredWidgets.contains(b.objName)) {
102
fprintf(stderr, "'%s' isn't a valid widget\n", b.objName.toLatin1().data());
104
} else if (!m_registeredWidgets.contains(b.buddy)) {
105
fprintf(stderr, "'%s' isn't a valid widget\n", b.buddy.toLatin1().data());
110
output << option.indent << b.objName << "->setBuddy(" << b.buddy << ");\n";
113
if (node->elementTabStops())
114
acceptTabStops(node->elementTabStops());
116
if (m_delayedActionInitialization.size())
117
output << "\n" << m_delayedActionInitialization;
119
output << option.indent << "retranslateUi(" << varName << ");\n";
121
if (node->elementConnections())
122
acceptConnections(node->elementConnections());
124
if (option.autoConnection)
125
output << "\n" << option.indent << "QMetaObject::connectSlotsByName(" << varName << ");\n";
127
output << option.indent << "} // setupUi\n\n";
129
if (m_delayedActionInitialization.isEmpty()) {
130
m_delayedInitialization += option.indent + QLatin1String("Q_UNUSED(") + varName + QLatin1String(");\n");
133
output << option.indent << "void " << "retranslateUi(" << widgetClassName << " *" << varName << ")\n"
134
<< option.indent << "{\n"
135
<< m_delayedInitialization
136
<< option.indent << "} // retranslateUi\n\n";
140
m_actionGroupChain.pop();
143
void WriteInitialization::acceptWidget(DomWidget *node)
145
QString className = node->attributeClass();
146
QString varName = driver->findOrInsertWidget(node);
147
m_registeredWidgets.insert(varName, node); // register the current widget
149
QString parentWidget, parentClass;
150
if (m_widgetChain.top()) {
151
parentWidget = driver->findOrInsertWidget(m_widgetChain.top());
152
parentClass = m_widgetChain.top()->attributeClass();
155
QString savedParentWidget = parentWidget;
157
if (uic->isContainer(parentClass))
158
parentWidget.clear();
160
if (m_widgetChain.size() != 1)
161
output << option.indent << varName << " = new " << uic->customWidgetsInfo()->realClassName(className) << "(" << parentWidget << ");\n";
163
parentWidget = savedParentWidget;
165
if (uic->customWidgetsInfo()->extends(className, QLatin1String("QComboBox"))) {
166
initializeComboBox(node);
167
} else if (uic->customWidgetsInfo()->extends(className, QLatin1String("QListWidget"))) {
168
initializeListWidget(node);
169
} else if (uic->customWidgetsInfo()->extends(className, QLatin1String("QTreeWidget"))) {
170
initializeTreeWidget(node);
171
} else if (uic->customWidgetsInfo()->extends(className, QLatin1String("QTableWidget"))) {
172
initializeTableWidget(node);
173
} else if (uic->customWidgetsInfo()->extends(className, QLatin1String("Q3ListBox"))) {
174
initializeQ3ListBox(node);
175
} else if (uic->customWidgetsInfo()->extends(className, QLatin1String("Q3ListView"))) {
176
initializeQ3ListView(node);
177
} else if (uic->customWidgetsInfo()->extends(className, QLatin1String("Q3IconView"))) {
178
initializeQ3IconView(node);
179
} else if (uic->customWidgetsInfo()->extends(className, QLatin1String("Q3Table"))) {
180
initializeQ3Table(node);
181
} else if (uic->customWidgetsInfo()->extends(className, QLatin1String("Q3DataTable"))) {
182
initializeSqlDataTable(node);
183
} else if (uic->customWidgetsInfo()->extends(className, QLatin1String("Q3DataBrowser"))) {
184
initializeSqlDataBrowser(node);
187
if (uic->isButton(className)) {
188
QHash<QString, DomProperty*> attributes = propertyMap(node->elementAttribute());
189
if (attributes.contains(QLatin1String("buttonGroup"))) {
190
DomProperty *prop = attributes.value(QLatin1String("buttonGroup"));
191
QString groupName = toString(prop->elementString());
192
if (!m_buttonGroups.contains(groupName)) {
193
m_buttonGroups.insert(groupName, driver->findOrInsertName(groupName));
194
QString g = m_buttonGroups.value(groupName);
195
output << option.indent << "QButtonGroup *" << g << " = new QButtonGroup(" << m_generatedClass << ");\n";
198
QString g = m_buttonGroups.value(groupName);
199
output << option.indent << g << "->addButton(" << varName << ");\n";
203
writeProperties(varName, className, node->elementProperty());
205
if (uic->customWidgetsInfo()->extends(className, QLatin1String("QMenu")) && parentWidget.size()) {
206
initializeMenu(node, parentWidget);
209
if (node->elementLayout().isEmpty())
210
m_layoutChain.push(0);
212
m_widgetChain.push(node);
213
m_layoutChain.push(0);
214
TreeWalker::acceptWidget(node);
218
QHash<QString, DomProperty*> attributes = propertyMap(node->elementAttribute());
220
QString title = QLatin1String("Page");
221
if (attributes.contains(QLatin1String("title")))
222
title = toString(attributes.value(QLatin1String("title"))->elementString());
224
QString label = QLatin1String("Page");
225
if (attributes.contains(QLatin1String("label")))
226
label = toString(attributes.value(QLatin1String("label"))->elementString());
229
if (attributes.contains(QLatin1String("id")))
230
id = attributes.value(QLatin1String("id"))->elementNumber();
232
if (uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QMainWindow"))
233
|| uic->customWidgetsInfo()->extends(parentClass, QLatin1String("Q3MainWindow"))) {
235
if (uic->customWidgetsInfo()->extends(className, QLatin1String("QMenuBar"))) {
236
if (!uic->customWidgetsInfo()->extends(parentClass, QLatin1String("Q3MainWindow")))
237
output << option.indent << parentWidget << "->setMenuBar(" << varName <<");\n";
238
} else if (uic->customWidgetsInfo()->extends(className, QLatin1String("QToolBar"))) {
239
output << option.indent << parentWidget << "->addToolBar(" << varName << ");\n";
240
} else if (uic->customWidgetsInfo()->extends(className, QLatin1String("QStatusBar"))) {
241
output << option.indent << parentWidget << "->setStatusBar(" << varName << ");\n";
242
} else if (className == QLatin1String("QWidget")) {
243
output << option.indent << parentWidget << "->setCentralWidget(" << varName << ");\n";
247
if (uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QStackedWidget"))) {
248
output << option.indent << parentWidget << "->addWidget(" << varName << ");\n";
249
} else if (uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QToolBar"))) {
250
output << option.indent << parentWidget << "->addWidget(" << varName << ");\n";
251
} else if (uic->customWidgetsInfo()->extends(parentClass, QLatin1String("Q3WidgetStack"))) {
252
output << option.indent << parentWidget << "->addWidget(" << varName << ", " << id << ");\n";
253
} else if (uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QDockWidget"))) {
254
output << option.indent << parentWidget << "->setWidget(" << varName << ");\n";
255
} else if (uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QToolBox"))) {
256
output << option.indent << parentWidget << "->addItem(" << varName << ", " << trCall(label, className) << ");\n";
258
refreshOut << option.indent << parentWidget << "->setItemText("
259
<< parentWidget << "->indexOf(" << varName << "), " << trCall(label, className) << ");\n";
261
} else if (uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QTabWidget"))) {
262
output << option.indent << parentWidget << "->addTab(" << varName << ", " << trCall(title, className) << ");\n";
264
refreshOut << option.indent << parentWidget << "->setTabText("
265
<< parentWidget << "->indexOf(" << varName << "), " << trCall(title, className) << ");\n";
267
} else if (uic->customWidgetsInfo()->extends(parentClass, QLatin1String("Q3Wizard"))) {
268
output << option.indent << parentWidget << "->addPage(" << varName << ", " << trCall(title, className) << ");\n";
270
refreshOut << option.indent << parentWidget << "->setTitle("
271
<< varName << ", " << trCall(title, className) << ");\n";
275
if (node->elementLayout().isEmpty())
279
void WriteInitialization::acceptLayout(DomLayout *node)
281
QString className = node->attributeClass();
282
QString varName = driver->findOrInsertLayout(node);
284
QHash<QString, DomProperty*> properties = propertyMap(node->elementProperty());
286
bool isGroupBox = false;
287
bool isMainWindow = false;
289
if (m_widgetChain.top()) {
290
QString parentWidget = m_widgetChain.top()->attributeClass();
292
if (!m_layoutChain.top() && (uic->customWidgetsInfo()->extends(parentWidget, QLatin1String("Q3GroupBox"))
293
|| uic->customWidgetsInfo()->extends(parentWidget, QLatin1String("Q3ButtonGroup")))) {
294
QString parent = driver->findOrInsertWidget(m_widgetChain.top());
298
// special case for group box
300
int margin = m_defaultMargin;
301
int spacing = m_defaultSpacing;
303
if (properties.contains(QLatin1String("margin")))
304
margin = properties.value(QLatin1String("margin"))->elementNumber();
306
if (properties.contains(QLatin1String("spacing")))
307
spacing = properties.value(QLatin1String("spacing"))->elementNumber();
309
output << option.indent << parent << "->setColumnLayout(0, Qt::Vertical);\n";
311
if (spacing != INT_MIN) {
312
QString value = QString::number(spacing);
313
if (!m_spacingFunction.isEmpty() && spacing == m_defaultSpacing)
314
value = m_spacingFunction + QLatin1String("()");
316
output << option.indent << parent << "->layout()->setSpacing(" << value << ");\n";
319
if (margin != INT_MIN) {
320
QString value = QString::number(margin);
321
if (!m_marginFunction.isEmpty() && spacing == m_defaultMargin)
322
value = m_marginFunction + QLatin1String("()");
324
output << option.indent << parent << "->layout()->setMargin(" << margin << ");\n";
327
} else if (uic->isMainWindow(parentWidget)) {
332
output << option.indent << varName << " = new " << className << "(";
335
output << driver->findOrInsertWidget(m_widgetChain.top()) << "->layout()";
336
} else if (!m_layoutChain.top()) {
337
output << driver->findOrInsertWidget(m_widgetChain.top());
342
QList<DomProperty*> layoutProperties = node->elementProperty();
345
output << option.indent << varName << "->setAlignment(Qt::AlignTop);\n";
347
int margin = m_defaultMargin;
348
int spacing = m_defaultSpacing;
350
if (properties.contains(QLatin1String("margin"))) {
351
DomProperty *p = properties.value(QLatin1String("margin"));
354
margin = properties.value(QLatin1String("margin"))->elementNumber();
355
layoutProperties.removeAt(layoutProperties.indexOf(p));
358
if (properties.contains(QLatin1String("spacing"))) {
359
DomProperty *p = properties.value(QLatin1String("spacing"));
362
spacing = properties.value(QLatin1String("spacing"))->elementNumber();
363
layoutProperties.removeAt(layoutProperties.indexOf(p));
366
if (spacing != INT_MIN) {
367
QString value = QString::number(spacing);
368
if (!m_spacingFunction.isEmpty() && spacing == m_defaultSpacing)
369
value = m_spacingFunction + QLatin1String("()");
371
output << option.indent << varName << "->setSpacing(" << value << ");\n";
374
if (margin != INT_MIN) {
375
QString value = QString::number(margin);
376
if (!m_marginFunction.isEmpty() && spacing == m_defaultMargin)
377
value = m_marginFunction + QLatin1String("()");
379
output << option.indent << varName << "->setMargin(" << margin << ");\n";
383
writeProperties(varName, className, layoutProperties);
385
m_layoutChain.push(node);
386
TreeWalker::acceptLayout(node);
390
void WriteInitialization::acceptSpacer(DomSpacer *node)
392
QHash<QString, DomProperty *> properties = propertyMap(node->elementProperty());
393
QString varName = driver->findOrInsertSpacer(node);
395
DomSize *sizeHint = properties.contains(QLatin1String("sizeHint"))
396
? properties.value(QLatin1String("sizeHint"))->elementSize() : 0;
398
QString sizeType = properties.contains(QLatin1String("sizeType"))
399
? properties.value(QLatin1String("sizeType"))->elementEnum()
400
: QString::fromLatin1("Expanding");
402
QString orientation = properties.contains(QLatin1String("orientation"))
403
? properties.value(QLatin1String("orientation"))->elementEnum() : QString();
405
bool isVspacer = orientation == QLatin1String("Qt::Vertical")
406
|| orientation == QLatin1String("Vertical");
408
output << option.indent << varName << " = new QSpacerItem(";
411
output << sizeHint->elementWidth() << ", " << sizeHint->elementHeight() << ", ";
413
if (sizeType.startsWith(QLatin1String("QSizePolicy::")) == false)
414
sizeType.prepend(QLatin1String("QSizePolicy::"));
417
output << "QSizePolicy::Minimum, " << sizeType << ");\n";
419
output << sizeType << ", QSizePolicy::Minimum);\n";
421
TreeWalker::acceptSpacer(node);
424
void WriteInitialization::acceptLayoutItem(DomLayoutItem *node)
426
TreeWalker::acceptLayoutItem(node);
428
DomLayout *layout = m_layoutChain.top();
433
QString varName = driver->findOrInsertLayoutItem(node);
434
QString layoutName = driver->findOrInsertLayout(layout);
437
if (layout->attributeClass() == QLatin1String("QGridLayout")) {
438
int row = node->attributeRow();
439
int col = node->attributeColumn();
442
if (node->hasAttributeRowSpan())
443
rowSpan = node->attributeRowSpan();
446
if (node->hasAttributeColSpan())
447
colSpan = node->attributeColSpan();
449
opt = QString::fromLatin1(", %1, %2, %3, %4").arg(row).arg(col).arg(rowSpan).arg(colSpan);
452
QString method = QLatin1String("addItem");
453
switch (node->kind()) {
454
case DomLayoutItem::Widget:
455
method = QLatin1String("addWidget");
457
case DomLayoutItem::Layout:
458
method = QLatin1String("addLayout");
460
case DomLayoutItem::Spacer:
461
method = QLatin1String("addItem");
463
case DomLayoutItem::Unknown:
468
output << "\n" << option.indent << layoutName << "->" << method << "(" << varName << opt << ");\n\n";
471
void WriteInitialization::acceptActionGroup(DomActionGroup *node)
473
QString actionName = driver->findOrInsertActionGroup(node);
474
QString varName = driver->findOrInsertWidget(m_widgetChain.top());
476
if (m_actionGroupChain.top())
477
varName = driver->findOrInsertActionGroup(m_actionGroupChain.top());
479
output << option.indent << actionName << " = new QActionGroup(" << varName << ");\n";
480
writeProperties(actionName, QLatin1String("QActionGroup"), node->elementProperty());
482
m_actionGroupChain.push(node);
483
TreeWalker::acceptActionGroup(node);
484
m_actionGroupChain.pop();
487
void WriteInitialization::acceptAction(DomAction *node)
489
if (node->hasAttributeMenu())
492
QString actionName = driver->findOrInsertAction(node);
493
QString varName = driver->findOrInsertWidget(m_widgetChain.top());
495
if (m_actionGroupChain.top())
496
varName = driver->findOrInsertActionGroup(m_actionGroupChain.top());
498
output << option.indent << actionName << " = new QAction(" << varName << ");\n";
499
writeProperties(actionName, QLatin1String("QAction"), node->elementProperty());
502
void WriteInitialization::acceptActionRef(DomActionRef *node)
504
QString actionName = node->attributeName();
505
bool isSeparator = actionName == QLatin1String("separator");
508
QString varName = driver->findOrInsertWidget(m_widgetChain.top());
510
if (actionName.isEmpty() || !m_widgetChain.top()) {
512
} else if (driver->actionGroupByName(actionName)) {
514
} else if (DomWidget *w = driver->widgetByName(actionName)) {
515
isMenu = uic->isMenu(w->attributeClass());
516
bool inQ3ToolBar = uic->customWidgetsInfo()->extends(m_widgetChain.top()->attributeClass(), QLatin1String("Q3ToolBar"));
517
if (!isMenu && inQ3ToolBar) {
518
actionOut << option.indent << actionName << "->setParent(0);\n";
519
actionOut << option.indent << actionName << "->setParent(" << varName << ");\n";
522
} else if (!(driver->actionByName(actionName) || isSeparator)) {
523
fprintf(stderr, "Warning: action `%s' not declared\n", actionName.toLatin1().data());
527
if (m_widgetChain.top() && isSeparator) {
528
// separator is always reserved!
529
actionOut << option.indent << varName << "->addSeparator();\n";
534
actionName += QLatin1String("->menuAction()");
536
actionOut << option.indent << varName << "->addAction(" << actionName << ");\n";
539
void WriteInitialization::writeProperties(const QString &varName,
540
const QString &className,
541
const QList<DomProperty*> &lst)
543
bool isTopLevel = m_widgetChain.count() == 1;
545
if (uic->customWidgetsInfo()->extends(className, QLatin1String("QAxWidget"))) {
546
QHash<QString, DomProperty*> properties = propertyMap(lst);
547
if (properties.contains(QLatin1String("control"))) {
548
DomProperty *p = properties.value(QLatin1String("control"));
549
output << option.indent << varName << "->setControl(QString::fromUtf8("
550
<< fixString(toString(p->elementString())) << "));\n";
554
DomWidget *buttonGroupWidget = findWidget(QLatin1String("Q3ButtonGroup"));
556
output << option.indent << varName << "->setObjectName(QString::fromUtf8(" << fixString(varName) << "));\n";
558
for (int i=0; i<lst.size(); ++i) {
559
DomProperty *p = lst.at(i);
560
QString propertyName = p->attributeName();
561
QString propertyValue;
563
// special case for the property `geometry'
564
if (isTopLevel && propertyName == QLatin1String("geometry") && p->elementRect()) {
565
DomRect *r = p->elementRect();
566
int w = r->elementWidth();
567
int h = r->elementHeight();
568
output << option.indent << varName << "->resize(QSize(" << w << ", " << h << ").expandedTo("
569
<< varName << "->minimumSizeHint()));\n";
571
} else if (propertyName == QLatin1String("buttonGroupId") && buttonGroupWidget) { // Q3ButtonGroup support
572
output << option.indent << driver->findOrInsertWidget(buttonGroupWidget) << "->insert("
573
<< varName << ", " << p->elementNumber() << ");\n";
575
} else if (propertyName == QLatin1String("control") // ActiveQt support
576
&& uic->customWidgetsInfo()->extends(className, QLatin1String("QAxWidget"))) {
579
} else if (propertyName == QLatin1String("database")
580
&& p->elementStringList()) {
583
} else if (propertyName == QLatin1String("frameworkCode")
584
&& p->kind() == DomProperty::Bool) {
587
} else if (propertyName == QLatin1String("orientation")
588
&& uic->customWidgetsInfo()->extends(className, QLatin1String("Line"))) {
590
QString shape = QLatin1String("QFrame::HLine");
591
if (p->elementEnum() == QLatin1String("Qt::Vertical"))
592
shape = QLatin1String("QFrame::VLine");
594
output << option.indent << varName << "->setFrameShape(" << shape << ");\n";
598
bool stdset = m_stdsetdef;
599
if (p->hasAttributeStdset())
600
stdset = p->attributeStdset();
602
QString setFunction = stdset
603
? QLatin1String("->set") + propertyName.left(1).toUpper() + propertyName.mid(1) + QLatin1String("(")
604
: QLatin1String("->setProperty(\"") + propertyName + QLatin1String("\", QVariant(");
607
case DomProperty::Bool: {
608
propertyValue = p->elementBool();
611
case DomProperty::Color: {
612
DomColor *c = p->elementColor();
613
propertyValue = QString::fromLatin1("QColor(%1, %2, %3)")
614
.arg(c->elementRed())
615
.arg(c->elementGreen())
616
.arg(c->elementBlue()); }
618
case DomProperty::Cstring:
619
if (propertyName == QLatin1String("buddy") && uic->customWidgetsInfo()->extends(className, QLatin1String("QLabel"))) {
620
m_buddies.append(Buddy(varName, p->elementCstring()));
622
propertyValue = fixString(p->elementCstring());
625
case DomProperty::Cursor:
626
propertyValue = QString::fromLatin1("QCursor(static_cast<Qt::CursorShape>(%1))")
627
.arg(p->elementCursor());
629
case DomProperty::Enum:
630
propertyValue = p->elementEnum();
631
if (!propertyValue.contains(QLatin1String("::")))
632
propertyValue.prepend(className + QLatin1String(QLatin1String("::")));
634
case DomProperty::Set:
635
propertyValue = p->elementSet();
637
case DomProperty::Font: {
638
DomFont *f = p->elementFont();
639
QString fontName = driver->unique(QLatin1String("font"));
640
output << option.indent << "QFont " << fontName << ";\n";
641
output << option.indent << fontName << ".setFamily(QString::fromUtf8(" << fixString(f->elementFamily())
643
output << option.indent << fontName << ".setPointSize(" << f->elementPointSize()
645
output << option.indent << fontName << ".setBold("
646
<< (f->elementBold() ? "true" : "false") << ");\n";
647
output << option.indent << fontName << ".setItalic("
648
<< (f->elementItalic() ? "true" : "false") << ");\n";
649
output << option.indent << fontName << ".setUnderline("
650
<< (f->elementUnderline() ? "true" : "false") << ");\n";
651
output << option.indent << fontName << ".setWeight("
652
<< f->elementWeight() << ");" << endl;
653
output << option.indent << fontName << ".setStrikeOut("
654
<< (f->elementStrikeOut() ? "true" : "false") << ");\n";
655
propertyValue = fontName;
658
case DomProperty::IconSet:
659
propertyValue = pixCall(p->elementIconSet());
662
case DomProperty::Pixmap:
663
propertyValue = pixCall(p->elementPixmap());
666
case DomProperty::Palette: {
667
DomPalette *pal = p->elementPalette();
668
QString paletteName = driver->unique(QLatin1String("palette"));
669
output << option.indent << "QPalette " << paletteName << ";\n";
671
writeColorGroup(pal->elementActive(), QLatin1String("QPalette::Active"), paletteName);
672
writeColorGroup(pal->elementInactive(), QLatin1String("QPalette::Inactive"), paletteName);
673
writeColorGroup(pal->elementDisabled(), QLatin1String("QPalette::Disabled"), paletteName);
675
propertyValue = paletteName;
678
case DomProperty::Point: {
679
DomPoint *po = p->elementPoint();
680
propertyValue = QString::fromLatin1("QPoint(%1, %2)")
681
.arg(po->elementX()).arg(po->elementY());
684
case DomProperty::Rect: {
685
DomRect *r = p->elementRect();
686
propertyValue = QString::fromLatin1("QRect(%1, %2, %3, %4)")
687
.arg(r->elementX()).arg(r->elementY())
688
.arg(r->elementWidth()).arg(r->elementHeight());
691
case DomProperty::SizePolicy: {
692
DomSizePolicy *sp = p->elementSizePolicy();
693
QString spName = driver->unique(QLatin1String("sizePolicy"));
694
output << option.indent << "QSizePolicy " << spName << QString::fromLatin1(
695
"((QSizePolicy::Policy)%1, (QSizePolicy::Policy)%2);\n")
696
.arg(sp->elementHSizeType())
697
.arg(sp->elementVSizeType());
698
output << option.indent << spName << ".setHorizontalStretch("
699
<< sp->elementHorStretch() << ");\n";
700
output << option.indent << spName << ".setVerticalStretch("
701
<< sp->elementVerStretch() << ");\n";
702
output << option.indent << spName << QString::fromLatin1(
703
".setHeightForWidth(%1->sizePolicy().hasHeightForWidth());\n")
706
propertyValue = spName;
709
case DomProperty::Size: {
710
DomSize *s = p->elementSize();
711
propertyValue = QString::fromLatin1("QSize(%1, %2)")
712
.arg(s->elementWidth()).arg(s->elementHeight());
715
case DomProperty::String: {
716
if (propertyName == QLatin1String("objectName")) {
717
QString v = p->elementString()->text();
721
// ### qWarning("Deprecated: the property `objectName' is different from the variable name");
724
if (p->elementString()->hasAttributeNotr()
725
&& toBool(p->elementString()->attributeNotr())) {
726
propertyValue = QLatin1String("QString::fromUtf8(")
727
+ fixString(p->elementString()->text())
728
+ QLatin1String(")");
730
propertyValue = trCall(p->elementString(), className);
734
case DomProperty::Number:
735
propertyValue = QString::number(p->elementNumber());
737
case DomProperty::Float:
738
propertyValue = QString::number(p->elementFloat());
740
case DomProperty::Double:
741
propertyValue = QString::number(p->elementDouble());
743
case DomProperty::Date: {
744
DomDate *d = p->elementDate();
745
propertyValue = QString::fromLatin1("QDate(%1, %2, %3)")
746
.arg(d->elementYear())
747
.arg(d->elementMonth())
748
.arg(d->elementDay());
751
case DomProperty::Time: {
752
DomTime *t = p->elementTime();
753
propertyValue = QString::fromLatin1("QTime(%1, %2, %3)")
754
.arg(t->elementHour())
755
.arg(t->elementMinute())
756
.arg(t->elementSecond());
759
case DomProperty::DateTime: {
760
DomDateTime *dt = p->elementDateTime();
761
propertyValue = QString::fromLatin1("QDateTime(QDate(%1, %2, %3), QTime(%4, %5, %6))")
762
.arg(dt->elementYear())
763
.arg(dt->elementMonth())
764
.arg(dt->elementDay())
765
.arg(dt->elementHour())
766
.arg(dt->elementMinute())
767
.arg(dt->elementSecond());
770
case DomProperty::StringList:
771
propertyValue = QLatin1String("QStringList()");
772
if (p->elementStringList()->elementString().size()) {
773
QStringList lst = p->elementStringList()->elementString();
774
for (int i=0; i<lst.size(); ++i) {
775
propertyValue += QLatin1String(" << ") + fixString(lst.at(i));
780
case DomProperty::Unknown:
784
if (propertyValue.size()) {
785
QTextStream *o = &output;
787
if (p->kind() == DomProperty::String
788
&& (!p->elementString()->hasAttributeNotr() || !toBool(p->elementString()->attributeNotr())))
791
(*o) << option.indent << varName << setFunction << propertyValue;
799
QString WriteInitialization::domColor2QString(DomColor *c)
801
return QString::fromLatin1("QColor(%1, %2, %3)")
802
.arg(c->elementRed())
803
.arg(c->elementGreen())
804
.arg(c->elementBlue());
807
void WriteInitialization::writeColorGroup(DomColorGroup *colorGroup, const QString &group, const QString &paletteName)
812
QList<DomColor*> colors = colorGroup->elementColor();
813
for (int i=0; i<colors.size(); ++i) {
814
DomColor *color = colors.at(i);
816
output << option.indent << paletteName << ".setColor(" << group
817
<< ", " << "static_cast<QPalette::ColorRole>(" << i << ")"
818
<< ", " << domColor2QString(color)
823
void WriteInitialization::acceptCustomWidget(DomCustomWidget *node)
828
void WriteInitialization::acceptCustomWidgets(DomCustomWidgets *node)
833
void WriteInitialization::acceptTabStops(DomTabStops *tabStops)
837
QStringList l = tabStops->elementTabStop();
838
for (int i=0; i<l.size(); ++i) {
839
QString name = l.at(i);
841
if (!m_registeredWidgets.contains(name)) {
842
fprintf(stderr, "'%s' isn't a valid widget\n", name.toLatin1().data());
849
} else if (name.isEmpty() || lastName.isEmpty()) {
853
output << option.indent << "QWidget::setTabOrder(" << lastName << ", " << name << ");\n";
859
QString WriteInitialization::translate(const QString &text, const QString &className) const
861
if (option.translateFunction.size())
862
return option.translateFunction + QLatin1String("(") + text + QLatin1String(")");
866
return QLatin1String("QApplication::translate(\"") + m_generatedClass + QLatin1String("\", ") + text + QLatin1String(")");
869
void WriteInitialization::acceptLayoutDefault(DomLayoutDefault *node)
871
m_defaultMargin = INT_MIN;
872
m_defaultSpacing = INT_MIN;
877
if (node->hasAttributeMargin())
878
m_defaultMargin = node->attributeMargin();
880
if (node->hasAttributeSpacing())
881
m_defaultSpacing = node->attributeSpacing();
884
void WriteInitialization::acceptLayoutFunction(DomLayoutFunction *node)
886
m_marginFunction.clear();
887
m_spacingFunction.clear();
892
if (node->hasAttributeMargin())
893
m_marginFunction = node->attributeMargin();
895
if (node->hasAttributeSpacing())
896
m_spacingFunction = node->attributeSpacing();
899
void WriteInitialization::initializeQ3ListBox(DomWidget *w)
901
QString varName = driver->findOrInsertWidget(w);
902
QString className = w->attributeClass();
904
QList<DomItem*> items = w->elementItem();
909
refreshOut << option.indent << varName << "->clear();\n";
911
for (int i=0; i<items.size(); ++i) {
912
DomItem *item = items.at(i);
914
QHash<QString, DomProperty*> properties = propertyMap(item->elementProperty());
915
DomProperty *text = properties.value(QLatin1String("text"));
916
DomProperty *pixmap = properties.value(QLatin1String("pixmap"));
917
if (!(text || pixmap))
920
refreshOut << option.indent << varName << "->insertItem(";
922
refreshOut << pixCall(pixmap->elementPixmap());
927
refreshOut << trCall(text->elementString(), className) << ");\n";
931
void WriteInitialization::initializeQ3IconView(DomWidget *w)
933
QString varName = driver->findOrInsertWidget(w);
934
QString className = w->attributeClass();
936
QList<DomItem*> items = w->elementItem();
941
refreshOut << option.indent << varName << "->clear();\n";
943
for (int i=0; i<items.size(); ++i) {
944
DomItem *item = items.at(i);
946
QHash<QString, DomProperty*> properties = propertyMap(item->elementProperty());
947
DomProperty *text = properties.value(QLatin1String("text"));
948
DomProperty *pixmap = properties.value(QLatin1String("pixmap"));
949
if (!(text || pixmap))
952
QString itemName = driver->unique(QLatin1String("__item"));
954
refreshOut << option.indent << "Q3IconViewItem *" << itemName << " = new Q3IconViewItem(" << varName << ");\n";
957
refreshOut << option.indent << itemName << "->setPixmap(" << pixCall(pixmap->elementPixmap()) << ");\n";
961
refreshOut << option.indent << itemName << "->setText(" << trCall(text->elementString(), className) << ");\n";
966
void WriteInitialization::initializeQ3ListView(DomWidget *w)
968
QString varName = driver->findOrInsertWidget(w);
969
QString className = w->attributeClass();
972
QList<DomColumn*> columns = w->elementColumn();
973
for (int i=0; i<columns.size(); ++i) {
974
DomColumn *column = columns.at(i);
976
QHash<QString, DomProperty*> properties = propertyMap(column->elementProperty());
977
DomProperty *text = properties.value(QLatin1String("text"));
978
DomProperty *pixmap = properties.value(QLatin1String("pixmap"));
979
DomProperty *clickable = properties.value(QLatin1String("clickable"));
980
DomProperty *resizable = properties.value(QLatin1String("resizable"));
982
QString txt = trCall(text->elementString(), className);
983
output << option.indent << varName << "->addColumn(" << txt << ");\n";
984
refreshOut << option.indent << varName << "->header()->setLabel(" << i << ", " << txt << ");\n";
987
output << option.indent << varName << "->header()->setLabel("
988
<< varName << "->header()->count() - 1, " << pixCall(pixmap->elementIconSet()) << ", " << txt << ");\n";
991
if (clickable != 0) {
992
output << option.indent << varName << "->header()->setClickEnabled(" << clickable->elementBool() << ", " << varName << "->header()->count() - 1);\n";
995
if (resizable != 0) {
996
output << option.indent << varName << "->header()->setResizeEnabled(" << resizable->elementBool() << ", " << varName << "->header()->count() - 1);\n";
1000
if (w->elementItem().size()) {
1001
refreshOut << option.indent << varName << "->clear();\n";
1003
initializeQ3ListViewItems(className, varName, w->elementItem());
1007
void WriteInitialization::initializeQ3ListViewItems(const QString &className, const QString &varName, const QList<DomItem *> &items)
1009
if (items.isEmpty())
1013
for (int i=0; i<items.size(); ++i) {
1014
DomItem *item = items.at(i);
1016
QString itemName = driver->unique(QLatin1String("__item"));
1018
refreshOut << option.indent << "Q3ListViewItem *" << itemName << " = new Q3ListViewItem(" << varName << ");\n";
1020
int textCount = 0, pixCount = 0;
1021
QList<DomProperty*> properties = item->elementProperty();
1022
for (int i=0; i<properties.size(); ++i) {
1023
DomProperty *p = properties.at(i);
1024
if (p->attributeName() == QLatin1String("text"))
1025
refreshOut << option.indent << itemName << "->setText(" << textCount++ << ", "
1026
<< trCall(p->elementString(), className) << ");\n";
1028
if (p->attributeName() == QLatin1String("pixmap"))
1029
refreshOut << option.indent << itemName << "->setPixmap(" << pixCount++ << ", "
1030
<< pixCall(p->elementPixmap()) << ");\n";
1033
if (item->elementItem().size()) {
1034
refreshOut << option.indent << itemName << "->setOpen(true);\n";
1035
initializeQ3ListViewItems(className, itemName, item->elementItem());
1040
void WriteInitialization::initializeTreeWidgetItems(const QString &className, const QString &varName, const QList<DomItem *> &items)
1042
if (items.isEmpty())
1046
for (int i=0; i<items.size(); ++i) {
1047
DomItem *item = items.at(i);
1049
QString itemName = driver->unique(QLatin1String("__item"));
1051
refreshOut << option.indent << "QTreeWidgetItem *" << itemName << " = new QTreeWidgetItem(" << varName << ");\n";
1053
int textCount = 0, pixCount = 0;
1054
QList<DomProperty*> properties = item->elementProperty();
1055
for (int i=0; i<properties.size(); ++i) {
1056
DomProperty *p = properties.at(i);
1057
if (p->attributeName() == QLatin1String("text"))
1058
refreshOut << option.indent << itemName << "->setText(" << textCount++ << ", "
1059
<< trCall(p->elementString(), className) << ");\n";
1061
if (p->attributeName() == QLatin1String("icon"))
1062
refreshOut << option.indent << itemName << "->setIcon(" << pixCount++ << ", "
1063
<< pixCall(p->elementIconSet()) << ");\n";
1066
if (item->elementItem().size()) {
1067
refreshOut << option.indent << varName << "->setExpanded(" << itemName << ", " << "true);\n";
1068
initializeTreeWidgetItems(className, itemName, item->elementItem());
1074
void WriteInitialization::initializeQ3Table(DomWidget *w)
1076
QString varName = driver->findOrInsertWidget(w);
1077
QString className = w->attributeClass();
1080
QList<DomColumn*> columns = w->elementColumn();
1081
output << option.indent << varName << "->setNumCols(" << columns.size() << ");\n";
1083
for (int i=0; i<columns.size(); ++i) {
1084
DomColumn *column = columns.at(i);
1086
QHash<QString, DomProperty*> properties = propertyMap(column->elementProperty());
1087
DomProperty *text = properties.value(QLatin1String("text"));
1088
DomProperty *pixmap = properties.value(QLatin1String("pixmap"));
1090
refreshOut << option.indent << varName << "->horizontalHeader()->setLabel(" << i << ", ";
1092
refreshOut << pixCall(pixmap->elementPixmap()) << ", ";
1094
refreshOut << trCall(text->elementString(), className) << ");\n";
1098
QList<DomRow*> rows = w->elementRow();
1099
refreshOut << option.indent << varName << "->setNumRows(" << rows.size() << ");\n";
1101
for (int i=0; i<rows.size(); ++i) {
1102
DomRow *row = rows.at(i);
1104
QHash<QString, DomProperty*> properties = propertyMap(row->elementProperty());
1105
DomProperty *text = properties.value(QLatin1String("text"));
1106
DomProperty *pixmap = properties.value(QLatin1String("pixmap"));
1108
refreshOut << option.indent << varName << "->verticalHeader()->setLabel(" << i << ", ";
1110
refreshOut << pixCall(pixmap->elementPixmap()) << ", ";
1112
refreshOut << trCall(text->elementString(), className) << ");\n";
1116
//initializeQ3TableItems(className, varName, w->elementItem());
1119
void WriteInitialization::initializeQ3TableItems(const QString &className, const QString &varName, const QList<DomItem *> &items)
1121
Q_UNUSED(className);
1126
QString WriteInitialization::pixCall(DomResourcePixmap *r) const
1128
QString s = r->text();
1131
return QLatin1String("QPixmap()");
1132
else if (findImage(s) != 0)
1133
return QLatin1String("icon(") + s + QLatin1String("_ID)");
1135
QString pixFunc = uic->pixmapFunction();
1136
if (pixFunc.isEmpty())
1137
pixFunc = QLatin1String("QString::fromUtf8");
1139
return QLatin1String("QPixmap(") + pixFunc + QLatin1String("(") + fixString(s) + QLatin1String(")") + QLatin1String(")");
1142
void WriteInitialization::initializeComboBox(DomWidget *w)
1144
QString varName = driver->findOrInsertWidget(w);
1145
QString className = w->attributeClass();
1147
QList<DomItem*> items = w->elementItem();
1149
if (items.isEmpty())
1152
for (int i=0; i<items.size(); ++i) {
1153
DomItem *item = items.at(i);
1155
QHash<QString, DomProperty*> properties = propertyMap(item->elementProperty());
1156
DomProperty *text = properties.value(QLatin1String("text"));
1157
DomProperty *pixmap = properties.value(QLatin1String("icon"));
1158
if (!(text || pixmap))
1161
refreshOut << option.indent << varName << "->addItem(";
1164
DomResourcePixmap *pix = pixmap->elementIconSet();
1166
pix = pixmap->elementPixmap(); // ### for q3support code!
1170
refreshOut << pixCall(pix);
1176
refreshOut << trCall(text->elementString(), className) << ");\n";
1180
void WriteInitialization::initializeListWidget(DomWidget *w)
1182
QString varName = driver->findOrInsertWidget(w);
1183
QString className = w->attributeClass();
1185
QList<DomItem*> items = w->elementItem();
1187
if (items.isEmpty())
1190
refreshOut << option.indent << varName << "->clear();\n";
1193
for (int i=0; i<items.size(); ++i) {
1194
DomItem *item = items.at(i);
1196
QString itemName = driver->unique(QLatin1String("__item"));
1198
refreshOut << option.indent << "QListWidgetItem *" << itemName << " = new QListWidgetItem(" << varName << ");\n";
1200
QList<DomProperty*> properties = item->elementProperty();
1201
for (int i=0; i<properties.size(); ++i) {
1202
DomProperty *p = properties.at(i);
1204
if (p->attributeName() == QLatin1String("text"))
1205
refreshOut << option.indent << itemName << "->setText(" << trCall(p->elementString(), className) << ");\n";
1207
if (p->attributeName() == QLatin1String("icon"))
1208
refreshOut << option.indent << itemName << "->setIcon(" << pixCall(p->elementIconSet()) << ");\n";
1213
void WriteInitialization::initializeTreeWidget(DomWidget *w)
1215
QString varName = driver->findOrInsertWidget(w);
1216
QString className = w->attributeClass();
1219
QList<DomColumn*> columns = w->elementColumn();
1220
for (int i=0; i<columns.size(); ++i) {
1221
DomColumn *column = columns.at(i);
1223
QHash<QString, DomProperty*> properties = propertyMap(column->elementProperty());
1224
DomProperty *text = properties.value(QLatin1String("text"));
1225
DomProperty *icon = properties.value(QLatin1String("icon"));
1227
QString txt = trCall(text->elementString(), className);
1228
refreshOut << option.indent << varName << "->headerItem()->setText(" << i << ", " << txt << ");\n";
1230
if (icon != 0 && icon->elementIconSet()) {
1231
output << option.indent << varName << "->headerItem()->setIcon("
1232
<< varName << "->headerItem()->childCount() - 1, " << pixCall(icon->elementIconSet()) << ");\n";
1236
if (w->elementItem().size()) {
1237
refreshOut << option.indent << varName << "->clear();\n";
1239
initializeTreeWidgetItems(className, varName, w->elementItem());
1243
void WriteInitialization::initializeTableWidget(DomWidget *w)
1245
// ### not implemented yet
1249
QString WriteInitialization::trCall(const QString &str, const QString &className) const
1251
return translate(fixString(str), className);
1254
void WriteInitialization::initializeSqlDataTable(DomWidget *w)
1256
QHash<QString, DomProperty*> properties = propertyMap(w->elementProperty());
1258
DomProperty *frameworkCode = properties.value(QLatin1String("frameworkCode"), 0);
1259
if (frameworkCode && toBool(frameworkCode->elementBool()) == false)
1266
DomProperty *db = properties.value(QLatin1String("database"), 0);
1267
if (db && db->elementStringList()) {
1268
QStringList info = db->elementStringList()->elementString();
1269
connection = info.size() > 0 ? info.at(0) : QString();
1270
table = info.size() > 1 ? info.at(1) : QString();
1271
field = info.size() > 2 ? info.at(2) : QString();
1274
if (table.isEmpty() || connection.isEmpty()) {
1275
fprintf(stderr, "invalid database connection\n");
1279
QString varName = driver->findOrInsertWidget(w);
1281
output << option.indent << "if (!" << varName << "->sqlCursor()) {\n";
1283
output << option.indent << option.indent << varName << "->setSqlCursor(";
1285
if (connection == QLatin1String("(default)")) {
1286
output << "new QSqlCursor(" << fixString(table) << "), false, true);\n";
1288
output << "new QSqlCursor(" << fixString(table) << ", true, " << connection << "Connection" << "), false, true);\n";
1290
output << option.indent << option.indent << varName << "->refresh(QDataTable::RefreshAll);\n";
1291
output << option.indent << "}\n";
1294
void WriteInitialization::initializeSqlDataBrowser(DomWidget *w)
1296
QHash<QString, DomProperty*> properties = propertyMap(w->elementProperty());
1298
DomProperty *frameworkCode = properties.value(QLatin1String("frameworkCode"), 0);
1299
if (frameworkCode && toBool(frameworkCode->elementBool()) == false)
1306
DomProperty *db = properties.value(QLatin1String("database"), 0);
1307
if (db && db->elementStringList()) {
1308
QStringList info = db->elementStringList()->elementString();
1309
connection = info.size() > 0 ? info.at(0) : QString();
1310
table = info.size() > 1 ? info.at(1) : QString();
1311
field = info.size() > 2 ? info.at(2) : QString();
1314
if (table.isEmpty() || connection.isEmpty()) {
1315
fprintf(stderr, "invalid database connection\n");
1319
QString varName = driver->findOrInsertWidget(w);
1321
output << option.indent << "if (!" << varName << "->sqlCursor()) {\n";
1323
output << option.indent << option.indent << varName << "->setSqlCursor(";
1325
if (connection == QLatin1String("(default)")) {
1326
output << "new QSqlCursor(" << fixString(table) << "), true);\n";
1328
output << "new QSqlCursor(" << fixString(table) << ", true, " << connection << "Connection" << "), false, true);\n";
1330
output << option.indent << option.indent << varName << "->refresh();\n";
1331
output << option.indent << "}\n";
1334
void WriteInitialization::initializeMenu(DomWidget *w, const QString &/*parentWidget*/)
1336
QString menuName = driver->findOrInsertWidget(w);
1337
QString menuAction = menuName + QLatin1String("Action");
1339
DomAction *action = driver->actionByName(menuAction);
1340
if (action && action->hasAttributeMenu()) {
1341
output << option.indent << menuAction << " = " << menuName << "->menuAction();\n";
1345
QString WriteInitialization::trCall(const DomString *str, const QString &className) const
1347
return trCall(toString(str), className);
1350
void WriteInitialization::acceptConnection(DomConnection *connection)
1352
if (!m_registeredWidgets.contains(connection->elementSender())
1353
|| !m_registeredWidgets.contains(connection->elementReceiver()))
1356
output << option.indent << "QObject::connect("
1357
<< connection->elementSender()
1359
<< "SIGNAL(" << connection->elementSignal() << ")"
1361
<< connection->elementReceiver()
1363
<< "SLOT(" << connection->elementSlot() << ")"
1367
DomImage *WriteInitialization::findImage(const QString &name) const
1369
return m_registeredImages.value(name);
1372
DomWidget *WriteInitialization::findWidget(const QString &widgetClass)
1374
for (int i = m_widgetChain.count() - 1; i >= 0; --i) {
1375
DomWidget *widget = m_widgetChain.at(i);
1377
if (widget && uic->customWidgetsInfo()->extends(widget->attributeClass(), widgetClass))
1384
void WriteInitialization::acceptImage(DomImage *image)
1386
if (!image->hasAttributeName())
1389
m_registeredImages.insert(image->attributeName(), image);