diff options
Diffstat (limited to 'tools/designer/plugins/glade')
-rw-r--r-- | tools/designer/plugins/glade/glade.pro | 13 | ||||
-rw-r--r-- | tools/designer/plugins/glade/glade2ui.cpp | 2203 | ||||
-rw-r--r-- | tools/designer/plugins/glade/glade2ui.h | 169 | ||||
-rw-r--r-- | tools/designer/plugins/glade/main.cpp | 109 |
4 files changed, 2494 insertions, 0 deletions
diff --git a/tools/designer/plugins/glade/glade.pro b/tools/designer/plugins/glade/glade.pro new file mode 100644 index 000000000..c1be0c560 --- /dev/null +++ b/tools/designer/plugins/glade/glade.pro @@ -0,0 +1,13 @@ +TEMPLATE = lib +CONFIG += qt warn_on release plugin +HEADERS = glade2ui.h +SOURCES = main.cpp glade2ui.cpp +DESTDIR = ../../../../plugins/designer +DEFINES += QT_INTERNAL_XML +include( ../../../../src/qt_professional.pri ) +TARGET = gladeplugin +INCLUDEPATH += ../../interfaces + + +target.path += $$plugins.path/designer +INSTALLS += target diff --git a/tools/designer/plugins/glade/glade2ui.cpp b/tools/designer/plugins/glade/glade2ui.cpp new file mode 100644 index 000000000..89337eb58 --- /dev/null +++ b/tools/designer/plugins/glade/glade2ui.cpp @@ -0,0 +1,2203 @@ +/********************************************************************** +** +** Converts a Glade .glade file into a .ui file. +** +** Copyright (C) 2000-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 "glade2ui.h" + +#include <qapplication.h> +#include <qfile.h> +#include <qimage.h> +#include <qprogressdialog.h> +#include <qmessagebox.h> +#include <qrect.h> +#include <qregexp.h> +#include <qsizepolicy.h> + +#include <ctype.h> + +static const struct { + const char *gtkName; + const char *qtName; +} classNames[] = { + { "Custom", "Custom" }, + { "GnomeAbout", "TQDialog" }, + { "GnomeApp", "TQMainWindow" }, + { "GnomeCanvas", "TQLabel" }, + { "GnomeColorPicker", "TQComboBox" }, + { "GnomeDateEdit", "TQDateTimeEdit" }, + { "GnomeDialog", "TQDialog" }, + { "GnomeFontPicker", "TQComboBox" }, + { "GnomeIconSelection", "TQIconView" }, + { "GnomePixmap", "TQLabel" }, + { "GnomePropertyBox", "TQDialog" }, + { "GtkAccelLabel", "TQLabel" }, + { "GtkAspectFrame", "TQFrame" }, + { "GtkButton", "TQPushButton" }, + { "GtkCList", "TQListView" }, + { "GtkCTree", "TQListView" }, + { "GtkCheckButton", "TQCheckBox" }, + { "GtkCombo", "TQComboBox" }, + { "GtkDial", "TQDial" }, + { "GtkDialog", "TQDialog" }, + { "GtkEntry", "TQLineEdit" }, + { "GtkFixed", "TQLayoutWidget" }, + { "GtkFrame", "TQFrame" }, + { "GtkHPaned", "TQSplitter" }, + { "GtkHScale", "TQSlider" }, + { "GtkHScrollbar", "TQScrollBar" }, + { "GtkHSeparator", "Line" }, + { "GtkHandleBox", "TQFrame" }, + { "GtkImage", "TQLabel" }, + { "GtkLabel", "TQLabel" }, + { "GtkList", "TQListBox" }, + { "GtkNotebook", "TQTabWidget" }, + { "GtkOptionMenu", "TQComboBox" }, + { "GtkPixmap", "TQLabel" }, + { "GtkPreview", "TQLabel" }, + { "GtkProgressBar", "TQProgressBar" }, + { "GtkRadioButton", "TQRadioButton" }, + { "GtkSpinButton", "TQSpinBox" }, + { "GtkStatusbar", "TQStatusBar" }, + { "GtkText", "TQTextEdit" }, + { "GtkToggleButton", "TQPushButton" }, + { "GtkTree", "TQListView" }, + { "GtkVPaned", "TQSplitter" }, + { "GtkVScale", "TQSlider" }, + { "GtkVScrollbar", "TQScrollBar" }, + { "GtkVSeparator", "Line" }, + { "Placeholder", "TQLabel" }, + { 0, 0 } +}; + +static const struct { + const char *name; + const char *menuText; +} stockMenuItems[] = { + { "ABOUT", "&About" }, + { "CLEAR", "C&lear" }, + { "CLOSE", "&Close" }, + { "CLOSE_WINDOW", "&Close This Window" }, + { "COPY", "&Copy" }, + { "CUT", "C&ut" }, + { "END_GAME", "&End Game" }, + { "EXIT", "E&xit" }, + { "FIND", "&Find..." }, + { "FIND_AGAIN", "Find &Again" }, + { "HINT", "&Hint" }, + { "NEW", "&New" }, + { "NEW_GAME", "&New Game" }, + { "NEW_WINDOW", "Create New &Window" }, + { "OPEN", "&Open..." }, + { "PASTE", "&Paste" }, + { "PAUSE_GAME", "&Pause Game" }, + { "PREFERENCES", "&Preferences..." }, + { "PRINT", "&Print" }, + { "PRINT_SETUP", "Print S&etup..." }, + { "PROPERTIES", "&Properties..." }, + { "REDO", "&Redo" }, + { "REDO_MOVE", "&Redo Move" }, + { "REPLACE", "&Replace..." }, + { "RESTART_GAME", "&Restart Game" }, + { "REVERT", "&Revert" }, + { "SAVE", "&Save" }, + { "SAVE_AS", "Save &As..." }, + { "SCORES", "&Scores..." }, + { "SELECT_ALL", "&Select All" }, + { "UNDO", "&Undo" }, + { "UNDO_MOVE", "&Undo Move" }, + { 0, 0 } +}; + +static const struct { + const char *gtkName; + int qtValue; +} keys[] = { + { "BackSpace", TQt::Key_BackSpace }, + { "Delete", TQt::Key_Delete }, + { "Down", TQt::Key_Down }, + { "End", TQt::Key_End }, + { "Escape", TQt::Key_Escape }, + { "F1", TQt::Key_F1 }, + { "F10", TQt::Key_F10 }, + { "F11", TQt::Key_F11 }, + { "F12", TQt::Key_F12 }, + { "F2", TQt::Key_F2 }, + { "F3", TQt::Key_F3 }, + { "F4", TQt::Key_F4 }, + { "F5", TQt::Key_F5 }, + { "F6", TQt::Key_F6 }, + { "F7", TQt::Key_F7 }, + { "F8", TQt::Key_F8 }, + { "F9", TQt::Key_F9 }, + { "Home", TQt::Key_Home }, + { "Insert", TQt::Key_Insert }, + { "KP_Enter", TQt::Key_Enter }, + { "Left", TQt::Key_Left }, + { "Page_Down", TQt::Key_PageDown }, + { "Page_Up", TQt::Key_PageUp }, + { "Return", TQt::Key_Return }, + { "Right", TQt::Key_Right }, + { "Tab", TQt::Key_Tab }, + { "Up", TQt::Key_Up }, + { "space", TQt::Key_Space }, + { 0, 0 } +}; + +static TQString nonMenuText( const TQString& menuText ) +{ + TQString t; + int len = (int) menuText.length(); + if ( menuText.endsWith(TQString("...")) ) + len -= 3; + for ( int i = 0; i < len; i++ ) { + if ( menuText[i] != TQChar('&') ) + t += menuText[i]; + } + return t; +} + +/* + Some GTK dialog use hyphens in variable names. Let's take no chance. +*/ +static TQString fixedName( const TQString& name ) +{ + const char *latin1 = name.latin1(); + TQString fixed; + + int i = 0; + while ( latin1 != 0 && latin1[i] != '\0' ) { + if ( isalnum(latin1[i]) ) + fixed += name[i]; + else + fixed += TQChar( '_' ); + i++; + } + return fixed; +} + +/* + Returns an hexadecimal rendering of a block of memory. +*/ +static TQString hexed( const char *data, int length ) +{ + TQString t; + for ( int i = 0; i < length; i++ ) { + TQString x; + x.sprintf( "%.2x", (uchar) data[i] ); + t += x; + } + return t; +} + +static bool isTrue( const TQString& val ) +{ + return val.lower() == TQString( "true" ); +} + +static AttributeMap attribute( const TQString& name, const TQString& val ) +{ + AttributeMap attr; + attr.insert( name, val ); + return attr; +} + +static TQString entitize( const TQString& str ) +{ + TQString t = str; + t.replace( '&', TQString("&") ); + t.replace( '>', TQString(">") ); + t.replace( '<', TQString("<") ); + t.replace( '"', TQString(""") ); + t.replace( '\'', TQString("'") ); + return t; +} + +Glade2Ui::Glade2Ui() +{ + int i = 0; + while ( classNames[i].gtkName != 0 ) { + yyClassNameMap.insert( TQString(classNames[i].gtkName), + TQString(classNames[i].qtName) ); + i++; + } + + i = 0; + while ( stockMenuItems[i].name != 0 ) { + yyStockMap.insert( TQString(stockMenuItems[i].name), + TQString(stockMenuItems[i].menuText) ); + i++; + } + + i = 0; + while ( keys[i].gtkName != 0 ) { + yyKeyMap.insert( TQString(keys[i].gtkName), keys[i].qtValue ); + i++; + } +} + +TQString Glade2Ui::imageName( const TQString& fileName ) +{ + return *yyImages.insert( fileName, TQString("image%1").arg(yyImages.count()), + FALSE ); +} + +TQString Glade2Ui::opening( const TQString& tag, const AttributeMap& attr ) +{ + TQString t = TQChar( '<' ) + tag; + AttributeMap::ConstIterator a = attr.begin(); + while ( a != attr.end() ) { + t += TQChar( ' ' ) + a.key() + TQString( "=\"" ) + entitize( *a ) + + TQChar( '"' ); + ++a; + } + t += TQChar( '>' ); + return t; +} + +TQString Glade2Ui::closing( const TQString& tag ) +{ + return opening( TQChar('/') + tag ); +} + +TQString Glade2Ui::atom( const TQString& tag, const AttributeMap& attr ) +{ + TQString t = opening( tag, attr ); + t.insert( t.length() - 1, TQChar('/') ); + return t; +} + +void Glade2Ui::error( const TQString& message ) +{ + if ( numErrors++ == 0 ) + TQMessageBox::warning( 0, yyFileName, message ); +} + +void Glade2Ui::syntaxError() +{ + error( TQString("Sorry, I met a random syntax error. I did what I could, but" + " that was not enough." + "<p>You might want to write to" + " <tt>qt-bugs@trolltech.com</tt> about this incident.") ); +} + +TQString Glade2Ui::getTextValue( const TQDomNode& node ) +{ + if ( node.childNodes().count() > 1 ) { + syntaxError(); + return TQString::null; + } + + if ( node.childNodes().count() == 0 ) + return TQString::null; + + TQDomText t = node.firstChild().toText(); + if ( t.isNull() ) { + syntaxError(); + return TQString::null; + } + return t.data().stripWhiteSpace(); +} + +void Glade2Ui::emitHeader() +{ + yyOut += TQString( "<!DOCTYPE UI><UI version=\"3.0\" stdsetdef=\"1\">\n" ); +} + +void Glade2Ui::emitFooter() +{ + yyOut += TQString( "</UI>\n" ); +} + +void Glade2Ui::emitSimpleValue( const TQString& tag, const TQString& value, + const AttributeMap& attr ) +{ + yyOut += yyIndentStr + opening( tag, attr ) + entitize( value ) + + closing( tag ) + TQChar( '\n' ); +} + +void Glade2Ui::emitOpening( const TQString& tag, const AttributeMap& attr ) +{ + yyOut += yyIndentStr + opening( tag, attr ) + TQChar( '\n' ); + yyIndentStr += TQString( " " ); +} + +void Glade2Ui::emitClosing( const TQString& tag ) +{ + yyIndentStr.truncate( yyIndentStr.length() - 4 ); + yyOut += yyIndentStr + closing( tag ) + TQChar( '\n' ); +} + +void Glade2Ui::emitAtom( const TQString& tag, const AttributeMap& attr ) +{ + yyOut += yyIndentStr + atom( tag, attr ) + TQChar( '\n' ); +} + +void Glade2Ui::emitVariant( const TQVariant& val, const TQString& stringType ) +{ + if ( val.isValid() ) { + switch ( val.type() ) { + case TQVariant::String: + emitSimpleValue( stringType, val.toString() ); + break; + case TQVariant::CString: + emitSimpleValue( TQString("cstring"), val.toString() ); + break; + case TQVariant::Bool: + emitSimpleValue( TQString("bool"), + TQString(val.toBool() ? "true" : "false") ); + break; + case TQVariant::Int: + case TQVariant::UInt: + emitSimpleValue( TQString("number"), val.toString() ); + break; + case TQVariant::Rect: + emitOpening( TQString("rect") ); + emitSimpleValue( TQString("x"), TQString::number(val.toRect().x()) ); + emitSimpleValue( TQString("y"), TQString::number(val.toRect().y()) ); + emitSimpleValue( TQString("width"), + TQString::number(val.toRect().width()) ); + emitSimpleValue( TQString("height"), + TQString::number(val.toRect().height()) ); + emitClosing( TQString("rect") ); + break; + case TQVariant::Size: + emitOpening( TQString("size") ); + emitSimpleValue( TQString("width"), + TQString::number(val.toSize().width()) ); + emitSimpleValue( TQString("height"), + TQString::number(val.toSize().height()) ); + emitClosing( TQString("size") ); + break; + case TQVariant::SizePolicy: + emitOpening( TQString("sizepolicy") ); + emitSimpleValue( TQString("hsizetype"), + TQString::number((int) val.toSizePolicy() + .horData()) ); + emitSimpleValue( TQString("vsizetype"), + TQString::number((int) val.toSizePolicy() + .verData()) ); + emitClosing( TQString("sizepolicy") ); + break; + default: + emitSimpleValue( TQString("fnord"), TQString::null ); + } + } +} + +void Glade2Ui::emitProperty( const TQString& prop, const TQVariant& val, + const TQString& stringType ) +{ + emitOpening( TQString("property"), attribute(TQString("name"), prop) ); + emitVariant( val, stringType ); + emitClosing( TQString("property") ); +} + +void Glade2Ui::emitFontProperty( const TQString& prop, int pointSize, bool bold ) +{ + emitOpening( TQString("property"), attribute(TQString("name"), prop) ); + emitOpening( TQString("font") ); + emitSimpleValue( TQString("pointsize"), TQString::number(pointSize) ); + if ( bold ) + emitSimpleValue( TQString("bold"), TQString("1") ); + emitClosing( TQString("font") ); + emitClosing( TQString("property") ); +} + +void Glade2Ui::emitAttribute( const TQString& prop, const TQVariant& val, + const TQString& stringType ) +{ + emitOpening( TQString("attribute"), attribute(TQString("name"), prop) ); + emitVariant( val, stringType ); + emitClosing( TQString("attribute") ); +} + +static TQString accelerate( const TQString& gtkLabel ) +{ + TQString qtLabel = gtkLabel; + qtLabel.replace( '&', TQString("&&") ); + // close but not tquite right + qtLabel.replace( TQChar('_'), TQChar('&') ); + return qtLabel; +} + +static TQString decelerate( const TQString& gtkLabel ) +{ + TQString qtLabel = gtkLabel; + // ditto + qtLabel.replace( '_', TQString::null ); + return qtLabel; +} + +/* + Converting a GTK widget to a corresponding TQt widget is sometimes + hard. For example, a GtkScrolledWindow should sometimes be converted + into a TQTextView, a TQTextEdit, a TQListView or whatever. What we do + is pretty hackish, but it mostly works. +*/ +TQString Glade2Ui::gtk2qtClass( const TQString& gtkClass, + const TQValueList<TQDomElement>& childWidgets ) +{ + TQRegExp gnomeXEntry( TQString("Gnome(File|Number|Pixmap)?Entry") ); + + TQString qtClass; + + if ( gtkClass == TQString("GtkScrolledWindow") ) { + if ( childWidgets.count() == 1 ) { + TQString g; + bool editable = FALSE; + bool showTitles = TRUE; + + TQDomNode n = childWidgets.first().firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("class") ) { + g = getTextValue( n ); + } else if ( tagName == TQString("editable") ) { + editable = isTrue( getTextValue(n) ); + } else if ( tagName.startsWith(TQString("show_tit")) ) { + showTitles = isTrue( getTextValue(n) ); + } + n = n.nextSibling(); + } + + if ( g == TQString("GnomeCanvas") || + g == TQString("GtkDrawingArea") ) { + qtClass = TQString( "TQLabel" ); + } else if ( g == TQString("GnomeIconList") ) { + qtClass = TQString( "TQIconView" ); + } else if ( g == TQString("GtkCList") ) { + if ( showTitles ) + qtClass = TQString( "TQListView" ); + else + qtClass = TQString( "TQListBox" ); + } else if ( g == TQString("GtkCTree") ) { + qtClass = TQString( "TQListView" ); + } else if ( g == TQString("GtkList") ) { + qtClass = TQString( "TQListBox" ); + } else if ( g == TQString("GtkText") ) { + if ( editable ) + qtClass = TQString( "TQTextEdit" ); + else + qtClass = TQString( "TQTextView" ); + } else if ( g == TQString("GtkTree") ) { + qtClass = TQString( "TQListView" ); + } + // else too bad (qtClass is empty) + } + } else if ( gtkClass == TQString("GtkWindow") ) { + qtClass = TQString( "TQDialog" ); + if ( childWidgets.count() == 1 ) { + TQString g; + + TQDomNode n = childWidgets.first().firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("class") ) + g = getTextValue( n ); + n = n.nextSibling(); + } + if ( g == TQString("GnomeDruid") ) + qtClass = TQString( "TQWizard" ); + } + /* + GnomeEntry and friends are a wrapper around a GtkEntry. We only + want the GtkEntry child. + */ + } else if ( !gnomeXEntry.exactMatch(gtkClass) && + gtkClass != TQString("GtkAlignment") && + gtkClass != TQString("GtkEventBox") ) { + qtClass = yyClassNameMap[gtkClass]; + if ( qtClass.isEmpty() ) + qtClass = TQString( "Unknown" ); + } + return qtClass; +} + +static TQString gtk2qtScrollBarMode( const TQString& scrollbarPolicy ) +{ + if ( scrollbarPolicy.endsWith(TQString("_NEVER")) ) { + return TQString( "AlwaysOff" ); + } else if ( scrollbarPolicy.endsWith(TQString("_ALWAYS")) ) { + return TQString( "AlwaysOn" ); + } else { + return TQString( "Auto" ); + } +} + +static TQString gtk2qtSelectionMode( const TQString& selectionMode ) +{ + if ( selectionMode.endsWith(TQString("_MULTIPLE")) ) + return TQString( "Multi" ); + else if ( selectionMode.endsWith(TQString("_EXTENDED")) ) + return TQString( "Extended" ); + else + return TQString( "Single" ); +} + +int Glade2Ui::matchAccelOnActivate( const TQDomElement& accel ) +{ + TQString key; + TQString modifiers; + + TQDomNode n = accel.firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("key") ) { + key = getTextValue( n ); + if ( !key.startsWith(TQString("GDK_")) ) + return 0; + } else if ( tagName == TQString("modifiers") ) { + modifiers = getTextValue( n ); + } else if ( tagName == TQString("signal") ) { + if ( getTextValue(n) != TQString("activate") ) + return 0; + } + n = n.nextSibling(); + } + + int flags = 0; + + if ( key.length() == 5 ) { + flags = key[4].upper().latin1(); + } else if ( yyKeyMap.contains(key.mid(4)) ) { + flags = yyKeyMap[key.mid(4)]; + } else { + return 0; + } + + if ( modifiers.contains(TQString("_CONTROL_")) ) + flags |= TQt::CTRL; + if ( modifiers.contains(TQString("_SHIFT_")) ) + flags |= TQt::SHIFT; + if ( modifiers.contains(TQString("_MOD1_")) ) + flags |= TQt::ALT; + return flags; +} + +void Glade2Ui::emitGtkMenu( const TQDomElement& menu ) +{ + TQRegExp gnomeuiinfoMenuXItem( TQString("GNOMEUIINFO_MENU_(.+)_ITEM") ); + + TQDomNode n = menu.firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("widget") ) { + TQString activateHandler; + TQString gtkClass; + TQString icon; + TQString label; + TQString name; + TQString stockItem; + TQString tooltip; + int qtAccel = 0; + + TQDomNode child = n.firstChild(); + while ( !child.isNull() ) { + TQString childTagName = child.toElement().tagName(); + if ( childTagName == TQString("accelerator") ) { + qtAccel = matchAccelOnActivate( child.toElement() ); + } else if ( childTagName == TQString("class") ) { + gtkClass = getTextValue( child ); + } else if ( childTagName == TQString("icon") ) { + icon = getTextValue( child ); + } else if ( childTagName == TQString("label") ) { + label = getTextValue( child ); + } else if ( childTagName == TQString("name") ) { + name = getTextValue( child ); + } else if ( childTagName == TQString("signal") ) { + TQString signalName; + TQString signalHandler; + + TQDomNode grandchild = child.firstChild(); + while ( !grandchild.isNull() ) { + TQString grandchildTagName = + grandchild.toElement().tagName(); + if ( grandchildTagName == TQString("handler") ) { + signalHandler = getTextValue( grandchild ); + } else if ( grandchildTagName == TQString("name") ) { + signalName = getTextValue( grandchild ); + } + grandchild = grandchild.nextSibling(); + } + if ( signalName == TQString("activate") ) + activateHandler = signalHandler; + } else if ( childTagName == TQString("stock_item") ) { + stockItem = getTextValue( child ); + } else if ( childTagName == TQString("tooltip") ) { + tooltip = getTextValue( child ); + } + child = child.nextSibling(); + } + + if ( label.length() + stockItem.length() == 0 ) { + emitAtom( TQString("separator") ); + } else { + if ( name.isEmpty() ) + name = TQString( "action%1" ).arg( uniqueAction++ ); + emitAtom( TQString("action"), attribute(TQString("name"), name) ); + + if ( !activateHandler.isEmpty() ) { + TQString slot = activateHandler + TQString( "()" ); + GladeConnection c; + c.sender = name; + c.signal = TQString( "activated()" ); + c.slot = slot; + yyConnections.push_back( c ); + yySlots.insert( slot, TQString("public") ); + } + + TQString x; + GladeAction a; + + if ( gnomeuiinfoMenuXItem.exactMatch(stockItem) ) { + x = gnomeuiinfoMenuXItem.cap( 1 ); + a.menuText = yyStockMap[x]; + if ( x == TQString("EXIT") && qtAccel == 0 ) + qtAccel = TQt::CTRL + TQt::Key_Q; + } else { + a.menuText = accelerate( label ); + } + a.text = nonMenuText( a.menuText ); + a.toolTip = tooltip; + a.accel = qtAccel; + a.iconSet = icon; + yyActions.insert( name, a ); + if ( !x.isEmpty() ) + yyStockItemActions.insert( x, name ); + } + } + n = n.nextSibling(); + } +} + +void Glade2Ui::emitGtkMenuBarChildWidgets( + const TQValueList<TQDomElement>& childWidgets ) +{ + TQRegExp gnomeuiinfoMenuXTree( TQString("GNOMEUIINFO_MENU_(.+)_TREE") ); + + emitOpening( TQString("menubar") ); + emitProperty( TQString("name"), + TQString("MenuBar%1").arg(uniqueMenuBar++).latin1() ); + + TQValueList<TQDomElement>::ConstIterator c = childWidgets.begin(); + while ( c != childWidgets.end() ) { + TQValueList<TQDomElement> grandchildWidgets; + TQString gtkClass; + TQString label; + TQString name; + TQString stockItem; + + TQDomNode n = (*c).firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("class") ) { + gtkClass = getTextValue( n ); + } else if ( tagName == TQString("label") ) { + label = getTextValue( n ); + } else if ( tagName == TQString("name") ) { + name = getTextValue( n ); + } else if ( tagName == TQString("stock_item") ) { + stockItem = getTextValue( n ); + } else if ( tagName == TQString("widget") ) { + grandchildWidgets.push_back( n.toElement() ); + } + n = n.nextSibling(); + } + + if ( gtkClass == TQString("GtkMenuItem") && + grandchildWidgets.count() == 1 ) { + TQString text; + if ( gnomeuiinfoMenuXTree.exactMatch(stockItem) ) { + text = gnomeuiinfoMenuXTree.cap( 1 ); + if ( text == TQString("Files") ) + text = TQString( "Fi&les" ); + else + text = TQChar( '&' ) + text.left( 1 ) + + text.mid( 1 ).lower(); + } else { + text = accelerate( label ); + } + + AttributeMap attr; + attr.insert( TQString("name"), name ); + attr.insert( TQString("text"), text ); + + emitOpening( TQString("item"), attr ); + emitGtkMenu( grandchildWidgets.first() ); + emitClosing( TQString("item") ); + } + ++c; + } + emitClosing( TQString("menubar") ); +} + +void Glade2Ui::emitGtkToolbarChildWidgets( + const TQValueList<TQDomElement>& childWidgets ) +{ + TQRegExp gnomeStockPixmapX( TQString("GNOME_STOCK_PIXMAP_(.+)") ); + + emitOpening( TQString("toolbar"), attribute(TQString("dock"), TQString("2")) ); + emitProperty( TQString("name"), + TQString("ToolBar%1").arg(uniqueToolBar++).latin1() ); + + TQValueList<TQDomElement>::ConstIterator c = childWidgets.begin(); + while ( c != childWidgets.end() ) { + TQString childName; + TQString icon; + TQString label; + TQString name; + TQString stockPixmap; + TQString tooltip; + + TQDomNode n = (*c).firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("child_name") ) { + childName = getTextValue( n ); + } else if ( tagName == TQString("icon") ) { + icon = getTextValue( n ); + } else if ( tagName == TQString("label") ) { + label = getTextValue( n ); + } else if ( tagName == TQString("name") ) { + name = getTextValue( n ); + } else if ( tagName == TQString("stock_pixmap") ) { + stockPixmap = getTextValue( n ); + } else if ( tagName == TQString("tooltip") ) { + tooltip = getTextValue( n ); + } + n = n.nextSibling(); + } + + if ( childName == TQString("Toolbar:button") ) { + TQString actionName; + GladeAction a; + a.menuText = label; + a.text = label; + a.accel = 0; + a.iconSet = icon; + + if ( gnomeStockPixmapX.exactMatch(stockPixmap) ) { + TQString x = gnomeStockPixmapX.cap( 1 ); + actionName = yyStockItemActions[x]; + } + if ( actionName.isEmpty() ) { + if ( name.isEmpty() ) + actionName = TQString( "action%1" ).arg( uniqueAction++ ); + else + actionName = TQString( "action_%1" ).arg( name ); + yyActions.insert( actionName, a ); + } + if ( !tooltip.isEmpty() ) + yyActions[actionName].toolTip = tooltip; + + emitAtom( TQString("action"), attribute(TQString("name"), + actionName) ); + } else { + emitAtom( TQString("separator") ); + } + ++c; + } + emitClosing( TQString("toolbar") ); +} + +void Glade2Ui::emitPushButton( const TQString& text, const TQString& name ) +{ + emitOpening( TQString("widget"), + attribute(TQString("class"), TQString("TQPushButton")) ); + emitProperty( TQString("name"), name.latin1() ); + emitProperty( TQString("text"), text ); + if ( name.contains(TQString("ok")) > 0 ) { + emitProperty( TQString("default"), TQVariant(TRUE, 0) ); + } else if ( name.contains(TQString("help")) > 0 ) { + emitProperty( TQString("accel"), (int) TQt::Key_F1 ); + } + emitClosing( TQString("widget") ); +} + +void Glade2Ui::attach( AttributeMap *attr, int leftAttach, int rightAttach, + int topAttach, int bottomAttach ) +{ + if ( leftAttach >= 0 ) { + attr->insert( TQString("row"), TQString::number(topAttach) ); + attr->insert( TQString("column"), TQString::number(leftAttach) ); + if ( bottomAttach - topAttach != 1 ) + attr->insert( TQString("rowspan"), + TQString::number(bottomAttach - topAttach) ); + if ( rightAttach - leftAttach != 1 ) + attr->insert( TQString("colspan"), + TQString::number(rightAttach - leftAttach) ); + } +} + +void Glade2Ui::emitSpacer( const TQString& orientation, int leftAttach, + int rightAttach, int topAttach, int bottomAttach ) +{ + AttributeMap attr; + attach( &attr, leftAttach, rightAttach, topAttach, bottomAttach ); + emitOpening( TQString("spacer"), attr ); + emitProperty( TQString("name"), + TQString("Spacer%1").arg(uniqueSpacer++).latin1() ); + emitProperty( TQString("orientation"), orientation, TQString("enum") ); + emitProperty( TQString("sizeType"), TQString("Expanding"), + TQString("enum") ); + emitClosing( TQString("spacer") ); +} + +void Glade2Ui::emitPixmap( const TQString& imageName, int leftAttach, + int rightAttach, int topAttach, int bottomAttach ) +{ + emitOpeningWidget( TQString("TQLabel"), leftAttach, rightAttach, topAttach, + bottomAttach ); + emitProperty( TQString("sizePolicy"), + TQSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Fixed) ); + emitProperty( TQString("pixmap"), imageName, TQString("pixmap") ); + emitClosing( TQString("widget") ); +} + +void Glade2Ui::emitGnomeAbout( TQString copyright, TQString authors, + TQString comments ) +{ + TQString prog = yyProgramName; + if ( prog.isEmpty() ) + prog = TQString( "Gnomovision 1.69" ); + if ( copyright.isEmpty() ) + copyright = TQString( "(C) 2001 Jasmin Blanchette" ); + if ( authors.isEmpty() ) + authors = TQString( "Jasmin Blanchette <jasmin@troll.no>" ); + if ( comments.isEmpty() ) + comments = TQString( "Gnomovision is the official GNU application." ); + + emitOpening( TQString("hbox") ); + emitSpacer( TQString("Horizontal") ); + emitOpeningWidget( TQString("TQLayoutWidget") ); + emitOpening( TQString("vbox") ); + emitProperty( TQString("spacing"), 17 ); + + /* + Emit the application name. + */ + emitOpeningWidget( TQString("TQLabel") ); + emitFontProperty( TQString("font"), 24, TRUE ); + emitProperty( TQString("text"), prog ); + emitProperty( TQString("alignment"), TQString("AlignAuto|AlignCenter"), + TQString("set") ); + emitClosing( TQString("widget") ); + + /* + Emit the copyright notice. + */ + emitOpeningWidget( TQString("TQLabel") ); + emitFontProperty( TQString("font"), 12, TRUE ); + emitProperty( TQString("text"), copyright ); + emitClosing( TQString("widget") ); + + /* + Emit the authors' names. + */ + emitOpeningWidget( TQString("TQLayoutWidget") ); + emitOpening( TQString("hbox") ); + + emitOpeningWidget( TQString("TQLabel") ); + emitFontProperty( TQString("font"), 12, TRUE ); + emitProperty( TQString("text"), TQString("Authors:") ); + emitProperty( TQString("alignment"), TQString("AlignAuto|AlignTop"), + TQString("set") ); + emitClosing( TQString("widget") ); + + emitOpeningWidget( TQString("TQLabel") ); + emitFontProperty( TQString("font"), 12, FALSE ); + emitProperty( TQString("text"), authors ); + emitProperty( TQString("alignment"), TQString("AlignAuto|AlignTop"), + TQString("set") ); + emitClosing( TQString("widget") ); + + emitSpacer( TQString("Horizontal") ); + + emitClosing( TQString("hbox") ); + emitClosing( TQString("widget") ); + + /* + Emit the comments. + */ + emitOpeningWidget( TQString("TQLabel") ); + emitFontProperty( TQString("font"), 10, FALSE ); + emitProperty( TQString("text"), comments ); + emitProperty( TQString("alignment"), TQString("AlignAuto|AlignTop"), + TQString("set") ); + emitClosing( TQString("widget") ); + + /* + Emit the spacer and the OK button. + */ + emitSpacer( TQString("Vertical") ); + + emitOpeningWidget( TQString("TQLayoutWidget") ); + emitOpening( TQString("hbox") ); + emitSpacer( TQString("Horizontal") ); + + emitPushButton( TQString("&OK"), TQString("okButton") ); + + emitSpacer( TQString("Horizontal") ); + emitClosing( TQString("hbox") ); + emitClosing( TQString("widget") ); + + emitClosing( TQString("vbox") ); + emitClosing( TQString("widget") ); + emitSpacer( TQString("Horizontal") ); + emitClosing( TQString("hbox") ); +} + +/* + GnomeApps are emitted in two passes, because some information goes + into the <widget> section, whereas other information goes into the + <toolbars> section. +*/ +void Glade2Ui::emitGnomeAppChildWidgetsPass1( + const TQValueList<TQDomElement>& childWidgets ) +{ + TQValueList<TQDomElement>::ConstIterator c = childWidgets.begin(); + while ( c != childWidgets.end() ) { + TQValueList<TQDomElement> grandchildWidgets; + TQString childName; + + TQDomNode n = (*c).firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("child_name") ) { + childName = getTextValue( n ); + } else if ( tagName == TQString("widget") ) { + grandchildWidgets.push_back( n.toElement() ); + } + n = n.nextSibling(); + } + + if ( childName == TQString("GnomeDock:contents") ) { + emitWidget( *c, FALSE ); + } else { + emitGnomeAppChildWidgetsPass1( grandchildWidgets ); + } + ++c; + } +} + +void Glade2Ui::doPass2( const TQValueList<TQDomElement>& childWidgets, + TQValueList<TQDomElement> *menuBar, + TQValueList<TQValueList<TQDomElement> > *toolBars ) +{ + TQValueList<TQDomElement>::ConstIterator c = childWidgets.begin(); + while ( c != childWidgets.end() ) { + TQValueList<TQDomElement> grandchildWidgets; + TQString childName; + TQString gtkClass; + + TQDomNode n = (*c).firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("child_name") ) { + childName = getTextValue( n ); + } else if ( tagName == TQString("class") ) { + gtkClass = getTextValue( n ); + } else if ( tagName == TQString("widget") ) { + grandchildWidgets.push_back( n.toElement() ); + } + n = n.nextSibling(); + } + + if ( gtkClass == TQString("GtkMenuBar") ) { + *menuBar = grandchildWidgets; + } else if ( gtkClass == TQString("GtkToolbar") ) { + toolBars->push_back( grandchildWidgets ); + } else if ( childName != TQString("GnomeDock:contents") ) { + doPass2( grandchildWidgets, menuBar, toolBars ); + } + ++c; + } +} + +void Glade2Ui::emitGnomeAppChildWidgetsPass2( + const TQValueList<TQDomElement>& childWidgets ) +{ + TQValueList<TQDomElement> menuBar; + TQValueList<TQValueList<TQDomElement> > toolBars; + + doPass2( childWidgets, &menuBar, &toolBars ); + + emitGtkMenuBarChildWidgets( menuBar ); + if ( !toolBars.isEmpty() ) { + emitOpening( TQString("toolbars") ); + while ( !toolBars.isEmpty() ) { + emitGtkToolbarChildWidgets( toolBars.first() ); + toolBars.remove( toolBars.begin() ); + } + emitClosing( TQString("toolbars") ); + } +} + +void Glade2Ui::emitGtkButtonChildWidgets( TQValueList<TQDomElement> childWidgets ) +{ + TQValueList<TQDomElement>::ConstIterator c = childWidgets.begin(); + while ( c != childWidgets.end() ) { + TQString label; + + TQDomNode n = (*c).firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("label") ) { + label = getTextValue( n ); + } else if ( tagName == TQString("widget") ) { + childWidgets.push_back( n.toElement() ); + } + n = n.nextSibling(); + } + + if ( !label.isEmpty() ) { + emitProperty( TQString("text"), accelerate(label) ); + break; + } + ++c; + } +} + +void Glade2Ui::emitGtkComboChildWidgets( + const TQValueList<TQDomElement>& childWidgets, const TQStringList& items ) +{ + TQString text; + + // there should be exactly one child, of type GtkEntry + if ( childWidgets.count() == 1 ) { + TQDomNode n = childWidgets.first().firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("name") ) { + // grep 'elsewhere' + emitProperty( TQString("name"), + fixedName(getTextValue(n).latin1()) ); + } else if ( tagName == TQString("text") ) { + text = getTextValue( n ); + } + n = n.nextSibling(); + } + } + + int n = 0; + TQStringList::ConstIterator s = items.begin(); + while ( s != items.end() ) { + if ( !text.isEmpty() && *s == text ) + emitProperty( TQString("currentItem"), n ); + n++; + ++s; + } + +} + +void Glade2Ui::emitGtkNotebookChildWidgets( + const TQValueList<TQDomElement>& childWidgets ) +{ + TQStringList tabNames; + TQStringList tabLabels; + + for ( int i = 0; i < (int) childWidgets.count(); i++ ) { + tabNames.push_back( TQString("tab%1").arg(i + 1) ); + tabLabels.push_back( TQString("Tab %1").arg(i + 1) ); + } + + TQValueList<TQDomElement>::ConstIterator c; + c = childWidgets.begin(); + + TQStringList::Iterator nam = tabNames.begin(); + TQStringList::Iterator lab = tabLabels.begin(); + + while ( c != childWidgets.end() ) { + TQString childName; + TQString name; + TQString label; + + TQDomNode n = (*c).firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("child_name") ) { + childName = getTextValue( n ); + } else if ( tagName == TQString("name") ) { + name = getTextValue( n ); + } else if ( tagName == TQString("label") ) { + label = getTextValue( n ); + } + n = n.nextSibling(); + } + + if ( childName == TQString("Notebook:tab") ) { + if ( !name.isEmpty() ) + *nam = name; + if ( !label.isEmpty() ) + *lab = label; + ++nam; + ++lab; + } + ++c; + } + + c = childWidgets.begin(); + while ( c != childWidgets.end() ) { + TQString childName; + TQString name; + TQString label; + + TQDomNode n = (*c).firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("child_name") ) + childName = getTextValue( n ); + n = n.nextSibling(); + } + + if ( childName != TQString("Notebook:tab") ) { + emitOpeningWidget( TQString("TQWidget") ); + emitProperty( TQString("name"), tabNames.first().latin1() ); + tabNames.remove( tabNames.begin() ); + emitAttribute( TQString("title"), accelerate(tabLabels.first()) ); + tabLabels.remove( tabLabels.begin() ); + emitWidget( *c, FALSE ); + emitClosing( TQString("widget") ); + } + ++c; + } +} + +void Glade2Ui::emitTQListViewColumns( const TQDomElement& qlistview ) +{ + TQDomNode n = qlistview.firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("widget") ) { + TQDomNode child = n.firstChild(); + while ( !child.isNull() ) { + TQString tagName = child.toElement().tagName(); + if ( tagName == TQString("label") ) { + emitOpening( TQString("column") ); + emitProperty( TQString("text"), + decelerate(getTextValue(child)) ); + emitClosing( TQString("column") ); + } + child = child.nextSibling(); + } + } else if ( tagName == TQString("class") ) { + TQString gtkClass = getTextValue( n ); + if ( gtkClass.endsWith(TQString("Tree")) ) + emitProperty( TQString("rootIsDecorated"), TQVariant(TRUE, 0) ); + } else if ( tagName == TQString("selection_mode") ) { + emitProperty( TQString("selectionMode"), + gtk2qtSelectionMode(getTextValue(n)) ); + } + n = n.nextSibling(); + } +} + +void Glade2Ui::emitGtkScrolledWindowChildWidgets( + const TQValueList<TQDomElement>& childWidgets, const TQString& qtClass ) +{ + if ( childWidgets.count() == 1 ) { + if ( qtClass == TQString("TQIconView") || + qtClass == TQString("TQListBox") || + qtClass == TQString("TQListView") ) { + TQDomNode n = childWidgets.first().firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("selection_mode") ) { + emitProperty( TQString("selectionMode"), + gtk2qtSelectionMode(getTextValue(n)) ); + } + n = n.nextSibling(); + } + } + + if ( qtClass == TQString("TQListView") ) { + emitTQListViewColumns( childWidgets.first() ); + } else if ( qtClass == TQString("TQTextEdit") || + qtClass == TQString("TQTextView") ) { + TQDomNode n = childWidgets.first().firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("text") ) + emitProperty( TQString("text"), getTextValue(n) ); + n = n.nextSibling(); + } + } + } +} + +void Glade2Ui::emitGnomeDruidPage( const TQDomElement& druidPage ) +{ + TQValueList<TQDomElement> childWidgets; + TQString gtkClass; + TQString logoImage; + TQString name; + TQString text; + TQString title; + TQString watermarkImage; + + emitOpeningWidget( TQString("TQWidget") ); + + TQDomNode n = druidPage.firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("class") ) { + gtkClass = getTextValue( n ); + } else if ( tagName == TQString("logo_image") ) { + logoImage = getTextValue( n ); + } else if ( tagName == TQString("name") ) { + name = getTextValue( n ); + } else if ( tagName == TQString("text") ) { + text = getTextValue( n ); + } else if ( tagName == TQString("title") ) { + title = getTextValue( n ); + } else if ( tagName == TQString("watermark_image") ) { + watermarkImage = getTextValue( n ); + } else if ( tagName == TQString("widget") ) { + childWidgets.push_back( n.toElement() ); + } + n = n.nextSibling(); + } + + if ( !name.isEmpty() ) + emitProperty( TQString("name"), fixedName(name).latin1() ); + if ( title.isEmpty() ) + title = TQString( "Page" ); + emitAttribute( TQString("title"), title ); + + /* + We're striving to get the logoImage and/or the watermarkImage at + the right places with a grid layout. + */ + int leftAttach = 0; + int rightAttach = 0; + int topAttach = 0; + int bottomAttach = 0; + + int numImages = 0; + if ( !logoImage.isEmpty() ) { + topAttach = 1; + numImages++; + } + if ( !watermarkImage.isEmpty() ) { + leftAttach = 1; + numImages++; + } + rightAttach = leftAttach + numImages; + bottomAttach = topAttach + numImages; + + bool layouted = ( numImages > 0 ); + if ( layouted ) { + emitOpening( TQString("grid") ); + if ( !logoImage.isEmpty() ) + emitPixmap( imageName(logoImage), numImages, numImages + 1, 0, 1 ); + if ( !watermarkImage.isEmpty() ) + emitPixmap( imageName(watermarkImage), 0, 1, numImages, + numImages + 1 ); + } else { + leftAttach = -1; + rightAttach = -1; + topAttach = -1; + bottomAttach = -1; + } + + if ( gtkClass.endsWith(TQString("Standard")) ) { + emitChildWidgets( childWidgets, layouted, leftAttach, rightAttach, + topAttach, bottomAttach ); + } else if ( !text.isEmpty() ) { + if ( layouted ) + emitOpeningWidget( TQString("TQLayoutWidget"), leftAttach, + rightAttach, topAttach, bottomAttach ); + emitOpening( TQString("hbox") ); + emitSpacer( TQString("Horizontal") ); + emitOpeningWidget( TQString("TQLabel") ); + emitProperty( TQString("text"), text ); + emitClosing( TQString("widget") ); + emitSpacer( TQString("Horizontal") ); + emitClosing( TQString("hbox") ); + if ( layouted ) + emitClosing( TQString("widget") ); + } + + if ( layouted ) + emitClosing( TQString("grid") ); + emitClosing( TQString("widget") ); +} + +void Glade2Ui::emitGtkWindowChildWidgets( + const TQValueList<TQDomElement>& childWidgets, const TQString& qtClass ) +{ + if ( childWidgets.count() == 1 && qtClass == TQString("TQWizard") ) { + emitFontProperty( TQString("titleFont"), 18, FALSE ); + + TQDomNode n = childWidgets.first().firstChild(); + while ( !n.isNull() ) { + if ( n.toElement().tagName() == TQString("widget") ) + emitGnomeDruidPage( n.toElement() ); + n = n.nextSibling(); + } + } else { + emitChildWidgets( childWidgets, FALSE ); + } +} + +bool Glade2Ui::packEnd( const TQDomElement& widget ) +{ + TQDomNode n = widget.firstChild(); + while ( !n.isNull() ) { + if ( n.toElement().tagName() == TQString("child") ) { + TQDomNode child = n.firstChild(); + while ( !child.isNull() ) { + if ( child.toElement().tagName() == TQString("pack") ) { + TQString pack = getTextValue( child ); + return pack.endsWith( TQString("_END") ); + } + child = child.nextSibling(); + } + } + n = n.nextSibling(); + } + return FALSE; +} + +void Glade2Ui::emitChildWidgets( const TQValueList<TQDomElement>& childWidgets, + bool layouted, int leftAttach, int rightAttach, + int topAttach, int bottomAttach ) +{ + TQValueList<TQDomElement> start; + TQValueList<TQDomElement> end; + TQValueList<TQDomElement>::ConstIterator e; + + if ( layouted ) { + e = childWidgets.begin(); + while ( e != childWidgets.end() ) { + if ( packEnd(*e) ) + end.push_front( *e ); + else + start.push_back( *e ); + ++e; + } + } else { + start = childWidgets; + } + + e = start.begin(); + while ( e != start.end() ) { + emitWidget( *e, layouted, leftAttach, rightAttach, topAttach, + bottomAttach ); + ++e; + } + e = end.begin(); + while ( e != end.end() ) { + emitWidget( *e, layouted, leftAttach, rightAttach, topAttach, + bottomAttach ); + ++e; + } +} + +void Glade2Ui::emitOpeningWidget( const TQString& qtClass, int leftAttach, + int rightAttach, int topAttach, + int bottomAttach ) +{ + AttributeMap attr = attribute( TQString("class"), qtClass ); + attach( &attr, leftAttach, rightAttach, topAttach, bottomAttach ); + emitOpening( TQString("widget"), attr ); +} + +/* + Returns TRUE if the vbox containing childWidgets should have a + spacer at the end to prevent it from looking bad, otherwise returns + FALSE. + + The algorithm is very experimental. +*/ +bool Glade2Ui::shouldPullup( const TQValueList<TQDomElement>& childWidgets ) +{ + TQRegExp gtkSmallWidget( TQString( + "G.*(?:Button|Combo|Dial|Entry|Label|OptionMenu|Picker|ProgressBar" + "|Separator|Statusbar|Toolbar|VBox)") ); + + TQValueList<TQDomElement>::ConstIterator c = childWidgets.begin(); + while ( c != childWidgets.end() ) { + TQValueList<TQDomElement> grandchildWidgets; + TQString gtkClass; + + TQDomNode n = (*c).firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( tagName == TQString("class") ) { + gtkClass = getTextValue( n ); + } else if ( tagName == TQString("widget") ) { + grandchildWidgets.push_back( n.toElement() ); + } + n = n.nextSibling(); + } + + if ( !gtkSmallWidget.exactMatch(gtkClass) || + !shouldPullup(grandchildWidgets) ) + return FALSE; + ++c; + } + return TRUE; +} + +TQString Glade2Ui::emitWidget( const TQDomElement& widget, bool layouted, + int leftAttach, int rightAttach, int topAttach, + int bottomAttach ) +{ + TQRegExp gtkLayoutWidget( TQString( + "Gtk(?:Packer|Table|Toolbar|[HV](?:(?:Button)?Box))") ); + TQRegExp gtkOrientedWidget( TQString( + "Gtk([HV])(?:Paned|Scale|Scrollbar|Separator)") ); + + TQValueList<TQDomElement> childWidgets; + TQString gtkClass; + TQString name; + TQString title; + int x = 0; + int y = 0; + int width = 0; + int height = 0; + int numRows = 0; + int numColumns = 0; + + bool active = FALSE; + TQString authors; + TQString childName; + TQString comments; + TQString copyright; + TQString creationFunction; + bool editable = TRUE; + TQString filename; + TQString focusTarget; + TQString hscrollbarPolicy; + TQString icon; + int initialChoice = 0; + TQStringList items; + TQString justify; + TQString label; + TQString logoImage; + int lower = -123456789; + int page = 10; + int pageSize = 10; + TQString selectionMode; + TQString shadowType( "GTK_SHADOW_NONE" ); + bool showText = TRUE; + bool showTitles = TRUE; + int step = 1; + TQString tabPos; + TQString text; + int textMaxLength = 0; + bool textVisible = TRUE; + TQString tooltip; + TQString type; + int upper = 123456789; + int value = 123456789; + bool valueInList = TRUE; + TQString vscrollbarPolicy; + TQString watermarkImage; + bool wrap = FALSE; + + bool topLevel = yyFormName.isEmpty(); + if ( topLevel ) + name = TQString( "Form%1" ).arg( uniqueForm++ ); + + TQDomNode n = widget.firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + if ( !tagName.isEmpty() ) { + /* + Recognize the properties and stores them in variables. + This step is a bit silly, and if this function were to + be rewritten, almost everything would just be stored, as + strings, in a giant map, and looked up for when emitting + the properties. + */ + switch ( (uchar) tagName[0].cell() ) { + case 'a': + if ( tagName == TQString("active") ) { + active = isTrue( getTextValue(n) ); + } else if ( tagName == TQString("authors") ) { + authors = getTextValue( n ); + } + break; + case 'c': + if ( tagName == TQString("child") ) { + TQDomNode child = n.firstChild(); + while ( !child.isNull() ) { + TQString childTagName = child.toElement().tagName(); + if ( childTagName == TQString("left_attach") ) { + leftAttach = getTextValue( child ).toInt(); + } else if ( childTagName == TQString("right_attach") ) { + rightAttach = getTextValue( child ).toInt(); + } else if ( childTagName == TQString("top_attach") ) { + topAttach = getTextValue( child ).toInt(); + } else if ( childTagName == TQString("bottom_attach") ) { + bottomAttach = getTextValue( child ).toInt(); + } + child = child.nextSibling(); + } + } else if ( tagName == TQString("child_name") ) { + childName = getTextValue( n ); + } else if ( tagName == TQString("class") ) { + gtkClass = getTextValue( n ); + } else if ( tagName == TQString("climb_rate") ) { + step = getTextValue( n ).toInt(); + } else if ( tagName == TQString("columns") ) { + numColumns = getTextValue( n ).toInt(); + } else if ( tagName == TQString("comments") ) { + comments = getTextValue( n ); + } else if ( tagName == TQString("copyright") ) { + copyright = getTextValue( n ); + } else if ( tagName == TQString("creation_function") ) { + creationFunction = getTextValue( n ); + } + break; + case 'd': + if ( tagName == TQString("default_focus_target") ) { + if ( focusTarget.isEmpty() ) + focusTarget = getTextValue( n ); + } + break; + case 'e': + if ( tagName == TQString("editable") ) + editable = isTrue( getTextValue(n) ); + break; + case 'f': + if ( tagName == TQString("filename") ) { + filename = getTextValue( n ); + } else if ( tagName == TQString("focus_target") ) { + focusTarget = getTextValue( n ); + } + break; + case 'h': + if ( tagName == TQString("height") ) { + height = getTextValue( n ).toInt(); + } else if ( tagName == TQString("hscrollbar_policy") ) { + hscrollbarPolicy = getTextValue( n ); + } + break; + case 'i': + if ( tagName == TQString("icon") ) { + icon = getTextValue( n ); + } else if ( tagName == TQString("initial_choice") ) { + initialChoice = getTextValue( n ).toInt(); + } else if ( tagName == TQString("items") ) { + items = TQStringList::split( TQChar('\n'), getTextValue(n) ); + } + break; + case 'j': + if ( tagName == TQString("justify") ) + justify = getTextValue( n ); + break; + case 'l': + if ( tagName == TQString("label") ) { + label = getTextValue( n ); + } else if ( tagName == TQString("logo_image") ) { + logoImage = getTextValue( n ); + } else if ( tagName == TQString("lower") ) { + lower = getTextValue( n ).toInt(); + } + break; + case 'n': + if ( tagName == TQString("name") ) + name = getTextValue( n ); + break; + case 'p': + if ( tagName == TQString("page") ) { + page = getTextValue( n ).toInt(); + } else if ( tagName == TQString("page_size") ) { + pageSize = getTextValue( n ).toInt(); + } + break; + case 'r': + if ( tagName == TQString("rows") ) + numRows = getTextValue( n ).toInt(); + break; + case 's': + if ( tagName == TQString("selection_mode") ) { + selectionMode = getTextValue( n ); + } else if ( tagName == TQString("shadow_type") ) { + shadowType = getTextValue( n ); + } else if ( tagName == TQString("show_text") ) { + showText = isTrue( getTextValue(n) ); + } else if ( tagName == TQString(TQString("show_titles")) ) { + showTitles = isTrue( getTextValue(n) ); + } else if ( tagName == TQString("step") ) { + step = getTextValue( n ).toInt(); + } else if ( tagName == TQString("stock_button") ) { + /* + Let's cheat: We convert the symbolic name into a + button label. + */ + label = getTextValue( n ); + int k = label.findRev( TQChar('_') ); + if ( k != -1 ) + label = label.mid( k + 1 ); + if ( !label.isEmpty() && label != TQString("OK") ) + label = label.left( 1 ) + label.mid( 1 ).lower(); + } + break; + case 't': + if ( tagName == TQString("tab_pos") ) { + tabPos = getTextValue( n ); + } else if ( tagName == TQString("text") ) { + text = getTextValue( n ); + } else if ( tagName == TQString("textMaxLength") ) { + textMaxLength = getTextValue( n ).toInt(); + } else if ( tagName == TQString("textVisible") ) { + textVisible = isTrue( getTextValue(n) ); + } else if ( tagName == TQString("title") ) { + title = getTextValue( n ); + } else if ( tagName == TQString("tooltip") ) { + tooltip = getTextValue( n ); + } else if ( tagName == TQString("type") ) { + type = getTextValue( n ); + } + break; + case 'u': + if ( tagName == TQString("upper") ) + upper = getTextValue( n ).toInt(); + break; + case 'v': + if ( tagName == TQString("value") ) { + value = getTextValue( n ).toInt(); + } else if ( tagName == TQString("value_in_list") ) { + valueInList = isTrue( getTextValue(n) ); + } else if ( tagName == TQString("vscrollbar_policy") ) { + vscrollbarPolicy = getTextValue( n ); + } + break; + case 'w': + if ( tagName == TQString("watermark_image") ) { + watermarkImage = getTextValue( n ); + } else if ( tagName == TQString("widget") ) + childWidgets.push_back( n.toElement() ); + else if ( tagName == TQString("width") ) + width = getTextValue( n ).toInt(); + else if ( tagName == TQString("wrap") ) + wrap = isTrue( getTextValue(n) ); + break; + case 'x': + if ( tagName == TQString("x") ) + x = getTextValue( n ).toInt(); + break; + case 'y': + if ( tagName == TQString("y") ) + y = getTextValue( n ).toInt(); + } + } + n = n.nextSibling(); + } + + if ( topLevel ) { + yyFormName = name; + emitSimpleValue( TQString("class"), yyFormName ); + } + + if ( gtkLayoutWidget.exactMatch(gtkClass) ) { + TQString boxKind; + TQString orientation; + + if ( gtkClass.startsWith(TQString("GtkH")) || + gtkClass == TQString(TQString("GtkToolbar")) ) { + /* + GtkToolbar, right. Toolbars may appear anywhere in a + widget, but then they really are just a row of buttons. + */ + boxKind = TQString( "hbox" ); + orientation = TQString( "Horizontal" ); + } else if ( gtkClass.startsWith(TQString("GtkV")) || + gtkClass == TQString("GtkPacker") ) { + /* + We don't support the GtkPacker, whose trails lead to + destruction. + */ + boxKind = TQString( "vbox" ); + orientation = TQString( "Vertical" ); + } else { + boxKind = TQString( "grid" ); + } + + if ( layouted ) + emitOpeningWidget( TQString("TQLayoutWidget"), leftAttach, + rightAttach, topAttach, bottomAttach ); + emitOpening( boxKind ); + emitProperty( TQString("name"), fixedName(name).latin1() ); + if ( gtkClass == TQString("GtkHButtonBox") || + childName == TQString("Dialog:action_area") ) + emitSpacer( orientation ); + emitChildWidgets( childWidgets, TRUE ); + + if ( gtkClass == TQString("GtkVButtonBox") || + childName == TQString("Dialog:action_area") || + (boxKind == TQString("vbox") && shouldPullup(childWidgets)) ) { + emitSpacer( orientation ); + } else if ( boxKind == TQString("grid") && shouldPullup(childWidgets) ) { + emitSpacer( TQString("Vertical"), 0, numColumns, numRows, + numRows + 1 ); + } + + emitClosing( boxKind ); + if ( layouted ) + emitClosing( TQString("widget") ); + } else if ( gtkClass == TQString("GtkFixed") && !layouted ) { + emitChildWidgets( childWidgets, FALSE ); + /* + Placeholders in a grid are typically needless. + */ + } else if ( !(leftAttach >= 0 && gtkClass == TQString("Placeholder")) ) { + bool needFakeLayout = ( !layouted && !topLevel && x == 0 && y == 0 && + width == 0 && height == 0 ); + TQString qtClass = gtk2qtClass( gtkClass, childWidgets ); + bool unknown = FALSE; + + if ( qtClass == TQString("TQFrame") && !label.isEmpty() ) { + qtClass = TQString( "TQButtonGroup" ); + } else if ( qtClass == TQString("TQListView") && !showTitles && + gtkClass.endsWith(TQString("List")) ) { + qtClass = TQString( "TQListBox" ); + } else if ( qtClass == TQString("Custom") ) { + qtClass = creationFunction; + yyCustomWidgets.insert( qtClass, TQString::null ); + } else if ( qtClass == TQString("Unknown") ) { + qtClass = TQString( "TQLabel" ); + unknown = TRUE; + } + + if ( qtClass.isEmpty() ) { + emitChildWidgets( childWidgets, layouted, leftAttach, rightAttach, + topAttach, bottomAttach ); + } else { + if ( needFakeLayout ) { + emitOpening( TQString("vbox") ); + emitProperty( TQString("margin"), 11 ); + } + emitOpeningWidget( qtClass, leftAttach, rightAttach, topAttach, + bottomAttach ); + + // grep 'elsewhere' + if ( gtkClass != TQString("GtkCombo") ) + emitProperty( TQString("name"), fixedName(name).latin1() ); + if ( !title.isEmpty() ) + emitProperty( TQString("caption"), title ); + if ( !layouted && (x != 0 || y != 0 || width != 0 || height != 0) ) + emitProperty( TQString("geometry"), TQRect(x, y, width, height) ); + if ( gtkClass == TQString("GtkToggleButton") ) { + emitProperty( TQString("toggleButton"), TQVariant(TRUE, 0) ); + if ( active ) + emitProperty( TQString("on"), TQVariant(TRUE, 0) ); + } else { + if ( active ) + emitProperty( TQString("checked"), TQVariant(TRUE, 0) ); + } + + if ( !editable ) + emitProperty( TQString("readOnly"), TQVariant(TRUE, 0) ); + if ( !focusTarget.isEmpty() ) + emitProperty( TQString("buddy"), + fixedName(focusTarget).latin1() ); + if ( !hscrollbarPolicy.isEmpty() ) + emitProperty( TQString("hScrollBarMode"), + gtk2qtScrollBarMode(hscrollbarPolicy), + TQString("enum") ); + if ( !vscrollbarPolicy.isEmpty() ) + emitProperty( TQString("vScrollBarMode"), + gtk2qtScrollBarMode(vscrollbarPolicy), + TQString("enum") ); + if ( !justify.isEmpty() || + (wrap && gtkClass != TQString("GtkSpinButton")) ) { + TQStringList flags; + if ( wrap ) + flags.push_back( TQString("WordBreak") ); + + if ( justify.endsWith(TQString("_CENTER")) ) { + flags.push_back( TQString("AlignCenter") ); + } else { + if ( justify.endsWith(TQString("_RIGHT")) ) + flags.push_back( TQString("AlignRight") ); + flags.push_back( TQString("AlignVCenter") ); + } + + if ( !flags.isEmpty() ) + emitProperty( TQString("alignment"), flags.join(TQChar('|')), + TQString("set") ); + } + if ( !label.isEmpty() ) { + if ( gtkClass.endsWith(TQString("Frame")) ) { + emitProperty( TQString("title"), label ); + } else { + emitProperty( TQString("text"), accelerate(label) ); + } + } + if ( lower != -123456789 ) + emitProperty( TQString("minValue"), lower ); + if ( upper != 123456789 ) + emitProperty( TQString("maxValue"), upper ); + if ( value != 123456789 ) { + if ( gtkClass == TQString("GtkProgressBar") ) { + emitProperty( TQString("progress"), value ); + } else { + emitProperty( TQString("value"), value ); + } + } + if ( TQMAX(page, pageSize) != 10 && + gtkClass.endsWith(TQString("Scrollbar")) ) + emitProperty( TQString("pageStep"), TQMAX(page, pageSize) ); + if ( !selectionMode.isEmpty() ) + emitProperty( TQString("selectionMode"), + gtk2qtSelectionMode(selectionMode), + TQString("enum") ); + if ( !shadowType.endsWith(TQString("_NONE")) ) { + TQString shape = shadowType.contains( TQString("_ETCHED_") ) > 0 ? + TQString( "Box" ) : TQString( "WinPanel" ); + TQString shadow = shadowType.endsWith( TQString("_IN") ) ? + TQString( "Sunken" ) : TQString( "Raised" ); + emitProperty( TQString("frameShape"), shape, TQString("enum") ); + emitProperty( TQString("frameShadow"), shadow, TQString("enum") ); + } + if ( !showText ) + emitProperty( TQString("percentageVisible"), + TQVariant(FALSE, 0) ); + if ( step != 1 ) + emitProperty( TQString("lineStep"), step ); + if ( tabPos.endsWith(TQString("_BOTTOM")) || + tabPos.endsWith(TQString("_RIGHT")) ) + emitProperty( TQString("tabPosition"), TQString("Bottom") ); + if ( !text.isEmpty() ) + emitProperty( TQString("text"), text ); + if ( textMaxLength != 0 ) + emitProperty( TQString("maxLength"), textMaxLength ); + if ( !textVisible ) + emitProperty( TQString("echoMode"), TQString("Password"), + TQString("enum") ); + if ( !tooltip.isEmpty() ) + emitProperty( TQString("toolTip"), tooltip ); + if ( !valueInList ) + emitProperty( TQString("editable"), TQVariant(TRUE, 0) ); + if ( wrap && gtkClass == TQString("GtkSpinButton") ) + emitProperty( TQString("wrapping"), TQVariant(TRUE, 0) ); + + if ( gtkClass.endsWith(TQString("Tree")) ) { + emitProperty( TQString("rootIsDecorated"), TQVariant(TRUE, 0) ); + } else if ( gtkOrientedWidget.exactMatch(gtkClass) ) { + TQString s = ( gtkOrientedWidget.cap(1) == TQChar('H') ) ? + TQString( "Horizontal" ) : TQString( "Vertical" ); + emitProperty( TQString("orientation"), s, TQString("enum") ); + } + + if ( qtClass == TQString("TQListView") ) + emitProperty( TQString("resizeMode"), TQString("AllColumns"), + TQString("enum") ); + + while ( !items.isEmpty() ) { + emitOpening( TQString("item") ); + emitProperty( TQString("text"), items.first() ); + emitClosing( TQString("item") ); + items.remove( items.begin() ); + } + if ( initialChoice != 0 ) + emitProperty( TQString("currentItem"), initialChoice ); + + if ( !icon.isEmpty() ) + emitProperty( TQString("pixmap"), imageName(icon), + TQString("pixmap") ); + + if ( gtkClass == TQString("GnomeAbout") ) { + emitGnomeAbout( copyright, authors, comments ); + } else if ( gtkClass == TQString("GnomeApp") ) { + emitGnomeAppChildWidgetsPass1( childWidgets ); + } else if ( gtkClass == TQString("GnomePropertyBox") ) { + emitOpening( TQString("vbox") ); + emitChildWidgets( childWidgets, TRUE ); + emitOpeningWidget( TQString("TQLayoutWidget") ); + emitOpening( TQString("hbox") ); + emitPushButton( TQString("&Help"), TQString("helpButton") ); + emitSpacer( TQString("Horizontal") ); + emitPushButton( TQString("&OK"), TQString("okButton") ); + emitPushButton( TQString("&Apply"), TQString("applyButton") ); + emitPushButton( TQString("&Close"), TQString("closeButton") ); + emitClosing( TQString("hbox") ); + emitClosing( TQString("widget") ); + emitClosing( TQString("vbox") ); + } else if ( gtkClass.endsWith(TQString("Button")) ) { + if ( label.isEmpty() ) + emitGtkButtonChildWidgets( childWidgets ); + } else if ( gtkClass == TQString("GtkCombo") ) { + emitGtkComboChildWidgets( childWidgets, items ); + } else if ( gtkClass == TQString("GtkNotebook") ) { + emitGtkNotebookChildWidgets( childWidgets ); + } else if ( gtkClass == TQString("GtkWindow") ) { + emitGtkWindowChildWidgets( childWidgets, qtClass ); + } else if ( gtkClass == TQString("GtkScrolledWindow") ) { + emitGtkScrolledWindowChildWidgets( childWidgets, qtClass ); + } else if ( qtClass == TQString("TQListView") ) { + emitTQListViewColumns( widget ); + } else if ( unknown || gtkClass == TQString("Placeholder") ) { + TQString prefix; + if ( unknown ) + prefix = gtkClass; + emitProperty( TQString("text"), + TQString("<font color=\"red\">%1<b>?</b></font>") + .arg(prefix) ); + emitProperty( TQString("alignment"), + TQString("AlignAuto|AlignCenter"), + TQString("set") ); + } else if ( qtClass != TQString("TQListBox") ) { + emitChildWidgets( childWidgets, FALSE ); + } + + emitClosing( TQString("widget") ); + if ( needFakeLayout ) + emitClosing( TQString("vbox") ); + if ( gtkClass == TQString("GnomeApp") ) + emitGnomeAppChildWidgetsPass2( childWidgets ); + } + } + return name; +} + +TQStringList Glade2Ui::convertGladeFile( const TQString& fileName ) +{ + TQStringList outFileNames; + + yyFileName = fileName; + + TQDomDocument doc( TQString("GTK-Interface") ); + TQFile f( fileName ); + if ( !f.open(IO_ReadOnly) ) { + error( TQString("Cannot open file for reading.") ); + return TQStringList(); + } + if ( !doc.setContent(&f) ) { + error( TQString("File is not an XML file.") ); + f.close(); + return TQStringList(); + } + f.close(); + + TQDomElement root = doc.documentElement(); + if ( root.tagName() != TQString("GTK-Interface") ) { + error( TQString("File is not a Glade XML file.") ); + return TQStringList(); + } + + int widgetNo = 0; + int numWidgets = 0; + TQDomNode n = root.firstChild(); + while ( !n.isNull() ) { + if ( n.toElement().tagName() == TQString("widget") ) + numWidgets++; + n = n.nextSibling(); + } + + TQProgressDialog fremskritt( TQString("Converting Glade files..."), + TQString("Abort Conversion"), numWidgets, 0, + "fremskritt", TRUE ); + + n = root.firstChild(); + while ( !n.isNull() ) { + TQString tagName = n.toElement().tagName(); + + if ( tagName == TQString("project") ) { + TQDomNode child = n.firstChild(); + while ( !child.isNull() ) { + TQString childTagName = child.toElement().tagName(); + if ( childTagName == TQString("pixmaps_directory") ) { + yyPixmapDirectory = getTextValue( child ); + } else if ( childTagName == TQString("program_name") ) { + yyProgramName = getTextValue( child ); + } + child = child.nextSibling(); + } + } else if ( tagName == TQString("widget") ) { + yyOut = TQString::null; + yyCustomWidgets.clear(); + yyStockItemActions.clear(); + yyActions.clear(); + yyConnections.clear(); + yySlots.clear(); + yyFormName = TQString::null; + yyImages.clear(); + + uniqueAction = 1; + uniqueForm = 1; + uniqueMenuBar = 1; + uniqueSpacer = 1; + uniqueToolBar = 1; + + emitHeader(); + TQString name = emitWidget( n.toElement(), FALSE ); + + if ( !yyCustomWidgets.isEmpty() ) { + emitOpening( TQString("customwidgets") ); + + TQMap<TQString, TQString>::Iterator c = yyCustomWidgets.begin(); + while ( c != yyCustomWidgets.end() ) { + emitOpening( TQString("customwidget") ); + emitSimpleValue( TQString("class"), c.key() ); + if ( !(*c).isEmpty() ) + emitSimpleValue( TQString("header"), *c, + attribute(TQString("location"), + TQString("local")) ); + emitClosing( TQString("customwidget") ); + ++c; + } + emitClosing( TQString("customwidgets") ); + } + + if ( !yyActions.isEmpty() ) { + emitOpening( TQString("actions") ); + + TQMap<TQString, GladeAction>::Iterator a = yyActions.begin(); + while ( a != yyActions.end() ) { + emitOpening( TQString("action") ); + emitProperty( TQString("name"), + fixedName(a.key()).latin1() ); + emitProperty( TQString("text"), (*a).text ); + emitProperty( TQString("menuText"), (*a).menuText ); + if ( (*a).toolTip ) + emitProperty( TQString("toolTip"), (*a).toolTip ); + if ( (*a).accel != 0 ) + emitProperty( TQString("accel"), (*a).accel ); + if ( !(*a).iconSet.isEmpty() ) + emitProperty( TQString("iconSet"), + imageName((*a).iconSet), + TQString("iconset") ); + emitClosing( TQString("action") ); + ++a; + } + emitClosing( TQString("actions") ); + } + + if ( !yyImages.isEmpty() ) { + uint maxLength = 524288; + char *data = new char[maxLength]; + + TQString dir = yyFileName; + dir.truncate( dir.findRev(TQChar('/')) + 1 ); + dir += yyPixmapDirectory; + + emitOpening( TQString("images") ); + + TQMap<TQString, TQString>::ConstIterator im = yyImages.begin(); + while ( im != yyImages.end() ) { + uint length = 0; + const char *format = 0; + + TQString fn = dir + TQChar( '/' ) + im.key(); + TQFile f( fn ); + if ( !f.open(IO_ReadOnly) ) { + error( TQString("Cannot open image '%1' for reading.") + .arg(fn) ); + } else { + length = f.readBlock( data, maxLength ); + f.at( 0 ); + format = TQImageIO::imageFormat( &f ); + f.close(); + } + if ( format == 0 ) + format = "XPM"; + + AttributeMap attr; + attr.insert( TQString("format"), TQString(format) ); + attr.insert( TQString("length"), TQString::number(length) ); + + emitOpening( TQString("image"), + attribute(TQString("name"), *im) ); + emitSimpleValue( TQString("data"), hexed(data, length), + attr ); + emitClosing( TQString("image") ); + ++im; + } + emitClosing( TQString("images") ); + delete[] data; + } + + if ( yyConnections.count() + yySlots.count() > 0 ) { + emitOpening( TQString("connections") ); + + TQValueList<GladeConnection>::Iterator c = yyConnections.begin(); + while ( c != yyConnections.end() ) { + emitOpening( TQString("connection") ); + emitSimpleValue( TQString("sender"), (*c).sender ); + emitSimpleValue( TQString("signal"), (*c).signal ); + emitSimpleValue( TQString("receiver"), yyFormName ); + emitSimpleValue( TQString("slot"), (*c).slot ); + emitClosing( TQString("connection") ); + ++c; + } + + TQMap<TQString, TQString>::Iterator s = yySlots.begin(); + while ( s != yySlots.end() ) { + AttributeMap attr; + attr.insert( TQString("access"), *s ); + attr.insert( TQString("language"), TQString("C++") ); + attr.insert( TQString("returntype"), TQString("void") ); + emitSimpleValue( TQString("slot"), s.key(), attr ); + ++s; + } + emitClosing( TQString("connections") ); + } + emitFooter(); + + TQString outFileName = fileName; + int k = outFileName.findRev( "." ); + if ( k != -1 ) + outFileName.truncate( k ); + if ( widgetNo != 0 ) + outFileName += TQString::number( widgetNo + 1 ); + outFileName += TQString( ".ui" ); + FILE *out = fopen( outFileName.latin1(), "w" ); + if ( out == 0 ) { + qWarning( "glade2ui: Could not open file '%s'", + outFileName.latin1() ); + } else { + if ( !yyOut.isEmpty() ) + fprintf( out, "%s", yyOut.latin1() ); + fclose( out ); + outFileNames.push_back( outFileName ); + } + yyOut = TQString::null; + widgetNo++; + + qApp->processEvents(); + if ( fremskritt.wasCancelled() ) + break; + fremskritt.setProgress( widgetNo ); + } + n = n.nextSibling(); + } + return outFileNames; +} diff --git a/tools/designer/plugins/glade/glade2ui.h b/tools/designer/plugins/glade/glade2ui.h new file mode 100644 index 000000000..f50a08fe6 --- /dev/null +++ b/tools/designer/plugins/glade/glade2ui.h @@ -0,0 +1,169 @@ +/********************************************************************** +** +** Copyright (C) 2000-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. +** +**********************************************************************/ + +#ifndef GLADE2UI_H +#define GLADE2UI_H + +#include <qdom.h> +#include <qmap.h> +#include <qstring.h> +#include <qvariant.h> + +typedef TQMap<TQString, TQString> AttributeMap; + +struct GladeAction +{ + TQString text; + TQString menuText; + TQString toolTip; + int accel; + TQString iconSet; +}; + +struct GladeConnection +{ + TQString sender; + TQString signal; + TQString slot; +}; + +class Glade2Ui +{ +public: + Glade2Ui(); + + TQStringList convertGladeFile( const TQString& fileName ); + +private: + TQString imageName( const TQString& fileName ); + TQString opening( const TQString& tag, + const AttributeMap& attr = AttributeMap() ); + TQString closing( const TQString& tag ); + TQString atom( const TQString& tag, + const AttributeMap& attr = AttributeMap() ); + void error( const TQString& message ); + void syntaxError(); + TQString getTextValue( const TQDomNode& node ); + void emitHeader(); + void emitFooter(); + void emitSimpleValue( const TQString& tag, const TQString& value, + const AttributeMap& attr = AttributeMap() ); + void emitOpening( const TQString& tag, + const AttributeMap& attr = AttributeMap() ); + void emitClosing( const TQString& tag ); + void emitAtom( const TQString& tag, + const AttributeMap& attr = AttributeMap() ); + void emitVariant( const TQVariant& val, + const TQString& stringType = "string" ); + void emitProperty( const TQString& prop, const TQVariant& val, + const TQString& stringType = "string" ); + void emitFontProperty( const TQString& prop, int pointSize, bool bold ); + void emitAttribute( const TQString& prop, const TQVariant& val, + const TQString& stringType = "string" ); + TQString gtk2qtClass( const TQString& gtkClass, + const TQValueList<TQDomElement>& childWidgets ); + + int matchAccelOnActivate( const TQDomElement& accel ); + void emitGtkMenu( const TQDomElement& menu ); + void emitGtkMenuBarChildWidgets( + const TQValueList<TQDomElement>& childWidgets ); + void emitGtkToolbarChildWidgets( + const TQValueList<TQDomElement>& childWidgets ); + void emitPushButton( const TQString& text, const TQString& name ); + void attach( AttributeMap *attr, int leftAttach, int rightAttach, + int topAttach, int bottomAttach ); + void emitSpacer( const TQString& orientation, int leftAttach = -1, + int rightAttach = -1, int topAttach = -1, + int bottomAttach = -1 ); + void emitPixmap( const TQString& imageName, int leftAttach = -1, + int rightAttach = -1, int topAttach = -1, + int bottomAttach = -1 ); + void emitGnomeAbout( TQString copyright, TQString authors, TQString comments ); + void emitGnomeAppChildWidgetsPass1( + const TQValueList<TQDomElement>& childWidgets ); + void doPass2( const TQValueList<TQDomElement>& childWidgets, + TQValueList<TQDomElement> *menuBar, + TQValueList<TQValueList<TQDomElement> > *toolBars ); + void emitGnomeAppChildWidgetsPass2( + const TQValueList<TQDomElement>& childWidgets ); + void emitGtkButtonChildWidgets( TQValueList<TQDomElement> childWidgets ); + void emitGtkComboChildWidgets( const TQValueList<TQDomElement>& childWidgets, + const TQStringList& items ); + void emitGtkNotebookChildWidgets( + const TQValueList<TQDomElement>& childWidgets ); + void emitTQListViewColumns( const TQDomElement& qlistview ); + void emitGtkScrolledWindowChildWidgets( + const TQValueList<TQDomElement>& childWidgets, + const TQString& qtClass ); + void emitGnomeDruidPage( const TQDomElement& druidPage ); + void emitGtkWindowChildWidgets( const TQValueList<TQDomElement>& childWidgets, + const TQString& qtClass ); + bool packEnd( const TQDomElement& widget ); + void emitChildWidgets( const TQValueList<TQDomElement>& childWidgets, + bool layouted, int leftAttach = -1, + int rightAttach = -1, int topAttach = -1, + int bottomAttach = -1 ); + void emitOpeningWidget( const TQString& qtClass, int leftAttach = -1, + int rightAttach = -1, int topAttach = -1, + int bottomAttach = -1 ); + bool shouldPullup( const TQValueList<TQDomElement>& childWidgets ); + TQString emitWidget( const TQDomElement& widget, bool layouted, + int leftAttach = -1, int rightAttach = -1, + int topAttach = -1, int bottomAttach = -1 ); + + TQString yyOut; + TQString yyIndentStr; + TQString yyFileName; + TQString yyProgramName; + TQString yyPixmapDirectory; + TQMap<TQString, TQString> yyClassNameMap; + TQMap<TQString, TQString> yyStockMap; + TQMap<TQString, int> yyKeyMap; + TQMap<TQString, TQString> yyCustomWidgets; + TQMap<TQString, TQString> yyStockItemActions; + TQMap<TQString, GladeAction> yyActions; + TQValueList<GladeConnection> yyConnections; + TQMap<TQString, TQString> yySlots; + TQString yyFormName; + TQMap<TQString, TQString> yyImages; + + int numErrors; + int uniqueAction; + int uniqueForm; + int uniqueMenuBar; + int uniqueSpacer; + int uniqueToolBar; +}; + +#endif diff --git a/tools/designer/plugins/glade/main.cpp b/tools/designer/plugins/glade/main.cpp new file mode 100644 index 000000000..e1504e067 --- /dev/null +++ b/tools/designer/plugins/glade/main.cpp @@ -0,0 +1,109 @@ +/********************************************************************** +** +** Copyright (C) 2000-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 <filterinterface.h> +#include <qapplication.h> + +#include "glade2ui.h" + +class GladeFilter : public ImportFilterInterface, public TQLibraryInterface +{ +public: + GladeFilter(); + + TQRESULT queryInterface( const TQUuid&, TQUnknownInterface **iface ); + Q_REFCOUNT; + + TQStringList featureList() const; + TQStringList import( const TQString& filter, const TQString& filename ); + + bool init(); + void cleanup(); + bool canUnload() const; + +}; + +GladeFilter::GladeFilter() +{ +} + +TQRESULT GladeFilter::queryInterface( const TQUuid &uuid, TQUnknownInterface **iface ) +{ + *iface = 0; + if ( uuid == IID_QUnknown ) + *iface = (TQUnknownInterface*)(ImportFilterInterface*)this; + else if ( uuid == IID_QFeatureList ) + *iface = (TQFeatureListInterface*)this; + else if ( uuid == IID_ImportFilter ) + *iface = (ImportFilterInterface*)this; + else if ( uuid == IID_QLibrary ) + *iface = (TQLibraryInterface*)this; + else + return TQE_NOINTERFACE; + + (*iface)->addRef(); + return TQS_OK; +} + +TQStringList GladeFilter::featureList() const +{ + TQStringList list; + list << "Glade Files (*.glade)" ; + return list; +} + +TQStringList GladeFilter::import( const TQString &, const TQString& filename ) +{ + Glade2Ui g; + return g.convertGladeFile( filename ); +} + +bool GladeFilter::init() +{ + return TRUE; +} + +void GladeFilter::cleanup() +{ +} + +bool GladeFilter::canUnload() const +{ + return TRUE; +} + +Q_EXPORT_COMPONENT() +{ + Q_CREATE_INSTANCE( GladeFilter ) +} |