diff options
Diffstat (limited to 'kdevdesigner/designer/customwidgeteditorimpl.cpp')
| -rw-r--r-- | kdevdesigner/designer/customwidgeteditorimpl.cpp | 842 | 
1 files changed, 842 insertions, 0 deletions
| diff --git a/kdevdesigner/designer/customwidgeteditorimpl.cpp b/kdevdesigner/designer/customwidgeteditorimpl.cpp new file mode 100644 index 00000000..f417f6f2 --- /dev/null +++ b/kdevdesigner/designer/customwidgeteditorimpl.cpp @@ -0,0 +1,842 @@ +/********************************************************************** +** Copyright (C) 2000 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 "customwidgeteditorimpl.h" +#include "defs.h" +#include "pixmapchooser.h" +#include "mainwindow.h" +#include "asciivalidator.h" +#include "resource.h" +#include "widgetfactory.h" +#include "widgetdatabase.h" + +#include <tdefiledialog.h> +#include <klineedit.h> + +#include <tqlistbox.h> +#include <tqpushbutton.h> +#include <tqcombobox.h> +#include <tqspinbox.h> +#include <tqlabel.h> +#include <tqmessagebox.h> +#include <tqfiledialog.h> +#include <tqmessagebox.h> +#include <tqtimer.h> +#include <tqapplication.h> +#include <tqlistview.h> +#include <tqfile.h> +#include <tqtextstream.h> +#include <tqdom.h> +#include <tqtextcodec.h> +#include <tqcheckbox.h> + +#include <tdelocale.h> + +CustomWidgetEditor::CustomWidgetEditor( TQWidget *parent, MainWindow *mw ) +    : CustomWidgetEditorBase( parent, 0, TRUE ), mainWindow( mw ) +{ +    connect( helpButton, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); +    checkTimer = new TQTimer( this ); +    connect( checkTimer, TQT_SIGNAL( timeout() ), +	     this, TQT_SLOT( checkWidgetName() ) ); + +    editClass->setEnabled( FALSE ); +    editHeader->setEnabled( FALSE ); +    buttonChooseHeader->setEnabled( FALSE ); +    buttonChoosePixmap->setEnabled( FALSE ); +    spinWidth->setEnabled( FALSE ); +    spinHeight->setEnabled( FALSE ); +    sizeHor->setEnabled( FALSE ); +    sizeVer->setEnabled( FALSE ); +    checkContainer->setEnabled( FALSE ); +    localGlobalCombo->setEnabled( FALSE ); +    editClass->setValidator( new AsciiValidator( TQString(":"), TQT_TQOBJECT(editClass) ) ); +    editSignal->setValidator( new AsciiValidator( TRUE, TQT_TQOBJECT(editSignal) ) ); +    editSlot->setValidator( new AsciiValidator( TRUE, TQT_TQOBJECT(editSignal) ) ); +    editProperty->setValidator( new AsciiValidator( TQT_TQOBJECT(editSignal) ) ); +    editSignal->setEnabled( FALSE ); +    buttonRemoveSignal->setEnabled( FALSE ); + +    setupDefinition(); +    setupSignals(); +    setupSlots(); +    setupProperties(); +} + +void CustomWidgetEditor::setupDefinition() +{ +    TQPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets(); +    for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) { +	TQListBoxItem *i; +	if ( w->pixmap ) +	    i = new TQListBoxPixmap( boxWidgets, *w->pixmap, w->className ); +	else +	    i = new TQListBoxText( boxWidgets, w->className ); +	customWidgets.insert( i, w ); +    } + +    if ( boxWidgets->firstItem() ) { +	boxWidgets->setCurrentItem( boxWidgets->firstItem() ); +	boxWidgets->setSelected( boxWidgets->firstItem(), TRUE ); +    } +    oldItem = 0; +} + +void CustomWidgetEditor::setupSignals() +{ +    editSignal->setEnabled( FALSE ); +    buttonRemoveSignal->setEnabled( FALSE ); +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( !w ) +	return; +    listSignals->clear(); +    for ( TQValueList<TQCString>::Iterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it ) +	listSignals->insertItem( TQString( *it ) ); +    if ( listSignals->firstItem() ) { +	listSignals->setCurrentItem( listSignals->firstItem() ); +	listSignals->setSelected( listSignals->firstItem(), TRUE ); +    } +} + +void CustomWidgetEditor::setupSlots() +{ +    editSlot->setEnabled( FALSE ); +    comboAccess->setEnabled( FALSE ); +    buttonRemoveSlot->setEnabled( FALSE ); + +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( !w ) +	return; +    listSlots->clear(); +    for ( TQValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it ) +	(void)new TQListViewItem( listSlots, (*it).function, (*it).access ); + +    if ( listSlots->firstChild() ) { +	listSlots->setCurrentItem( listSlots->firstChild() ); +	listSlots->setSelected( listSlots->firstChild(), TRUE ); +    } +} + +void CustomWidgetEditor::setupProperties() +{ +    editProperty->setEnabled( FALSE ); +    comboType->setEnabled( FALSE ); +    buttonRemoveProperty->setEnabled( FALSE ); + +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( !w ) +	return; +    listProperties->clear(); +    for ( TQValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.begin(); it != w->lstProperties.end(); ++it ) +	(void)new TQListViewItem( listProperties, (*it).property, (*it).type ); + +    if ( listProperties->firstChild() ) { +	listProperties->setCurrentItem( listProperties->firstChild() ); +	listProperties->setSelected( listProperties->firstChild(), TRUE ); +    } +} + +void CustomWidgetEditor::currentWidgetChanged( TQListBoxItem *i ) +{ +    checkTimer->stop(); +    checkWidgetName(); + +    MetaDataBase::CustomWidget *w = findWidget( i ); +    if ( !i || !w ) { +	buttonChooseHeader->setEnabled( FALSE ); +	editClass->setEnabled( FALSE ); +	editHeader->setEnabled( FALSE ); +	buttonChoosePixmap->setEnabled( FALSE ); +	spinWidth->setEnabled( FALSE ); +	spinHeight->setEnabled( FALSE ); +	localGlobalCombo->setEnabled( FALSE ); +	sizeHor->setEnabled( FALSE ); +	sizeVer->setEnabled( FALSE ); +	checkContainer->setEnabled( FALSE ); +	return; +    } + +    buttonChooseHeader->setEnabled( TRUE ); +    editClass->setEnabled( TRUE ); +    editHeader->setEnabled( TRUE ); +    buttonChoosePixmap->setEnabled( TRUE ); +    spinWidth->setEnabled( TRUE ); +    spinHeight->setEnabled( TRUE ); +    localGlobalCombo->setEnabled( TRUE ); +    sizeHor->setEnabled( TRUE ); +    sizeVer->setEnabled( TRUE ); +    checkContainer->setEnabled( TRUE ); + +    editClass->blockSignals( TRUE ); +    editClass->setText( w->className ); +    editClass->blockSignals( FALSE ); +    editHeader->setText( w->includeFile ); +    localGlobalCombo->setCurrentItem( (int)w->includePolicy ); +    if ( w->pixmap ) +	previewPixmap->setPixmap( *w->pixmap ); +    else +	previewPixmap->setText( "" ); +    spinWidth->setValue( w->sizeHint.width() ); +    spinHeight->setValue( w->sizeHint.height() ); +    sizeHor->setCurrentItem( size_type_to_int( w->sizePolicy.horData() ) ); +    sizeVer->setCurrentItem( size_type_to_int( w->sizePolicy.verData() ) ); +    checkContainer->setChecked( w->isContainer ); + +    setupSignals(); +    setupSlots(); +    setupProperties(); +} + +void CustomWidgetEditor::addWidgetClicked() +{ +    oldItem = 0; +    checkTimer->stop(); +    checkWidgetName(); + +    MetaDataBase::CustomWidget *w = new MetaDataBase::CustomWidget; +    TQString s = w->className; +    if ( !MetaDataBase::addCustomWidget( w ) ) { +	TQMessageBox::information( this, i18n( "Adding Custom Widget" ), +				  i18n( "Custom widget names must be unique.\n" +				      "A custom widget called '%1' already exists, so it is not possible " +				      "to add another widget with this name." ).arg( s ) ); +	return; +    } + +    TQListBoxPixmap *i = new TQListBoxPixmap( boxWidgets, *w->pixmap, w->className ); +    customWidgets.insert( i, w ); + +    boxWidgets->setCurrentItem( i ); +    boxWidgets->setSelected( i, TRUE ); +} + +void CustomWidgetEditor::classNameChanged( const TQString &s ) +{ +    TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); +    MetaDataBase::CustomWidget *w = findWidget( i ); +    if ( !i || !w ) +	return; + +    WidgetDatabase::customWidgetClassNameChanged( w->className, s ); + +    checkTimer->stop(); +    boxWidgets->blockSignals( TRUE ); +    oldName = w->className; +    w->className = s; +    TQListBoxItem *old = i; +    if ( w->pixmap ) +	boxWidgets->changeItem( *w->pixmap, s, boxWidgets->currentItem() ); +    else +	boxWidgets->changeItem( s, boxWidgets->currentItem() ); +    i = boxWidgets->item( boxWidgets->currentItem() ); +    oldItem = i; +    customWidgets.insert( i, w ); +    customWidgets.remove( old ); +    boxWidgets->blockSignals( FALSE ); +    checkTimer->start( 1000, TRUE ); +} + +void CustomWidgetEditor::deleteWidgetClicked() +{ +    oldItem = 0; +    checkTimer->stop(); +    checkWidgetName(); + +    TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); +    MetaDataBase::CustomWidget *w = findWidget( i ); + +    if ( mainWindow->isCustomWidgetUsed( w ) ) { +	TQMessageBox::information( mainWindow, i18n( "Removing Custom Widget" ), +				  i18n( "The custom widget '%1' is in use, so it cannot be removed." ). +				  arg( w->className ) ); +	return; +    } + +    if ( !i || !w ) +	return; + +    MetaDataBase::CustomWidget *cw = MetaDataBase::customWidget( mainWindow->currentTool() ); +    if ( cw == w ) +	mainWindow->resetTool(); + +    MetaDataBase::removeCustomWidget( w ); +    customWidgets.remove( i ); +    delete i; + +    i = boxWidgets->item( boxWidgets->currentItem() ); +    if ( i ) { +	boxWidgets->setCurrentItem( i ); +	boxWidgets->setSelected( i, TRUE ); +    } +} + +void CustomWidgetEditor::headerFileChanged( const TQString &s ) +{ +    TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); +    MetaDataBase::CustomWidget *w = findWidget( i ); +    if ( !i || !w ) +	return; + +    w->includeFile = s; +} + +void CustomWidgetEditor::heightChanged( int h ) +{ +    TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); +    MetaDataBase::CustomWidget *w = findWidget( i ); +    if ( !i || !w ) +	return; + +    w->sizeHint.setHeight( h ); +    updateCustomWidgetSizes(); +} + +void CustomWidgetEditor::includePolicyChanged( int p ) +{ +    TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); +    MetaDataBase::CustomWidget *w = findWidget( i ); +    if ( !i || !w ) +	return; + +    w->includePolicy = (MetaDataBase::CustomWidget::IncludePolicy)p; +} + +void CustomWidgetEditor::pixmapChoosen() +{ +    TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); +    MetaDataBase::CustomWidget *w = findWidget( i ); +    if ( !i || !w ) +	return; + +    TQPixmap pix = qChoosePixmap( this ); +    if ( pix.isNull() ) +	return; +    delete w->pixmap; +    w->pixmap = new TQPixmap( pix ); + +    boxWidgets->blockSignals( TRUE ); +    TQListBoxItem *old = i; +    boxWidgets->changeItem( *w->pixmap, w->className, boxWidgets->currentItem() ); +    i = boxWidgets->item( boxWidgets->currentItem() ); +    customWidgets.insert( i, w ); +    customWidgets.remove( old ); +    boxWidgets->blockSignals( FALSE ); +    previewPixmap->setPixmap( *w->pixmap ); +} + +void CustomWidgetEditor::widthChanged( int wid ) +{ +    TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); +    MetaDataBase::CustomWidget *w = findWidget( i ); +    if ( !i || !w ) +	return; + +    w->sizeHint.setWidth( wid ); +    updateCustomWidgetSizes(); +} + +MetaDataBase::CustomWidget *CustomWidgetEditor::findWidget( TQListBoxItem *i ) +{ +    if ( !i ) +	return 0; + +    TQMap<TQListBoxItem*, MetaDataBase::CustomWidget*>::Iterator it = customWidgets.find( i ); +    if ( it == customWidgets.end() ) +	return 0; +    return *it; +} + +void CustomWidgetEditor::chooseHeader() +{ +    TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); +    MetaDataBase::CustomWidget *w = findWidget( i ); +    if ( !i || !w ) +	return; + +    TQString h = KFileDialog::getOpenFileName( TQString(), i18n( "*.h *.h++ *.hxx *.hh|Header Files" ), this ); +    if ( h.isEmpty() ) +	return; +    editHeader->setText( h ); +    localGlobalCombo->setCurrentItem( (int)MetaDataBase::CustomWidget::Global ); +} + +void CustomWidgetEditor::checkWidgetName() +{ +    TQListBoxItem *i = oldItem ? oldItem : boxWidgets->item( boxWidgets->currentItem() ); +    MetaDataBase::CustomWidget *w = findWidget( i ); +    oldItem = 0; +    if ( !i || !w ) +	return; + +    if ( MetaDataBase::isWidgetNameUsed( w ) ) { +	TQString s = w->className; +	w->className = oldName; +	TQMessageBox::information( this, i18n( "Renaming Custom Widget" ), +				  i18n( "Custom widget names must be unique.\n" +				      "A custom widget called '%1' already exists, so it is not possible " +				      "to rename this widget with this name." ).arg( s ) ); +	if ( i != boxWidgets->item( boxWidgets->currentItem() ) ) { +	    boxWidgets->setCurrentItem( i ); +	    tqApp->processEvents(); +	} +	editClass->setText( w->className ); +	classNameChanged( w->className ); +    } +} + +void CustomWidgetEditor::closeClicked() +{ +    oldItem = 0; +    checkTimer->stop(); +    checkWidgetName(); +    accept(); +} + +void CustomWidgetEditor::currentSignalChanged( TQListBoxItem *i ) +{ +    editSignal->blockSignals( TRUE ); +    editSignal->setText( "" ); +    editSignal->blockSignals( FALSE ); + +    if ( !i ) { +	editSignal->setEnabled( FALSE ); +	buttonRemoveSignal->setEnabled( FALSE ); +	return; +    } + +    editSignal->blockSignals( TRUE ); +    editSignal->setEnabled( TRUE ); +    buttonRemoveSignal->setEnabled( TRUE ); +    editSignal->setText( i->text() ); +    editSignal->blockSignals( FALSE ); +} + +void CustomWidgetEditor::addSignal() +{ +    TQListBoxItem *i = new TQListBoxText( listSignals, "signal()" ); +    listSignals->setCurrentItem( i ); +    listSignals->setSelected( i, TRUE ); +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( w ) +	w->lstSignals.append( i->text().latin1() ); +} + +void CustomWidgetEditor::removeSignal() +{ +    TQString s = listSignals->currentText(); +    delete listSignals->item( listSignals->currentItem() ); +    if ( listSignals->currentItem() != -1 ) +	listSignals->setSelected( listSignals->currentItem(), TRUE ); +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( w ) +	w->lstSignals.remove( s.latin1() ); +} + +void CustomWidgetEditor::signalNameChanged( const TQString &s ) +{ +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( !w || listSignals->currentItem() == -1 ) +	return; + +    TQValueList<TQCString>::Iterator it = w->lstSignals.find( listSignals->currentText().latin1() ); +    if ( it != w->lstSignals.end() ) +	w->lstSignals.remove( it ); +    listSignals->blockSignals( TRUE ); +    listSignals->changeItem( s, listSignals->currentItem() ); +    listSignals->blockSignals( FALSE ); +    w->lstSignals.append( s.latin1() ); +} + +void CustomWidgetEditor::slotAccessChanged( const TQString &s ) +{ +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( !w || !listSlots->currentItem() ) +	return; + +    MetaDataBase::Function slot; +    slot.function = listSlots->currentItem()->text( 0 ); +    slot.access = listSlots->currentItem()->text( 1 ); +    TQValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.find( slot ); +    if ( it != w->lstSlots.end() ) +	w->lstSlots.remove( it ); +    listSlots->currentItem()->setText( 1, s ); +    slot.function = listSlots->currentItem()->text( 0 ); +    slot.access = listSlots->currentItem()->text( 1 ); +    w->lstSlots.append( slot ); +} + +void CustomWidgetEditor::slotNameChanged( const TQString &s ) +{ +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( !w || !listSlots->currentItem() ) +	return; + +    MetaDataBase::Function slot; +    slot.function = listSlots->currentItem()->text( 0 ); +    slot.access = listSlots->currentItem()->text( 1 ); +    slot.type = "slot"; +    TQValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.find( slot ); +    if ( it != w->lstSlots.end() ) +	w->lstSlots.remove( it ); +    listSlots->currentItem()->setText( 0, s ); +    slot.function = listSlots->currentItem()->text( 0 ); +    slot.access = listSlots->currentItem()->text( 1 ); +    w->lstSlots.append( slot ); +} + +void CustomWidgetEditor::addSlot() +{ +    TQListViewItem *i = new TQListViewItem( listSlots, "slot()", "public" ); +    listSlots->setCurrentItem( i ); +    listSlots->setSelected( i, TRUE ); +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( w ) { +	MetaDataBase::Function slot; +	slot.function = "slot()"; +	slot.access = "public"; +	slot.type = "slot"; +	w->lstSlots.append( slot ); +    } +} + +void CustomWidgetEditor::removeSlot() +{ +    MetaDataBase::Function slot; +    slot.function = "1 2 3"; +    if ( listSlots->currentItem() ) { +	slot.function = listSlots->currentItem()->text( 0 ); +	slot.access = listSlots->currentItem()->text( 1 ); +    } +    delete listSlots->currentItem(); +    if ( listSlots->currentItem() ) +	listSlots->setSelected( listSlots->currentItem(), TRUE ); +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( w && slot.function != "1 2 3" ) +	w->lstSlots.remove( slot ); +} + +void CustomWidgetEditor::currentSlotChanged( TQListViewItem *i ) +{ +    editSlot->blockSignals( TRUE ); +    editSlot->setText( "" ); +    editSignal->blockSignals( FALSE ); + +    if ( !i ) { +	editSlot->setEnabled( FALSE ); +	comboAccess->setEnabled( FALSE ); +	buttonRemoveSlot->setEnabled( FALSE ); +	return; +    } + +    editSlot->setEnabled( TRUE ); +    comboAccess->setEnabled( TRUE ); +    buttonRemoveSlot->setEnabled( TRUE ); +    editSlot->blockSignals( TRUE ); +    comboAccess->blockSignals( TRUE ); +    editSlot->setText( i->text( 0 ) ); +    if ( i->text( 1 ) == i18n( "protected" ) ) +	comboAccess->setCurrentItem( 1 ); +    else +	comboAccess->setCurrentItem( 0 ); +    editSlot->blockSignals( FALSE ); +    comboAccess->blockSignals( FALSE ); +} + +void CustomWidgetEditor::propertyTypeChanged( const TQString &s ) +{ +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( !w || !listProperties->currentItem() ) +	return; + +    MetaDataBase::Property property; +    property.property = listProperties->currentItem()->text( 0 ); +    property.type = listProperties->currentItem()->text( 1 ); +    TQValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.find( property ); +    if ( it != w->lstProperties.end() ) +	w->lstProperties.remove( it ); +    listProperties->currentItem()->setText( 1, s ); +    property.property = listProperties->currentItem()->text( 0 ); +    property.type = listProperties->currentItem()->text( 1 ); +    w->lstProperties.append( property ); +} + +void CustomWidgetEditor::propertyNameChanged( const TQString &s ) +{ +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( !w || !listProperties->currentItem() ) +	return; + +    MetaDataBase::Property property; +    property.property = listProperties->currentItem()->text( 0 ); +    property.type = listProperties->currentItem()->text( 1 ); +    TQValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.find( property ); +    if ( it != w->lstProperties.end() ) +	w->lstProperties.remove( it ); +    listProperties->currentItem()->setText( 0, s ); +    property.property = listProperties->currentItem()->text( 0 ); +    property.type = listProperties->currentItem()->text( 1 ); +    w->lstProperties.append( property ); +} + +void CustomWidgetEditor::addProperty() +{ +    TQListViewItem *i = new TQListViewItem( listProperties, "property", "String" ); +    listProperties->setCurrentItem( i ); +    listProperties->setSelected( i, TRUE ); +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( w ) { +	MetaDataBase::Property prop; +	prop.property = "property"; +	prop.type = "String"; +	w->lstProperties.append( prop ); +    } +} + +void CustomWidgetEditor::removeProperty() +{ +    MetaDataBase::Property property; +    property.property = "1 2 3"; +    if ( listProperties->currentItem() ) { +	property.property = listProperties->currentItem()->text( 0 ); +	property.type = listProperties->currentItem()->text( 1 ); +    } +    delete listProperties->currentItem(); +    if ( listProperties->currentItem() ) +	listProperties->setSelected( listProperties->currentItem(), TRUE ); +    MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); +    if ( w && property.property != "1 2 3" ) +	w->lstProperties.remove( property ); +} + +void CustomWidgetEditor::currentPropertyChanged( TQListViewItem *i ) +{ +    editProperty->blockSignals( TRUE ); +    editProperty->setText( "" ); +    editSignal->blockSignals( FALSE ); + +    if ( !i ) { +	editProperty->setEnabled( FALSE ); +	comboType->setEnabled( FALSE ); +	buttonRemoveProperty->setEnabled( FALSE ); +	return; +    } + +    editProperty->setEnabled( TRUE ); +    comboType->setEnabled( TRUE ); +    buttonRemoveProperty->setEnabled( TRUE ); +    editProperty->blockSignals( TRUE ); +    comboType->blockSignals( TRUE ); +    editProperty->setText( i->text( 0 ) ); + +    for ( int j = 0; j < comboType->count(); ++j ) { +	if ( i->text( 1 ) == comboType->text( j ) ) { +	    comboType->setCurrentItem( j ); +	    break; +	} +    } +    editProperty->blockSignals( FALSE ); +    comboType->blockSignals( FALSE ); +} + +static TQString makeIndent2( int indent ) +{ +    TQString s; +    s.fill( ' ', indent * 4 ); +    return s; +} + +static TQString entitize2( const TQString &s ) +{ +    TQString s2 = s; +    s2 = s2.replace( "\"", """ ); +    s2 = s2.replace( "&", "&" ); +    s2 = s2.replace( ">", ">" ); +    s2 = s2.replace( "<", "<" ); +    s2 = s2.replace( "'", "'" ); +    return s2; +} + +void CustomWidgetEditor::saveDescription() +{ +    TQString fn = KFileDialog::getSaveFileName( TQString(), i18n( "*.cw|Custom-Widget Description\n*|All Files" ), this ); +    if ( fn.isEmpty() ) +	return; + +    if ( TQFileInfo( fn ).extension() != "cw" ) +	fn += ".cw"; +    TQFile f( fn ); +    if ( !f.open( IO_WriteOnly ) ) +	return; + +    TQTextStream ts( &f ); +    ts.setCodec( TQTextCodec::codecForName( "UTF-8" ) ); +    int indent = 0; + +    ts << "<!DOCTYPE CW><CW>" << endl; + +    ts << makeIndent2( indent ) << "<customwidgets>" << endl; +    indent++; + +    TQPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets(); +    for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) { +	ts << makeIndent2( indent ) << "<customwidget>" << endl; +	indent++; +	ts << makeIndent2( indent ) << "<class>" << w->className << "</class>" << endl; +	ts << makeIndent2( indent ) << "<header location=\"" +	   << ( w->includePolicy == MetaDataBase::CustomWidget::Local ? "local" : "global" ) +	   << "\">" << w->includeFile << "</header>" << endl; +	ts << makeIndent2( indent ) << "<sizehint>" << endl; +	indent++; +	ts << makeIndent2( indent ) << "<width>" << w->sizeHint.width() << "</width>" << endl; +	ts << makeIndent2( indent ) << "<height>" << w->sizeHint.height() << "</height>" << endl; +	indent--; +	ts << makeIndent2( indent ) << "</sizehint>" << endl; +	ts << makeIndent2( indent ) << "<container>" << (int)w->isContainer << "</container>" << endl; +	ts << makeIndent2( indent ) << "<sizepolicy>" << endl; +	indent++; +	ts << makeIndent2( indent ) << "<hordata>" << (int)w->sizePolicy.horData() << "</hordata>" << endl; +	ts << makeIndent2( indent ) << "<verdata>" << (int)w->sizePolicy.verData() << "</verdata>" << endl; +	indent--; +	ts << makeIndent2( indent ) << "</sizepolicy>" << endl; +	ts << makeIndent2( indent ) << "<pixmap>" << endl; +	indent++; +	Resource::saveImageData( w->pixmap->convertToImage(), ts, indent ); +	indent--; +	ts << makeIndent2( indent ) << "</pixmap>" << endl; +	if ( !w->lstSignals.isEmpty() ) { +	    for ( TQValueList<TQCString>::Iterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it ) +		ts << makeIndent2( indent ) << "<signal>" << entitize2( *it ) << "</signal>" << endl; +	} +	if ( !w->lstSlots.isEmpty() ) { +	    for ( TQValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it ) +		ts << makeIndent2( indent ) << "<slot access=\"" << (*it).access << "\">" << entitize2( (*it).function ) << "</slot>" << endl; +	} +	if ( !w->lstProperties.isEmpty() ) { +	    for ( TQValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.begin(); it != w->lstProperties.end(); ++it ) +		ts << makeIndent2( indent ) << "<property type=\"" << (*it).type << "\">" << entitize2( (*it).property ) << "</property>" << endl; +	} +	indent--; +	ts << makeIndent2( indent ) << "</customwidget>" << endl; +    } + +    indent--; +    ts << makeIndent2( indent ) << "</customwidgets>" << endl; +    ts << "</CW>" << endl; +} + +void CustomWidgetEditor::loadDescription() +{ +    TQString fn = KFileDialog::getOpenFileName( TQString(), i18n( "*.cw|Custom-Widget Description\n*|All Files" ), this ); +    if ( fn.isEmpty() ) +	return; + +    TQFile f( fn ); +    if ( !f.open( IO_ReadOnly ) ) +	return; + +    TQDomDocument doc; +    TQString errMsg; +    int errLine; +    if ( !doc.setContent( &f, &errMsg, &errLine ) ) { +	tqDebug( TQString("Parse error: ") + errMsg + TQString(" in line %d"), errLine ); +	return; +    } + +    TQDomElement firstWidget = doc.firstChild().toElement().firstChild().toElement(); + +    while ( firstWidget.tagName() != "customwidgets" ) +	firstWidget = firstWidget.nextSibling().toElement(); + +    Resource::loadCustomWidgets( firstWidget, 0 ); +    boxWidgets->clear(); +    setupDefinition(); +    setupSignals(); +    setupSlots(); +    setupProperties(); +} + +void CustomWidgetEditor::updateCustomWidgetSizes() +{ +    if ( cwLst.isEmpty() ) +	cwLst = *mainWindow->queryList( "CustomWidget" ); +    for ( TQObject *o = cwLst.first(); o; o = cwLst.next() ) +	( (TQWidget*)o )->updateGeometry(); +} + +void CustomWidgetEditor::horDataChanged( int a ) +{ +    TQSizePolicy::SizeType st = int_to_size_type( a ); +    TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); +    MetaDataBase::CustomWidget *w = findWidget( i ); +    if ( !i || !w ) +	return; + +    TQSizePolicy osp = w->sizePolicy; +    w->sizePolicy.setHorData( st ); +    if ( cwLst.isEmpty() ) +	cwLst = *mainWindow->queryList( "CustomWidget" ); +    for ( TQObject *o = cwLst.first(); o; o = cwLst.next() ) { +	CustomWidget *cw = (CustomWidget*)o; +	if ( cw->realClassName() == boxWidgets->currentText() ) { +	    if ( cw->sizePolicy() == osp ) +		cw->setSizePolicy( w->sizePolicy ); +	} +    } +} + +void CustomWidgetEditor::verDataChanged( int a ) +{ +    TQSizePolicy::SizeType st = int_to_size_type( a ); +    TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); +    MetaDataBase::CustomWidget *w = findWidget( i ); +    if ( !i || !w ) +	return; + +    TQSizePolicy osp = w->sizePolicy; +    w->sizePolicy.setVerData( st ); +    if ( cwLst.isEmpty() ) +	cwLst = *mainWindow->queryList( "CustomWidget" ); +    for ( TQObject *o = cwLst.first(); o; o = cwLst.next() ) { +	CustomWidget *cw = (CustomWidget*)o; +	if ( cw->realClassName() == boxWidgets->currentText() ) { +	    if ( cw->sizePolicy() == osp ) +		cw->setSizePolicy( w->sizePolicy ); +	} +    } +} + +void CustomWidgetEditor::widgetIsContainer( bool b ) +{ +    TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); +    MetaDataBase::CustomWidget *w = findWidget( i ); +    if ( !i || !w ) +	return; + +    w->isContainer = b; +    WidgetDatabaseRecord *r = WidgetDatabase::at( w->id ); +    if ( r ) +	r->isContainer = b; +} | 
