diff options
Diffstat (limited to 'kdevdesigner/uilib/qwidgetfactory.cpp')
| -rw-r--r-- | kdevdesigner/uilib/qwidgetfactory.cpp | 2606 | 
1 files changed, 2606 insertions, 0 deletions
| diff --git a/kdevdesigner/uilib/qwidgetfactory.cpp b/kdevdesigner/uilib/qwidgetfactory.cpp new file mode 100644 index 00000000..56649616 --- /dev/null +++ b/kdevdesigner/uilib/qwidgetfactory.cpp @@ -0,0 +1,2606 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS.  All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** 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 +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +**   information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "qwidgetfactory.h" + +#include "../interfaces/languageinterface.h" +#include "../interfaces/widgetinterface.h" + +#include <tqfeatures.h> +#include "database2.h" +#include <tqdom.h> +#include <tqdir.h> +#include <tqlayout.h> +#include <tqmetaobject.h> +#include <domtool.h> +#include <uib.h> +#include <tqapplication.h> +#include <tqtooltip.h> +#include <tqwhatsthis.h> +#include <tqobjectlist.h> +#include <tqpluginmanager_p.h> +#include <tqmime.h> +#include <tqdragobject.h> + +#ifndef TQT_NO_SQL +#include <tqsqlrecord.h> +#include <tqsqldatabase.h> +#include <tqdatatable.h> +#endif + +// include all TQt widgets we support +#include <tqpushbutton.h> +#include <tqtoolbutton.h> +#include <tqcheckbox.h> +#include <tqradiobutton.h> +#include <tqgroupbox.h> +#include <tqbuttongroup.h> +#include <tqiconview.h> +#include <tqheader.h> +#ifndef TQT_NO_TABLE +#include <tqtable.h> +#endif +#include <tqlistbox.h> +#include <tqlistview.h> +#include <tqlineedit.h> +#include <tqspinbox.h> +#include <tqmultilineedit.h> +#include <tqlabel.h> +#include <tqwidget.h> +#include <tqtabwidget.h> +#include <tqcombobox.h> +#include <tqdialog.h> +#include <tqwizard.h> +#include <tqlcdnumber.h> +#include <tqprogressbar.h> +#include <tqtextview.h> +#include <tqtextbrowser.h> +#include <tqdial.h> +#include <tqslider.h> +#include <tqframe.h> +#include <tqwidgetstack.h> +#include <tqtoolbox.h> +#include <tqtextedit.h> +#include <tqscrollbar.h> +#include <tqmainwindow.h> +#include <tqsplitter.h> +#include <tqaction.h> +#include <tqpopupmenu.h> +#include <tqmenubar.h> +#include <tqpopupmenu.h> +#include <tqdatetimeedit.h> +#include <tqvbox.h> +#include <tqhbox.h> +#include <tqgrid.h> + +#include <stdlib.h> + +class TQWidgetFactoryPrivate +{ +public: +    TQCString translationContext; +    TQListViewItem *lastItem; +    TQDict<bool> customWidgets; +}; + +static TQPtrList<TQWidgetFactory> widgetFactories; +static TQPluginManager<LanguageInterface> *languageInterfaceManager = 0; +static TQPluginManager<WidgetInterface> *widgetInterfaceManager = 0; + +static TQMap<TQString, bool> *availableWidgetMap = 0; +static TQStringList *availableWidgetList = 0; + +TQMap<TQWidget*, TQString> *qwf_forms = 0; +TQString *qwf_language = 0; +bool qwf_execute_code = TRUE; +bool qwf_stays_on_top = FALSE; +TQString qwf_currFileName = ""; +TQObject *qwf_form_object = 0; +TQString *qwf_plugin_dir = 0; + +static void setupPluginDir() +{ +    if ( !qwf_plugin_dir ) +	qwf_plugin_dir = new TQString( "/designer" ); +} + +static void setupWidgetListAndMap() +{ +    if ( availableWidgetMap ) +	return; +    setupPluginDir(); +    availableWidgetList = new TQStringList; +    (*availableWidgetList) << TQPUSHBUTTON_OBJECT_NAME_STRING << TQTOOLBUTTON_OBJECT_NAME_STRING << TQCHECKBOX_OBJECT_NAME_STRING << TQRADIOBUTTON_OBJECT_NAME_STRING +			   << TQGROUPBOX_OBJECT_NAME_STRING << TQBUTTONGROUP_OBJECT_NAME_STRING << TQICONVIEW_OBJECT_NAME_STRING << TQTABLE_OBJECT_NAME_STRING +			   << TQLISTBOX_OBJECT_NAME_STRING << TQLISTVIEW_OBJECT_NAME_STRING << TQLINEEDIT_OBJECT_NAME_STRING << TQSPINBOX_OBJECT_NAME_STRING +			   << TQMULTILINEEDIT_OBJECT_NAME_STRING << TQLABEL_OBJECT_NAME_STRING << "TextLabel" << "PixmapLabel" +			   << TQLAYOUTWIDGET_OBJECT_NAME_STRING << TQTABWIDGET_OBJECT_NAME_STRING << TQCOMBOBOX_OBJECT_NAME_STRING +			   << TQWIDGET_OBJECT_NAME_STRING << TQDIALOG_OBJECT_NAME_STRING << TQWIZARD_OBJECT_NAME_STRING << TQLCDNUMBER_OBJECT_NAME_STRING; +    // put less stress on the compiler by limiting the template nesting depth +    (*availableWidgetList) << TQPROGRESSBAR_OBJECT_NAME_STRING << TQTEXTVIEW_OBJECT_NAME_STRING << TQTEXTBROWSER_OBJECT_NAME_STRING +			   << TQDIAL_OBJECT_NAME_STRING << TQSLIDER_OBJECT_NAME_STRING << TQFRAME_OBJECT_NAME_STRING << "Line" << TQTEXTEDIT_OBJECT_NAME_STRING +			   << TQDATEEDIT_OBJECT_NAME_STRING << TQTIMEEDIT_OBJECT_NAME_STRING << TQDATETIMEEDIT_OBJECT_NAME_STRING << TQSCROLLBAR_OBJECT_NAME_STRING +			   << TQPOPUPMENU_OBJECT_NAME_STRING << TQWIDGETSTACK_OBJECT_NAME_STRING << TQMAINWINDOW_OBJECT_NAME_STRING +			   << TQDATATABLE_OBJECT_NAME_STRING << TQDATABROWSER_OBJECT_NAME_STRING << TQDATAVIEW_OBJECT_NAME_STRING +			   << TQVBOX_OBJECT_NAME_STRING << TQHBOX_OBJECT_NAME_STRING << TQGRID_OBJECT_NAME_STRING << TQTOOLBOX_OBJECT_NAME_STRING; + +    if ( !widgetInterfaceManager ) +	widgetInterfaceManager = +	    new TQPluginManager<WidgetInterface>( IID_Widget, TQApplication::libraryPaths(), *qwf_plugin_dir ); + +    TQStringList l = widgetInterfaceManager->featureList(); +    TQStringList::Iterator it; +    for ( it = l.begin(); it != l.end(); ++it ) +	(*availableWidgetList) << *it; + +    availableWidgetMap = new TQMap<TQString, bool>; +    for ( it = availableWidgetList->begin(); it != availableWidgetList->end(); ++it ) +	availableWidgetMap->insert( *it, TRUE ); +} + +static TQImage loadImageData( const TQString& format, ulong len, TQByteArray data ) +{ +    TQImage img; +    if ( format == "XPM.GZ" || format == "XBM.GZ" ) { +	if ( len < data.size() * 10 ) +	    len = data.size() * 10; +	// tqUncompress() expects the first 4 bytes to be the expected length of +	// the uncompressed data +	TQByteArray dataTmp( data.size() + 4 ); +	memcpy( dataTmp.data()+4, data.data(), data.size() ); +	dataTmp[0] = ( len & 0xff000000 ) >> 24; +	dataTmp[1] = ( len & 0x00ff0000 ) >> 16; +	dataTmp[2] = ( len & 0x0000ff00 ) >> 8; +	dataTmp[3] = ( len & 0x000000ff ); +	TQByteArray baunzip = tqUncompress( dataTmp ); +	len = baunzip.size(); +	img.loadFromData( (const uchar*)baunzip.data(), len, format.left(format.find('.')).ascii() ); +    } else { +	img.loadFromData( (const uchar*)data.data(), data.size(), format.ascii() ); +    } +    return img; +} + +static TQSizePolicy::SizeType stringToSizeType( const TQString& str ) +{ +    if ( str == "Fixed" ) { +	return TQSizePolicy::Fixed; +    } else if ( str == "Minimum" ) { +	return TQSizePolicy::Minimum; +    } else if ( str == "Maximum" ) { +	return TQSizePolicy::Maximum; +    } else if ( str == "Preferred" ) { +	return TQSizePolicy::Preferred; +    } else if ( str == "MinimumExpanding" ) { +	return TQSizePolicy::MinimumExpanding; +    } else if ( str == "Expanding" ) { +	return TQSizePolicy::Expanding; +    } else { +	return TQSizePolicy::Ignored; +    } +} + + +/*! +  \class TQWidgetFactory + +  \brief The TQWidgetFactory class provides for the dynamic creation of widgets +  from TQt Designer .ui files. + +  This class basically offers two things: + +  \list + +  \i Dynamically creating widgets from \link designer-manual.book TQt +  Designer\endlink user interface description files. +  You can do this using the static function TQWidgetFactory::create(). +  This function also performs signal and slot connections, tab +  ordering, etc., as defined in the .ui file, and returns the +  top-level widget in the .ui file. After creating the widget you can +  use TQObject::child() and TQObject::queryList() to access child +  widgets of this returned widget. + +  \i Adding additional widget factories to be able to create custom +  widgets. See createWidget() for details. + +  \endlist + +  This class is not included in the TQt library itself. To use it you +  must link against \c libqui.so (Unix) or \c qui.lib (Windows), which is +  built into \c INSTALL/lib if you built \e{TQt Designer} (\c INSTALL is +  the directory where TQt is installed ). + +  See the "Creating Dynamic Dialogs from .ui Files" section of the \link +  designer-manual.book TQt Designer manual\endlink for an example. See +  also the \l{TQWidgetPlugin} class and the \link plugins-howto.html +  Plugins documentation\endlink. +*/ + +/*! Constructs a TQWidgetFactory. */ + +TQWidgetFactory::TQWidgetFactory() +    : d( new TQWidgetFactoryPrivate() ), dbControls( 0 ), +      usePixmapCollection( FALSE ), defMargin( 11 ), defSpacing( 6 ) +{ +    widgetFactories.setAutoDelete( TRUE ); +    d->customWidgets.setAutoDelete( TRUE ); +} + +/*! \fn TQWidgetFactory::~TQWidgetFactory() +    Destructor. +*/ +TQWidgetFactory::~TQWidgetFactory() +{ +    delete d; +} + +/*! + +    Loads the \e{TQt Designer} user interface description file \a uiFile +  and returns the top-level widget in that description. \a parent and +  \a name are passed to the constructor of the top-level widget. + +  This function also performs signal and slot connections, tab +  ordering, etc., as described in the .ui file. In \e{TQt Designer} it +  is possible to add custom slots to a form and connect to them. If +  you want these connections to be made, you must create a class +  derived from TQObject, which implements all these slots. Then pass an +  instance of the object as \a connector to this function. If you do +  this, the connections to the custom slots will be done using the \a +  connector as slot. + +  If something fails, 0 is returned. + +  The ownership of the returned widget is passed to the caller. +*/ + +TQWidget *TQWidgetFactory::create( const TQString &uiFile, TQObject *connector, +				 TQWidget *parent, const char *name ) +{ +    setupPluginDir(); +    TQFile f( uiFile ); +    bool failed = FALSE; +    if ( !f.open( IO_ReadOnly ) ) +	failed = TRUE; +    if ( failed && tqApp->type() == TQApplication::Tty ) { +	// for TQSA: If we have no GUI, we have no form definition +	// files, but just the code. So try if only the code exists. +	f.setName( uiFile + ".qs" ); +	failed = !f.open( IO_ReadOnly ); +    } +    if ( failed ) +	return 0; + +    qwf_currFileName = uiFile; +    TQWidget *w = TQWidgetFactory::create( TQT_TQIODEVICE(&f), connector, parent, name ); +    if ( !qwf_forms ) +	qwf_forms = new TQMap<TQWidget*, TQString>; +    qwf_forms->insert( w, uiFile ); +    return w; +} + +#undef slots + +/*!  \overload +    Loads the user interface description from device \a dev. + */ + +TQWidget *TQWidgetFactory::create( TQIODevice *dev, TQObject *connector, TQWidget *parent, const char *name ) +{ +    setupPluginDir(); +    TQWidget *w = 0; +    TQDomDocument doc; +    TQString errMsg; +    int errLine; + +    TQWidgetFactory *widgetFactory = new TQWidgetFactory; +    widgetFactory->toplevel = 0; + +    // If we have no GUI, we only want to load the code +    if ( tqApp->type() != TQApplication::Tty ) { +	TQIODevice::Offset start = dev->at(); +	TQ_UINT32 magic; +	TQDataStream in( dev ); +	in >> magic; +	if ( magic == UibMagic ) { +	    w = widgetFactory->createFromUibFile( in, connector, parent, name ); +	} else { +	    in.unsetDevice(); +	    dev->at( start ); +	    if ( doc.setContent( dev, &errMsg, &errLine ) ) { +		w = widgetFactory->createFromUiFile( doc, connector, parent, name ); +	    } else { +		// tqDebug( TQString("Parse error: ") + errMsg + TQString(" in line %d"), errLine ); +	    } +	} +	if ( !w ) { +	    delete widgetFactory; +	    return 0; +	} +    } + +    if ( !languageInterfaceManager ) +	languageInterfaceManager = +	    new TQPluginManager<LanguageInterface>( IID_Language, TQApplication::libraryPaths(), *qwf_plugin_dir ); +    widgetFactory->loadExtraSource(); + +    if ( widgetFactory->toplevel ) { +#ifndef TQT_NO_SQL +	TQMap<TQWidget*, SqlWidgetConnection>::Iterator cit = widgetFactory->sqlWidgetConnections.begin(); +	for( ; cit != widgetFactory->sqlWidgetConnections.end(); ++cit ) { +	    if ( widgetFactory->noDatabaseWidgets.find( cit.key()->name() ) != +		 widgetFactory->noDatabaseWidgets.end() ) +		continue; +	    if ( cit.key()->inherits( "QDesignerDataBrowser2" ) ) +		( (QDesignerDataBrowser2*)cit.key() )->initPreview( (*cit).conn, (*cit).table, +								    TQT_TQOBJECT(cit.key()), *(*cit).dbControls ); +	    else if ( cit.key()->inherits( "QDesignerDataView2" ) ) +		( (QDesignerDataView2*)cit.key() )->initPreview( (*cit).conn, (*cit).table, +								 TQT_TQOBJECT(cit.key()), *(*cit).dbControls ); +	} + +	for ( TQMap<TQString, TQStringList>::Iterator it = widgetFactory->dbTables.begin(); +	      it != widgetFactory->dbTables.end(); ++it ) { +	    TQDataTable *table = (TQDataTable*)widgetFactory->toplevel->child( it.key().ascii(), TQDATATABLE_OBJECT_NAME_STRING ); +	    if ( !table ) +		continue; +	    if ( widgetFactory->noDatabaseWidgets.find( table->name() ) != +		 widgetFactory->noDatabaseWidgets.end() ) +		continue; +	    TQValueList<Field> fieldMap = *widgetFactory->fieldMaps.find( table ); +	    TQString conn = (*it)[ 0 ]; +	    TQSqlCursor* c = 0; +	    TQSqlDatabase *db = 0; +	    if ( conn.isEmpty() || conn == "(default)" ) { +		db = TQSqlDatabase::database(); +		c = new TQSqlCursor( (*it)[ 1 ] ); +	    } else { +		db = TQSqlDatabase::database( conn ); +		c = new TQSqlCursor( (*it)[ 1 ], TRUE, db ); +	    } +	    if ( db ) { +		table->setSqlCursor( c, fieldMap.isEmpty(), TRUE ); +		table->refresh( TQDataTable::RefreshAll ); +	    } +	} +#endif +    } + +    for ( TQMap<TQString, TQString>::Iterator it = widgetFactory->buddies.begin(); +	  it != widgetFactory->buddies.end(); ++it ) { +	TQLabel *label = (TQLabel*)widgetFactory->toplevel->child( it.key().ascii(), TQLABEL_OBJECT_NAME_STRING ); +	TQWidget *buddy = (TQWidget*)widgetFactory->toplevel->child( (*it).ascii(), TQWIDGET_OBJECT_NAME_STRING ); +	if ( label && buddy ) +	    label->setBuddy( buddy ); +    } + +    delete widgetFactory; + +    TQApplication::sendPostedEvents(); + +    return w; +} + +TQWidget *TQWidgetFactory::createFromUiFile( TQDomDocument doc, TQObject *connector, +	TQWidget *parent, const char *name ) +{ +    DomTool::fixDocument( doc ); + +    uiFileVersion = doc.firstChild().toElement().attribute("version"); +    TQDomElement e = doc.firstChild().toElement().firstChild().toElement(); + +    TQDomElement variables = e; +    while ( variables.tagName() != "variables" && !variables.isNull() ) +	variables = variables.nextSibling().toElement(); + +    TQDomElement slots = e; +    while ( slots.tagName() != "slots" && !slots.isNull() ) +	slots = slots.nextSibling().toElement(); + +    TQDomElement connections = e; +    while ( connections.tagName() != "connections" && !connections.isNull() ) +	connections = connections.nextSibling().toElement(); + +    TQDomElement imageCollection = e; +    while ( imageCollection.tagName() != "images" && !imageCollection.isNull() ) +	imageCollection = imageCollection.nextSibling().toElement(); + +    TQDomElement tabOrder = e; +    while ( tabOrder.tagName() != "tabstops" && !tabOrder.isNull() ) +	tabOrder = tabOrder.nextSibling().toElement(); + +    TQDomElement actions = e; +    while ( actions.tagName() != "actions" && !actions.isNull() ) +	actions = actions.nextSibling().toElement(); + +    TQDomElement toolbars = e; +    while ( toolbars.tagName() != "toolbars" && !toolbars.isNull() ) +	toolbars = toolbars.nextSibling().toElement(); + +    TQDomElement menubar = e; +    while ( menubar.tagName() != "menubar" && !menubar.isNull() ) +	menubar = menubar.nextSibling().toElement(); + +    TQDomElement functions = e; +    while ( functions.tagName() != "functions" && !functions.isNull() ) +	functions = functions.nextSibling().toElement(); + +    TQDomElement widget; +    while ( !e.isNull() ) { +	if ( e.tagName() == "class" ) { +	    d->translationContext = e.firstChild().toText().data().ascii(); +	} else if ( e.tagName() == "widget" ) { +	    widget = e; +	} else if ( e.tagName() == "pixmapinproject" ) { +	    usePixmapCollection = TRUE; +	} else if ( e.tagName() == "layoutdefaults" ) { +	    defSpacing = e.attribute( "spacing", TQString::number( defSpacing ) ).toInt(); +	    defMargin = e.attribute( "margin", TQString::number( defMargin ) ).toInt(); +	} +	e = e.nextSibling().toElement(); +    } + +    if ( !imageCollection.isNull() ) +	loadImageCollection( imageCollection ); + +    createWidgetInternal( widget, parent, 0, widget.attribute("class", TQWIDGET_OBJECT_NAME_STRING) ); +    TQWidget *w = toplevel; +    if ( !w ) +	return 0; + +    if ( !actions.isNull() ) +	loadActions( actions ); +    if ( !toolbars.isNull() ) +	loadToolBars( toolbars ); +    if ( !menubar.isNull() ) +	loadMenuBar( menubar ); + +    if ( !connections.isNull() ) +	loadConnections( connections, connector ); +    if ( w && name && tqstrlen( name ) > 0 ) +	w->setName( name ); + +    if ( !tabOrder.isNull() ) +	loadTabOrder( tabOrder ); + +#if 0 +    if ( !functions.isNull() ) // compatibiliy with early 3.0 betas +	loadFunctions( functions ); +#endif + +    return w; +} + +void TQWidgetFactory::unpackUInt16( TQDataStream& in, TQ_UINT16& n ) +{ +    TQ_UINT8 half; +    in >> half; +    if ( half == 255 ) { +	in >> n; +    } else { +	n = half; +    } +} + +void TQWidgetFactory::unpackUInt32( TQDataStream& in, TQ_UINT32& n ) +{ +    TQ_UINT16 half; +    in >> half; +    if ( half == 65535 ) { +	in >> n; +    } else { +	n = half; +    } +} + +void TQWidgetFactory::unpackByteArray( TQDataStream& in, TQByteArray& array ) +{ +    TQ_UINT32 size; +    unpackUInt32( in, size ); +    array.resize( size ); +    in.readRawBytes( array.data(), size ); +} + +void TQWidgetFactory::unpackCString( const UibStrTable& strings, TQDataStream& in, +				    TQCString& cstr ) +{ +    TQ_UINT32 n; +    unpackUInt32( in, n ); +    cstr = strings.asCString( n ); +} + +void TQWidgetFactory::unpackString( const UibStrTable& strings, TQDataStream& in, +				   TQString& str ) +{ +    TQ_UINT32 n; +    unpackUInt32( in, n ); +    str = strings.asString( n ); +} + +void TQWidgetFactory::unpackStringSplit( const UibStrTable& strings, +					TQDataStream& in, TQString& str ) +{ +    TQString remainder; +    unpackString( strings, in, str ); +    unpackString( strings, in, remainder ); +    str += remainder; +} + +void TQWidgetFactory::unpackVariant( const UibStrTable& strings, TQDataStream& in, +				    TQVariant& value ) +{ +    TQString imageName; +    TQ_UINT32 number; +    TQ_UINT16 count; +    TQ_UINT16 x; +    TQ_UINT16 y; +    TQ_UINT16 width; +    TQ_UINT16 height; +    TQ_UINT8 bit; +    TQ_UINT8 type; + +    in >> type; + +    switch ( type ) { +    case TQVariant::String: +	unpackString( strings, in, value.asString() ); +	break; +    case TQVariant::Pixmap: +	unpackString( strings, in, imageName ); +	if ( imageName.isEmpty() ) { +	    value.asPixmap() = TQPixmap(); +	} else { +	    value.asPixmap() = loadPixmap( imageName ); +	} +	break; +    case TQVariant::Image: +	unpackString( strings, in, imageName ); +	if ( imageName.isEmpty() ) { +	    value.asImage() = TQImage(); +	} else { +	    value.asImage() = loadFromCollection( imageName ); +	} +	break; +    case TQVariant::IconSet: +	unpackString( strings, in, imageName ); +	if ( imageName.isEmpty() ) { +	    value.asIconSet() = TQIconSet(); +	} else { +	    value.asIconSet() = TQIconSet( loadPixmap(imageName) ); +	} +	break; +    case TQVariant::StringList: +	unpackUInt16( in, count ); +	while ( count-- ) { +	    TQString str; +	    unpackString( strings, in, str ); +	    value.asStringList().append( str ); +	} +	break; +    case TQVariant::Rect: +	unpackUInt16( in, x ); +	unpackUInt16( in, y ); +	unpackUInt16( in, width ); +	unpackUInt16( in, height ); +	value = TQRect( x, y, width, height ); +	break; +    case TQVariant::Size: +	unpackUInt16( in, width ); +	unpackUInt16( in, height ); +	value = TQSize( width, height ); +	break; +    case TQVariant::Color: +	in >> value.asColor(); +	break; +    case TQVariant::Point: +	unpackUInt16( in, x ); +	unpackUInt16( in, y ); +	value = TQPoint( x, y ); +	break; +    case TQVariant::Int: +	unpackUInt32( in, number ); +	value = (int) number; +	break; +    case TQVariant::Bool: +	in >> bit; +	value = TQVariant( bit != 0, 0 ); +	break; +    case TQVariant::Double: +	in >> value.asDouble(); +	break; +    case TQVariant::CString: +	unpackCString( strings, in, value.asCString() ); +	break; +    case TQVariant::Cursor: +	in >> value.asCursor(); +	break; +    case TQVariant::Date: +	in >> value.asDate(); +	break; +    case TQVariant::Time: +	in >> value.asTime(); +	break; +    case TQVariant::DateTime: +	in >> value.asDateTime(); +	break; +    default: +	in >> value; +    } +} + +void TQWidgetFactory::inputSpacer( const UibStrTable& strings, TQDataStream& in, +				  TQLayout *parent ) +{ +    TQCString name; +    TQVariant value; +    TQCString comment; +    TQSizePolicy::SizeType sizeType = TQSizePolicy::Preferred; +    bool vertical = FALSE; +    int w = 0; +    int h = 0; +    TQ_UINT16 column = 0; +    TQ_UINT16 row = 0; +    TQ_UINT16 colspan = 1; +    TQ_UINT16 rowspan = 1; +    TQ_UINT8 objectTag; + +    in >> objectTag; +    while ( !in.atEnd() && objectTag != Object_End ) { +	switch ( objectTag ) { +	case Object_GridCell: +	    unpackUInt16( in, column ); +	    unpackUInt16( in, row ); +	    unpackUInt16( in, colspan ); +	    unpackUInt16( in, rowspan ); +	    break; +	case Object_VariantProperty: +	    unpackCString( strings, in, name ); +	    unpackVariant( strings, in, value ); + +	    if ( name == "orientation" ) { +		vertical = ( value == "Vertical" ); +	    } else if ( name == "sizeHint" ) { +		w = value.toSize().width(); +		h = value.toSize().height(); +	    } else if ( name == "sizeType" ) { +		sizeType = stringToSizeType( value.toString() ); +	    } +	    break; +	default: +	    tqFatal( "Corrupt" ); +	} +	in >> objectTag; +    } + +    if ( parent != 0 ) { +	TQSpacerItem *spacer; +	if ( vertical ) { +	    spacer = new TQSpacerItem( w, h, TQSizePolicy::Minimum, sizeType ); +	} else { +	    spacer = new TQSpacerItem( w, h, sizeType, TQSizePolicy::Minimum ); +	} + +	if ( parent->inherits(TQGRIDLAYOUT_OBJECT_NAME_STRING) ) { +	    ((TQGridLayout *) parent)->addMultiCell( spacer, row, +		    row + rowspan - 1, column, column + colspan - 1, +		    vertical ? TQt::AlignHCenter : TQt::AlignVCenter ); +	} else { +	    parent->addItem( spacer ); +	} +    } +} + +void TQWidgetFactory::inputColumnOrRow( const UibStrTable& strings, +				       TQDataStream& in, TQObject *parent, +				       bool isRow ) +{ +    TQString text; +    TQPixmap pixmap; +    TQString field; +    bool clickable = TRUE; +    bool resizable = TRUE; + +    TQCString name; +    TQVariant value; +    TQCString comment; +    TQString str; +    TQ_UINT8 objectTag; + +    in >> objectTag; +    while ( !in.atEnd() && objectTag != Object_End ) { +	switch ( objectTag ) { +	case Object_TextProperty: +	    unpackCString( strings, in, name ); +	    unpackCString( strings, in, value.asCString() ); +	    unpackCString( strings, in, comment ); +	    str = translate( value.asCString().data(), comment.data() ); + +	    if ( name == "field" ) { +		field = str; +	    } else if ( name == "text" ) { +		text = str; +	    } +	    break; +	case Object_VariantProperty: +	    unpackCString( strings, in, name ); +	    unpackVariant( strings, in, value ); + +	    if ( name == "clickable" ) { +		clickable = value.toBool(); +	    } else if ( name == "pixmap" ) { +		pixmap = value.asPixmap(); +	    } else if ( name == "resizable" ) { +		resizable = value.toBool(); +	    } +	    break; +	default: +	    tqFatal( "Corrupt" ); +	} +	in >> objectTag; +    } + +    if ( parent != 0 ) { +	if ( parent->inherits(TQLISTVIEW_OBJECT_NAME_STRING) ) { +	    createListViewColumn( (TQListView *) parent, text, pixmap, clickable, +				  resizable ); +#ifndef TQT_NO_TABLE +	} else if ( parent->inherits(TQTABLE_OBJECT_NAME_STRING) ) { +	    createTableColumnOrRow( (TQTable *) parent, text, pixmap, field, +				    isRow ); +#endif +	} +    } +} + +void TQWidgetFactory::inputItem( const UibStrTable& strings, TQDataStream& in, +				TQObject *parent, TQListViewItem *parentItem ) +{ +    TQStringList texts; +    TQValueList<TQPixmap> pixmaps; +    TQCString name; +    TQVariant value; +    TQCString comment; +    TQ_UINT8 objectTag; + +    TQListView *listView = 0; +    if ( parent != 0 && parent->inherits(TQLISTVIEW_OBJECT_NAME_STRING) ) +	parent = TQT_TQOBJECT((TQListView *) parent); +    TQListViewItem *item = 0; +    if ( listView != 0 ) { +	if ( parentItem == 0 ) { +	    item = new TQListViewItem( listView, d->lastItem ); +	} else { +	    item = new TQListViewItem( parentItem, d->lastItem ); +	} +	d->lastItem = item; +    } + +    in >> objectTag; +    while ( !in.atEnd() && objectTag != Object_End ) { +	switch ( objectTag ) { +	case Object_Item: +	    if ( listView != 0 ) +		d->lastItem->setOpen( TRUE ); +	    inputItem( strings, in, parent, item ); +	    break; +	case Object_TextProperty: +	    unpackCString( strings, in, name ); +	    unpackCString( strings, in, value.asCString() ); +	    unpackCString( strings, in, comment ); + +	    if ( name == "text" ) +		texts << translate( value.asCString().data(), comment.data() ); +	    break; +	case Object_VariantProperty: +	    unpackCString( strings, in, name ); +	    unpackVariant( strings, in, value ); + +	    if ( name == "pixmap" ) +		pixmaps << value.asPixmap(); +	    break; +	default: +	    tqFatal( "Corrupt" ); +	} +	in >> objectTag; +    } + +    if ( listView != 0 ) { +	int i = 0; +	TQStringList::ConstIterator t = texts.begin(); +	while ( t != texts.end() ) { +	    item->setText( i, *t ); +	    ++i; +	    ++t; +	} + +	int j = 0; +	TQValueList<TQPixmap>::ConstIterator p = pixmaps.begin(); +	while ( p != pixmaps.end() ) { +	    item->setPixmap( j, *p ); +	    ++j; +	    ++p; +	} +    } else { +	TQString text = texts.last(); +	TQPixmap pixmap = pixmaps.last(); + +	if ( parent != 0 ) { +	    if ( parent->inherits(TQCOMBOBOX_OBJECT_NAME_STRING) || +		 parent->inherits(TQLISTBOX_OBJECT_NAME_STRING) ) { +		TQListBox *listBox = (TQListBox *) parent->tqt_cast( TQLISTBOX_OBJECT_NAME_STRING ); +		if ( listBox == 0 ) +		    listBox = ((TQComboBox *) parent)->listBox(); + +		if ( pixmap.isNull() ) { +		    (void) new TQListBoxText( listBox, text ); +		} else { +		    (void) new TQListBoxPixmap( listBox, pixmap, text ); +		} +    #ifndef TQT_NO_ICONVIEW +	    } else if ( parent->inherits(TQICONVIEW_OBJECT_NAME_STRING) ) { +		(void) new TQIconViewItem( (TQIconView *) parent, text, pixmap ); +    #endif +	    } +	} +    } +} + +void TQWidgetFactory::inputMenuItem( TQObject **objects, +				    const UibStrTable& strings, TQDataStream& in, +				    TQMenuBar *menuBar ) +{ +    TQCString name; +    TQCString text; +    TQ_UINT16 actionNo; +    TQ_UINT8 objectTag; + +    unpackCString( strings, in, name ); +    unpackCString( strings, in, text ); + +    TQPopupMenu *popupMenu = new TQPopupMenu( menuBar->parentWidget(), name ); + +    in >> objectTag; +    while ( !in.atEnd() && objectTag != Object_End ) { +	switch ( objectTag ) { +	case Object_ActionRef: +	    unpackUInt16( in, actionNo ); +	    ((TQAction *) objects[actionNo])->addTo( popupMenu ); +	    break; +	case Object_Separator: +	    popupMenu->insertSeparator(); +	    break; +	default: +	    tqFatal( "Corrupt" ); +	} +	in >> objectTag; +    } +    menuBar->insertItem( translate(text.data()), popupMenu ); +} + +TQObject *TQWidgetFactory::inputObject( TQObject **objects, int& numObjects, +				      const UibStrTable& strings, +				      TQDataStream& in, TQWidget *ancestorWidget, +				      TQObject *parent, TQCString className ) +{ +    TQObject *obj = 0; +    TQWidget *widget = 0; +    TQLayout *layout = 0; +    TQWidget *parentWidget = 0; +    TQLayout *parentLayout = 0; + +    bool isTQObject = !className.isEmpty(); +    if ( isTQObject ) { +	if ( parent != 0 ) { +	    if ( parent->isWidgetType() ) { +		if ( parent->inherits(TQMAINWINDOW_OBJECT_NAME_STRING) ) { +		    parentWidget = ((TQMainWindow *) parent)->centralWidget(); +		} else { +		    parentWidget = (TQWidget *) parent; +		} +	    } else if ( parent->inherits(TQLAYOUT_OBJECT_NAME_STRING) ) { +		parentLayout = (TQLayout *) parent; +		parentWidget = ancestorWidget; +	    } +	} + +	if ( className == TQACTION_OBJECT_NAME_STRING ) { +	    unpackCString( strings, in, className ); +	    if ( className == TQACTIONGROUP_OBJECT_NAME_STRING ) { +		obj = new TQActionGroup( parent ); +	    } else { +		obj = new TQAction( parent ); +	    } +	} else if ( className == TQLAYOUT_OBJECT_NAME_STRING ) { +	    unpackCString( strings, in, className ); +	    LayoutType type = Grid; +	    if ( className == TQHBOXLAYOUT_OBJECT_NAME_STRING ) { +		type = HBox; +	    } else if ( className == TQVBOXLAYOUT_OBJECT_NAME_STRING ) { +		type = VBox; +	    } +	    if ( parentLayout != 0 && parentLayout->inherits(TQGRIDLAYOUT_OBJECT_NAME_STRING) ) { +		layout = createLayout( 0, 0, type ); +	    } else { +		layout = createLayout( parentWidget, parentLayout, type ); +	    } +	    obj = TQT_TQOBJECT(layout); +	} else if ( className == TQMENUBAR_OBJECT_NAME_STRING ) { +	    unpackCString( strings, in, className ); +	    widget = ((TQMainWindow *) parent)->menuBar(); +	    obj = TQT_TQOBJECT(widget); +	} else if ( className == TQTOOLBAR_OBJECT_NAME_STRING ) { +	    TQ_UINT8 dock; +	    in >> dock; +	    unpackCString( strings, in, className ); +	    widget = new TQToolBar( TQString(), (TQMainWindow *) parent, +				   (TQt::Dock) dock ); +	    obj = TQT_TQOBJECT(widget); +	} else if ( className == TQWIDGET_OBJECT_NAME_STRING ) { +	    unpackCString( strings, in, className ); +	    widget = createWidget( className, parentWidget, 0 ); +	    obj = TQT_TQOBJECT(widget); +	} + +	if ( widget != 0 ) +	    ancestorWidget = widget; +	d->lastItem = 0; +	objects[numObjects++] = obj; +    } + +    TQCString name; +    TQVariant value; +    TQCString comment; +    TQString str; +    TQ_UINT16 actionNo; +    int metAttribute = 0; +    TQ_UINT16 column = 0; +    TQ_UINT16 row = 0; +    TQ_UINT16 colspan = 1; +    TQ_UINT16 rowspan = 1; +    TQ_UINT8 paletteTag; +    TQ_UINT8 objectTag; + +    in >> objectTag; +    while ( !in.atEnd() && objectTag != Object_End ) { +	switch ( objectTag ) { +	case Object_ActionRef: +	    unpackUInt16( in, actionNo ); +	    ((TQAction *) objects[actionNo])->addTo( (TQToolBar *) widget ); +	    break; +	case Object_Attribute: +	    metAttribute = 2; +	    break; +	case Object_Column: +	    inputColumnOrRow( strings, in, obj, FALSE ); +	    break; +	case Object_Event: +	    unpackCString( strings, in, name ); +	    unpackVariant( strings, in, value ); +	    // ### do something with value.asStringList() +	    break; +	case Object_FontProperty: +	    { +		TQFont font; +		TQString family; +		TQ_UINT16 pointSize; +		TQ_UINT8 fontFlags; + +		unpackCString( strings, in, name ); +		in >> fontFlags; + +		if ( fontFlags & Font_Family ) { +		    unpackString( strings, in, family ); +		    font.setFamily( family ); +		} +		if ( fontFlags & Font_PointSize ) { +		    unpackUInt16( in, pointSize ); +		    font.setPointSize( pointSize ); +		} +		if ( fontFlags & Font_Bold ) +		    font.setBold( TRUE ); +		if ( fontFlags & Font_Italic ) +		    font.setItalic( TRUE ); +		if ( fontFlags & Font_Underline ) +		    font.setUnderline( TRUE ); +		if ( fontFlags & Font_StrikeOut ) +		    font.setStrikeOut( TRUE ); + +		if ( obj != 0 ) +		    setProperty( obj, name, font ); +	    } +	    break; +	case Object_GridCell: +	    unpackUInt16( in, column ); +	    unpackUInt16( in, row ); +	    unpackUInt16( in, colspan ); +	    unpackUInt16( in, rowspan ); +	    break; +	case Object_Item: +	    inputItem( strings, in, obj ); +	    break; +	case Object_MenuItem: +	    inputMenuItem( objects, strings, in, (TQMenuBar *) widget ); +	    break; +	case Object_PaletteProperty: +	    { +		TQPalette palette; +		TQColorGroup colorGroup; +		TQColor color; +		int role = -1; + +		unpackCString( strings, in, name ); + +		in >> paletteTag; +		while ( !in.atEnd() && paletteTag != Palette_End ) { +		    switch ( paletteTag ) { +		    case Palette_Active: +			palette.setActive( colorGroup ); +			role = -1; +			break; +		    case Palette_Inactive: +			palette.setInactive( colorGroup ); +			role = -1; +			break; +		    case Palette_Disabled: +			palette.setDisabled( colorGroup ); +			role = -1; +			break; +		    case Palette_Color: +			role++; +			in >> color; +			colorGroup.setColor( (TQColorGroup::ColorRole) role, +					     color ); +			break; +		    case Palette_Pixmap: +			unpackVariant( strings, in, value ); +			colorGroup.setBrush( (TQColorGroup::ColorRole) role, +					     TQBrush(color, value.asPixmap()) ); +			break; +		    default: +			tqFatal( "Corrupt" ); +		    } +		    in >> paletteTag; +		} +		if ( obj != 0 ) +		    setProperty( obj, name, palette ); +	    } +	    break; +	case Object_Row: +	    inputColumnOrRow( strings, in, obj, TRUE ); +	    break; +	case Object_Spacer: +	    inputSpacer( strings, in, layout ); +	    break; +	case Object_Separator: +	    ((TQToolBar *) widget)->addSeparator(); +	    break; +	case Object_SubAction: +	    inputObject( objects, numObjects, strings, in, parentWidget, +			 obj != 0 ? obj : parent, TQACTION_OBJECT_NAME_STRING ); +	    break; +	case Object_SubLayout: +	    inputObject( objects, numObjects, strings, in, parentWidget, obj, +			 TQLAYOUT_OBJECT_NAME_STRING ); +	    break; +	case Object_SubWidget: +	    inputObject( objects, numObjects, strings, in, parentWidget, obj, +			 TQWIDGET_OBJECT_NAME_STRING ); +	    break; +	case Object_TextProperty: +	    unpackCString( strings, in, name ); +	    unpackCString( strings, in, value.asCString() ); +	    unpackCString( strings, in, comment ); +	    str = translate( value.asCString().data(), comment.data() ); + +	    if ( metAttribute > 0 ) { +		if ( name == "title" ) { +		    if ( parent != 0 ) { +			if ( parent->inherits(TQTABWIDGET_OBJECT_NAME_STRING) ) { +			    ((TQTabWidget *) parent)->insertTab( widget, str ); +			} else if ( parent->inherits(TQWIZARD_OBJECT_NAME_STRING) ) { +			    ((TQWizard *) parent)->addPage( widget, str ); +			} +		    } +		} +	    } else { +		if ( obj != 0 ) +		    setProperty( obj, name, str ); +	    } +	    break; +	case Object_VariantProperty: +	    unpackCString( strings, in, name ); +	    unpackVariant( strings, in, value ); + +	    if ( metAttribute > 0 ) { +		if ( name == "id" ) { +		    if ( parent != 0 && parent->inherits(TQWIDGETSTACK_OBJECT_NAME_STRING) ) +			((TQWidgetStack *) parent)->addWidget( widget, value.toInt() ); +		} +	    } else { +		if ( obj != 0 ) +		    setProperty( obj, name, value ); +	    } +	    break; +	default: +	    tqFatal( "Corrupt" ); +	} +	in >> objectTag; +	metAttribute--; +    } + +    if ( parentLayout != 0 ) { +	if ( widget != 0 ) { +	    if ( parentLayout->inherits(TQGRIDLAYOUT_OBJECT_NAME_STRING) ) { +		((TQGridLayout *) parentLayout)->addMultiCellWidget( +			widget, row, row + rowspan - 1, column, +			column + colspan - 1 ); +	    } else { +		((TQBoxLayout *) parentLayout)->addWidget( widget ); +	    } +	} else if ( layout != 0 ) { +	    if ( parentLayout->inherits(TQGRIDLAYOUT_OBJECT_NAME_STRING) ) { +		((TQGridLayout *) parentLayout)->addMultiCellLayout( +			layout, row, row + rowspan - 1, column, +			column + colspan - 1 ); +	    } +	} +    } +    return obj; +} + +TQWidget *TQWidgetFactory::createFromUibFile( TQDataStream& in, +	TQObject * /* connector */ , TQWidget *parent, const char *name ) +{ +#define END_OF_BLOCK() \ +	( in.atEnd() || in.device()->at() >= nextBlock ) + +    TQ_UINT8 lf; +    TQ_UINT8 cr; +    in >> lf; +    in >> cr; +    if ( lf != '\n' || cr != '\r' ) { +	tqWarning( "File corrupted" ); +	return 0; +    } + +    TQ_UINT8 qdatastreamVersion; +    in >> qdatastreamVersion; +    if ( (int) qdatastreamVersion > in.version() ) { +	tqWarning( "Incompatible version of TQt" ); +	return 0; +    } +    in.setVersion( qdatastreamVersion ); + +    UibStrTable strings; +    TQObject **objects = 0; +    int numObjects = 0; + +    TQ_UINT8 blockType; +    TQ_UINT32 blockSize; + +    in >> blockType; +    while ( !in.atEnd() && blockType != Block_End ) { +	unpackUInt32( in, blockSize ); +	TQIODevice::Offset nextBlock = in.device()->at() + blockSize; + +	switch ( blockType ) { +	case Block_Actions: +	    inputObject( objects, numObjects, strings, in, toplevel, TQT_TQOBJECT(toplevel) ); +	    break; +	case Block_Buddies: +	    { +		TQ_UINT16 labelNo; +		TQ_UINT16 buddyNo; + +		do { +		    unpackUInt16( in, labelNo ); +		    unpackUInt16( in, buddyNo ); +		    TQLabel *label = +			(TQLabel *) objects[labelNo]->tqt_cast( TQLABEL_OBJECT_NAME_STRING ); +		    if ( label != 0 ) +			label->setBuddy( (TQWidget *) objects[buddyNo] ); +		} while ( !END_OF_BLOCK() ); +	    } +	    break; +	case Block_Connections: +	    { +		TQString language = "C++"; +		TQ_UINT16 senderNo = 0; +		TQString signal = "clicked()"; +		TQ_UINT16 receiverNo = 0; +		TQString slot = "accept()"; +		TQ_UINT8 connectionFlags; + +		do { +		    in >> connectionFlags; +		    if ( connectionFlags & Connection_Language ) +			unpackString( strings, in, language ); +		    if ( connectionFlags & Connection_Sender ) +			unpackUInt16( in, senderNo ); +		    if ( connectionFlags & Connection_Signal ) +			unpackStringSplit( strings, in, signal ); +		    if ( connectionFlags & Connection_Receiver ) +			unpackUInt16( in, receiverNo ); +		    if ( connectionFlags & Connection_Slot ) +			unpackStringSplit( strings, in, slot ); +		    // ### +#if 0 +		    tqWarning( "connect( %p, %s, %p, %s )", objects[senderNo], +			      signal.latin1(), objects[receiverNo], +			      slot.latin1() ); +#endif +		} while ( !END_OF_BLOCK() ); +	    } +	    break; +	case Block_Functions: +	    // ### +	    tqWarning( "Block_Functions not supported" ); +	    in.device()->at( nextBlock ); +	    break; +	case Block_Images: +	    { +		TQString format; +		TQ_UINT32 length; +		TQByteArray data; +		Image image; + +		do { +		    unpackString( strings, in, image.name ); +		    unpackString( strings, in, format ); +		    unpackUInt32( in, length ); +		    unpackByteArray( in, data ); +		    image.img = loadImageData( format, length, data ); +		    images += image; +		} while ( !END_OF_BLOCK() ); +	    } +	    break; +	case Block_Intro: +	    { +		TQ_INT16 defaultMargin; +		TQ_INT16 defaultSpacing; +		TQ_UINT16 maxObjects; +		TQ_UINT8 introFlags; + +		in >> introFlags; +		in >> defaultMargin; +		in >> defaultSpacing; +		unpackUInt16( in, maxObjects ); +		unpackCString( strings, in, d->translationContext ); + +		if ( introFlags & Intro_Pixmapinproject ) +		    usePixmapCollection = TRUE; +		if ( defaultMargin != -32768 ) +		    defMargin = defaultMargin; +		if ( defaultSpacing != -32768 ) +		    defSpacing = defaultSpacing; +		objects = new TQObject *[maxObjects]; +	    } +	    break; +	case Block_Menubar: +	    inputObject( objects, numObjects, strings, in, toplevel, TQT_TQOBJECT(toplevel), +			 TQMENUBAR_OBJECT_NAME_STRING ); +	    break; +	case Block_Slots: +	    { +		TQString language; +		TQString slot; + +		do { +		    unpackString( strings, in, language ); +		    unpackStringSplit( strings, in, slot ); +		} while ( !END_OF_BLOCK() ); +	    } +	    break; +	case Block_Strings: +	    strings.readBlock( in, blockSize ); +	    break; +	case Block_Tabstops: +	    { +		TQ_UINT16 beforeNo; +		TQ_UINT16 afterNo; + +		unpackUInt16( in, beforeNo ); +		while ( !END_OF_BLOCK() ) { +		    unpackUInt16( in, afterNo ); +		    toplevel->setTabOrder( (TQWidget *) objects[beforeNo], +					   (TQWidget *) objects[afterNo] ); +		    beforeNo = afterNo; +		} +	    } +	    break; +	case Block_Toolbars: +	    do { +		inputObject( objects, numObjects, strings, in, toplevel, +			     TQT_TQOBJECT(toplevel), TQTOOLBAR_OBJECT_NAME_STRING ); +	    } while ( !END_OF_BLOCK() ); +	    break; +	case Block_Variables: +	    // ### +	    tqWarning( "Block_Variables not supported" ); +	    in.device()->at( nextBlock ); +	    break; +	case Block_Widget: +	    toplevel = (TQWidget *) +		inputObject( objects, numObjects, strings, in, toplevel, TQT_TQOBJECT(parent), +			     TQWIDGET_OBJECT_NAME_STRING ); +	    if ( toplevel != 0 ) +		toplevel->setName( name ); +	    break; +	default: +	    tqWarning( "Version error" ); +	    return 0; +	} +	in >> blockType; +    } +    delete[] objects; +    return toplevel; +} + +/*! Installs a widget factory \a factory, which normally contains +  additional widgets that can then be created using a TQWidgetFactory. +  See createWidget() for further details. +*/ + +void TQWidgetFactory::addWidgetFactory( TQWidgetFactory *factory ) +{ +    widgetFactories.append( factory ); +} + +/*! +    Creates a widget of the type \a className passing \a parent and \a +    name to its constructor. + +    If \a className is a widget in the TQt library, it is directly +    created by this function. If the widget isn't in the TQt library, +    each of the installed widget plugins is asked, in turn, to create +    the widget. As soon as a plugin says it can create the widget it +    is asked to do so. It may occur that none of the plugins can +    create the widget, in which case each installed widget factory is +    asked to create the widget (see addWidgetFactory()). If the widget +    cannot be created by any of these means, 0 is returned. + +    If you have a custom widget, and want it to be created using the +    widget factory, there are two approaches you can use: + +    \list 1 + +    \i Write a widget plugin. This allows you to use the widget in +    \e{TQt Designer} and in this TQWidgetFactory. See the widget plugin +    documentation for further details. (See the "Creating Custom +    Widgets with Plugins" section of the \link designer-manual.book TQt +    Designer manual\endlink for an example. + +    \i Subclass TQWidgetFactory. Then reimplement this function to +    create and return an instance of your custom widget if \a +    className equals the name of your widget, otherwise return 0. Then +    at the beginning of your program where you want to use the widget +    factory to create widgets do a: +    \code +    TQWidgetFactory::addWidgetFactory( new MyWidgetFactory ); +    \endcode +    where MyWidgetFactory is your TQWidgetFactory subclass. + +    \endlist +*/ + +TQWidget *TQWidgetFactory::createWidget( const TQString &className, TQWidget *parent, +				       const char *name ) const +{ +    // create widgets we know +    if ( className == TQPUSHBUTTON_OBJECT_NAME_STRING ) { +	return new TQPushButton( parent, name ); +    } else if ( className == TQTOOLBUTTON_OBJECT_NAME_STRING ) { +	return new TQToolButton( parent, name ); +    } else if ( className == TQCHECKBOX_OBJECT_NAME_STRING ) { +	return new TQCheckBox( parent, name ); +    } else if ( className == TQRADIOBUTTON_OBJECT_NAME_STRING ) { +	return new TQRadioButton( parent, name ); +    } else if ( className == TQGROUPBOX_OBJECT_NAME_STRING ) { +	return new TQGroupBox( parent, name ); +    } else if ( className == TQBUTTONGROUP_OBJECT_NAME_STRING ) { +	return new TQButtonGroup( parent, name ); +    } else if ( className == TQICONVIEW_OBJECT_NAME_STRING ) { +#if !defined(TQT_NO_ICONVIEW) +	return new TQIconView( parent, name ); +#endif +    } else if ( className == TQTABLE_OBJECT_NAME_STRING ) { +#if !defined(TQT_NO_TABLE) +	return new TQTable( parent, name ); +#endif +    } else if ( className == TQLISTBOX_OBJECT_NAME_STRING ) { +	return new TQListBox( parent, name ); +    } else if ( className == TQLISTVIEW_OBJECT_NAME_STRING ) { +	return new TQListView( parent, name ); +    } else if ( className == TQLINEEDIT_OBJECT_NAME_STRING ) { +	return new TQLineEdit( parent, name ); +    } else if ( className == TQSPINBOX_OBJECT_NAME_STRING ) { +	return new TQSpinBox( parent, name ); +    } else if ( className == TQMULTILINEEDIT_OBJECT_NAME_STRING ) { +	return new TQMultiLineEdit( parent, name ); +    } else if ( className == TQLABEL_OBJECT_NAME_STRING || className == "TextLabel" || className == "PixmapLabel" ) { +	return new TQLabel( parent, name ); +    } else if ( className == TQLAYOUTWIDGET_OBJECT_NAME_STRING ) { +	return new TQWidget( parent, name ); +    } else if ( className == TQTABWIDGET_OBJECT_NAME_STRING ) { +	return new TQTabWidget( parent, name ); +    } else if ( className == TQCOMBOBOX_OBJECT_NAME_STRING ) { +	return new TQComboBox( FALSE, parent, name ); +    } else if ( className == TQWIDGET_OBJECT_NAME_STRING ) { +	if ( !qwf_stays_on_top ) +	    return new TQWidget( parent, name ); +	return new TQWidget( parent, name, TQt::WStyle_StaysOnTop ); +    } else if ( className == TQDIALOG_OBJECT_NAME_STRING ) { +	if ( !qwf_stays_on_top ) +	    return new TQDialog( parent, name ); +	return new TQDialog( parent, name, FALSE, TQt::WStyle_StaysOnTop ); +    } else if ( className == TQWIZARD_OBJECT_NAME_STRING ) { +	return  new TQWizard( parent, name ); +    } else if ( className == TQLCDNUMBER_OBJECT_NAME_STRING ) { +	return new TQLCDNumber( parent, name ); +    } else if ( className == TQPROGRESSBAR_OBJECT_NAME_STRING ) { +	return new TQProgressBar( parent, name ); +    } else if ( className == TQTEXTVIEW_OBJECT_NAME_STRING ) { +	return new TQTextView( parent, name ); +    } else if ( className == TQTEXTBROWSER_OBJECT_NAME_STRING ) { +	return new TQTextBrowser( parent, name ); +    } else if ( className == TQDIAL_OBJECT_NAME_STRING ) { +	return new TQDial( parent, name ); +    } else if ( className == TQSLIDER_OBJECT_NAME_STRING ) { +	return new TQSlider( parent, name ); +    } else if ( className == TQFRAME_OBJECT_NAME_STRING ) { +	return new TQFrame( parent, name ); +    } else if ( className == TQSPLITTER_OBJECT_NAME_STRING ) { +	return new TQSplitter( parent, name ); +    } else if ( className == "Line" ) { +	TQFrame *f = new TQFrame( parent, name ); +	f->setFrameStyle( TQFrame::HLine | TQFrame::Sunken ); +	return f; +    } else if ( className == TQTEXTEDIT_OBJECT_NAME_STRING ) { +	return new TQTextEdit( parent, name ); +    } else if ( className == TQDATEEDIT_OBJECT_NAME_STRING ) { +	return new TQDateEdit( parent, name ); +    } else if ( className == TQTIMEEDIT_OBJECT_NAME_STRING ) { +	return new TQTimeEdit( parent, name ); +    } else if ( className == TQDATETIMEEDIT_OBJECT_NAME_STRING ) { +	return new TQDateTimeEdit( parent, name ); +    } else if ( className == TQSCROLLBAR_OBJECT_NAME_STRING ) { +	return new TQScrollBar( parent, name ); +    } else if ( className == TQPOPUPMENU_OBJECT_NAME_STRING ) { +	return new TQPopupMenu( parent, name ); +    } else if ( className == TQWIDGETSTACK_OBJECT_NAME_STRING ) { +	return new TQWidgetStack( parent, name ); +    } else if ( className == TQTOOLBOX_OBJECT_NAME_STRING ) { +	return new TQToolBox( parent, name ); +    } else if ( className == TQVBOX_OBJECT_NAME_STRING ) { +	return new TQVBox( parent, name ); +    } else if ( className == TQHBOX_OBJECT_NAME_STRING ) { +	return new TQHBox( parent, name ); +    } else if ( className == TQGRID_OBJECT_NAME_STRING ) { +	return new TQGrid( 4, parent, name ); +    } else if ( className == TQMAINWINDOW_OBJECT_NAME_STRING ) { +	TQMainWindow *mw = 0; +	if ( !qwf_stays_on_top ) +	    mw = new TQMainWindow( parent, name ); +	else +	    mw = new TQMainWindow( parent, name, TQt::WType_TopLevel | TQt::WStyle_StaysOnTop ); +	mw->setCentralWidget( new TQWidget( mw, "qt_central_widget" ) ); +	mw->centralWidget()->show(); +	(void)mw->statusBar(); +	return mw; + +    } +#if !defined(TQT_NO_SQL) +    else if ( className == TQDATATABLE_OBJECT_NAME_STRING ) { +	return new TQDataTable( parent, name ); +    } else if ( className == TQDATABROWSER_OBJECT_NAME_STRING ) { +	return new QDesignerDataBrowser2( parent, name ); +    } else if ( className == TQDATAVIEW_OBJECT_NAME_STRING ) { +	return new QDesignerDataView2( parent, name ); +    } +#endif + +    setupPluginDir(); +    // try to create it using the loaded widget plugins +    if ( !widgetInterfaceManager ) +	widgetInterfaceManager = +	    new TQPluginManager<WidgetInterface>( IID_Widget, TQApplication::libraryPaths(), +						 *qwf_plugin_dir ); + +    TQInterfacePtr<WidgetInterface> iface = 0; +    widgetInterfaceManager->queryInterface( className, &iface ); +    if ( iface ) { +	TQWidget *w = iface->create( className, parent, name ); +	if ( w ) { +	    d->customWidgets.replace( className.latin1(), new bool(TRUE) ); +	    return w; +	} +    } + +    // hope we have a factory which can do it +    for ( TQWidgetFactory* f = widgetFactories.first(); f; f = widgetFactories.next() ) { +	TQWidget *w = f->createWidget( className, parent, name ); +	if ( w ) +	    return w; +    } + +    // no success +    return 0; +} + +/*! Returns the names of the widgets, which this facory can create. */ + +TQStringList TQWidgetFactory::widgets() +{ +    setupWidgetListAndMap(); +    return *availableWidgetList; +} + +/*! Returns whether this widget factory can create the widget \a +  widget */ + +bool TQWidgetFactory::supportsWidget( const TQString &widget ) +{ +    setupWidgetListAndMap(); +    return ( availableWidgetMap->find( widget ) != availableWidgetMap->end() ); +} + +TQWidget *TQWidgetFactory::createWidgetInternal( const TQDomElement &e, TQWidget *parent, +					       TQLayout* layout, const TQString &classNameArg ) +{ +    d->lastItem = 0; +    TQDomElement n = e.firstChild().toElement(); +    TQWidget *w = 0; // the widget that got created +    TQObject *obj = 0; // gets the properties + +    TQString className = classNameArg; + +    int row = e.attribute( "row" ).toInt(); +    int col = e.attribute( "column" ).toInt(); +    int rowspan = e.attribute( "rowspan" ).toInt(); +    int colspan = e.attribute( "colspan" ).toInt(); +    if ( rowspan < 1 ) +	rowspan = 1; +    if ( colspan < 1 ) +	colspan = 1; + +    bool isTQLayoutWidget = FALSE; + +    if ( !className.isEmpty() ) { +	if ( !layout && className  == TQLAYOUTWIDGET_OBJECT_NAME_STRING ) { +	    className = TQWIDGET_OBJECT_NAME_STRING; +	    isTQLayoutWidget = TRUE; +	} +	if ( layout && className == TQLAYOUTWIDGET_OBJECT_NAME_STRING ) { +	    // hide layout widgets +	    w = parent; +	} else { +	    obj = TQT_TQOBJECT(TQWidgetFactory::createWidget( className, parent, 0 )); +	    if ( !obj ) +		return 0; +	    w = (TQWidget*)obj; +	    if ( !toplevel ) +		toplevel = w; +	    if ( w->inherits( TQMAINWINDOW_OBJECT_NAME_STRING ) ) +		w = ( (TQMainWindow*)w )->centralWidget(); +	    if ( layout ) { +		switch( layoutType( layout ) ) { +		case HBox: +		    ( (TQHBoxLayout*)layout )->addWidget( w ); +		    break; +		case VBox: +		    ( (TQVBoxLayout*)layout )->addWidget( w ); +		    break; +		case Grid: +		    ( (TQGridLayout*)layout )->addMultiCellWidget( w, row, row + rowspan - 1, +								  col, col + colspan - 1 ); +		    break; +		default: +		    break; +		} +	    } + +	    layout = 0; +	} +    } +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS +    TQString parentClassName = parent ? parent->className() : 0; +    bool isPlugin = parent ? !!d->customWidgets.find( parent->className() ) : FALSE; +    if ( isPlugin ) +	tqWarning( "####### loading custom container widgets without page support not implemented!" ); +    // ### TODO loading for custom container widgets without pages +#endif +     +    int idx = 0; +    while ( !n.isNull() ) { +	if ( n.tagName() == "spacer" ) { +	    createSpacer( n, layout ); +	} else if ( n.tagName() == "widget" ) { +	    TQMap< TQString, TQString> *oldDbControls = dbControls; +	    createWidgetInternal( n, w, layout, n.attribute( "class", TQWIDGET_OBJECT_NAME_STRING ) ); +	    dbControls = oldDbControls; +	} else if ( n.tagName() == "hbox" ) { +	    TQLayout *parentLayout = layout; +	    if ( layout && layout->inherits( TQGRIDLAYOUT_OBJECT_NAME_STRING ) ) +		layout = createLayout( 0, 0, TQWidgetFactory::HBox, isTQLayoutWidget ); +	    else +		layout = createLayout( w, layout, TQWidgetFactory::HBox, isTQLayoutWidget ); +	    obj = TQT_TQOBJECT(layout); +	    n = n.firstChild().toElement(); +	    if ( parentLayout && parentLayout->inherits( TQGRIDLAYOUT_OBJECT_NAME_STRING ) ) +		( (TQGridLayout*)parentLayout )->addMultiCellLayout( layout, row, +				    row + rowspan - 1, col, col + colspan - 1 ); +	    continue; +	} else if ( n.tagName() == "grid" ) { +	    TQLayout *parentLayout = layout; +	    if ( layout && layout->inherits( TQGRIDLAYOUT_OBJECT_NAME_STRING ) ) +		layout = createLayout( 0, 0, TQWidgetFactory::Grid, isTQLayoutWidget ); +	    else +		layout = createLayout( w, layout, TQWidgetFactory::Grid, isTQLayoutWidget ); +	    obj = TQT_TQOBJECT(layout); +	    n = n.firstChild().toElement(); +	    if ( parentLayout && parentLayout->inherits( TQGRIDLAYOUT_OBJECT_NAME_STRING ) ) +		( (TQGridLayout*)parentLayout )->addMultiCellLayout( layout, row, +				    row + rowspan - 1, col, col + colspan - 1 ); +	    continue; +	} else if ( n.tagName() == "vbox" ) { +	    TQLayout *parentLayout = layout; +	    if ( layout && layout->inherits( TQGRIDLAYOUT_OBJECT_NAME_STRING ) ) +		layout = createLayout( 0, 0, TQWidgetFactory::VBox, isTQLayoutWidget ); +	    else +		layout = createLayout( w, layout, TQWidgetFactory::VBox, isTQLayoutWidget ); +	    obj = TQT_TQOBJECT(layout); +	    n = n.firstChild().toElement(); +	    if ( parentLayout && parentLayout->inherits( TQGRIDLAYOUT_OBJECT_NAME_STRING ) ) +		( (TQGridLayout*)parentLayout )->addMultiCellLayout( layout, row, +				    row + rowspan - 1, col, col + colspan - 1 ); +	    continue; +	} else if ( n.tagName() == "property" && obj ) { +	    setProperty( obj, n.attribute( "name" ), n.firstChild().toElement() ); +	} else if ( n.tagName() == "attribute" && w ) { +	    TQString attrib = n.attribute( "name" ); +	    TQVariant v = DomTool::elementToVariant( n.firstChild().toElement(), TQVariant() ); +	    if ( parent ) { +		if ( parent->inherits( TQTABWIDGET_OBJECT_NAME_STRING ) ) { +		    if ( attrib == "title" ) +			( (TQTabWidget*)parent )->insertTab( w, translate( v.toString() ) ); +		} else if ( parent->inherits( TQWIDGETSTACK_OBJECT_NAME_STRING ) ) { +		    if ( attrib == "id" ) +			( (TQWidgetStack*)parent )->addWidget( w, v.toInt() ); +		} else if ( parent->inherits( TQTOOLBOX_OBJECT_NAME_STRING ) ) { +		    if ( attrib == "label" ) +			( (TQToolBox*)parent )->addItem( w, v.toString() ); +		} else if ( parent->inherits( TQWIZARD_OBJECT_NAME_STRING ) ) { +		    if ( attrib == "title" ) +			( (TQWizard*)parent )->addPage( w, translate( v.toString() ) ); +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS +		} else if ( isPlugin ) { +		    if ( attrib == "label" ) { +			WidgetInterface *iface = 0; +			widgetInterfaceManager->queryInterface( parentClassName, &iface ); +			if ( iface ) { +			    TQWidgetContainerInterfacePrivate *iface2 = 0; +			    iface->queryInterface( IID_TQWidgetContainer, +						   (TQUnknownInterface**)&iface2 ); +			    if ( iface2 ) { +				iface2->insertPage( parentClassName, +						    (TQWidget*)parent, translate( v.toString() ), -1, w ); +				iface2->release(); +			    } +			    iface->release(); +			} +		    } +#endif +		} +	    } +	} else if ( n.tagName() == "item" ) { +	    createItem( n, w ); +	} else if ( n.tagName() == "column" || n.tagName() == "row" ) { +	    createColumn( n, w ); +	} + +	n = n.nextSibling().toElement(); +	idx++; +    } + +    return w; +} + +TQLayout *TQWidgetFactory::createLayout( TQWidget *widget, TQLayout* layout, +				       LayoutType type, bool isTQLayoutWidget ) +{ +    int spacing = defSpacing; +    int margin = defMargin; + +    if ( layout || !widget || isTQLayoutWidget ) +	margin = 0; + +    if ( !layout && widget && widget->inherits( TQTABWIDGET_OBJECT_NAME_STRING ) ) +	widget = ((TQTabWidget*)widget)->currentPage(); + +    if ( !layout && widget && widget->inherits( TQWIZARD_OBJECT_NAME_STRING ) ) +	widget = ((TQWizard*)widget)->currentPage(); + +    if ( !layout && widget && widget->inherits( TQWIDGETSTACK_OBJECT_NAME_STRING ) ) +	widget = ((TQWidgetStack*)widget)->visibleWidget(); + +    if ( !layout && widget && widget->inherits( TQTOOLBOX_OBJECT_NAME_STRING ) ) +	widget = ((TQToolBox*)widget)->currentItem(); + +    TQLayout *l = 0; +    int align = 0; +    if ( !layout && widget && widget->inherits( TQGROUPBOX_OBJECT_NAME_STRING ) ) { +	TQGroupBox *gb = (TQGroupBox*)widget; +	gb->setColumnLayout( 0, Qt::Vertical ); +	layout = gb->layout(); +	layout->setMargin( 0 ); +	layout->setSpacing( 0 ); +	align = TQt::AlignTop; +    } +    if ( layout ) { +	switch ( type ) { +        case HBox: +	    l = new TQHBoxLayout( layout ); +	    break; +	case VBox: +	    l = new TQVBoxLayout( layout ); +	    break; +	case Grid: +	    l = new TQGridLayout( layout ); +	    break; +	default: +	    return 0; +	} +    } else { +	switch ( type ) { +	case HBox: +	    l = new TQHBoxLayout( widget ); +	    break; +	case VBox: +	    l = new TQVBoxLayout( widget ); +	    break; +	case Grid: +	    l = new TQGridLayout( widget ); +	    break; +	default: +	    return 0; +	} +    } +    l->setAlignment( align ); +    l->setMargin( margin ); +    l->setSpacing( spacing ); +    return l; +} + +TQWidgetFactory::LayoutType TQWidgetFactory::layoutType( TQLayout *layout ) const +{ +    if ( layout->inherits( TQHBOXLAYOUT_OBJECT_NAME_STRING ) ) +	return HBox; +    else if ( layout->inherits( TQVBOXLAYOUT_OBJECT_NAME_STRING ) ) +	return VBox; +    else if ( layout->inherits( TQGRIDLAYOUT_OBJECT_NAME_STRING ) ) +	return Grid; +    return NoLayout; +} + +void TQWidgetFactory::setProperty( TQObject* obj, const TQString &prop, +				  TQVariant value ) +{ +    int offset = obj->metaObject()->findProperty( prop.ascii(), TRUE ); + +    if ( offset != -1 ) { +	if ( prop == "geometry" && TQT_BASE_OBJECT(obj) == TQT_BASE_OBJECT(toplevel) ) { +	    toplevel->resize( value.toRect().size() ); +	} else if ( prop == "accel" ) { +	    obj->setProperty( prop.ascii(), TQVariant(value.toKeySequence()) ); +	} else { +	    if ( value.type() == TQVariant::String || +		 value.type() == TQVariant::CString ) { +		const TQMetaProperty *metaProp = +			obj->metaObject()->property( offset, TRUE ); +		if ( metaProp != 0 && metaProp->isEnumType() ) { +		    if ( metaProp->isSetType() ) { +			TQStrList flagsCStr; +			TQStringList flagsStr = +			    TQStringList::split( '|', value.asString() ); +			TQStringList::ConstIterator f = flagsStr.begin(); +			while ( f != flagsStr.end() ) { +			    flagsCStr.append( (*f).ascii() ); +			    ++f; +			} +			value = TQVariant( metaProp->keysToValue(flagsCStr) ); +		    } else { +			TQCString key = value.toCString(); +			value = TQVariant( metaProp->keyToValue(key) ); +		    } +		} +	    } +	    obj->setProperty( prop.ascii(), value ); +	} +    } else { +	if ( obj->isWidgetType() ) { +	    if ( prop == "toolTip" ) { +		if ( !value.toString().isEmpty() ) +		    TQToolTip::add( (TQWidget*)obj, translate( value.toString() ) ); +	    } else if ( prop == "whatsThis" ) { +		if ( !value.toString().isEmpty() ) +		    TQWhatsThis::add( (TQWidget*)obj, translate( value.toString() ) ); +	    } else if ( prop == "buddy" ) { +		buddies.insert( obj->name(), value.toCString() ); +	    } else if ( prop == "buttonGroupId" ) { +		if ( obj->inherits( TQBUTTON_OBJECT_NAME_STRING ) && obj->parent()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ) ) +		    ( (TQButtonGroup*)obj->parent() )->insert( (TQButton*)obj, value.toInt() ); +#ifndef TQT_NO_SQL +	    } else if ( prop == "database" && !obj->inherits( TQDATAVIEW_OBJECT_NAME_STRING ) +		 && !obj->inherits( TQDATABROWSER_OBJECT_NAME_STRING ) ) { +		const TQStringList& lst = value.asStringList(); +		if ( lst.count() > 2 ) { +		    if ( dbControls ) +			dbControls->insert( obj->name(), lst[ 2 ] ); +		} else if ( lst.count() == 2 ) { +		    dbTables.insert( obj->name(), lst ); +		} +	    } else if ( prop == "database" ) { +		const TQStringList& lst = value.asStringList(); +		if ( lst.count() == 2 && obj->inherits( TQWIDGET_OBJECT_NAME_STRING ) ) { +		    SqlWidgetConnection conn( lst[ 0 ], lst[ 1 ] ); +		    sqlWidgetConnections.insert( (TQWidget*)obj, conn ); +		    dbControls = conn.dbControls; +		} +#endif +	    } else if ( prop == "frameworkCode" ) { +		if ( value.isValid() && !value.toBool() ) +		    noDatabaseWidgets << obj->name(); +	    } +	} +    } +} + +void TQWidgetFactory::setProperty( TQObject* widget, const TQString &prop, const TQDomElement &e ) +{ +    TQString comment; +    TQVariant value( DomTool::elementToVariant( e, TQVariant(), comment ) ); + +    if ( e.tagName() == "string" ) { +	value = translate( value.asString(), comment ); +    } else if ( e.tagName() == "pixmap" ) { +	TQPixmap pix = loadPixmap( value.toString() ); +	if ( !pix.isNull() ) +	    value = pix; +    } else if ( e.tagName() == "iconset" ) { +	TQPixmap pix = loadPixmap( value.toString() ); +	if ( !pix.isNull() ) +	    value = TQIconSet( pix ); +    } else if ( e.tagName() == "image" ) { +	value = loadFromCollection( value.toString() ); +    } else if ( e.tagName() == "palette" ) { +	TQDomElement n = e.firstChild().toElement(); +	TQPalette p; +	while ( !n.isNull() ) { +	    TQColorGroup cg; +	    if ( n.tagName() == "active" ) { +		cg = loadColorGroup( n ); +		p.setActive( cg ); +	    } else if ( n.tagName() == "inactive" ) { +		cg = loadColorGroup( n ); +		p.setInactive( cg ); +	    } else if ( n.tagName() == "disabled" ) { +		cg = loadColorGroup( n ); +		p.setDisabled( cg ); +	    } +	    n = n.nextSibling().toElement(); +	} +	value = p; +    } +    setProperty( widget, prop, value ); +} + +void TQWidgetFactory::createSpacer( const TQDomElement &e, TQLayout *layout ) +{ +    TQDomElement n = e.firstChild().toElement(); +    int row = e.attribute( "row" ).toInt(); +    int col = e.attribute( "column" ).toInt(); +    int rowspan = e.attribute( "rowspan" ).toInt(); +    int colspan = e.attribute( "colspan" ).toInt(); + +    Qt::Orientation orient = Qt::Horizontal; +    int w = 0, h = 0; +    TQSizePolicy::SizeType sizeType = TQSizePolicy::Preferred; +    while ( !n.isNull() ) { +	if ( n.tagName() == "property" ) { +	    TQString prop = n.attribute( "name" ); +	    if ( prop == "orientation" ) { +		if ( n.firstChild().firstChild().toText().data() == "Horizontal" ) +		    orient = Qt::Horizontal; +		else +		    orient = Qt::Vertical; +	    } else if ( prop == "sizeType" ) { +		sizeType = stringToSizeType( n.firstChild().firstChild().toText().data() ); +	    } else if ( prop == "sizeHint" ) { +		w = n.firstChild().firstChild().firstChild().toText().data().toInt(); +		h = n.firstChild().firstChild().nextSibling().firstChild().toText().data().toInt(); +	    } +	} +	n = n.nextSibling().toElement(); +    } + +    if ( rowspan < 1 ) +	rowspan = 1; +    if ( colspan < 1 ) +	colspan = 1; +    TQSpacerItem *item = new TQSpacerItem( w, h, orient == Qt::Horizontal ? sizeType : TQSizePolicy::Minimum, +					 orient == Qt::Vertical ? sizeType : TQSizePolicy::Minimum ); +    if ( layout ) { +	if ( layout->inherits( TQBOXLAYOUT_OBJECT_NAME_STRING ) ) +	    ( (TQBoxLayout*)layout )->addItem( item ); +	else +	    ( (TQGridLayout*)layout )->addMultiCell( item, row, row + rowspan - 1, col, col + colspan - 1, +						    orient == Qt::Horizontal ? TQt::AlignVCenter : TQt::AlignHCenter ); +    } +} + +static TQImage loadImageData( TQDomElement &n2 ) +{ +    TQString format = n2.attribute( "format", "PNG" ); +    TQString hex = n2.firstChild().toText().data(); +    int n = hex.length() / 2; +    TQByteArray data( n ); +    for ( int i = 0; i < n; i++ ) +	data[i] = (char) hex.mid( 2 * i, 2 ).toUInt( 0, 16 ); +    return loadImageData( format, n2.attribute("length").toULong(), data ); +} + +void TQWidgetFactory::loadImageCollection( const TQDomElement &e ) +{ +    TQDomElement n = e.firstChild().toElement(); +    while ( !n.isNull() ) { +	if ( n.tagName() == "image" ) { +	    Image img; +	    img.name =  n.attribute( "name" ); +	    TQDomElement n2 = n.firstChild().toElement(); +	    while ( !n2.isNull() ) { +		if ( n2.tagName() == "data" ) +		    img.img = loadImageData( n2 ); +		n2 = n2.nextSibling().toElement(); +	    } +	    images.append( img ); +	    n = n.nextSibling().toElement(); +	} +    } +} + +TQImage TQWidgetFactory::loadFromCollection( const TQString &name ) +{ +    TQValueList<Image>::Iterator it = images.begin(); +    for ( ; it != images.end(); ++it ) { +	if ( ( *it ).name == name ) +	    return ( *it ).img; +    } +    return TQImage(); +} + +TQPixmap TQWidgetFactory::loadPixmap( const TQString& name ) +{ +    TQPixmap pix; +    if ( usePixmapCollection ) { +	const TQMimeSource *m = TQMimeSourceFactory::defaultFactory()->data( name ); +	if ( m ) +	    TQImageDrag::decode( m, pix ); +    } else { +	pix.convertFromImage( loadFromCollection(name) ); +    } +    return pix; +} + +TQPixmap TQWidgetFactory::loadPixmap( const TQDomElement &e ) +{ +    return loadPixmap( e.firstChild().toText().data() ); +} + +TQColorGroup TQWidgetFactory::loadColorGroup( const TQDomElement &e ) +{ +    TQColorGroup cg; +    int r = -1; +    TQDomElement n = e.firstChild().toElement(); +    TQColor col; +    while ( !n.isNull() ) { +	if ( n.tagName() == "color" ) { +	    r++; +	    cg.setColor( (TQColorGroup::ColorRole)r, (col = DomTool::readColor( n ) ) ); +	} else if ( n.tagName() == "pixmap" ) { +	    TQPixmap pix = loadPixmap( n ); +	    cg.setBrush( (TQColorGroup::ColorRole)r, TQBrush( col, pix ) ); +	} +	n = n.nextSibling().toElement(); +    } +    return cg; +} + +struct Connection +{ +    TQObject *sender, *receiver; +    TQCString signal, slot; +    bool operator==( const Connection &c ) const { +	return sender == c.sender && receiver == c.receiver && +	       signal == c.signal && slot == c.slot ; +    } + +    Connection() : sender( 0 ), receiver( 0 ) { } +}; + +class NormalizeObject : public TQObject +{ +public: +    NormalizeObject() : TQObject() {} +    static TQCString normalizeSignalSlot( const char *signalSlot ) { return TQObject::normalizeSignalSlot( signalSlot ); } +}; + +void TQWidgetFactory::loadConnections( const TQDomElement &e, TQObject *connector ) +{ +    TQDomElement n = e.firstChild().toElement(); +    while ( !n.isNull() ) { +	if ( n.tagName() == "connection" ) { +	    TQString lang = n.attribute( "language", "C++" ); +	    TQDomElement n2 = n.firstChild().toElement(); +	    Connection conn; +	    while ( !n2.isNull() ) { +		if ( n2.tagName() == "sender" ) { +		    TQString name = n2.firstChild().toText().data(); +		    if ( name == "this" || qstrcmp( toplevel->name(), name.ascii() ) == 0 ) { +			conn.sender = TQT_TQOBJECT(toplevel); +		    } else { +			if ( name == "this" ) +			    name = toplevel->name(); +			TQObjectList *l = toplevel->queryList( 0, name.ascii(), FALSE ); +			if ( l ) { +			    if ( l->first() ) +				conn.sender = l->first(); +			    delete l; +			} +		    } +		    if ( !conn.sender ) +			conn.sender = findAction( name ); +		} else if ( n2.tagName() == "signal" ) { +		    conn.signal = n2.firstChild().toText().data().ascii(); +		} else if ( n2.tagName() == "receiver" ) { +		    TQString name = n2.firstChild().toText().data(); +		    if ( name == "this" || qstrcmp( toplevel->name(), name.ascii() ) == 0 ) { +			conn.receiver = TQT_TQOBJECT(toplevel); +		    } else { +			TQObjectList *l = toplevel->queryList( 0, name.ascii(), FALSE ); +			if ( l ) { +			    if ( l->first() ) +				conn.receiver = l->first(); +			    delete l; +			} +		    } +		} else if ( n2.tagName() == "slot" ) { +		    conn.slot = n2.firstChild().toText().data().ascii(); +		} +		n2 = n2.nextSibling().toElement(); +	    } + +	    conn.signal = NormalizeObject::normalizeSignalSlot( conn.signal ); +	    conn.slot = NormalizeObject::normalizeSignalSlot( conn.slot ); + +	    if ( !conn.sender || !conn.receiver ) { +		n = n.nextSibling().toElement(); +		continue; +	    } + +	    TQObject *sender = 0, *receiver = 0; +	    TQObjectList *l = toplevel->queryList( 0, conn.sender->name(), FALSE ); +	    if ( qstrcmp( conn.sender->name(), toplevel->name() ) == 0 ) { +		sender = TQT_TQOBJECT(toplevel); +	    } else { +		if ( !l || !l->first() ) { +		    delete l; +		    n = n.nextSibling().toElement(); +		    continue; +		} +		sender = l->first(); +		delete l; +	    } +	    if ( !sender ) +		sender = findAction( conn.sender->name() ); + +	    if ( qstrcmp( conn.receiver->name(), toplevel->name() ) == 0 ) { +		receiver = TQT_TQOBJECT(toplevel); +	    } else { +		l = toplevel->queryList( 0, conn.receiver->name(), FALSE ); +		if ( !l || !l->first() ) { +		    delete l; +		    n = n.nextSibling().toElement(); +		    continue; +		} +		receiver = l->first(); +		delete l; +	    } + +	    TQString s = "2""%1"; +	    s = s.arg( conn.signal.data() ); +	    TQString s2 = "1""%1"; +	    s2 = s2.arg( conn.slot.data() ); + +	    TQStrList signalList = sender->metaObject()->signalNames( TRUE ); +	    TQStrList slotList = receiver->metaObject()->slotNames( TRUE ); + +	    // if this is a connection to a custom slot and we have a connector, try this as receiver +	    if ( slotList.find( conn.slot ) == -1 && (TQT_BASE_OBJECT(receiver) == TQT_BASE_OBJECT(toplevel)) && connector ) { +		slotList = connector->metaObject()->slotNames( TRUE ); +		receiver = connector; +	    } + +	    // avoid warnings +	    if ( signalList.find( conn.signal ) == -1 || +		 slotList.find( conn.slot ) == -1 ) { +		n = n.nextSibling().toElement(); +		continue; +	    } +	    TQObject::connect( sender, s.ascii(), receiver, s2.ascii() ); +	} +	n = n.nextSibling().toElement(); +    } +} + +void TQWidgetFactory::loadTabOrder( const TQDomElement &e ) +{ +    TQWidget *last = 0; +    TQDomElement n = e.firstChild().toElement(); +    while ( !n.isNull() ) { +	if ( n.tagName() == "tabstop" ) { +	    TQString name = n.firstChild().toText().data(); +	    TQObjectList *l = toplevel->queryList( 0, name.ascii(), FALSE ); +	    if ( l ) { +		if ( l->first() ) { +		    TQWidget *w = (TQWidget*)l->first(); +		    if ( last ) +			toplevel->setTabOrder( last, w ); +		    last = w; +		} +		delete l; +	    } +	} +	n = n.nextSibling().toElement(); +    } +} + +void TQWidgetFactory::createListViewColumn( TQListView *lv, const TQString& txt, +					   const TQPixmap& pix, bool clickable, +					   bool resizable ) +{ +    if ( pix.isNull() ) { +	lv->addColumn( txt ); +    } else { +	lv->addColumn( pix, txt ); +    } + +    int i = lv->header()->count() - 1; +    if ( !pix.isNull() ) +	lv->header()->setLabel( i, pix, txt ); +    if ( !clickable ) +	lv->header()->setClickEnabled( clickable, i ); +    if ( !resizable ) +	lv->header()->setResizeEnabled( resizable, i ); +} + +#ifndef TQT_NO_TABLE +void TQWidgetFactory::createTableColumnOrRow( TQTable *table, const TQString& txt, +					     const TQPixmap& pix, +					     const TQString& field, bool isRow ) +{ +#ifndef TQT_NO_SQL +    bool isSql = table->inherits( TQDATATABLE_OBJECT_NAME_STRING ); +#endif +    if ( isRow ) +	table->setNumRows( table->numRows() + 1 ); +    else { +#ifndef TQT_NO_SQL +	if ( !isSql ) +#endif +	    table->setNumCols( table->numCols() + 1 ); +    } + +    TQValueList<Field> fieldMap; +    if ( fieldMaps.find( table ) != fieldMaps.end() ) { +	fieldMap = *fieldMaps.find( table ); +	fieldMaps.remove( table ); +    } + +    int i = isRow ? table->numRows() - 1 : table->numCols() - 1; +    TQHeader *h = !isRow ? table->horizontalHeader() : table->verticalHeader(); +    if ( !pix.isNull() ) { +#ifndef TQT_NO_SQL +	if ( isSql ) +	    ((TQDataTable*)table)->addColumn( field, txt, -1, pix ); +	else +#endif +	    h->setLabel( i, pix, txt ); +    } else { +#ifndef TQT_NO_SQL +	if ( isSql ) +	    ((TQDataTable*)table)->addColumn( field, txt ); +	else +#endif +	    h->setLabel( i, txt ); +    } +    if ( !isRow && !field.isEmpty() ) { +	fieldMap.append( Field( txt, pix, field ) ); +	fieldMaps.insert( table, fieldMap ); +    } + +} +#endif + +void TQWidgetFactory::createColumn( const TQDomElement &e, TQWidget *widget ) +{ +    if ( widget->inherits( TQLISTVIEW_OBJECT_NAME_STRING ) && e.tagName() == "column" ) { +	TQListView *lv = (TQListView*)widget; +	TQDomElement n = e.firstChild().toElement(); +	TQPixmap pix; +	TQString txt; +	bool clickable = TRUE, resizable = TRUE; +	while ( !n.isNull() ) { +	    if ( n.tagName() == "property" ) { +		TQString attrib = n.attribute( "name" ); +		TQVariant v = DomTool::elementToVariant( n.firstChild().toElement(), TQVariant() ); +		if ( attrib == "text" ) +		    txt = translate( v.toString() ); +		else if ( attrib == "pixmap" ) +		    pix = loadPixmap( n.firstChild().toElement().toElement() ); +		else if ( attrib == "clickable" ) +		    clickable = v.toBool(); +		else if ( attrib == "resizable" || attrib == "resizeable" ) +		    resizable = v.toBool(); +	    } +	    n = n.nextSibling().toElement(); +	} +	createListViewColumn( lv, txt, pix, clickable, resizable ); +    } +#ifndef TQT_NO_TABLE +    else if ( widget->inherits( TQTABLE_OBJECT_NAME_STRING ) ) { +	TQTable *table = (TQTable*)widget; + +	TQDomElement n = e.firstChild().toElement(); +	TQPixmap pix; +	TQString txt; +	TQString field; + +	while ( !n.isNull() ) { +	    if ( n.tagName() == "property" ) { +		TQString attrib = n.attribute( "name" ); +		TQVariant v = DomTool::elementToVariant( n.firstChild().toElement(), TQVariant() ); +		if ( attrib == "text" ) +		    txt = translate( v.toString() ); +		else if ( attrib == "pixmap" ) { +		    if ( !n.firstChild().firstChild().toText().data().isEmpty() ) +			pix = loadPixmap( n.firstChild().toElement().toElement() ); +		} else if ( attrib == "field" ) +		    field = translate( v.toString() ); +	    } +	    n = n.nextSibling().toElement(); +	} +	createTableColumnOrRow( table, txt, pix, field, e.tagName() == "row" ); +    } +#endif +} + +void TQWidgetFactory::loadItem( const TQDomElement &e, TQPixmap &pix, TQString &txt, bool &hasPixmap ) +{ +    TQDomElement n = e; +    hasPixmap = FALSE; +    while ( !n.isNull() ) { +	if ( n.tagName() == "property" ) { +	    TQString attrib = n.attribute( "name" ); +	    TQVariant v = DomTool::elementToVariant( n.firstChild().toElement(), TQVariant() ); +	    if ( attrib == "text" ) +		txt = translate( v.toString() ); +	    else if ( attrib == "pixmap" ) { +		pix = loadPixmap( n.firstChild().toElement() ); +		hasPixmap = !pix.isNull(); +	    } +	} +	n = n.nextSibling().toElement(); +    } +} + +void TQWidgetFactory::createItem( const TQDomElement &e, TQWidget *widget, TQListViewItem *i ) +{ +    if ( widget->inherits( TQLISTBOX_OBJECT_NAME_STRING ) || widget->inherits( TQCOMBOBOX_OBJECT_NAME_STRING ) ) { +	TQDomElement n = e.firstChild().toElement(); +	TQPixmap pix; +	bool hasPixmap = FALSE; +	TQString txt; +	loadItem( n, pix, txt, hasPixmap ); +	TQListBox *lb = 0; +	if ( widget->inherits( TQLISTBOX_OBJECT_NAME_STRING ) ) +	    lb = (TQListBox*)widget; +	else +	    lb = ( (TQComboBox*)widget)->listBox(); +	if ( hasPixmap ) { +	    new TQListBoxPixmap( lb, pix, txt ); +	} else { +	    new TQListBoxText( lb, txt ); +	} +#ifndef TQT_NO_ICONVIEW +    } else if ( widget->inherits( TQICONVIEW_OBJECT_NAME_STRING ) ) { +	TQDomElement n = e.firstChild().toElement(); +	TQPixmap pix; +	bool hasPixmap = FALSE; +	TQString txt; +	loadItem( n, pix, txt, hasPixmap ); + +	TQIconView *iv = (TQIconView*)widget; +	new TQIconViewItem( iv, txt, pix ); +#endif +    } else if ( widget->inherits( TQLISTVIEW_OBJECT_NAME_STRING ) ) { +	TQDomElement n = e.firstChild().toElement(); +	TQPixmap pix; +	TQValueList<TQPixmap> pixmaps; +	TQStringList textes; +	TQListViewItem *item = 0; +	TQListView *lv = (TQListView*)widget; +	if ( i ) +	    item = new TQListViewItem( i, d->lastItem ); +	else +	    item = new TQListViewItem( lv, d->lastItem ); +	while ( !n.isNull() ) { +	    if ( n.tagName() == "property" ) { +		TQString attrib = n.attribute( "name" ); +		TQVariant v = DomTool::elementToVariant( n.firstChild().toElement(), TQVariant() ); +		if ( attrib == "text" ) +		    textes << translate( v.toString() ); +		else if ( attrib == "pixmap" ) { +		    TQString s = v.toString(); +		    if ( s.isEmpty() ) { +			pixmaps << TQPixmap(); +		    } else { +			pix = loadPixmap( n.firstChild().toElement() ); +			pixmaps << pix; +		    } +		} +	    } else if ( n.tagName() == "item" ) { +		item->setOpen( TRUE ); +		createItem( n, widget, item ); +	    } + +	    n = n.nextSibling().toElement(); +	} + +	for ( int i = 0; i < lv->columns(); ++i ) { +	    item->setText( i, textes[ i ] ); +	    item->setPixmap( i, pixmaps[ i ] ); +	} +	d->lastItem = item; +    } +} + + + +void TQWidgetFactory::loadChildAction( TQObject *parent, const TQDomElement &e ) +{ +    TQDomElement n = e; +    TQAction *a = 0; +    bool hasMenuText = FALSE; +    if ( n.tagName() == "action" ) { +	a = new TQAction( parent ); +	TQDomElement n2 = n.firstChild().toElement(); +	 +	while ( !n2.isNull() ) { +	    if ( n2.tagName() == "property" ) { +		TQString prop(n2.attribute("name")); +		if (prop == "menuText") +		    hasMenuText = TRUE; +		setProperty( a, prop, n2.firstChild().toElement() ); +	    } +	    n2 = n2.nextSibling().toElement(); +	} +	if ( !parent->inherits( TQACTION_OBJECT_NAME_STRING ) ) +	    actionList.append( a ); +    } else if ( n.tagName() == "actiongroup" ) { +	a = new TQActionGroup( parent ); +	TQDomElement n2 = n.firstChild().toElement(); +	while ( !n2.isNull() ) { +	    if ( n2.tagName() == "property" ) { +		TQString prop(n2.attribute("name")); +		if (prop == "menuText") +		    hasMenuText = TRUE; +		setProperty( a, prop, n2.firstChild().toElement() ); +	    } else if ( n2.tagName() == "action" || +			n2.tagName() == "actiongroup" ) { +		loadChildAction( a, n2 ); + +	    } +	    n2 = n2.nextSibling().toElement(); +	} +	if ( !parent->inherits( TQACTION_OBJECT_NAME_STRING ) ) +	    actionList.append( a ); +    } + +    if (a && !hasMenuText && !a->text().isEmpty() && uiFileVersion < "3.3") +	a->setMenuText(a->text()); +} + +void TQWidgetFactory::loadActions( const TQDomElement &e ) +{ +    TQDomElement n = e.firstChild().toElement(); +    while ( !n.isNull() ) { +	if ( n.tagName() == "action" ) { +	    loadChildAction( TQT_TQOBJECT(toplevel), n ); +	} else if ( n.tagName() == "actiongroup" ) { +	    loadChildAction( TQT_TQOBJECT(toplevel), n ); +	} +	n = n.nextSibling().toElement(); +    } +} + +void TQWidgetFactory::loadToolBars( const TQDomElement &e ) +{ +    TQDomElement n = e.firstChild().toElement(); +    TQMainWindow *mw = ( (TQMainWindow*)toplevel ); +    TQToolBar *tb = 0; +    while ( !n.isNull() ) { +	if ( n.tagName() == "toolbar" ) { +	    TQt::Dock dock = (TQt::Dock)n.attribute( "dock" ).toInt(); +	    tb = new TQToolBar( TQString(), mw, dock ); +	    tb->setLabel( n.attribute( "label" ) ); +	    tb->setName( n.attribute( "name" ).ascii() ); +	    TQDomElement n2 = n.firstChild().toElement(); +	    while ( !n2.isNull() ) { +		if ( n2.tagName() == "action" ) { +		    TQAction *a = findAction( n2.attribute( "name" ) ); +		    if ( a ) +			a->addTo( tb ); +		} else if ( n2.tagName() == "separator" ) { +		    tb->addSeparator(); +		} else if ( n2.tagName() == "widget" ) { +		    (void)createWidgetInternal( n2, tb, 0, n2.attribute( "class", TQWIDGET_OBJECT_NAME_STRING ) ); +		} else if ( n2.tagName() == "property" ) { +		    setProperty( TQT_TQOBJECT(tb), n2.attribute( "name" ), n2.firstChild().toElement() ); +		} +		n2 = n2.nextSibling().toElement(); +	    } +	} +	n = n.nextSibling().toElement(); +    } +} + +void TQWidgetFactory::loadMenuBar( const TQDomElement &e ) +{ +    TQDomElement n = e.firstChild().toElement(); +    TQMainWindow *mw = ( (TQMainWindow*)toplevel ); +    TQMenuBar *mb = mw->menuBar(); +    while ( !n.isNull() ) { +	if ( n.tagName() == "item" ) { +	    TQPopupMenu *popup = new TQPopupMenu( mw ); +	    loadPopupMenu( popup, n ); +	    popup->setName( n.attribute( "name" ).ascii() ); +	    mb->insertItem( translate( n.attribute( "text" ) ), popup ); +	} else if ( n.tagName() == "property" ) { +	    setProperty( TQT_TQOBJECT(mb), n.attribute( "name" ), n.firstChild().toElement() ); +	} else if ( n.tagName() == "separator" ) { +	    mb->insertSeparator(); +	} +	n = n.nextSibling().toElement(); +    } +} + +void TQWidgetFactory::loadPopupMenu( TQPopupMenu *p, const TQDomElement &e ) +{ +    TQMainWindow *mw = ( (TQMainWindow*)toplevel ); +    TQDomElement n = e.firstChild().toElement(); +    while ( !n.isNull() ) { +	if ( n.tagName() == "action" ) { +	    TQAction *a = findAction( n.attribute( "name" ) ); +	    TQDomElement n2 = n.nextSibling().toElement(); +	    if ( n2.tagName() == "item") { // load submenu +		TQPopupMenu *popup = new TQPopupMenu( mw ); +		popup->setName( n2.attribute( "name" ).ascii() ); +		if ( a ) { +		    p->setAccel( a->accel(), p->insertItem( a->iconSet(), +					     translate( n2.attribute( "text" ).utf8().data() ), +					     popup ) ); +		} else { +		    p->insertItem( translate( n2.attribute( "text" ).utf8().data() ), popup ); +		} +		loadPopupMenu( popup, n2 ); +		n = n2; +	    } else { +		if ( a ) { +		    a->addTo( p ); +		} +	    } +	    a = 0; +	} else if ( n.tagName() == "separator" ) { +	    p->insertSeparator(); +	} +	n = n.nextSibling().toElement(); +    } +} + +// compatibility with early 3.0 betas +// ### remove for 4.0 +void TQWidgetFactory::loadFunctions( const TQDomElement & ) +{ +} + +TQAction *TQWidgetFactory::findAction( const TQString &name ) +{ +    for ( TQAction *a = actionList.first(); a; a = actionList.next() ) { +	if ( TQString( a->name() ) == name ) +	    return a; +	TQAction *ac = (TQAction*)a->child( name.latin1(), TQACTION_OBJECT_NAME_STRING ); +	if ( ac ) +	    return ac; +    } +    return 0; +} + +/*! +    If you use a pixmap collection (which is the default for new +    projects) rather than saving the pixmaps within the .ui XML file, +    you must load the pixmap collection. TQWidgetFactory looks in the +    default TQMimeSourceFactory for the pixmaps. Either add it there +    manually, or call this function and specify the directory where +    the images can be found, as \a dir. This is normally the +    directory called \c images in the project's directory. +*/ + +void TQWidgetFactory::loadImages( const TQString &dir ) +{ +    TQDir d( dir ); +    TQStringList l = d.entryList( TQDir::Files ); +    for ( TQStringList::Iterator it = l.begin(); it != l.end(); ++it ) +	TQMimeSourceFactory::defaultFactory()->setPixmap( *it, TQPixmap( d.path() + "/" + *it, "PNG" ) ); + +} + +void TQWidgetFactory::loadExtraSource() +{ +    if ( !qwf_language || !languageInterfaceManager ) +	return; +    TQString lang = *qwf_language; +    LanguageInterface *iface = 0; +    languageInterfaceManager->queryInterface( lang, &iface ); +    if ( !iface ) +	return; +    TQFile f( qwf_currFileName + iface->formCodeExtension() ); +    if ( f.open( IO_ReadOnly ) ) { +	TQTextStream ts( &f ); +	code = ts.read(); +    } +} + +TQString TQWidgetFactory::translate( const TQString& sourceText, const TQString& comment ) +{ +    return tqApp->translate( d->translationContext, sourceText.utf8(), comment.utf8(), +			    TQApplication::UnicodeUTF8 ); +} + +TQString TQWidgetFactory::translate( const char *sourceText, const char *comment ) +{ +    return tqApp->translate( d->translationContext, sourceText, comment, +			    TQApplication::UnicodeUTF8 ); +} | 
