summaryrefslogtreecommitdiffstats
path: root/tools/designer/plugins/rc
diff options
context:
space:
mode:
Diffstat (limited to 'tools/designer/plugins/rc')
-rw-r--r--tools/designer/plugins/rc/main.cpp117
-rw-r--r--tools/designer/plugins/rc/rc.pro11
-rw-r--r--tools/designer/plugins/rc/rc2ui.cpp888
-rw-r--r--tools/designer/plugins/rc/rc2ui.h103
4 files changed, 1119 insertions, 0 deletions
diff --git a/tools/designer/plugins/rc/main.cpp b/tools/designer/plugins/rc/main.cpp
new file mode 100644
index 0000000..f2e9abb
--- /dev/null
+++ b/tools/designer/plugins/rc/main.cpp
@@ -0,0 +1,117 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt 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 Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements 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 Qt Commercial licenses may use this file in
+** accordance with the Qt 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 <filterinterface.h>
+
+#include <qapplication.h>
+
+#include "rc2ui.h"
+
+class RCFilter : public ImportFilterInterface, public QLibraryInterface
+{
+public:
+ RCFilter();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface **iface );
+ Q_REFCOUNT;
+
+ QStringList featureList() const;
+ QStringList import( const QString& filter, const QString& filename );
+
+ bool init();
+ void cleanup();
+ bool canUnload() const;
+};
+
+RCFilter::RCFilter()
+{
+}
+
+QRESULT RCFilter::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
+{
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)(ImportFilterInterface*)this;
+ else if ( uuid == IID_QFeatureList )
+ *iface = (QFeatureListInterface*)this;
+ else if ( uuid == IID_ImportFilter )
+ *iface = (ImportFilterInterface*)this;
+ else if ( uuid == IID_QLibrary )
+ *iface = (QLibraryInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+QStringList RCFilter::featureList() const
+{
+ QStringList list;
+ list << "Microsoft Resource Files (*.rc)" ;
+ return list;
+}
+
+QStringList RCFilter::import( const QString &, const QString& filename )
+{
+ QFile file( filename );
+ if ( !file.open( IO_ReadOnly ) )
+ qWarning( "uic: Could not open file '%s' ", filename.latin1() );
+ QTextStream in;
+ in.setDevice( &file );
+
+ RC2UI c( &in );
+ QStringList files;
+ c.parse();
+ return c.targetFiles;
+}
+
+bool RCFilter::init()
+{
+ return TRUE;
+}
+
+void RCFilter::cleanup()
+{
+}
+
+bool RCFilter::canUnload() const
+{
+ return TRUE;
+}
+
+Q_EXPORT_COMPONENT()
+{
+ Q_CREATE_INSTANCE( RCFilter )
+}
diff --git a/tools/designer/plugins/rc/rc.pro b/tools/designer/plugins/rc/rc.pro
new file mode 100644
index 0000000..27ad444
--- /dev/null
+++ b/tools/designer/plugins/rc/rc.pro
@@ -0,0 +1,11 @@
+TEMPLATE = lib
+CONFIG += qt warn_on release plugin
+HEADERS = rc2ui.h
+SOURCES = main.cpp rc2ui.cpp
+DESTDIR = ../../../../plugins/designer
+TARGET = rcplugin
+INCLUDEPATH += ../../interfaces
+
+
+target.path += $$plugins.path/designer
+INSTALLS += target
diff --git a/tools/designer/plugins/rc/rc2ui.cpp b/tools/designer/plugins/rc/rc2ui.cpp
new file mode 100644
index 0000000..b3e48dd
--- /dev/null
+++ b/tools/designer/plugins/rc/rc2ui.cpp
@@ -0,0 +1,888 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt 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 Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements 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 Qt Commercial licenses may use this file in
+** accordance with the Qt 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 "rc2ui.h"
+#include <qdir.h>
+
+/// some little helpers ///
+
+void RC2UI::wi()
+{
+ for ( int i = 0; i < indentation; i++ )
+ *out << " ";
+}
+
+void RC2UI::indent()
+{
+ indentation++;
+}
+
+void RC2UI::undent()
+{
+ indentation--;
+}
+
+QString RC2UI::stripQM( const QString& string )
+{
+ return string.mid( 1, string.length()-2 );
+}
+
+QStringList RC2UI::splitStyles( const QString& styles, char sep )
+{
+ QString s = styles;
+ QString style;
+ QStringList l;
+ while ( s.find( sep ) > -1 ) {
+ style = s.left( s.find( sep ) );
+ l << style.stripWhiteSpace();
+ s = s.right( s.length() - style.length() -1 );
+ }
+ if ( !s.isEmpty() )
+ l << s.stripWhiteSpace();
+ return l;
+}
+
+QString RC2UI::parseNext( QString& arg, char sep )
+{
+ QString next = arg.left( arg.find(sep) );
+ arg = arg.right( arg.length() - next.length() - 1 );
+ return next;
+}
+
+void RC2UI::writeClass( const QString& name )
+{
+ wi(); *out << "<class>" << name << "</class>" << endl;
+}
+
+void RC2UI::writeCString( const QString& name, const QString& value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<cstring>" << value << "</cstring>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeString( const QString& name, const QString& value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<string>" << value << "</string>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeRect( const QString& name, int x, int y, int w, int h )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<rect>" << endl; indent();
+ wi(); *out << "<x>" << int(double(x)*1.5) << "</x>" << endl;
+ wi(); *out << "<y>" << int(double(y)*1.65) << "</y>" << endl;
+ wi(); *out << "<width>" << int(double(w)*1.5) << "</width>" << endl;
+ wi(); *out << "<height>" << int(double(h)*1.65) << "</height>" << endl; undent();
+ wi(); *out << "</rect>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeFont( const QString& family, int pointsize )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>font</name>" << endl;
+ wi(); *out << "<font>" << endl; indent();
+ wi(); *out << "<family>" << family << "</family>" << endl;
+ wi(); *out << "<pointsize>" << pointsize << "</pointsize>" << endl; undent();
+ wi(); *out << "</font>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeBool( const QString& name, bool value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<bool>" << (value ? "true" : "false") << "</bool>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeNumber( const QString& name, int value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<number>" << value << "</number>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeEnum( const QString& name, const QString& value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<enum>" << value << "</enum>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeSet( const QString& name, const QString& value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<set>" << value << "</set>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeStyles( const QStringList styles, bool isFrame )
+{
+ if ( isFrame ) {
+ bool defineFrame = FALSE;
+ QString shadow = "NoFrame";
+ QString shape = "StyledPanel";
+ int width = 2;
+ if ( styles.contains( "WS_EX_STATICEDGE" ) ) {
+ shadow = "Plain";
+ width = 1;
+ defineFrame = TRUE;
+ }
+ if ( styles.contains( "WS_EX_CLIENTEDGE" ) ) {
+ shadow = "Sunken";
+ defineFrame = TRUE;
+ }
+ if ( styles.contains( "WS_EX_DLGMODALFRAME" ) ) {
+ shadow = "Raised";
+ defineFrame = TRUE;
+ }
+ if ( !styles.contains( "WS_BORDER" ) ) {
+ shape = "NoFrame";
+ defineFrame = TRUE;
+ }
+
+ if ( defineFrame ) {
+ writeEnum( "frameShape", "StyledPanel" );
+ writeEnum( "frameShadow", shadow );
+ writeNumber( "lineWidth", width );
+ }
+ }
+
+ if ( styles.contains("WS_DISABLED") )
+ writeBool("enabled", FALSE );
+ if ( styles.contains("WS_EX_ACCEPTFILES") )
+ writeBool("acceptDrops", TRUE );
+ if ( styles.contains("WS_EX_TRANSPARENT") )
+ writeBool("autoMask", TRUE );
+ if ( !styles.contains("WS_TABSTOP") )
+ writeEnum("focusPolicy", "NoFocus");
+}
+
+/*!
+ Constructs a RC2UI object
+*/
+
+RC2UI::RC2UI( QTextStream* input )
+: blockStart1( "/////////////////////////////////////////////////////////////////////////////" ),
+ blockStart2( "//" )
+{
+ writeToFile = TRUE;
+ in = input;
+ indentation = 0;
+ out = 0;
+}
+
+/*!
+ Destructs the RC2UI object
+*/
+
+RC2UI::~RC2UI()
+{
+}
+
+/*!
+ Parses the input stream and writes the output to files.
+*/
+
+bool RC2UI::parse()
+{
+ while ( !in->eof() ) {
+ while ( line != blockStart1 && !in->eof() )
+ line = in->readLine();
+ if ( in->eof() )
+ return FALSE;
+ while ( line != blockStart2 && !in->eof() )
+ line = in->readLine();
+ if ( in->eof() )
+ return FALSE;
+
+ line = in->readLine();
+
+ if ( line.left(3) == "// " && !in->eof() ) {
+ QString type = line.right( line.length() - 3 );
+ if ( in->readLine() == "//" && in->readLine().isEmpty() && !in->eof() ) {
+ if ( type == "Dialog" ) {
+ if ( !makeDialog() )
+ return FALSE;
+ }
+/*
+ else if ( type == "Bitmap" ) {
+ if ( !makeBitmap() )
+ return FALSE;
+ } else if ( type == "String Table" ) {
+ if ( !makeStringTable() )
+ return FALSE;
+ } else if ( type == "Accelerator" ) {
+ if ( !makeAccelerator() )
+ return FALSE;
+ } else if ( type == "Cursor" ) {
+ if ( !makeCursor() )
+ return FALSE;
+ } else if ( type == "HTML" ) {
+ if ( !makeHTML() )
+ return FALSE;
+ } else if ( type == "Icon" ) {
+ if ( !makeIcon() )
+ return FALSE;
+ } else if ( type == "Version" ) {
+ if ( !makeVersion() )
+ return FALSE;
+ }
+*/
+ }
+ } else
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/*!
+ Parses the input stream and writes the output in \a get.
+*/
+
+bool RC2UI::parse( QStringList& get )
+{
+ writeToFile = FALSE;
+ bool result = parse();
+ get = target;
+ return result;
+}
+
+/*!
+ Retrieves a unique name starting with \a start
+*/
+QString RC2UI::useName( const QString& start )
+{
+ QString name = start;
+ int id = 1;
+
+ while ( usedNames.contains( name ) ) {
+ name = start + QString( "%1" ).arg( id );
+ id++;
+ }
+
+ usedNames.append(name);
+
+ return name;
+}
+
+
+/*!
+ Builds a number of UI dialog out of the current input stream
+*/
+
+bool RC2UI::makeDialog()
+{
+ line = in->readLine();
+ do {
+ QFile fileOut;
+ QString buffer;
+ int count;
+ QCString className;
+ uint x, y, w, h;
+ uint endDesc;
+ bool space = FALSE;
+ for ( endDesc = 0; endDesc < line.length() ; endDesc++ ) {
+ char c = (QChar)line.at(endDesc);
+ if ( space && (c >= '0') && (c <= '9') )
+ break;
+ space = c==' ';
+ }
+
+ QString desc = line.left(endDesc-1);
+ line = line.right( line.length() - endDesc );
+
+ className = parseNext( desc, ' ' );
+
+ count = sscanf( line, "%u, %u, %u, %u", &x, &y, &w, &h );
+
+ if ( !count && count == EOF )
+ return FALSE;
+
+ char property[256];
+ QStringList styles;
+ QStringList extendedStyles;
+ QString caption = "";
+ QString baseClass = "";
+ QString widgetType;
+ QString widgetName;
+ QString arguments;
+ int pointsize = 10;
+ QString fontname;
+ do {
+ line = "";
+ do {
+ if ( in->eof() )
+ return TRUE;
+ line += in->readLine();
+ } while ( line[(int)line.length()-1] == '|' ||
+ line[(int)line.length()-1] == ',' );
+ count = sscanf( line, "%s", property );
+ line = line.right( line.length() - line.find(" ") -1 );
+ if ( QString(property) == "STYLE" ) {
+ styles = splitStyles(line);
+ if ( styles.contains( "WS_CAPTION" ) )
+ baseClass = "QDialog";
+ else
+ baseClass = "QWidget";
+ } else if ( QString(property) == "CAPTION" ) {
+ caption = stripQM( line );
+ } else if ( QString(property) == "FONT" ) {
+ QString pt = line.left( line.find(",") );
+ pointsize = pt.toInt();
+ fontname = stripQM(line.right( line.length() - line.find(",") - 2 ));
+ }
+ } while ( line != "BEGIN" );
+
+ if ( writeToFile ) {
+
+ QString outputFile = QString(className) + ".ui";
+ fileOut.setName( outputFile );
+ if (!fileOut.open( IO_WriteOnly ) )
+ qFatal( "rc2ui: Could not open output file '%s'", outputFile.latin1() );
+ out = new QTextStream( &fileOut );
+ targetFiles.append( outputFile );
+ } else {
+ out = new QTextStream( &buffer, IO_WriteOnly );
+ }
+
+ *out << "<!DOCTYPE UI><UI>" << endl;
+ writeClass( className );
+ wi(); *out << "<widget>"<< endl; indent();
+ writeClass( baseClass );
+ writeCString( "name", className );
+ writeRect( "geometry", x, y, w, h );
+ writeString( "caption", caption );
+ writeFont( fontname, pointsize );
+
+ do {
+ if ( in->eof() )
+ return TRUE;
+
+ line = in->readLine().stripWhiteSpace();
+ if ( line == "END" )
+ continue;
+
+ widgetType = parseNext(line, ' ');
+ arguments = line.stripWhiteSpace();
+ while ( arguments[(int)arguments.length()-1] == ',' ||
+ arguments[(int)arguments.length()-1] == '|' )
+ arguments += " "+in->readLine().stripWhiteSpace();
+
+ wi(); *out << "<widget>" << endl; indent();
+
+ WidgetType ID = IDUnknown;
+ QString controlType;
+ QString widgetID;
+ QString widgetText;
+ bool hasText = FALSE;
+ bool isControl = FALSE;
+ bool isFrame = FALSE;
+
+ if ( widgetType == "PUSHBUTTON" ) {
+ ID = IDPushButton;
+ hasText = TRUE;
+ } else if ( widgetType == "DEFPUSHBUTTON" ) {
+ ID = IDPushButton;
+ hasText = TRUE;
+ } else if ( widgetType == "LTEXT" ) {
+ ID = IDLabel;
+ hasText = TRUE;
+ } else if ( widgetType == "CTEXT" ) {
+ ID = IDLabel;
+ hasText = TRUE;
+ } else if ( widgetType == "RTEXT" ) {
+ ID = IDLabel;
+ hasText = TRUE;
+ } else if ( widgetType == "EDITTEXT" ) {
+ ID = IDLineEdit;
+ } else if ( widgetType == "GROUPBOX" ) {
+ ID = IDGroupBox;
+ hasText = TRUE;
+ } else if ( widgetType == "COMBOBOX" ) {
+ ID = IDComboBox;
+ } else if ( widgetType == "LISTBOX" ) {
+ ID = IDListBox;
+ } else if ( widgetType == "SCROLLBAR" ) {
+ ID = IDScrollBar;
+ } else if ( widgetType == "CHECKBOX" ) {
+ ID = IDCheckBox;
+ hasText = TRUE;
+ } else if ( widgetType == "RADIOBUTTON" ) {
+ ID = IDRadioButton;
+ hasText = TRUE;
+ } else if ( widgetType == "CONTROL" ) {
+ isControl = TRUE;
+ widgetText = stripQM(parseNext( arguments ));
+ widgetID = parseNext( arguments );
+ controlType = stripQM(parseNext( arguments ));
+ styles = splitStyles(parseNext( arguments ));
+
+ if ( controlType == "Static" ) {
+ ID = IDLabel;
+ } else if ( controlType == "Button" ) {
+ if ( styles.contains("BS_AUTOCHECKBOX") ||
+ styles.contains("BS_3STATE") )
+ ID = IDCheckBox;
+ else if ( styles.contains("BS_AUTORADIOBUTTON") )
+ ID = IDRadioButton;
+ } else if ( controlType == "msctls_updown32" ) {
+ ID = IDSpinBox;
+ } else if ( controlType == "msctls_progress32" ) {
+ ID = IDProgressBar;
+ } else if ( controlType == "msctls_trackbar32" ) {
+ ID = IDSlider;
+ } else if ( controlType == "SysListView32" ) {
+ ID = IDIconView;
+ } else if ( controlType == "SysTreeView32" ) {
+ ID = IDListView;
+ } else if ( controlType == "SysTabControl32" ) {
+ ID = IDTabWidget;
+ } else if ( controlType == "SysAnimate32" ) {
+ ID = IDLabel;
+ } else if ( controlType == "RICHEDIT" ) {
+ ID = IDMultiLineEdit;
+ } else if ( controlType == "ComboBoxEx32" ) {
+ ID = IDComboBox;
+ } else if ( controlType == "" ) {
+ ID = IDCustom;
+ } else {
+ ID = IDUnknown;
+ }
+ } else
+ ID = IDUnknown;
+
+ if ( hasText )
+ widgetText = stripQM(parseNext( arguments ));
+
+ if ( isControl ) {
+ x = parseNext( arguments ).toInt();
+ y = parseNext( arguments ).toInt();
+ w = parseNext( arguments ).toInt();
+ h = parseNext( arguments ).toInt();
+ } else {
+ widgetID = parseNext( arguments );
+ x = parseNext( arguments ).toInt();
+ y = parseNext( arguments ).toInt();
+ w = parseNext( arguments ).toInt();
+ h = parseNext( arguments ).toInt();
+ styles.clear();
+ }
+
+ do {
+ extendedStyles = splitStyles(parseNext( arguments ));
+ for ( uint i = 0; i < extendedStyles.count(); i++ )
+ styles << (*extendedStyles.at(i));
+ } while ( arguments.find(',') > -1 );
+
+ switch ( ID ) {
+ case IDWidget:
+ break;
+ case IDPushButton:
+ {
+ writeClass("QPushButton");
+ writeCString( "name", useName("PushButton_"+widgetID) );
+ writeRect( "geometry", x, y, w, h );
+ writeString( "text", widgetText );
+ if ( widgetType == "DEFPUSHBUTTON" )
+ writeBool( "default", TRUE );
+ }
+ break;
+ case IDLabel:
+ {
+ isFrame = TRUE,
+ writeClass("QLabel");
+ writeCString( "name", useName("Label_"+widgetID) );
+ writeRect( "geometry", x,y,w,h );
+ writeString( "text", widgetText );
+ QString align;
+ if ( !styles.contains("SS_CENTERIMAGE") )
+ align += "|AlignTop";
+ else
+ align += "|AlignVCenter";
+ if ( widgetType == "LTEXT" ) {
+ align += "|AlignLeft";
+ } else if ( widgetType == "CTEXT") {
+ align += "|AlignHCenter";
+ } else if ( widgetType == "RTEXT") {
+ align += "|AlignRight";
+ }
+ writeSet("alignment", align );
+ }
+ break;
+ case IDCheckBox:
+ {
+ writeClass("QCheckBox");
+ writeCString("name", useName("CheckBox_"+widgetID) );
+ writeRect("geometry", x,y,w,h);
+ writeString("text", widgetText );
+ if ( styles.contains( "BS_3STATE" ) )
+ writeBool( "tristate", TRUE );
+ }
+ break;
+ case IDRadioButton:
+ {
+ writeClass("QRadioButton");
+ writeCString("name", useName("RadioButton_"+widgetID) );
+ writeRect("geometry", x,y,w,h);
+ writeString("text", widgetText );
+ }
+ break;
+ case IDGroupBox:
+ {
+ isFrame = TRUE;
+ writeClass("QGroupBox");
+ writeCString( "name", useName("GroupBox_"+widgetID) );
+ writeRect( "geometry", x,y,w,h );
+ writeString( "title", widgetText );
+ if ( !styles.contains( "WS_BORDER" ) )
+ styles.append( "WS_BORDER" );
+ }
+ break;
+ case IDLineEdit:
+ {
+ if ( !styles.contains("ES_MULTILINE") ) {
+ writeClass("QLineEdit");
+ writeCString( "name", useName("LineEdit_"+widgetID) );
+ } else {
+ writeClass("QMultiLineEdit");
+ writeCString( "name", useName("MultiLineEdit_"+widgetID) );
+ }
+ writeRect( "geometry", x,y,w,h );
+ QString align = "AlignTop";
+ if ( styles.contains("ES_CENTER") )
+ align+="|AlignHCenter";
+ else if ( styles.contains("ES_RIGHT") )
+ align+="|AlignRight";
+ else
+ align+="|AlignLeft";
+ writeSet("alignment", align);
+ }
+ break;
+ case IDMultiLineEdit:
+ {
+ writeClass("QMultiLineEdit");
+ writeCString("name", useName("MultiLineEdit_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ }
+ break;
+ case IDIconView:
+ {
+ isFrame = TRUE;
+ writeClass("QIconView");
+ writeCString("name", useName("IconView_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ if ( !styles.contains( "LVS_SINGLESEL" ) )
+ writeEnum( "selectionMode", "Extended" );
+ if ( styles.contains( "LVS_NOLABELWRAP" ) )
+ writeBool("wordWrapIconText", FALSE );
+ }
+ break;
+ case IDListView:
+ {
+ isFrame = TRUE;
+ writeClass("QListView");
+ writeCString("name", useName("ListView_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ if ( styles.contains( "TVS_LINESATROOT" ) )
+ writeBool( "rootIsDecorated", TRUE );
+ if ( styles.contains( "TVS_FULLROWSELECT" ) )
+ writeBool( "allColumnsShowFocus", TRUE );
+ }
+ break;
+ case IDProgressBar:
+ {
+ isFrame = TRUE;
+ writeClass("QProgressBar");
+ writeCString("name", useName("ProgressBar_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ if ( styles.contains("TBS_VERT") )
+ writeEnum("orientation", "Vertical");
+ else
+ writeEnum("orientation", "Horizontal");
+ }
+ break;
+ case IDTabWidget:
+ {
+ writeClass("QTabWidget");
+ writeCString("name", useName("TabWidget_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ wi(); *out << "<widget>" << endl; indent();
+ writeClass("QWidget");
+ wi(); *out << "<attribute>" << endl; indent();
+ wi(); *out << "<name>title</name>" << endl;
+ wi(); *out << "<string>Tab1</string>" << endl; undent();
+ wi(); *out << "</attribute>" << endl; undent();
+ wi(); *out << "</widget>" << endl;
+ }
+ break;
+ case IDSpinBox:
+ {
+ isFrame = TRUE;
+ writeClass("QSpinBox");
+ writeCString("name", useName("SpinBox_"+widgetID) );
+ writeRect("geometry", x,y,w,h);
+ }
+ break;
+ case IDSlider:
+ {
+ writeClass("QSlider");
+ writeCString("name", useName("Slider_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ if ( styles.contains("TBS_VERT") )
+ writeEnum("orientation", "Vertical");
+ else
+ writeEnum("orientation", "Horizontal");
+ if ( !styles.contains("TBS_NOTICKS") )
+ writeEnum("tickmarks", "Left" );
+ }
+ break;
+ case IDComboBox:
+ {
+ writeClass("QComboBox");
+ writeCString("name", useName("ComboBox_"+widgetID) );
+ if ( isControl )
+ writeRect( "geometry", x,y,w,14 );
+ else
+ writeRect( "geometry", x,y,w,h );
+ }
+ break;
+ case IDListBox:
+ {
+ isFrame = TRUE;
+ writeClass("QListBox");
+ writeCString("name", useName("ListBox_"+widgetID) );
+ writeRect( "geometry", x,y,w,h );
+ if ( styles.contains("WS_HSCROLL") )
+ writeEnum("hScrollBarMode", "Auto");
+ else
+ writeEnum("hScrollBarMode", "AlwaysOff");
+ if ( styles.contains("WS_VSCROLL") )
+ writeEnum("vScrollBarMode", "Auto");
+ else
+ writeEnum("vScrollBarMode", "AlwaysOff");
+ if ( styles.contains("LBS_EXTENDEDSEL") )
+ writeEnum("selectionMode", "Extended");
+ else if ( styles.contains("LBS_MULTIPLESEL") )
+ writeEnum("selectionMode", "Multi");
+ else if ( styles.contains("LBS_NOSEL") )
+ writeEnum("selectionMode", "NoSelection");
+ else
+ writeEnum("selectionMode", "Single");
+ if ( !styles.contains( "NO WS_BORDER" ) )
+ styles.append( "WS_BORDER" );
+ }
+ break;
+ case IDScrollBar:
+ {
+ writeClass("QScrollBar");
+ writeCString("name", useName("ScrollBar_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ if ( styles.contains("SBS_VERT") )
+ writeEnum("orientation", "Vertical");
+ else
+ writeEnum("orientation", "Horizontal");
+ }
+ break;
+ case IDCustom:
+ {
+ writeClass("QLabel");
+ writeCString("name", useName("Custom_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ writeString("text", "Create a custom widget and place it here." );
+ }
+ default:
+ {
+ writeClass("QLabel");
+ writeCString("name", useName("Unknown_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ writeString("text", QString("No support for %1.").arg(controlType) );
+ }
+ break;
+ }
+
+ writeStyles( styles, isFrame );
+
+ styles.clear();
+
+ undent();
+ wi(); *out << "</widget>" << endl;
+ } while ( line != "END" );
+
+ undent();
+ wi(); *out << "</widget>" << endl;
+ *out << "</UI>" << endl;
+
+ do {
+ line = in->readLine();
+ } while ( line.isEmpty() );
+
+ if ( !writeToFile )
+ target.append( buffer.copy() );
+
+ if (out) {
+ delete out;
+ out = 0;
+ }
+ fileOut.close();
+
+ } while ( line != blockStart1 );
+
+ return TRUE;
+}
+
+/*! Not yet implemented
+*/
+
+bool RC2UI::makeBitmap()
+{
+ return TRUE;
+}
+
+/*! Not yet implemented
+*/
+
+bool RC2UI::makeAccelerator()
+{
+ return TRUE;
+}
+
+/*! Not yet implemented
+*/
+
+bool RC2UI::makeCursor()
+{
+ return TRUE;
+}
+
+/*! Not yet implemented
+*/
+
+bool RC2UI::makeHTML()
+{
+ return TRUE;
+}
+
+/*! Not yet implemented
+*/
+
+bool RC2UI::makeIcon()
+{
+ return TRUE;
+}
+
+/*!
+ Writes a stringtable from the input stream to a c++ header file.
+ All strings are assigned using QT_TR_NOOP to enable easy translation.
+*/
+
+bool RC2UI::makeStringTable()
+{
+ if ( !writeToFile )
+ return TRUE;
+
+ QFile fileOut;
+ line = in->readLine();
+ do {
+ char stringtable[256];
+ char discard[12];
+ sscanf( line, "%s %s", stringtable, discard );
+ if ( QString(stringtable) != "STRINGTABLE" )
+ return TRUE;
+ do {
+ line = in->readLine();
+ } while ( line != "BEGIN" );
+
+ QString outputFile = QString(stringtable).lower() + ".h";
+ if (outputFile ) {
+ fileOut.setName( outputFile );
+ if (!fileOut.open( IO_WriteOnly ) )
+ qFatal( "rc2ui: Could not open output file '%s'", outputFile.latin1() );
+ out = new QTextStream( &fileOut );
+ }
+
+ *out << "#ifndef STRINGTABLE_H" << endl;
+ *out << "#define STRINGTABLE_H" << endl;
+ *out << endl;
+ *out << "#include <qstring.h>" << endl;
+ *out << "#include <qobject.h>" << endl;
+ *out << endl;
+
+ QString ID;
+ QString value;
+ do {
+ line = in->readLine().stripWhiteSpace();
+ if ( line == "END" )
+ continue;
+
+ ID = parseNext(line, ' ');
+ value = parseNext(line).stripWhiteSpace();
+
+ *out << "static const QString " << ID << "= QT_TR_NOOP(" << value << ");" << endl;
+
+ } while ( line != "END" );
+
+ *out << endl;
+ *out << "#endif // STRINGTABLE_H" << endl;
+
+ do {
+ line = in->readLine();
+ } while ( line.isEmpty() );
+
+ if ( out ) {
+ delete out;
+ out = 0;
+ }
+ } while ( line != blockStart1 );
+
+ return TRUE;
+}
+
+/*! Not yet implemented
+*/
+
+bool RC2UI::makeVersion()
+{
+ return TRUE;
+}
diff --git a/tools/designer/plugins/rc/rc2ui.h b/tools/designer/plugins/rc/rc2ui.h
new file mode 100644
index 0000000..8f3b1c6
--- /dev/null
+++ b/tools/designer/plugins/rc/rc2ui.h
@@ -0,0 +1,103 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt 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 Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements 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 Qt Commercial licenses may use this file in
+** accordance with the Qt 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.
+**
+**********************************************************************/
+
+#ifndef RC2UI_H
+#define RC2UI_H
+
+#include <qtextstream.h>
+#include <qfile.h>
+#include <qstringlist.h>
+
+class RC2UI
+{
+public:
+ RC2UI( QTextStream* input );
+ ~RC2UI();
+
+ bool parse();
+ bool parse ( QStringList& get );
+
+ QStringList targetFiles;
+
+protected:
+ enum WidgetType { IDWidget, IDPushButton, IDLabel, IDCheckBox, IDRadioButton,
+ IDGroupBox, IDLineEdit, IDMultiLineEdit, IDIconView, IDListView,
+ IDProgressBar, IDTabWidget, IDSpinBox, IDSlider, IDComboBox,
+ IDListBox, IDScrollBar, IDCustom, IDUnknown = 0x0100 };
+ bool makeDialog();
+ bool makeBitmap();
+ bool makeStringTable();
+ bool makeAccelerator();
+ bool makeCursor();
+ bool makeHTML();
+ bool makeIcon();
+ bool makeVersion();
+
+ QString line;
+ QTextStream *in;
+ QStringList target;
+
+ void indent();
+ void undent();
+
+ QString stripQM( const QString& string );
+ QString parseNext( QString& arg, char sep = ',' );
+ QStringList splitStyles( const QString& styles, char sep = '|' );
+ void wi();
+
+ void writeClass( const QString& name );
+ void writeCString( const QString& name, const QString& value );
+ void writeString( const QString& name, const QString& value );
+ void writeRect( const QString& name, int x, int y, int w, int h );
+ void writeFont( const QString& family, int pointsize );
+ void writeBool( const QString& name, bool value );
+ void writeNumber( const QString& name, int value );
+ void writeEnum( const QString& name, const QString& value );
+ void writeSet( const QString& name, const QString& value );
+
+ void writeStyles( const QStringList styles, bool isFrame );
+private:
+ int indentation;
+ bool writeToFile;
+ QTextStream* out;
+
+ QString useName( const QString& );
+
+ QStringList usedNames;
+
+ const QString blockStart1;
+ const QString blockStart2;
+};
+
+#endif