|
|
|
/**********************************************************************
|
|
|
|
** Copyright (C) 2000 Trolltech AS. All rights reserved.
|
|
|
|
**
|
|
|
|
** This file is part of Qt 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 Qt Enterprise Edition or Qt Professional Edition
|
|
|
|
** licenses may use this file in accordance with the Qt 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 Qt 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 *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(":"), editClass ) );
|
|
|
|
editSignal->setValidator( new AsciiValidator( TRUE, editSignal ) );
|
|
|
|
editSlot->setValidator( new AsciiValidator( TRUE, editSignal ) );
|
|
|
|
editProperty->setValidator( new AsciiValidator( 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::null, 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 );
|
|
|
|
qApp->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::null, 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::null, 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->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;
|
|
|
|
}
|