/****************************************************************************+ −
**+ −
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).+ −
** All rights reserved.+ −
** Contact: Nokia Corporation (qt-info@nokia.com)+ −
**+ −
** This file is part of the tools applications 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 "uic.h"+ −
#include "ui4.h"+ −
#include "driver.h"+ −
#include "option.h"+ −
#include "treewalker.h"+ −
#include "validator.h"+ −
+ −
#ifdef QT_UIC_CPP_GENERATOR+ −
#include "cppwriteincludes.h"+ −
#include "cppwritedeclaration.h"+ −
#endif+ −
+ −
#ifdef QT_UIC_JAVA_GENERATOR+ −
#include "javawriteincludes.h"+ −
#include "javawritedeclaration.h"+ −
#endif+ −
+ −
#include <QtXml/QDomDocument>+ −
#include <QtCore/QFileInfo>+ −
#include <QtCore/QRegExp>+ −
#include <QtCore/QTextStream>+ −
#include <QtCore/QDateTime>+ −
+ −
#if defined Q_WS_WIN+ −
#include <qt_windows.h>+ −
#endif+ −
+ −
QT_BEGIN_NAMESPACE+ −
+ −
Uic::Uic(Driver *d)+ −
: drv(d),+ −
out(d->output()),+ −
opt(d->option()),+ −
info(d),+ −
externalPix(true)+ −
{+ −
}+ −
+ −
Uic::~Uic()+ −
{+ −
}+ −
+ −
bool Uic::printDependencies()+ −
{+ −
QString fileName = opt.inputFile;+ −
+ −
QFile f;+ −
if (fileName.isEmpty())+ −
f.open(stdin, QIODevice::ReadOnly);+ −
else {+ −
f.setFileName(fileName);+ −
if (!f.open(QIODevice::ReadOnly))+ −
return false;+ −
}+ −
+ −
QDomDocument doc; // ### generalize. share more code with the other tools!+ −
if (!doc.setContent(&f))+ −
return false;+ −
+ −
QDomElement root = doc.firstChildElement();+ −
DomUI *ui = new DomUI();+ −
ui->read(root);+ −
+ −
double version = ui->attributeVersion().toDouble();+ −
if (version < 4.0) {+ −
delete ui;+ −
+ −
fprintf(stderr, "uic: File generated with too old version of Qt Designer\n");+ −
return false;+ −
}+ −
+ −
if (DomIncludes *includes = ui->elementIncludes()) {+ −
foreach (DomInclude *incl, includes->elementInclude()) {+ −
QString file = incl->text();+ −
if (file.isEmpty())+ −
continue;+ −
+ −
fprintf(stdout, "%s\n", file.toLocal8Bit().constData());+ −
}+ −
}+ −
+ −
if (DomCustomWidgets *customWidgets = ui->elementCustomWidgets()) {+ −
foreach (DomCustomWidget *customWidget, customWidgets->elementCustomWidget()) {+ −
if (DomHeader *header = customWidget->elementHeader()) {+ −
QString file = header->text();+ −
if (file.isEmpty())+ −
continue;+ −
+ −
fprintf(stdout, "%s\n", file.toLocal8Bit().constData());+ −
}+ −
}+ −
}+ −
+ −
delete ui;+ −
+ −
return true;+ −
}+ −
+ −
void Uic::writeCopyrightHeader(DomUI *ui)+ −
{+ −
QString comment = ui->elementComment();+ −
if (comment.size())+ −
out << "/*\n" << comment << "\n*/\n\n";+ −
+ −
out << "/********************************************************************************\n";+ −
out << "** Form generated from reading UI file '" << QFileInfo(opt.inputFile).fileName() << "'\n";+ −
out << "**\n";+ −
out << "** Created: " << QDateTime::currentDateTime().toString() << "\n";+ −
out << "** " << QString::fromLatin1("by: Qt User Interface Compiler version %1\n").arg(QLatin1String(QT_VERSION_STR));+ −
out << "**\n";+ −
out << "** WARNING! All changes made in this file will be lost when recompiling UI file!\n";+ −
out << "********************************************************************************/\n\n";+ −
}+ −
+ −
bool Uic::write(QIODevice *in)+ −
{+ −
QDomDocument doc;+ −
if (!doc.setContent(in))+ −
return false;+ −
+ −
if (option().generator == Option::JavaGenerator) {+ −
// the Java generator ignores header protection+ −
opt.headerProtection = false;+ −
}+ −
+ −
QDomElement root = doc.firstChildElement();+ −
DomUI *ui = new DomUI();+ −
ui->read(root);+ −
+ −
double version = ui->attributeVersion().toDouble();+ −
if (version < 4.0) {+ −
delete ui;+ −
+ −
fprintf(stderr, "uic: File generated with too old version of Qt Designer\n");+ −
return false;+ −
}+ −
+ −
QString language = ui->attributeLanguage();+ −
+ −
+ −
bool rtn = false;+ −
+ −
if (option().generator == Option::JavaGenerator) {+ −
#ifdef QT_UIC_JAVA_GENERATOR+ −
if (language.toLower() != QLatin1String("jambi")) {+ −
fprintf(stderr, "uic: File is not a 'jambi' form\n");+ −
return false;+ −
}+ −
rtn = jwrite (ui);+ −
#else+ −
fprintf(stderr, "uic: option to generate java code not compiled in\n");+ −
#endif+ −
} else {+ −
#ifdef QT_UIC_CPP_GENERATOR+ −
if (!language.isEmpty() && language.toLower() != QLatin1String("c++")) {+ −
fprintf(stderr, "uic: File is not a 'c++' ui file, language=%s\n", qPrintable(language));+ −
return false;+ −
}+ −
+ −
rtn = write (ui);+ −
#else+ −
fprintf(stderr, "uic: option to generate cpp code not compiled in\n");+ −
#endif+ −
}+ −
+ −
delete ui;+ −
+ −
return rtn;+ −
}+ −
+ −
#ifdef QT_UIC_CPP_GENERATOR+ −
bool Uic::write(DomUI *ui)+ −
{+ −
using namespace CPP;+ −
+ −
if (!ui || !ui->elementWidget())+ −
return false;+ −
+ −
if (opt.copyrightHeader)+ −
writeCopyrightHeader(ui);+ −
+ −
if (opt.headerProtection) {+ −
writeHeaderProtectionStart();+ −
out << "\n";+ −
}+ −
+ −
pixFunction = ui->elementPixmapFunction();+ −
if (pixFunction == QLatin1String("QPixmap::fromMimeSource"))+ −
pixFunction = QLatin1String("qPixmapFromMimeSource");+ −
+ −
externalPix = ui->elementImages() == 0;+ −
+ −
info.acceptUI(ui);+ −
cWidgetsInfo.acceptUI(ui);+ −
WriteIncludes writeIncludes(this);+ −
writeIncludes.acceptUI(ui);+ −
+ −
Validator(this).acceptUI(ui);+ −
WriteDeclaration(this, writeIncludes.scriptsActivated()).acceptUI(ui);+ −
+ −
if (opt.headerProtection)+ −
writeHeaderProtectionEnd();+ −
+ −
return true;+ −
}+ −
#endif+ −
+ −
#ifdef QT_UIC_JAVA_GENERATOR+ −
bool Uic::jwrite(DomUI *ui)+ −
{+ −
using namespace Java;+ −
+ −
if (!ui || !ui->elementWidget())+ −
return false;+ −
+ −
if (opt.copyrightHeader)+ −
writeCopyrightHeader(ui);+ −
+ −
pixFunction = ui->elementPixmapFunction();+ −
if (pixFunction == QLatin1String("QPixmap::fromMimeSource"))+ −
pixFunction = QLatin1String("qPixmapFromMimeSource");+ −
+ −
externalPix = ui->elementImages() == 0;+ −
+ −
info.acceptUI(ui);+ −
cWidgetsInfo.acceptUI(ui);+ −
WriteIncludes(this).acceptUI(ui);+ −
+ −
Validator(this).acceptUI(ui);+ −
WriteDeclaration(this).acceptUI(ui);+ −
+ −
return true;+ −
}+ −
#endif+ −
+ −
#ifdef QT_UIC_CPP_GENERATOR+ −
+ −
void Uic::writeHeaderProtectionStart()+ −
{+ −
QString h = drv->headerFileName();+ −
out << "#ifndef " << h << "\n"+ −
<< "#define " << h << "\n";+ −
}+ −
+ −
void Uic::writeHeaderProtectionEnd()+ −
{+ −
QString h = drv->headerFileName();+ −
out << "#endif // " << h << "\n";+ −
}+ −
#endif+ −
+ −
bool Uic::isMainWindow(const QString &className) const+ −
{+ −
return customWidgetsInfo()->extends(className, QLatin1String("Q3MainWindow"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QMainWindow"));+ −
}+ −
+ −
bool Uic::isToolBar(const QString &className) const+ −
{+ −
return customWidgetsInfo()->extends(className, QLatin1String("Q3ToolBar"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QToolBar"));+ −
}+ −
+ −
bool Uic::isButton(const QString &className) const+ −
{+ −
return customWidgetsInfo()->extends(className, QLatin1String("QRadioButton"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QToolButton"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QCheckBox"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QPushButton"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QCommandLinkButton"));+ −
}+ −
+ −
bool Uic::isContainer(const QString &className) const+ −
{+ −
return customWidgetsInfo()->extends(className, QLatin1String("QStackedWidget"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QToolBox"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QTabWidget"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QScrollArea"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QMdiArea"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QWizard"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QDockWidget"));+ −
}+ −
+ −
bool Uic::isCustomWidgetContainer(const QString &className) const+ −
{+ −
return customWidgetsInfo()->isCustomWidgetContainer(className);+ −
}+ −
+ −
bool Uic::isStatusBar(const QString &className) const+ −
{+ −
return customWidgetsInfo()->extends(className, QLatin1String("QStatusBar"));+ −
}+ −
+ −
bool Uic::isMenuBar(const QString &className) const+ −
{+ −
return customWidgetsInfo()->extends(className, QLatin1String("QMenuBar"));+ −
}+ −
+ −
bool Uic::isMenu(const QString &className) const+ −
{+ −
return customWidgetsInfo()->extends(className, QLatin1String("QMenu"))+ −
|| customWidgetsInfo()->extends(className, QLatin1String("QPopupMenu"));+ −
}+ −
+ −
QT_END_NAMESPACE+ −