summaryrefslogtreecommitdiffstats
path: root/kdevdesigner/designer/customwidgeteditorimpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdevdesigner/designer/customwidgeteditorimpl.cpp')
-rw-r--r--kdevdesigner/designer/customwidgeteditorimpl.cpp842
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( "\"", "&quot;" );
+ s2 = s2.replace( "&", "&amp;" );
+ s2 = s2.replace( ">", "&gt;" );
+ s2 = s2.replace( "<", "&lt;" );
+ s2 = s2.replace( "'", "&apos;" );
+ 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;
+}