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()); +} |