diff options
Diffstat (limited to 'kdevdesigner/designer/widgetfactory.cpp')
| -rw-r--r-- | kdevdesigner/designer/widgetfactory.cpp | 1805 | 
1 files changed, 1805 insertions, 0 deletions
| diff --git a/kdevdesigner/designer/widgetfactory.cpp b/kdevdesigner/designer/widgetfactory.cpp new file mode 100644 index 00000000..9d04535a --- /dev/null +++ b/kdevdesigner/designer/widgetfactory.cpp @@ -0,0 +1,1805 @@ +/********************************************************************** +** 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 <tqvariant.h> // HP-UX compiler need this here +#include "widgetfactory.h" +#include <widgetdatabase.h> +#include "metadatabase.h" +#include "mainwindow.h" +#include "formwindow.h" +#include "propertyeditor.h" +#include "tqlayout.h" +#include "listboxeditorimpl.h" +#include "listvieweditorimpl.h" +#include "iconvieweditorimpl.h" +#include "formwindow.h" +#include "multilineeditorimpl.h" +#include "../interfaces/widgetinterface.h" +#ifndef TQT_NO_TABLE +#include "tableeditorimpl.h" +#endif +#include "project.h" +#include "menubareditor.h" +#include "popupmenueditor.h" + +#include "kdevdesigner_part.h" + +#include <kiconloader.h> + +#include <tqfeatures.h> + +#include <tqpixmap.h> +#include <tqgroupbox.h> +#include <tqiconview.h> +#ifndef TQT_NO_TABLE +#include <tqtable.h> +#endif +#ifndef TQT_NO_SQL +#include <tqdatatable.h> +#endif +#include <tqdatetimeedit.h> +#include <tqlineedit.h> +#include <tqspinbox.h> +#include <tqmultilineedit.h> +#include <tqtextedit.h> +#include <tqlabel.h> +#include <tqlayout.h> +#include <tqwidgetstack.h> +#include <tqcombobox.h> +#include <tqtabbar.h> +#include <tqlistbox.h> +#include <tqlistview.h> +#include <tqobjectlist.h> +#include <tqlcdnumber.h> +#include <tqslider.h> +#include <tqdial.h> +#include <tqprogressbar.h> +#include <tqtextview.h> +#include <tqtextbrowser.h> +#include <tqframe.h> +#include <tqmetaobject.h> +#include <tqwidgetstack.h> +#include <tqwizard.h> +#include <tqvaluelist.h> +#include <tqtimer.h> +#include <tqscrollbar.h> +#include <tqmainwindow.h> +#include <tqmenubar.h> +#include <tqapplication.h> +#include <tqsplitter.h> +#include <tqtoolbox.h> +#include <tqsizegrip.h> +#ifndef TQT_NO_SQL +#include "database.h" +#endif + +#define NO_STATIC_COLORS +#include <globaldefs.h> +#include <tqobject.h> + +#include <tdelocale.h> + +FormWindow *find_formwindow( TQWidget *w ) +{ +    if ( !w ) +	return 0; +    for (;;) { +	if ( ::tqqt_cast<FormWindow*>(w) ) +	    return (FormWindow*)w; +	if ( !w->parentWidget() ) +	    return 0; +	w = w->parentWidget(); +    } +} + +void TQLayoutWidget::paintEvent( TQPaintEvent* ) +{ +    TQPainter p ( this ); +    p.setPen( red ); +    p.drawRect( rect() ); +} + + +QDesignerTabWidget::QDesignerTabWidget( TQWidget *parent, const char *name ) +    : TQTabWidget( parent, name ), dropIndicator( 0 ), dragPage( 0 ), mousePressed( FALSE ) +{ +    tabBar()->setAcceptDrops( TRUE ); +    tabBar()->installEventFilter( this ); +} + +int QDesignerTabWidget::currentPage() const +{ +    return tabBar()->currentTab(); +} + +void QDesignerTabWidget::setCurrentPage( int i ) +{ +    tabBar()->setCurrentTab( i ); +} + +TQString QDesignerTabWidget::pageTitle() const +{ +    return ((TQTabWidget*)this)->tabLabel( TQTabWidget::currentPage() ); +} + +void QDesignerTabWidget::setPageTitle( const TQString& title ) +{ +    changeTab( TQTabWidget::currentPage(), title ); +} + +void QDesignerTabWidget::setPageName( const TQCString& name ) +{ +    if ( TQTabWidget::currentPage() ) +	TQTabWidget::currentPage()->setName( name ); +} + +TQCString QDesignerTabWidget::pageName() const +{ +    if ( !TQTabWidget::currentPage() ) +	return 0; +    return TQTabWidget::currentPage()->name(); +} + +int QDesignerTabWidget::count() const +{ +    return tabBar()->count(); +} + +bool QDesignerTabWidget::eventFilter( TQObject *o, TQEvent *e ) +{ +    if ( TQT_BASE_OBJECT(o) != TQT_BASE_OBJECT(tabBar()) ) return FALSE; + +    switch ( e->type() ) { +    case TQEvent::MouseButtonPress: { +	mousePressed = TRUE; +	TQMouseEvent *me = (TQMouseEvent*)e; +	pressPoint = me->pos(); +    } +    break; +    case TQEvent::MouseMove: { +	TQMouseEvent *me = (TQMouseEvent*)e; +	if ( mousePressed && ( pressPoint - me->pos()).manhattanLength() > TQApplication::startDragDistance() ) { +	    TQTextDrag *drg = new TQTextDrag( TQString::number( (long) this ) , this ); +	    mousePressed = FALSE; +	    dragPage = TQTabWidget::currentPage(); +	    dragLabel = TQTabWidget::tabLabel( dragPage ); + +	    int index = indexOf( dragPage ); + +	    removePage( dragPage ); +	    if ( !drg->dragMove() ) { +		insertTab( dragPage, dragLabel, index ); +		showPage( dragPage ); +	    } +	    if ( dropIndicator ) +		dropIndicator->hide(); +	} +    } +    break; +    case TQEvent::DragLeave:	{ +	if ( dropIndicator ) +	    dropIndicator->hide(); +    } +    break; +    case TQEvent::DragMove: { +	TQDragEnterEvent *de = (TQDragEnterEvent*) e; +	if ( TQTextDrag::canDecode( de ) ) { +	    TQString text; +	    TQTextDrag::decode( de, text ); +	    if ( text == TQString::number( (long)this ) ) +		de->accept(); +	    else +		return FALSE; +	} + +	int index = 0; +	TQRect rect; +	for ( ; index < tabBar()->count(); index++ ) { +	    if ( tabBar()->tabAt( index )->rect().contains( de->pos() ) ) { +		rect = tabBar()->tabAt( index )->rect(); +		break; +	    } +	} + +	if ( index == tabBar()->count() -1 ) { +	    TQRect rect2 = rect; +	    rect2.setLeft( rect2.left() + rect2.width() / 2 ); +	    if ( rect2.contains( de->pos() ) ) +		index++; +	} + +	if ( ! dropIndicator ) { +	    dropIndicator = new TQWidget( this ); +	    dropIndicator->setBackgroundColor( red ); +	} + +	TQPoint pos; +	if ( index == tabBar()->count() ) +	    pos = tabBar()->mapToParent( TQPoint( rect.x() + rect.width(), rect.y() ) ); +	else +	    pos = tabBar()->mapToParent( TQPoint( rect.x(), rect.y() ) ); + +	dropIndicator->setGeometry( pos.x(), pos.y() , 3, rect.height() ); +	dropIndicator->show(); +    } +    break; +    case TQEvent::Drop: { +	TQDragEnterEvent *de = (TQDragEnterEvent*) e; +	if ( TQTextDrag::canDecode( de ) ) { +	    TQString text; +	    TQTextDrag::decode( de, text ); +	    if ( text == TQString::number( (long)this ) ) { + +		int newIndex = 0; +		for ( ; newIndex < tabBar()->count(); newIndex++ ) { +		    if ( tabBar()->tabAt( newIndex )->rect().contains( de->pos() ) ) +			break; +		} + +		if ( newIndex == tabBar()->count() -1 ) { +		    TQRect rect2 = tabBar()->tabAt( newIndex )->rect(); +		    rect2.setLeft( rect2.left() + rect2.width() / 2 ); +		    if ( rect2.contains( de->pos() ) ) +			newIndex++; +		} + +		int oldIndex = 0; +		for ( ; oldIndex < tabBar()->count(); oldIndex++ ) { +		    if ( tabBar()->tabAt( oldIndex )->rect().contains( pressPoint ) ) +			break; +		} + +		FormWindow *fw = find_formwindow( this ); +		MoveTabPageCommand *cmd = +		    new MoveTabPageCommand( i18n( "Move Tab Page" ), fw, this, +					    dragPage, dragLabel, newIndex, oldIndex ); +		fw->commandHistory()->addCommand( cmd ); +		cmd->execute(); +		de->accept(); +	    } +	} +    } +    break; +    default: +	break; +    } +    return FALSE; +} + + +QDesignerWidgetStack::QDesignerWidgetStack( TQWidget *parent, const char *name ) +    : TQWidgetStack( parent, name ) +{ +    prev = new TQToolButton( TQt::LeftArrow, this, "designer_wizardstack_button" ); +    prev->setAutoRaise( TRUE ); +    prev->setAutoRepeat( TRUE ); +    prev->setSizePolicy( TQSizePolicy( TQSizePolicy::Ignored, TQSizePolicy::Ignored ) ); +    next = new TQToolButton( TQt::RightArrow, this, "designer_wizardstack_button" ); +    next->setAutoRaise( TRUE ); +    next->setAutoRepeat( TRUE ); +    next->setSizePolicy( TQSizePolicy( TQSizePolicy::Ignored, TQSizePolicy::Ignored ) ); +    connect( prev, TQT_SIGNAL( clicked() ), this, TQT_SLOT( prevPage() ) ); +    connect( next, TQT_SIGNAL( clicked() ), this, TQT_SLOT( nextPage() ) ); +    updateButtons(); +} + +void QDesignerWidgetStack::updateButtons() +{ +    prev->setGeometry( width() - 31, 1, 15, 15 ); +    next->setGeometry( width() - 16, 1, 15, 15 ); +    prev->show(); +    next->show(); +    prev->raise(); +    next->raise(); +} + +void QDesignerWidgetStack::prevPage() +{ +    setCurrentPage( currentPage() - 1 ); +} + +void QDesignerWidgetStack::nextPage() +{ +    setCurrentPage( currentPage() + 1 ); +} + +int QDesignerWidgetStack::currentPage() const +{ +    QDesignerWidgetStack* that = (QDesignerWidgetStack*) this; +    return that->pages.find( visibleWidget() ); +} + +void QDesignerWidgetStack::setCurrentPage( int i ) +{ +    // help next/prev page commands +    if ( i < 0 ) +	i += count(); +    if ( i >= count() ) +	i -= count(); + +    if ( i < 0 || i >= count() ) +	return; +    raiseWidget( pages.at( i ) ); +    updateButtons(); +} + +TQCString QDesignerWidgetStack::pageName() const +{ +    if ( !visibleWidget() ) +	return 0; +    return visibleWidget()->name(); +} + +void QDesignerWidgetStack::setPageName( const TQCString& name ) +{ +    if ( visibleWidget() ) +	visibleWidget()->setName( name ); +} + +int QDesignerWidgetStack::count() const +{ +    return pages.count(); +} + +TQWidget* QDesignerWidgetStack::page( int i ) const +{ +    if ( i < 0 || i >= count() ) +	return 0; +    QDesignerWidgetStack* that = (QDesignerWidgetStack*) this; +    return that->pages.at( i ); +} + + +int QDesignerWidgetStack::insertPage( TQWidget *p, int i ) +{ +    if ( i < 0 ) +	pages.append( p ); +    else +	pages.insert( (uint) i, p ); +    addWidget( p ); +    p->show(); +    raiseWidget( p ); +    TQApplication::sendPostedEvents(); +    updateButtons(); +    return pages.find( p ); +} + +int QDesignerWidgetStack::removePage( TQWidget *p ) +{ +    int i = pages.find( p ); +    pages.remove( p ); +    removeWidget( p ); +    setCurrentPage( 0 ); +    updateButtons(); +    return i; +} + + +int QDesignerWizard::currentPageNum() const +{ +    for ( int i = 0; i < pageCount(); ++i ) { +	if ( page( i ) == currentPage() ) +	    return i; +    } +    return 0; +} + + + + + +void QDesignerWizard::setCurrentPage( int i ) +{ +    if ( i < currentPageNum() ) { +	while ( i < currentPageNum() ) { +	    if ( currentPageNum() == 0 ) +		break; +	    back(); +	} + +    } else { +	while ( i > currentPageNum() ) { +	    if ( currentPageNum() == pageCount() - 1 ) +		break; +	    next(); +	} +    } +} + +TQString QDesignerWizard::pageTitle() const +{ +    return title( currentPage() ); +} + +void QDesignerWizard::setPageTitle( const TQString& title ) +{ +    setTitle( currentPage(), title ); +} + +void QDesignerWizard::setPageName( const TQCString& name ) +{ +    if ( TQWizard::currentPage() ) +	TQWizard::currentPage()->setName( name ); +} + +TQCString QDesignerWizard::pageName() const +{ +    if ( !TQWizard::currentPage() ) +	return 0; +    return TQWizard::currentPage()->name(); +} + +int QDesignerWizard::pageNum( TQWidget *p ) +{ +    for ( int i = 0; i < pageCount(); ++i ) { +	if ( page( i ) == p ) +	    return i; +    } +    return -1; +} + +void QDesignerWizard::addPage( TQWidget *p, const TQString &t ) +{ +    TQWizard::addPage( p, t ); +    if ( removedPages.find( p ) ) +	removedPages.remove( p ); +} + +void QDesignerWizard::removePage( TQWidget *p ) +{ +    TQWizard::removePage( p ); +    removedPages.insert( p, p ); +} + +void QDesignerWizard::insertPage( TQWidget *p, const TQString &t, int index ) +{ +    TQWizard::insertPage( p, t, index ); +    if ( removedPages.find( p ) ) +	removedPages.remove( p ); +} + +TQMap< int, TQMap< TQString, TQVariant> > *defaultProperties = 0; +TQMap< int, TQStringList > *changedProperties = 0; + +/*! +  \class WidgetFactory widgetfactory.h +  \brief Set of static functions for creating widgets, layouts and do other stuff + +  The widget factory offers functions to create widgets, create and +  delete layouts find out other details - all based on the +  WidgetDatabase's data. So the functions that use ids use the same +  ids as in the WidgetDatabase. +*/ + + +void WidgetFactory::saveDefaultProperties( TQObject *w, int id ) +{ +    TQMap< TQString, TQVariant> propMap; +    TQStrList lst = w->metaObject()->propertyNames( TRUE ); +    for ( uint i = 0; i < lst.count(); ++i ) { +	TQVariant var = w->property( lst.at( i ) ); +	if ( !var.isValid() && qstrcmp( "pixmap", lst.at( i ) ) == 0 ) +	    var = TQVariant( TQPixmap() ); +	else if ( !var.isValid() && qstrcmp( "iconSet", lst.at( i ) ) == 0 ) +	    var = TQVariant( TQIconSet() ); +	propMap.replace( lst.at( i ), var ); +    } +    defaultProperties->replace( id, propMap ); +} + +void WidgetFactory::saveChangedProperties( TQObject *w, int id ) +{ +    TQStringList l = MetaDataBase::changedProperties( w ); +    changedProperties->insert( id, l ); +} + +/*!  Creates a widget of the type which is registered as \a id as +  child of \a parent. The \a name is optional. If \a init is TRUE, the +  widget is initialized with some defaults, else the plain widget is +  created. +*/ + +TQWidget *WidgetFactory::create( int id, TQWidget *parent, const char *name, bool init, const TQRect *r, Qt::Orientation orient ) +{ +    TQString n = WidgetDatabase::className( id ); +    if ( n.isEmpty() ) +	return 0; + +    if ( !defaultProperties ) { +	defaultProperties = new TQMap< int, TQMap< TQString, TQVariant> >(); +	changedProperties = new TQMap< int, TQStringList >(); +    } + +    TQWidget *w = 0; +    TQString str = WidgetDatabase::createWidgetName( id ); +    const char *s = str.latin1(); +    w = createWidget( n, parent, name ? name : s, init, r, orient ); +    if ( ::tqqt_cast<TQScrollView*>(w) ) +	( (TQScrollView*)w )->disableSizeHintCaching(); +    if ( !w && WidgetDatabase::isCustomWidget( id ) ) +	w = createCustomWidget( parent, name ? name : s, MetaDataBase::customWidget( id ) ); +    if ( !w ) +	return 0; +    MetaDataBase::addEntry( TQT_TQOBJECT(w) ); + +    if ( !defaultProperties->contains( id ) ) +	saveDefaultProperties( TQT_TQOBJECT(w), id ); +    if ( !changedProperties->contains( id ) ) +	saveChangedProperties( TQT_TQOBJECT(w), id ); + +    return w; +} + +/*!  Creates a layout on the widget \a widget of the type \a type +  which can be \c HBox, \c VBox or \c Grid. +*/ + +TQLayout *WidgetFactory::createLayout( TQWidget *widget, TQLayout *layout, LayoutType type ) +{ +    int spacing = MainWindow::self->currentLayoutDefaultSpacing(); +    int margin = 0; + +    int metaspacing = MetaDataBase::spacing( TQT_TQOBJECT(widget) ); +    int metamargin = MetaDataBase::margin( TQT_TQOBJECT(widget) ); + +    if ( ::tqqt_cast<TQLayoutWidget*>(widget) && +	 ( WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(widget) ) ) ) || +	   widget && ::tqqt_cast<FormWindow*>(widget->parentWidget()) ) ) +	margin = MainWindow::self->currentLayoutDefaultMargin(); + +    if ( !layout && ::tqqt_cast<TQTabWidget*>(widget) ) +	widget = ((TQTabWidget*)widget)->currentPage(); + +    if ( !layout && ::tqqt_cast<TQWizard*>(widget) ) +	widget = ((TQWizard*)widget)->currentPage(); + +    if ( !layout && ::tqqt_cast<TQMainWindow*>(widget) ) +	widget = ((TQMainWindow*)widget)->centralWidget(); + +    if ( !layout && ::tqqt_cast<TQWidgetStack*>(widget) ) +	widget = ((TQWidgetStack*)widget)->visibleWidget(); + +    if ( !layout && ::tqqt_cast<TQToolBox*>(widget) ) +	widget = ((TQToolBox*)widget)->currentItem(); + +    MetaDataBase::addEntry( TQT_TQOBJECT(widget) ); + +    TQLayout *l = 0; +    int align = 0; +    if ( !layout && ::tqqt_cast<TQGroupBox*>(widget) ) { +	TQGroupBox *gb = (TQGroupBox*)widget; +	gb->setColumnLayout( 0, Qt::Vertical ); +	layout = gb->layout(); +	layout->setMargin( 0 ); +	layout->setSpacing( 0 ); +	switch ( type ) { +	case HBox: +	    l = new TQHBoxLayout( layout ); +	    break; +	case VBox: +	    l = new TQVBoxLayout( layout ); +	    break; +	case Grid: +	    l = new QDesignerGridLayout( layout ); +	    break; +	default: +	    return 0; +	} +	align = TQt::AlignTop; +	MetaDataBase::setMargin( TQT_TQOBJECT(gb), metamargin ); +	MetaDataBase::setSpacing( TQT_TQOBJECT(gb), metaspacing ); +    } else { +	if ( layout ) { +	    switch ( type ) { +	    case HBox: +		l = new TQHBoxLayout( layout ); +		break; +	    case VBox: +		l = new TQVBoxLayout( layout ); +		break; +	    case Grid: +		l = new QDesignerGridLayout( layout ); +		break; +	    default: +		return 0; +	    } +	    MetaDataBase::addEntry( TQT_TQOBJECT(l) ); +	    l->setSpacing( spacing ); +	    l->setMargin( margin ); +	} else { +	    switch ( type ) { +	    case HBox: +		l = new TQHBoxLayout( widget ); +		break; +	    case VBox: +		l = new TQVBoxLayout( widget ); +		break; +	    case Grid: +		l = new QDesignerGridLayout( widget ); +		break; +	    default: +		return 0; +	    } +	    MetaDataBase::addEntry( TQT_TQOBJECT(l) ); +	    if ( widget ) { +		MetaDataBase::setMargin( TQT_TQOBJECT(widget), metamargin ); +		MetaDataBase::setSpacing( TQT_TQOBJECT(widget), metaspacing ); +	    } else { +		l->setMargin( margin ); +		l->setSpacing( spacing ); +	    } +	} +    } +    l->setAlignment( align ); +    MetaDataBase::addEntry( TQT_TQOBJECT(l) ); +    return l; +} + +void WidgetFactory::deleteLayout( TQWidget *widget ) +{ +    if ( !widget ) +	return; + +    if ( ::tqqt_cast<TQTabWidget*>(widget) ) +	widget = ((TQTabWidget*)widget)->currentPage(); +    if ( ::tqqt_cast<TQWizard*>(widget) ) +	widget = ((TQWizard*)widget)->currentPage(); +    if ( ::tqqt_cast<TQMainWindow*>(widget) ) +	widget = ((TQMainWindow*)widget)->centralWidget(); +    if ( ::tqqt_cast<TQWidgetStack*>(widget) ) +	widget = ((TQWidgetStack*)widget)->visibleWidget(); +    if ( ::tqqt_cast<TQToolBox*>(widget) ) +	widget = ((TQToolBox*)widget)->currentItem(); +    delete widget->layout(); +} + +/*!  Factory functions for creating a widget of the type \a className +  as child of \a parent with the name \a name. + +  If \a init is TRUE, some initial default properties are set. This +  has to be in sync with the initChangedProperties() function! +*/ + +TQWidget *WidgetFactory::createWidget( const TQString &className, TQWidget *parent, const char *name, bool init, +				      const TQRect *r, Qt::Orientation orient ) +{ +    if ( className == TQPUSHBUTTON_OBJECT_NAME_STRING ) { +	TQPushButton *b = 0; +	if ( init ) { +	    b = new QDesignerPushButton( parent, name ); +	    b->setText( TQString::fromLatin1( name ) ); +	} else { +	    b = new QDesignerPushButton( parent, name ); +	} +	TQWidget *w = find_formwindow( b ); +	b->setAutoDefault( w && ::tqqt_cast<TQDialog*>(((FormWindow*)w)->mainContainer()) ); +	return b; +    } else if ( className == TQTOOLBUTTON_OBJECT_NAME_STRING ) { +	if ( init ) { +	    QDesignerToolButton *tb = new QDesignerToolButton( parent, name ); +	    if ( ::tqqt_cast<TQToolBox*>(widgetOfContainer(parent))) { +		tb->setUsesTextLabel(TRUE); +		tb->setTextLabel("..."); +		tb->setAutoRaise(TRUE); +		tb->setTextPosition(TQToolButton::BesideIcon); +	    } else { +		tb->setText( "..." ); +	    } +	    return tb; +	} +	return new QDesignerToolButton( parent, name ); +    } else if ( className == TQCHECKBOX_OBJECT_NAME_STRING ) { +	if ( init ) { +	    QDesignerCheckBox *cb = new QDesignerCheckBox( parent, name ); +	    cb->setText( TQString::fromLatin1( name ) ); +	    return cb; +	} +	return new QDesignerCheckBox( parent, name ); +    } else if ( className == TQRADIOBUTTON_OBJECT_NAME_STRING ) { +	if ( init ) { +	    QDesignerRadioButton *rb = new QDesignerRadioButton( parent, name ); +	    rb->setText( TQString::fromLatin1( name ) ); +	    return rb; +	} +	return new QDesignerRadioButton( parent, name ); +    } else if ( className == TQGROUPBOX_OBJECT_NAME_STRING ) { +	if ( init ) +	    return new TQGroupBox( TQString::fromLatin1( name ), parent, name ); +	return new TQGroupBox( parent, name ); +    } else if ( className == TQBUTTONGROUP_OBJECT_NAME_STRING ) { +	if ( init ) +	    return new TQButtonGroup( TQString::fromLatin1( name ), parent, name ); +	return new TQButtonGroup( parent, name ); +    } else if ( className == TQICONVIEW_OBJECT_NAME_STRING ) { +#if !defined(TQT_NO_ICONVIEW) +	TQIconView* iv = new TQIconView( parent, name ); +	if ( init ) +	    (void) new TQIconViewItem( iv, i18n( "New Item" ) ); +	return iv; +#else +	return 0; +#endif +    } else if ( className == TQTABLE_OBJECT_NAME_STRING ) { +#if !defined(TQT_NO_TABLE) +	if ( init ) +	    return new TQTable( 3, 3, parent, name ); +	return new TQTable( parent, name ); +#else +	return 0; +#endif +#ifndef TQT_NO_SQL +    } else if ( className == TQDATATABLE_OBJECT_NAME_STRING ) { +	return new TQDataTable( parent, name ); +#endif //TQT_NO_SQL +    } 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 == TQLISTBOX_OBJECT_NAME_STRING ) { +	TQListBox* lb = new TQListBox( parent, name ); +	if ( init ) { +	    lb->insertItem( i18n( "New Item" ) ); +	    lb->setCurrentItem( 0 ); +	} +	return lb; +    } else if ( className == TQLISTVIEW_OBJECT_NAME_STRING ) { +	TQListView *lv = new TQListView( parent, name ); +	lv->setSorting( -1 ); +	if ( init ) { +	    lv->addColumn( i18n( "Column 1" ) ); +	    lv->setCurrentItem( new TQListViewItem( lv, i18n( "New Item" ) ) ); +	} +	return lv; +    } 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 == TQSPLITTER_OBJECT_NAME_STRING ) +	return new TQSplitter( parent, name ); +    else if ( className == TQMULTILINEEDIT_OBJECT_NAME_STRING ) +	return new TQMultiLineEdit( parent, name ); +    else if ( className == TQTEXTEDIT_OBJECT_NAME_STRING ) +	return new TQTextEdit( parent, name ); +    else if ( className == TQLABEL_OBJECT_NAME_STRING  || className == "TextLabel" ) { +	QDesignerLabel *l = new QDesignerLabel( parent, name ); +	if ( init ) { +	    l->setText( TQString::fromLatin1( name ) ); +	    MetaDataBase::addEntry( TQT_TQOBJECT(l) ); +	    MetaDataBase::setPropertyChanged( TQT_TQOBJECT(l), "text", TRUE ); +	} +	return l; +    } else if ( className == "PixmapLabel" ) { +	QDesignerLabel *l = new QDesignerLabel( parent, name ); +	if ( init ) { +	    l->setPixmap( BarIcon( "designer_qtlogo.png", KDevDesignerPartFactory::instance() ) ); +	    l->setScaledContents( TRUE ); +	    MetaDataBase::addEntry( TQT_TQOBJECT(l) ); +	    MetaDataBase::setPropertyChanged( TQT_TQOBJECT(l), "pixmap", TRUE ); +	    MetaDataBase::setPropertyChanged( TQT_TQOBJECT(l), "scaledContents", TRUE ); +	} +	return l; +    } else if ( className == TQLAYOUTWIDGET_OBJECT_NAME_STRING ) +	return new TQLayoutWidget( parent, name ); +    else if ( className == TQTABWIDGET_OBJECT_NAME_STRING ) { +	TQTabWidget *tw = new QDesignerTabWidget( parent, name ); +	if ( init ) { +	    FormWindow *fw = find_formwindow( parent ); +	    TQWidget *w = fw ? new QDesignerWidget( fw, tw, "tab" ) : new TQWidget( tw, "tab" ); +	    tw->addTab( w, i18n("Tab 1") ); +	    MetaDataBase::addEntry( TQT_TQOBJECT(w) ); +	    w = fw ? new QDesignerWidget( fw, tw, "tab" ) : new TQWidget( tw, "tab" ); +	    tw->addTab( w, i18n("Tab 2") ); +	    MetaDataBase::addEntry( TQT_TQOBJECT(tw) ); +	    MetaDataBase::addEntry( TQT_TQOBJECT(w) ); +	} +	return tw; +    } else if ( className == TQWIDGETSTACK_OBJECT_NAME_STRING ) { +	QDesignerWidgetStack *ws = new QDesignerWidgetStack( parent, name ); +	if ( init ) { +	    FormWindow *fw = find_formwindow( parent ); +	    TQWidget *w = fw ? new QDesignerWidget( fw, ws, "WStackPage" ) : new TQWidget( ws, "WStackPage" ); +	    ws->insertPage( w ); +	    MetaDataBase::addEntry( TQT_TQOBJECT(w) ); +	    MetaDataBase::addEntry( TQT_TQOBJECT(ws) ); +	} +	return ws; +    } else if ( className == TQCOMBOBOX_OBJECT_NAME_STRING ) { +	return new TQComboBox( FALSE, parent, name ); +    } else if ( className == TQWIDGET_OBJECT_NAME_STRING ) { +	if ( parent && +	     ( ::tqqt_cast<FormWindow*>(parent) || +	       ::tqqt_cast<TQWizard*>(parent) || +	       ::tqqt_cast<TQTabWidget*>(parent) || +	       ::tqqt_cast<TQWidgetStack*>(parent) || +	       ::tqqt_cast<TQToolBox*>(parent) || +	       ::tqqt_cast<TQMainWindow*>(parent) ) ) { +	    FormWindow *fw = find_formwindow( parent ); +	    if ( fw ) { +		QDesignerWidget *dw = new QDesignerWidget( fw, parent, name ); +		MetaDataBase::addEntry( TQT_TQOBJECT(dw) ); +		return dw; +	    } +	} +	return new TQWidget( parent, name ); +    } else if ( className == TQDIALOG_OBJECT_NAME_STRING ) { +	TQDialog *dia = 0; +	if ( ::tqqt_cast<FormWindow*>(parent) ) +	    dia = new QDesignerDialog( (FormWindow*)parent, parent, name ); +	else +	    dia = new TQDialog( parent, name ); +#if defined(TQT_NON_COMMERCIAL) +	if ( ::tqqt_cast<MainWindow*>(parent) ) +#else +	if ( parent ) +#endif +	    dia->reparent( parent, TQPoint( 0, 0 ), TRUE ); +	return dia; +    } else if ( className == TQWIZARD_OBJECT_NAME_STRING ) { +	TQWizard *wiz = new QDesignerWizard( parent, name ); +#if defined(TQT_NON_COMMERCIAL) +	if ( ::tqqt_cast<MainWindow*>(parent) ) +#else +	if ( parent ) +#endif +	    wiz->reparent( parent, TQPoint( 0, 0 ), TRUE ); +	if ( init && ::tqqt_cast<FormWindow*>(parent) ) { +	    QDesignerWidget *dw = new QDesignerWidget( (FormWindow*)parent, wiz, "WizardPage" ); +	    MetaDataBase::addEntry( TQT_TQOBJECT(dw) ); +	    wiz->addPage( dw, i18n( "Page" ) ); +	    TQTimer::singleShot( 0, wiz, TQT_SLOT( next() ) ); +	} +	return wiz; +    } else if ( className == "Spacer" ) { +	Spacer *s = new Spacer( parent, name ); +	MetaDataBase::addEntry( TQT_TQOBJECT(s) ); +	MetaDataBase::setPropertyChanged( TQT_TQOBJECT(s), "orientation", TRUE ); +	MetaDataBase::setPropertyChanged( TQT_TQOBJECT(s), "sizeType", TRUE ); +	if ( !r ) +	    return s; +	if ( !r->isValid() || r->width() < 2 && r->height() < 2 ) +	    s->setOrientation( orient ); +	else if ( r->width() < r->height() ) +	    s->setOrientation( Qt::Vertical ); +	else +	    s->setOrientation( Qt::Horizontal ); +	return s; +    } 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 ) { +	TQSlider *s = new TQSlider( parent, name ); +	if ( !r ) +	    return s; +	if ( !r->isValid() || r->width() < 2 && r->height() < 2 ) +	    s->setOrientation( orient ); +	else if ( r->width() > r->height() ) +	    s->setOrientation( Qt::Horizontal ); +	MetaDataBase::addEntry( TQT_TQOBJECT(s) ); +	MetaDataBase::setPropertyChanged( TQT_TQOBJECT(s), "orientation", TRUE ); +	return s; +    } else if ( className == TQSCROLLBAR_OBJECT_NAME_STRING ) { +	TQScrollBar *s = new TQScrollBar( parent, name ); +	if ( !r ) +	    return s; +	if ( !r->isValid() || r->width() < 2 && r->height() < 2 ) +	    s->setOrientation( orient ); +	else if ( r->width() > r->height() ) +	    s->setOrientation( Qt::Horizontal ); +	MetaDataBase::addEntry( TQT_TQOBJECT(s) ); +	MetaDataBase::setPropertyChanged( TQT_TQOBJECT(s), "orientation", TRUE ); +	return s; +    } else if ( className == TQFRAME_OBJECT_NAME_STRING ) { +	if ( !init ) +	    return new TQFrame( parent, name ); +	TQFrame *f = new TQFrame( parent, name ); +	f->setFrameStyle( TQFrame::StyledPanel | TQFrame::Raised ); +	return f; +    } else if ( className == "Line" ) { +	Line *l = new Line( parent, name ); +	MetaDataBase::addEntry( TQT_TQOBJECT(l) ); +	MetaDataBase::setPropertyChanged( TQT_TQOBJECT(l), "orientation", TRUE ); +	MetaDataBase::setPropertyChanged( TQT_TQOBJECT(l), "frameShadow", TRUE ); +	MetaDataBase::setPropertyChanged( TQT_TQOBJECT(l), "frameShape", TRUE ); +	if ( !r ) +	    return l; +	if ( !r->isValid() || r->width() < 2 && r->height() < 2 ) +	    l->setOrientation( orient ); +	else if ( r->width() < r->height() ) +	    l->setOrientation( Qt::Vertical ); +	return l; +    } else if ( className == TQMAINWINDOW_OBJECT_NAME_STRING ) { +	TQMainWindow *mw = new TQMainWindow( parent, name, 0 ); +	mw->setDockEnabled( TQt::DockMinimized, FALSE ); +	QDesignerWidget *dw = new QDesignerWidget( (FormWindow*)parent, mw, "central widget" ); +	mw->setDockMenuEnabled( FALSE ); +	MetaDataBase::addEntry( TQT_TQOBJECT(dw) ); +	mw->setCentralWidget( dw ); +	(void)mw->statusBar(); +	dw->show(); +	return mw; +    } else if ( className == TQTOOLBOX_OBJECT_NAME_STRING ) { +	if ( !init ) +	    return new QDesignerToolBox( parent, name ); +	TQToolBox *tb = new QDesignerToolBox( parent, name ); +	FormWindow *fw = find_formwindow( parent ); +	TQWidget *w = fw ? new QDesignerWidget( fw, tb, "page1" ) : +		     new TQWidget( tb, "page1" ); +	tb->addItem( w, i18n("Page 1") ); +	MetaDataBase::addEntry( TQT_TQOBJECT(w) ); +	w = fw ? new QDesignerWidget( fw, tb, "page2" ) : new TQWidget( tb, "page2" ); +	tb->addItem( w, i18n("Page 2") ); +	MetaDataBase::addEntry( TQT_TQOBJECT(tb) ); +	MetaDataBase::addEntry( TQT_TQOBJECT(w) ); +	return tb; +    } +#ifndef TQT_NO_SQL +    else if ( className == TQDATABROWSER_OBJECT_NAME_STRING ) { +	TQWidget *w = new QDesignerDataBrowser( parent, name ); +	if ( parent ) +	    w->reparent( parent, TQPoint( 0, 0 ), TRUE ); +	return w; +    } else if ( className == TQDATAVIEW_OBJECT_NAME_STRING ) { +	TQWidget *w = new QDesignerDataView( parent, name ); +	if ( parent ) +	    w->reparent( parent, TQPoint( 0, 0 ), TRUE ); +	return w; +    } +#endif + +    WidgetInterface *iface = 0; +    widgetManager()->queryInterface( className, &iface ); +    if ( !iface ) +	return 0; + +    TQWidget *w = iface->create( className, parent, name ); +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS +    if ( init && WidgetDatabase::isCustomPluginWidget( WidgetDatabase::idFromClassName( className ) ) ) { +	TQWidgetContainerInterfacePrivate *iface2 = 0; +	iface->queryInterface( IID_TQWidgetContainer, (TQUnknownInterface**)&iface2 ); +	if ( iface2 ) { +	    iface2->addPage( className, w, "Page", -1 ); +	    iface2->release(); +	} +    } +#endif // TQT_CONTAINER_CUSTOM_WIDGETS +    iface->release(); +    return w; +} + + + +/*!  Find out which type the layout of the widget is. Returns \c HBox, +  \c VBox, \c Grid or \c NoLayout.  \a layout points to this +  TQWidget::layout() of \a w or to 0 after the function call. +*/ + +WidgetFactory::LayoutType WidgetFactory::layoutType( TQWidget *w, TQLayout *&layout ) +{ +    layout = 0; + +    if ( ::tqqt_cast<TQTabWidget*>(w) ) +	w = ((TQTabWidget*)w)->currentPage(); +    if ( ::tqqt_cast<TQWizard*>(w) ) +	w = ((TQWizard*)w)->currentPage(); +    if ( ::tqqt_cast<TQMainWindow*>(w) ) +	w = ((TQMainWindow*)w)->centralWidget(); +    if ( ::tqqt_cast<TQWidgetStack*>(w) ) +	w = ((TQWidgetStack*)w)->visibleWidget(); +    if ( ::tqqt_cast<TQToolBox*>(w) ) +	w = ((TQToolBox*)w)->currentItem(); + +    if ( ::tqqt_cast<TQSplitter*>(w) ) +	return ( (TQSplitter*)w )->orientation() ==Qt::Horizontal ? HBox : VBox; + +    if ( !w || !w->layout() ) +	return NoLayout; +    TQLayout *lay = w->layout(); + +    if ( ::tqqt_cast<TQGroupBox*>(w) ) { +	TQObjectList *l = TQT_TQOBJECT(lay)->queryList( TQLAYOUT_OBJECT_NAME_STRING ); +	if ( l && l->first() ) +	    lay = (TQLayout*)l->first(); +	delete l; +    } +    layout = lay; + +    if ( ::tqqt_cast<TQHBoxLayout*>(lay) ) +	return HBox; +    else if ( ::tqqt_cast<TQVBoxLayout*>(lay) ) +	return VBox; +    else if ( ::tqqt_cast<TQGridLayout*>(lay) ) +	return Grid; +    return NoLayout; +} + +/*! +  \overload +*/ +WidgetFactory::LayoutType WidgetFactory::layoutType( TQLayout *layout ) +{ +    if ( ::tqqt_cast<TQHBoxLayout*>(layout) ) +	return HBox; +    else if ( ::tqqt_cast<TQVBoxLayout*>(layout) ) +	return VBox; +    else if ( ::tqqt_cast<TQGridLayout*>(layout) ) +	return Grid; +    return NoLayout; +} + +/*! +  \overload +*/ +WidgetFactory::LayoutType WidgetFactory::layoutType( TQWidget *w ) +{ +    TQLayout *l = 0; +    return layoutType( w, l ); +} + + +TQWidget *WidgetFactory::layoutParent( TQLayout *layout ) +{ +    TQObject *o = TQT_TQOBJECT(layout); +    while ( o ) { +	if ( o->isWidgetType() ) +	    return (TQWidget*)o; +	o = o->parent(); +    } +    return 0; +} + +/*!  Returns the widget into which children should be inserted when \a +  w is a container known to the designer. + +  Usually that is \a w itself, sometimes it is different (e.g. a +  tabwidget is known to the designer as a container but the child +  widgets should be inserted into the current page of the +  tabwidget. So in this case this function returns the current page of +  the tabwidget.) + */ +TQWidget* WidgetFactory::containerOfWidget( TQWidget *w ) +{ +    if ( !w ) +	return w; +    if ( ::tqqt_cast<TQTabWidget*>(w) ) +	return ((TQTabWidget*)w)->currentPage(); +    if ( ::tqqt_cast<TQWizard*>(w) ) +	return ((TQWizard*)w)->currentPage(); +    if ( ::tqqt_cast<TQWidgetStack*>(w) ) +	return ((TQWidgetStack*)w)->visibleWidget(); +    if ( ::tqqt_cast<TQToolBox*>(w) ) +	return ((TQToolBox*)w)->currentItem(); +    if ( ::tqqt_cast<TQMainWindow*>(w) ) +	return ((TQMainWindow*)w)->centralWidget(); +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS +    if ( !WidgetDatabase::isCustomPluginWidget( WidgetDatabase::idFromClassName( classNameOf( w ) ) ) ) +	return w; +    WidgetInterface *iface = 0; +    widgetManager()->queryInterface( classNameOf( w ), &iface ); +    if ( !iface ) +	return w; +    TQWidgetContainerInterfacePrivate *iface2 = 0; +    iface->queryInterface( IID_TQWidgetContainer, (TQUnknownInterface**)&iface2 ); +    if ( !iface2 ) +	return w; +    TQWidget *c = iface2->containerOfWidget( w->className(), w ); +    iface2->release(); +    iface->release(); +    if ( c ) +	return c; +#endif // TQT_CONTAINER_CUSTOM_WIDGETS +    return w; +} + +/*!  Returns the actual designer widget of the container \a w. This is +  normally \a w itself, but might be a parent or grand parent of \a w +  (e.g. when working with a tabwidget and \a w is the container which +  contains and layouts childs, but the actual widget known to the +  designer is the tabwidget which is the parent of \a w. So this +  function returns the tabwidget then.) +*/ + +TQWidget* WidgetFactory::widgetOfContainer( TQWidget *w ) +{ +    if ( w && ::tqqt_cast<TQWidgetStack*>(w->parentWidget()) ) +	w = w->parentWidget(); +    if ( w->parentWidget() && w->parentWidget()->parentWidget() && +	 w->parentWidget()->parentWidget()->parentWidget() && +	 ::tqqt_cast<TQToolBox*>(w->parentWidget()->parentWidget()->parentWidget()) ) +	return w->parentWidget()->parentWidget()->parentWidget(); +    while ( w ) { +	int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ); +	if ( WidgetDatabase::isContainer( id ) || +	     w && ::tqqt_cast<FormWindow*>(w->parentWidget()) ) +	    return w; +	w = w->parentWidget(); +    } +    return w; +} + +/*! +  Returns whether \a o is a passive interactor or not. + */ + +bool WidgetFactory::lastWasAPassiveInteractor = FALSE; +TQGuardedPtr<TQObject> *WidgetFactory::lastPassiveInteractor = new TQGuardedPtr<TQObject>(); + +bool WidgetFactory::isPassiveInteractor( TQObject* o ) +{ +    if ( lastPassiveInteractor && *lastPassiveInteractor && (TQObject*)(*lastPassiveInteractor) == o ) +	return lastWasAPassiveInteractor; +    lastWasAPassiveInteractor = FALSE; +    (*lastPassiveInteractor) = o; +    if ( TQApplication::activePopupWidget() ) // if a popup is open, we have to make sure that this one is closed, else X might do funny things +	return ( lastWasAPassiveInteractor = TRUE ); + +    if ( ::tqqt_cast<TQTabBar*>(o) ) +	return ( lastWasAPassiveInteractor = TRUE ); +    else if ( ::tqqt_cast<TQSizeGrip*>(o) ) +	return ( lastWasAPassiveInteractor = TRUE ); +    else if ( ::tqqt_cast<TQButton*>(o) && +	      ( ::tqqt_cast<TQTabBar*>(o->parent()) || ::tqqt_cast<TQToolBox*>(o->parent()) ) ) +	return ( lastWasAPassiveInteractor = TRUE ); +    else if ( ::tqqt_cast<TQPushButton*>(o) && ::tqqt_cast<TQWizard*>(o->parent()) ) +	return ( lastWasAPassiveInteractor = TRUE ); +    else if ( ::tqqt_cast<TQMenuBar*>(o) && ::tqqt_cast<TQMainWindow*>(o->parent()) ) +	return ( lastWasAPassiveInteractor = TRUE ); +//    else if ( ::tqqt_cast<TQDockWindowHandle*>(o) ) +    else if ( o->inherits( TQDOCKWINDOWHANDLE_OBJECT_NAME_STRING ) ) +	return ( lastWasAPassiveInteractor = TRUE ); +//    else if ( ::tqqt_cast<TQHideDock*>(o) ) +    else if ( o->inherits( TQHIDEDOCK_OBJECT_NAME_STRING ) ) +	return ( lastWasAPassiveInteractor = TRUE ); +    else if ( qstrcmp( o->name(), "designer_wizardstack_button" ) == 0 ) +	return ( lastWasAPassiveInteractor = TRUE ); +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS +    if ( !o->isWidgetType() ) +	return ( lastWasAPassiveInteractor = FALSE ); +    WidgetInterface *iface = 0; +    TQWidget *w = (TQWidget*)o; +    while ( !iface && w && !::tqqt_cast<FormWindow*>(w) ) { +	widgetManager()->queryInterface( classNameOf( w ), &iface ); +	w = w->parentWidget(); +    } +    if ( !iface ) +	return ( lastWasAPassiveInteractor = FALSE ); +    TQWidgetContainerInterfacePrivate *iface2 = 0; +    iface->queryInterface( IID_TQWidgetContainer, (TQUnknownInterface**)&iface2 ); +    if ( !iface2 ) +	return ( lastWasAPassiveInteractor = FALSE ); +    TQWidget *fw = MainWindow::self->isAFormWindowChild( (TQWidget*)o ); +    if ( !fw ) +	return ( lastWasAPassiveInteractor = FALSE ); +    TQWidget *dw = ( (FormWindow*)fw )->designerWidget( (TQWidget*)o ); +    if ( !dw ) +	return ( lastWasAPassiveInteractor = FALSE ); +    lastWasAPassiveInteractor = iface2->isPassiveInteractor( dw->className(), (TQWidget*)o ); +    iface2->release(); +    iface->release(); +#endif // TQT_CONTAINER_CUSTOM_WIDGETS +    return lastWasAPassiveInteractor; +} + + +/*! +  Returns the class name of object \a o that should be used for externally (i.e. for saving) + */ +const char* WidgetFactory::classNameOf( TQObject* o ) +{ +    if ( o->isA( "PropertyObject" ) ) +	return o->className(); +    if (WidgetDatabase::isCustomPluginWidget(WidgetDatabase::idFromClassName(o->className()))) +        return o->className(); +    else if ( ::tqqt_cast<QDesignerTabWidget*>(o) ) +	return TQTABWIDGET_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<QDesignerWidgetStack*>(o) ) +	return TQWIDGETSTACK_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<TQWidgetStack*>(o) ) +	return "TQWeDoNotWantToBreakTabWidget"; +    else if ( ::tqqt_cast<QDesignerDialog*>(o) ) +	return TQDIALOG_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<QDesignerWidget*>(o) ) +	return TQWIDGET_OBJECT_NAME_STRING; +    else if ( o->inherits( "CustomWidget" ) ) +	return ( (CustomWidget*)o )->realClassName().latin1(); +    else if ( ::tqqt_cast<QDesignerLabel*>(o) ) +	return TQLABEL_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<QDesignerWizard*>(o) ) +	return TQWIZARD_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<QDesignerPushButton*>(o) ) +	return TQPUSHBUTTON_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<QDesignerToolButton*>(o) ) +	return TQTOOLBUTTON_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<QDesignerRadioButton*>(o) ) +	return TQRADIOBUTTON_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<QDesignerCheckBox*>(o) ) +	return TQCHECKBOX_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<MenuBarEditor*>(o) ) +	return TQMENUBAR_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<QDesignerToolBar*>(o) ) +	return TQTOOLBAR_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<QDesignerAction*>(o) ) +	return TQACTION_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<QDesignerActionGroup*>(o) ) +	return TQACTIONGROUP_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<PopupMenuEditor*>(o) ) +	return TQPOPUPMENU_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<QDesignerToolBox*>(o) ) +	return TQTOOLBOX_OBJECT_NAME_STRING; +#ifndef TQT_NO_SQL +    else if ( ::tqqt_cast<QDesignerDataBrowser*>(o) ) +	return TQDATABROWSER_OBJECT_NAME_STRING; +    else if ( ::tqqt_cast<QDesignerDataView*>(o) ) +	return TQDATAVIEW_OBJECT_NAME_STRING; +#endif +    return o->className(); +} + +TQString WidgetFactory::defaultSignal( TQObject *w ) +{ +    if ( ::tqqt_cast<TQRadioButton*>(w) || ::tqqt_cast<TQCheckBox*>(w) ) +	return "toggled"; +    else if ( ::tqqt_cast<TQButton*>(w) || ::tqqt_cast<TQButtonGroup*>(w) ) +	return "clicked"; +    else if ( ::tqqt_cast<TQTextBrowser*>(w) ) +	return "linkClicked"; +    else if ( ::tqqt_cast<TQLineEdit*>(w) || ::tqqt_cast<TQTextEdit*>(w) ) +	return "textChanged"; +    else if ( ::tqqt_cast<TQListView*>(w) || ::tqqt_cast<TQIconView*>(w) || +	      ::tqqt_cast<TQListBox*>(w) || ::tqqt_cast<TQTable*>(w) ) +	return "selectionChanged"; +    else if ( ::tqqt_cast<TQTabWidget*>(w) ) +	return "selected"; +    else if ( ::tqqt_cast<TQToolBox*>(w) ) +	return "currentChanged"; +    else if ( ::tqqt_cast<TQWidgetStack*>(w) ) +	return "aboutToShow"; +    else if ( ::tqqt_cast<TQSpinBox*>(w) || ::tqqt_cast<TQSlider*>(w) || +	      ::tqqt_cast<TQScrollBar*>(w) || ::tqqt_cast<TQDateEdit*>(w) || +	      ::tqqt_cast<TQTimeEdit*>(w) || ::tqqt_cast<TQDateTimeEdit*>(w) || +	      ::tqqt_cast<TQDial*>(w) ) +	return "valueChanged"; +    else if ( ::tqqt_cast<TQComboBox*>(w) ) +	return "activated"; +    return TQString(); +} + +/*!  As some properties are set by default when creating a widget this +  functions markes this properties as changed. Has to be in sync with +  createWidget()! +*/ + +void WidgetFactory::initChangedProperties( TQObject *o ) +{ +    if ( MainWindow::self && MainWindow::self->currProject() && +	 MainWindow::self->currProject()->fakeFormFileFor( o ) ) +	return; +    MetaDataBase::setPropertyChanged( o, "name", TRUE ); +    if ( !::tqqt_cast<QDesignerToolBar*>(o) && !::tqqt_cast<MenuBarEditor*>(o) ) +	MetaDataBase::setPropertyChanged( o, "geometry", TRUE ); + +    if ( ::tqqt_cast<TQPushButton*>(o) || +	 ::tqqt_cast<TQRadioButton*>(o) || +	 ::tqqt_cast<TQCheckBox*>(o) || +	 ::tqqt_cast<TQToolButton*>(o) ) { +	if (::tqqt_cast<TQToolButton*>(o) && ::tqqt_cast<TQToolBox*>(widgetOfContainer((TQWidget*)o->parent()))) { +	    MetaDataBase::setPropertyChanged( o, "usesTextLabel", TRUE ); +	    MetaDataBase::setPropertyChanged( o, "textLabel", TRUE ); +	    MetaDataBase::setPropertyChanged( o, "autoRaise", TRUE ); +	    MetaDataBase::setPropertyChanged( o, "textPosition", TRUE ); +	} else { +	    MetaDataBase::setPropertyChanged( o, "text", TRUE ); +	} +    } +    else if ( ::tqqt_cast<TQGroupBox*>(o) ) +	MetaDataBase::setPropertyChanged( o, "title", TRUE ); +    else if ( o->isA( TQFRAME_OBJECT_NAME_STRING ) ) { +	MetaDataBase::setPropertyChanged( o, "frameShadow", TRUE ); +	MetaDataBase::setPropertyChanged( o, "frameShape", TRUE ); +    } else if ( ::tqqt_cast<TQTabWidget*>(o) || ::tqqt_cast<TQWizard*>(o) ) { +	MetaDataBase::setPropertyChanged( o, "pageTitle", TRUE ); +	MetaDataBase::setPropertyChanged( o, "pageName", TRUE ); +	MetaDataBase::setPropertyChanged( o, "currentPage", TRUE ); +    } else if ( ::tqqt_cast<TQWidgetStack*>(o) ) { +	MetaDataBase::setPropertyChanged( o, "currentPage", TRUE ); +	MetaDataBase::setPropertyChanged( o, "pageName", TRUE ); +    } else if ( ::tqqt_cast<TQToolBox*>(o) ) { +	MetaDataBase::setPropertyChanged( o, "currentIndex", TRUE ); +	MetaDataBase::setPropertyChanged( o, "itemName", TRUE ); +	MetaDataBase::setPropertyChanged( o, "itemLabel", TRUE ); +	MetaDataBase::setPropertyChanged( o, "itemIconSet", TRUE ); +	MetaDataBase::setPropertyChanged( o, "itemToolTip", TRUE ); +	MetaDataBase::setPropertyChanged( o, "itemBackgroundMode", TRUE ); +#ifndef TQT_NO_TABLE +    } else if ( ::tqqt_cast<TQTable*>(o) ) { +#  ifndef TQT_NO_SQL +        if (!::tqqt_cast<TQDataTable*>(o) ) +#  endif +        { +            MetaDataBase::setPropertyChanged( o, "numRows", TRUE ); +            MetaDataBase::setPropertyChanged( o, "numCols", TRUE ); +            TQTable *t = (TQTable*)o; +            for ( int i = 0; i < 3; ++i ) { +                t->horizontalHeader()->setLabel( i, TQString::number( i + 1 ) ); +                t->verticalHeader()->setLabel( i, TQString::number( i + 1 ) ); +            } +        } +#endif +    } else if ( ::tqqt_cast<TQSplitter*>(o)  ) { +	MetaDataBase::setPropertyChanged( o, "orientation", TRUE ); +    } else if ( ::tqqt_cast<QDesignerToolBar*>(o)  ) { +	MetaDataBase::setPropertyChanged( o, "label", TRUE ); +    } else if ( ::tqqt_cast<MenuBarEditor*>(o)  ) { +	MetaDataBase::setPropertyChanged( o, "itemName", TRUE ); +	MetaDataBase::setPropertyChanged( o, "itemNumber", TRUE ); +	MetaDataBase::setPropertyChanged( o, "itemText", TRUE ); +    } +} + +bool WidgetFactory::hasSpecialEditor( int id, TQObject *editorWidget ) +{ +    TQString className = WidgetDatabase::className( id ); + +    if ( className.contains( "ListBox" ) ) +	return TRUE; +    if ( className.contains( "ComboBox" ) ) +	return TRUE; +    if ( className.contains( "ListView" ) ) +	return TRUE; +    if ( className.contains( "IconView" ) ) +	return TRUE; +    if ( className == TQTEXTEDIT_OBJECT_NAME_STRING || className == TQMULTILINEEDIT_OBJECT_NAME_STRING ) +	return TRUE; +    if ( ::tqqt_cast<TQTable*>(editorWidget) != 0 ) +	return TRUE; + +    return FALSE; +} + +bool WidgetFactory::hasItems( int id, TQObject *editorWidget ) +{ +    TQString className = WidgetDatabase::className( id ); + +    if ( className.contains( "ListBox" ) || className.contains( "ListView" ) || +	 className.contains( "IconView" )  || className.contains( "ComboBox" ) || +	 ::tqqt_cast<TQTable*>(editorWidget) != 0 ) +	return TRUE; + +    return FALSE; +} + +void WidgetFactory::editWidget( int id, TQWidget *parent, TQWidget *editWidget, FormWindow *fw ) +{ +    TQString className = WidgetDatabase::className( id ); + +    if ( className.contains( "ListBox" ) ) { +	if ( !::tqqt_cast<TQListBox*>(editWidget) ) +	    return; +	ListBoxEditor *e = new ListBoxEditor( parent, editWidget, fw ); +	e->exec(); +	delete e; +	return; +    } + +    if ( className.contains( "ComboBox" ) ) { +	if ( !::tqqt_cast<TQComboBox*>(editWidget) ) +	    return; +	TQComboBox *cb = (TQComboBox*)editWidget; +	ListBoxEditor *e = new ListBoxEditor( parent, cb->listBox(), fw ); +	e->exec(); +	delete e; +	cb->update(); +	return; +    } + +    if ( className.contains( "ListView" ) ) { +	if ( !::tqqt_cast<TQListView*>(editWidget) ) +	    return; +	TQListView *lv = (TQListView*)editWidget; +	ListViewEditor *e = new ListViewEditor( parent, lv, fw ); +	e->exec(); +	delete e; +	return; +    } + +    if ( className.contains( "IconView" ) ) { +	if ( !::tqqt_cast<TQIconView*>(editWidget) ) +	    return; +	IconViewEditor *e = new IconViewEditor( parent, editWidget, fw ); +	e->exec(); +	delete e; +	return; +    } + +    if ( className == TQMULTILINEEDIT_OBJECT_NAME_STRING || className == TQTEXTEDIT_OBJECT_NAME_STRING ) { +	MultiLineEditor *e = new MultiLineEditor( FALSE, TRUE, parent, editWidget, fw ); +	e->exec(); +	delete e; +	return; +    } +#ifndef TQT_NO_TABLE +    if (::tqqt_cast<TQTable*>(editWidget) != 0) { +	TableEditor *e = new TableEditor( parent, editWidget, fw ); +	e->exec(); +	delete e; +	return; +    } +#endif +} + +bool WidgetFactory::canResetProperty( TQObject *w, const TQString &propName ) +{ +    if ( propName == "name" || propName == "geometry" ) +	return FALSE; +    TQStringList l = *changedProperties->find( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( w ) ) ); +    return l.findIndex( propName ) == -1; +} + +bool WidgetFactory::resetProperty( TQObject *w, const TQString &propName ) +{ +    const TQMetaProperty *p = w->metaObject()->property( w->metaObject()-> +							findProperty( propName, TRUE ), TRUE ); +    if (!p ) +	return FALSE; +    return p->reset( w ); +} + +TQVariant WidgetFactory::defaultValue( TQObject *w, const TQString &propName ) +{ +    if ( propName == "wordwrap" ) { +	int v = defaultValue( w, "alignment" ).toInt(); +	return TQVariant( ( v & WordBreak ) == WordBreak, 0 ); +    } else if ( propName == "toolTip" || propName == "whatsThis" ) { +	return TQVariant( TQString::fromLatin1( "" ) ); +    } else if ( w->inherits( "CustomWidget" ) ) { +	return TQVariant(); +    } else if ( propName == "frameworkCode" ) { +	return TQVariant( TRUE, 0 ); +    } else if ( propName == "layoutMargin" || propName == "layoutSpacing" ) { +	return TQVariant( -1 ); +    } + +    return *( *defaultProperties->find( WidgetDatabase::idFromClassName( classNameOf( w ) ) ) ).find( propName ); +} + +TQString WidgetFactory::defaultCurrentItem( TQObject *w, const TQString &propName ) +{ +    const TQMetaProperty *p = w->metaObject()-> +			     property( w->metaObject()->findProperty( propName, TRUE ), TRUE ); +    if ( !p ) { +	int v = defaultValue( w, "alignment" ).toInt(); +	if ( propName == "hAlign" ) { +	    if ( ( v & AlignAuto ) == AlignAuto ) +		return "AlignAuto"; +	    if ( ( v & AlignLeft ) == AlignLeft ) +		return "AlignLeft"; +	    if ( ( v & AlignCenter ) == AlignCenter || ( v & AlignHCenter ) == AlignHCenter ) +		return "AlignHCenter"; +	    if ( ( v & AlignRight ) == AlignRight ) +		return "AlignRight"; +	    if ( ( v & AlignJustify ) == AlignJustify ) +		return "AlignJustify"; +	} else if ( propName == "vAlign" ) { +	    if ( ( v & AlignTop ) == AlignTop ) +		return "AlignTop"; +	    if ( ( v & AlignCenter ) == AlignCenter || ( v & AlignVCenter ) == AlignVCenter ) +		return "AlignVCenter"; +	    if ( ( v & AlignBottom ) == AlignBottom ) +		return "AlignBottom"; +	} else if ( propName == "resizeMode" ) { +	    return "Auto"; +	} +	return TQString(); + +    } +    return p->valueToKey( defaultValue( w, propName ).toInt() ); +} + +TQWidget *WidgetFactory::createCustomWidget( TQWidget *parent, const char *name, MetaDataBase::CustomWidget *w ) +{ +    if ( !w ) +	return 0; +    return new CustomWidget( parent, name, w ); +} + +TQVariant WidgetFactory::property( TQObject *w, const char *name ) +{ +    int id = w->metaObject()->findProperty( name, TRUE ); +    const TQMetaProperty* p = w->metaObject()->property( id, TRUE ); +    if ( !p || !p->isValid() ) +	return MetaDataBase::fakeProperty( w, name ); +    return w->property( name ); +} + +void QDesignerLabel::updateBuddy() +{ + +    if ( myBuddy.isEmpty() ) +	return; + +    TQObjectList *l = topLevelWidget()->queryList( TQWIDGET_OBJECT_NAME_STRING, myBuddy, FALSE, TRUE ); +    if ( !l || !l->first() ) { +	delete l; +	return; +    } + +    TQLabel::setBuddy( (TQWidget*)l->first() ); +    delete l; +} + + +void QDesignerWidget::resizeEvent( TQResizeEvent* e) +{ +    if ( need_frame ) { +	TQPainter p(this); +	p.setPen( backgroundColor() ); +	p.drawRect( TQRect( TQPoint(0,0), e->oldSize() ) ); +    } +} + +void QDesignerWidget::paintEvent( TQPaintEvent *e ) +{ +    if ( need_frame ) { +	TQPainter p(this); +	p.setPen( backgroundColor().dark() ); +	p.drawRect( rect() ); +    } +    formwindow->paintGrid( this, e ); +} + +void QDesignerDialog::paintEvent( TQPaintEvent *e ) +{ +    formwindow->paintGrid( this, e ); +} + +TQSizePolicy TQLayoutWidget::sizePolicy() const +{ +    return sp; +} + +bool TQLayoutWidget::event( TQEvent *e ) +{ +    if ( e && ( e->type() == TQEvent::ChildInserted || +		e->type() == TQEvent::ChildRemoved || +		e->type() == TQEvent::LayoutHint || +		e->type() == TQEvent::Reparent ) ) +	updateSizePolicy(); +    return TQWidget::event( e ); +} + +/* +  This function must be called on TQLayoutWidget creation and whenever +  the TQLayoutWidget's parent layout changes (e.g., from a TQHBoxLayout +  to a TQVBoxLayout), because of the (illogical) way layouting works. +*/ +void TQLayoutWidget::updateSizePolicy() +{ +    if ( childrenListObject().isEmpty() || childrenListObject().count() == 0 ) { +	sp = TQWidget::sizePolicy(); +	return; +    } + +    /* +      TQSizePolicy::MayShrink & friends are private. Here we assume the +      following: + +	  Fixed = 0 +	  Maximum = MayShrink +	  Minimum = MayGrow +	  Preferred = MayShrink | MayGrow +    */ + +    int ht = (int) TQSizePolicy::Preferred; +    int vt = (int) TQSizePolicy::Preferred; + +    if ( layout() ) { +	/* +	  parentLayout is set to the parent layout if there is one and if it is +	  top level, in which case layouting is illogical. +	*/ +	TQLayout *parentLayout = 0; +	if ( parent() && parent()->isWidgetType() ) { +	    parentLayout = ((TQWidget *)parent())->layout(); +	    if ( parentLayout && +		 ::tqqt_cast<TQLayoutWidget*>(parentLayout->mainWidget()) ) +		parentLayout = 0; +	} + +	TQObjectListIt it( childrenListObject() ); +	TQObject *o; + +	if ( ::tqqt_cast<TQVBoxLayout*>(layout()) ) { +	    if ( ::tqqt_cast<TQHBoxLayout*>(parentLayout) ) +		vt = TQSizePolicy::Minimum; +	    else +		vt = TQSizePolicy::Fixed; + +	    while ( ( o = it.current() ) ) { +		++it; +		if ( !o->isWidgetType() || ( (TQWidget*)o )->testWState( WState_ForceHide ) ) +		    continue; +		TQWidget *w = (TQWidget*)o; + +		if ( !w->sizePolicy().mayGrowHorizontally() ) +		    ht &= ~TQSizePolicy::Minimum; +		if ( !w->sizePolicy().mayShrinkHorizontally() ) +		    ht &= ~TQSizePolicy::Maximum; +		if ( w->sizePolicy().mayGrowVertically() ) +		    vt |= TQSizePolicy::Minimum; +		if ( w->sizePolicy().mayShrinkVertically() ) +		    vt |= TQSizePolicy::Maximum; +	    } +	} else if ( ::tqqt_cast<TQHBoxLayout*>(layout()) ) { +	    if ( ::tqqt_cast<TQVBoxLayout*>(parentLayout) ) +		ht = TQSizePolicy::Minimum; +	    else +		ht = TQSizePolicy::Fixed; + +	    while ( ( o = it.current() ) ) { +		++it; +		if ( !o->isWidgetType() || ( (TQWidget*)o )->testWState( WState_ForceHide ) ) +		    continue; +		TQWidget *w = (TQWidget*)o; + +		if ( w->sizePolicy().mayGrowHorizontally() ) +		    ht |= TQSizePolicy::Minimum; +		if ( w->sizePolicy().mayShrinkHorizontally() ) +		    ht |= TQSizePolicy::Maximum; +		if ( !w->sizePolicy().mayGrowVertically() ) +		    vt &= ~TQSizePolicy::Minimum; +		if ( !w->sizePolicy().mayShrinkVertically() ) +		    vt &= ~TQSizePolicy::Maximum; +	    } +	} else if ( ::tqqt_cast<TQGridLayout*>(layout()) ) { +	    ht = TQSizePolicy::Fixed; +	    vt = TQSizePolicy::Fixed; +	    if ( parentLayout ) { +		if ( ::tqqt_cast<TQVBoxLayout*>(parentLayout) ) +		    ht = TQSizePolicy::Minimum; +		else if ( ::tqqt_cast<TQHBoxLayout*>(parentLayout) ) +		    vt = TQSizePolicy::Minimum; +	    } + +	    while ( ( o = it.current() ) ) { +		++it; +		if ( !o->isWidgetType() || ( (TQWidget*)o )->testWState( WState_ForceHide ) ) +		    continue; +		TQWidget *w = (TQWidget*)o; + +		if ( w->sizePolicy().mayGrowHorizontally() ) +		    ht |= TQSizePolicy::Minimum; +		if ( w->sizePolicy().mayShrinkHorizontally() ) +		    ht |= TQSizePolicy::Maximum; +		if ( w->sizePolicy().mayGrowVertically() ) +		    vt |= TQSizePolicy::Minimum; +		if ( w->sizePolicy().mayShrinkVertically() ) +		    vt |= TQSizePolicy::Maximum; +	    } +	} +#ifdef USE_QT4 +	if ( layout()->expanding() & TQSizePolicy::Horizontally ) +#else // USE_QT4 +	if ( layout()->expanding() & TQSizePolicy::Horizontally ) +#endif // USE_QT4 +	    ht = TQSizePolicy::Expanding; +#ifdef USE_QT4 +	if ( layout()->expanding() & TQSizePolicy::Vertically ) +#else // USE_QT4 +	if ( layout()->expanding() & TQSizePolicy::Vertically ) +#endif // USE_QT4 +	    vt = TQSizePolicy::Expanding; + +	layout()->invalidate(); +    } + +    sp = TQSizePolicy( (TQSizePolicy::SizeType) ht, (TQSizePolicy::SizeType) vt ); +    updateGeometry(); +} + +void CustomWidget::paintEvent( TQPaintEvent *e ) +{ +    if ( ::tqqt_cast<FormWindow*>(parentWidget()) ) { +	( (FormWindow*)parentWidget() )->paintGrid( this, e ); +    } else { +	TQPainter p( this ); +	p.fillRect( rect(), colorGroup().dark() ); +	p.setPen( colorGroup().light() ); +	p.drawText( 2, 2, width() - 4, height() - 4, TQt::AlignAuto | TQt::AlignTop, cusw->className ); +	p.drawPixmap( ( width() - cusw->pixmap->width() ) / 2, +		      ( height() - cusw->pixmap->height() ) / 2, +		      *cusw->pixmap ); +    } +} + + +CustomWidgetFactory::CustomWidgetFactory() +{ +} + +TQWidget *CustomWidgetFactory::createWidget( const TQString &className, TQWidget *parent, const char *name ) const +{ +    MetaDataBase::CustomWidget *w = MetaDataBase::customWidget( WidgetDatabase::idFromClassName( className ) ); +    if ( !w ) +	return 0; +    return WidgetFactory::createCustomWidget( parent, name, w ); +} + + +QDesignerToolBox::QDesignerToolBox( TQWidget *parent, const char *name ) +    : TQToolBox( parent, name ) +{ +} + +TQString QDesignerToolBox::itemLabel() const +{ +    return TQToolBox::itemLabel( currentIndex() ); +} + +void QDesignerToolBox::setItemLabel( const TQString &l ) +{ +    TQToolBox::setItemLabel( currentIndex(), l ); +} + +TQCString QDesignerToolBox::itemName() const +{ +    return currentItem() ? currentItem()->name() : 0; +} + +void QDesignerToolBox::setItemName( const TQCString &n ) +{ +    if (currentItem()) +	currentItem()->setName( n ); +} + + +TQt::BackgroundMode QDesignerToolBox::itemBackgroundMode() const +{ +    return (item(0) ? item(0)->backgroundMode() : PaletteBackground); +} + +void QDesignerToolBox::setItemBackgroundMode( BackgroundMode bmode ) +{ +    for (int i = 0; i < count(); ++i) { +	TQWidget *w = item(i); +	w->setBackgroundMode( bmode ); +	w->update(); +    } +} + +void QDesignerToolBox::itemInserted( int index ) +{ +    if (count() > 1) +	item(index)->setBackgroundMode(item(index>0?0:1)->backgroundMode()); +} | 
