summaryrefslogtreecommitdiffstats
path: root/tools/designer/uic/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/designer/uic/main.cpp')
-rw-r--r--tools/designer/uic/main.cpp358
1 files changed, 358 insertions, 0 deletions
diff --git a/tools/designer/uic/main.cpp b/tools/designer/uic/main.cpp
new file mode 100644
index 000000000..3a20b471c
--- /dev/null
+++ b/tools/designer/uic/main.cpp
@@ -0,0 +1,358 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of TQt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free TQt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing retquirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid TQt Commercial licenses may use this file in
+** accordance with the TQt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "uic.h"
+#include "domtool.h"
+#if defined(UIB)
+#include "ui2uib.h"
+#endif
+#include <qapplication.h>
+#include <qfile.h>
+#include <qstringlist.h>
+#include <qdatetime.h>
+#include <qsettings.h>
+#define NO_STATIC_COLORS
+#include <globaldefs.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+// see ### in widgetdatabase.cpp
+extern bool dbnounload;
+extern TQStringList *dbpaths;
+
+int main( int argc, char * argv[] )
+{
+ bool impl = FALSE;
+ bool subcl = FALSE;
+ bool imagecollection = FALSE;
+ bool imagecollection_tmpfile = FALSE;
+#if defined(UIB)
+ bool binary = FALSE;
+#endif
+ TQStringList images;
+ const char *error = 0;
+ const char* fileName = 0;
+ const char* className = 0;
+ const char* headerFile = 0;
+ TQCString outputFile;
+ TQCString image_tmpfile;
+ const char* projectName = 0;
+ const char* trmacro = 0;
+ bool nofwd = FALSE;
+ bool fix = FALSE;
+ TQCString pchFile;
+ TQApplication app(argc, argv, FALSE);
+
+ TQString keybase( "/TQt Designer/" +
+ TQString::number( (QT_VERSION >> 16) & 0xff ) +"." + TQString::number( (QT_VERSION >> 8) & 0xff ) + "/" );
+ TQSettings config;
+ config.insertSearchPath( TQSettings::Windows, "/Trolltech" );
+ TQStringList pluginPaths = config.readListEntry( keybase + "PluginPaths" );
+ if (pluginPaths.count())
+ TQApplication::setLibraryPaths(pluginPaths);
+
+ for ( int n = 1; n < argc && error == 0; n++ ) {
+ TQCString arg = argv[n];
+ if ( arg[0] == '-' ) { // option
+ TQCString opt = &arg[1];
+ if ( opt[0] == 'o' ) { // output redirection
+ if ( opt[1] == '\0' ) {
+ if ( !(n < argc-1) ) {
+ error = "Missing output-file name";
+ break;
+ }
+ outputFile = argv[++n];
+ } else
+ outputFile = &opt[1];
+ } else if ( opt[0] == 'i' || opt == "impl" ) {
+ impl = TRUE;
+ if ( opt == "impl" || opt[1] == '\0' ) {
+ if ( !(n < argc-1) ) {
+ error = "Missing name of header file";
+ break;
+ }
+ headerFile = argv[++n];
+ } else
+ headerFile = &opt[1];
+ } else if ( opt[0] == 'e' || opt == "embed" ) {
+ imagecollection = TRUE;
+ if ( opt == "embed" || opt[1] == '\0' ) {
+ if ( !(n < argc-1) ) {
+ error = "Missing name of project";
+ break;
+ }
+ projectName = argv[++n];
+ } else {
+ projectName = &opt[1];
+ }
+ if ( argc > n+1 && qstrcmp( argv[n+1], "-f" ) == 0 ) {
+ imagecollection_tmpfile = TRUE;
+ image_tmpfile = argv[n+2];
+ n += 2;
+ }
+#if defined(UIB)
+
+ } else if ( opt == "binary" ) {
+ binary = TRUE;
+#endif
+ } else if ( opt == "nofwd" ) {
+ nofwd = TRUE;
+ } else if ( opt == "nounload" ) {
+ dbnounload = TRUE;
+ } else if ( opt == "subdecl" ) {
+ subcl = TRUE;
+ if ( !(n < argc-2) ) {
+ error = "Missing arguments";
+ break;
+ }
+ className = argv[++n];
+ headerFile = argv[++n];
+ } else if ( opt == "subimpl" ) {
+ subcl = TRUE;
+ impl = TRUE;
+ if ( !(n < argc-2) ) {
+ error = "Missing arguments";
+ break;
+ }
+ className = argv[++n];
+ headerFile = argv[++n];
+ } else if ( opt == "tr" ) {
+ if ( opt == "tr" || opt[1] == '\0' ) {
+ if ( !(n < argc-1) ) {
+ error = "Missing tr macro.";
+ break;
+ }
+ trmacro = argv[++n];
+ } else {
+ trmacro = &opt[1];
+ }
+ } else if ( opt == "L" ) {
+ if ( !(n < argc-1) ) {
+ error = "Missing plugin path.";
+ break;
+ }
+ if ( !dbpaths )
+ dbpaths = new TQStringList();
+ TQString fn = TQFile::decodeName( argv[++n] );
+ dbpaths->append( fn );
+ TQApplication::addLibraryPath( fn );
+ } else if ( opt == "version" ) {
+ fprintf( stderr,
+ "User Interface Compiler for TQt version %s\n",
+ QT_VERSION_STR );
+ return 1;
+ } else if ( opt == "help" ) {
+ break;
+ } else if ( opt == "fix" ) {
+ fix = TRUE;
+ } else if ( opt == "pch") {
+ if ( !(n < argc-1) ) {
+ error = "Missing name of PCH file";
+ break;
+ }
+ pchFile = argv[++n];
+ } else {
+ error = "Unrecognized option";
+ }
+ } else {
+ if ( imagecollection && !imagecollection_tmpfile )
+ images << argv[n];
+ else if ( fileName ) // can handle only one file
+ error = "Too many input files specified";
+ else
+ fileName = argv[n];
+ }
+ }
+
+ if ( argc < 2 || error || (!fileName && !imagecollection ) ) {
+ fprintf( stderr, "TQt user interface compiler.\n" );
+ if ( error )
+ fprintf( stderr, "uic: %s\n", error );
+
+ fprintf( stderr, "Usage: %s [options] [mode] <uifile>\n\n"
+ "Generate declaration:\n"
+ " %s [options] <uifile>\n"
+ "Generate implementation:\n"
+ " %s [options] -impl <headerfile> <uifile>\n"
+ "\t<headerfile> name of the declaration file\n"
+ "Generate image collection:\n"
+ " %s [options] -embed <project> <image1> <image2> <image3> ...\n"
+ "or\n"
+ " %s [options] -embed <project> -f <temporary file containing image names>\n"
+ "\t<project> project name\n"
+ "\t<image[1-N]> image files\n"
+#if defined(UIB)
+ "Generate binary UI file:\n"
+ " %s [options] -binary <uifile>\n"
+#endif
+ "Generate subclass declaration:\n"
+ " %s [options] -subdecl <subclassname> <baseclassheaderfile> <uifile>\n"
+ "\t<subclassname> name of the subclass to generate\n"
+ "\t<baseclassheaderfile> declaration file of the baseclass\n"
+ "Generate subclass implementation:\n"
+ " %s [options] -subimpl <subclassname> <subclassheaderfile> <uifile>\n"
+ "\t<subclassname> name of the subclass to generate\n"
+ "\t<subclassheaderfile> declaration file of the subclass\n"
+ "Options:\n"
+ "\t-o file Write output to file rather than stdout\n"
+ "\t-pch file Add #include \"file\" as the first statement in implementation\n"
+ "\t-nofwd Omit forward declarations of custom classes\n"
+ "\t-nounload Don't unload plugins after processing\n"
+ "\t-tr func Use func() instead of tr() for i18n\n"
+ "\t-L path Additional plugin search path\n"
+ "\t-version Display version of uic\n"
+ "\t-help Display this information\n"
+ , argv[0], argv[0], argv[0], argv[0], argv[0], argv[0], argv[0]
+#if defined(UIB)
+ , argv[0]
+#endif
+ );
+ return 1;
+ }
+
+ if ( imagecollection_tmpfile ) {
+ TQFile ifile( image_tmpfile );
+ if ( ifile.open( IO_ReadOnly ) ) {
+ TQTextStream ts( &ifile );
+ TQString s = ts.read();
+ s = s.simplifyWhiteSpace();
+ images = TQStringList::split( ' ', s );
+ for ( TQStringList::Iterator it = images.begin(); it != images.end(); ++it )
+ *it = (*it).simplifyWhiteSpace();
+ }
+ }
+
+#if defined(UIB)
+ if ( binary && outputFile.isEmpty() ) {
+ outputFile = fileName;
+ if ( outputFile.mid(outputFile.length() - 3).lower() == ".ui" )
+ outputFile.truncate( outputFile.length() - 3 );
+ outputFile += ".uib";
+ }
+#endif
+
+ TQFile fileOut;
+ if ( !outputFile.isEmpty() ) {
+ fileOut.setName( outputFile );
+ if (!fileOut.open( IO_WriteOnly ) ) {
+ qWarning( "uic: Could not open output file '%s'", outputFile.data() );
+ return 1;
+ }
+ } else {
+ fileOut.open( IO_WriteOnly, stdout );
+ }
+ TQTextStream out( &fileOut );
+
+ if ( imagecollection ) {
+ out.setEncoding( TQTextStream::Latin1 );
+ Uic::embed( out, projectName, images );
+ return 0;
+ }
+
+ out.setEncoding( TQTextStream::UnicodeUTF8 );
+
+ TQFile file( fileName );
+ if ( !file.open( IO_ReadOnly ) ) {
+ qWarning( "uic: Could not open file '%s'", fileName );
+ return 1;
+ }
+
+ TQDomDocument doc;
+ TQString errMsg;
+ int errLine;
+ if ( !doc.setContent( &file, &errMsg, &errLine ) ) {
+ qWarning( TQString("uic: Failed to parse %s: ") + errMsg + TQString (" in line %d"), fileName, errLine );
+ return 1;
+ }
+
+ TQDomElement e = doc.firstChild().toElement();
+ if ( e.hasAttribute("version") && e.attribute("version").toDouble() > 3.3 ) {
+ qWarning( TQString("uic: File generated with too recent version of TQt Designer (%s vs. %s)"),
+ e.attribute("version").latin1(), QT_VERSION_STR );
+ return 1;
+ }
+
+ DomTool::fixDocument( doc );
+
+ if ( fix ) {
+ out << doc.toString();
+ return 0;
+#if defined(UIB)
+ } else if ( binary ) {
+ out.unsetDevice();
+ TQDataStream binaryOut( &fileOut );
+ convertUiToUib( doc, binaryOut );
+ return 0;
+#endif
+ }
+
+ if ( !subcl ) {
+ out << "/****************************************************************************" << endl;
+ out << "** Form "<< (impl? "implementation" : "interface") << " generated from reading ui file '" << fileName << "'" << endl;
+ out << "**" << endl;
+ out << "** Created: " << TQDateTime::currentDateTime().toString() << endl;
+ out << "**" << endl;
+ out << "** WARNING! All changes made in this file will be lost!" << endl;
+ out << "****************************************************************************/" << endl << endl;
+ }
+
+ TQString protector;
+ if ( subcl && className && !impl )
+ protector = TQString::fromLocal8Bit( className ).upper() + "_H";
+
+ if ( !protector.isEmpty() ) {
+ out << "#ifndef " << protector << endl;
+ out << "#define " << protector << endl;
+ }
+
+ if ( !pchFile.isEmpty() && impl ) {
+ out << "#include \"" << pchFile << "\" // PCH include" << endl;
+ }
+
+ if ( headerFile ) {
+ out << "#include \"" << headerFile << "\"" << endl << endl;
+ }
+
+ Uic( fileName, outputFile, out, doc, !impl, subcl, trmacro, className, nofwd );
+
+ if ( !protector.isEmpty() ) {
+ out << endl;
+ out << "#endif // " << protector << endl;
+ }
+ if ( fileOut.status() != IO_Ok ) {
+ qWarning( "uic: Error writing to file" );
+ if ( !outputFile.isEmpty() )
+ remove( outputFile );
+ }
+ return 0;
+}