/********************************************************************** ** ** 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 #include #include #include #include #include #include #include #include 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." "

You might want to write to" " qt-bugs@trolltech.com 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( "\n" ); } void Glade2Ui::emitFooter() { yyOut += TQString( "\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 quite 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& 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& childWidgets ) { TQRegExp gnomeuiinfoMenuXTree( TQString("GNOMEUIINFO_MENU_(.+)_TREE") ); emitOpening( TQString("menubar") ); emitProperty( TQString("name"), TQString("MenuBar%1").arg(uniqueMenuBar++).latin1() ); TQValueList::ConstIterator c = childWidgets.begin(); while ( c != childWidgets.end() ) { TQValueList 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& 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::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 " ); 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 section, whereas other information goes into the section. */ void Glade2Ui::emitGnomeAppChildWidgetsPass1( const TQValueList& childWidgets ) { TQValueList::ConstIterator c = childWidgets.begin(); while ( c != childWidgets.end() ) { TQValueList 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& childWidgets, TQValueList *menuBar, TQValueList > *toolBars ) { TQValueList::ConstIterator c = childWidgets.begin(); while ( c != childWidgets.end() ) { TQValueList 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& childWidgets ) { TQValueList menuBar; TQValueList > 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 childWidgets ) { TQValueList::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& 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& 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::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& 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 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& 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& childWidgets, bool layouted, int leftAttach, int rightAttach, int topAttach, int bottomAttach ) { TQValueList start; TQValueList end; TQValueList::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& childWidgets ) { TQRegExp gtkSmallWidget( TQString( "G.*(?:Button|Combo|Dial|Entry|Label|OptionMenu|Picker|ProgressBar" "|Separator|Statusbar|Toolbar|VBox)") ); TQValueList::ConstIterator c = childWidgets.begin(); while ( c != childWidgets.end() ) { TQValueList 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 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("%1?") .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::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::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::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::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::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; }