/**************************************************************************** ** ** 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$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** 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. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** 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 #include #include #include #include #if defined Q_WS_WIN #include #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