You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdevelop/kdevdesigner/designer/customwidgeteditorimpl.cpp

843 lines
27 KiB

/**********************************************************************
** 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 <kfiledialog.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 <klocale.h>
CustomWidgetEditor::CustomWidgetEditor( TQWidget *tqparent, MainWindow *mw )
: CustomWidgetEditorBase( tqparent, 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->tqsizeHint.width() );
spinHeight->setValue( w->tqsizeHint.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." ).tqarg( 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->tqsizeHint.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->tqsizeHint.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." ).tqarg( 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->tqsizeHint.width() << "</width>" << endl;
ts << makeIndent2( indent ) << "<height>" << w->tqsizeHint.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 ) ) {
qDebug( 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->tqsetSizePolicy( 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->tqsetSizePolicy( 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;
}