#include <qwidgetstack.h>
#include <qtoolbutton.h>
#include <qfontdialog.h>
+#include <qfontdatabase.h>
+#include <qfileinfo.h>
+#include <qfiledialog.h>
#include "QtxIntSpinBox.h"
#include "QtxDblSpinBox.h"
+#include "QtxComboBox.h"
+#include "QtxDirListEditor.h"
/*
Class: QtxListResourceEdit
{
}
+void QtxListResourceEdit::setItemProperty( const int id, const QString& prop, const QVariant& val )
+{
+ Item* i = item( id );
+ if ( !i )
+ return;
+
+ bool prev = i->isEmpty();
+
+ QtxResourceEdit::setItemProperty( id, prop, val );
+
+ bool next = i->isEmpty();
+
+ if ( prev != next )
+ updateVisible();
+}
+
void QtxListResourceEdit::onSelectionChanged()
{
- int idx = myList->index( myList->selectedItem() );
- if ( idx < 0 )
+ QString title = myList->text( myList->index( myList->selectedItem() ) );
+ if ( title.isEmpty() )
return;
- myStack->raiseWidget( idx );
+ Item* i = 0;
+ QPtrList<Item> lst;
+ childItems( lst );
+ for ( QPtrListIterator<Item> it( lst ); it.current() && !i; ++it )
+ {
+ if ( it.current()->title() == title )
+ i = it.current();
+ }
+
+ if ( i )
+ myStack->raiseWidget( i->id() );
+}
+
+void QtxListResourceEdit::itemAdded( QtxResourceEdit::Item* i )
+{
+ if ( !i )
+ return;
+
+ QPtrList<Item> items;
+ childItems( items );
+
+ if ( items.contains( i ) || items.contains( i->parentItem() ) )
+ updateVisible();
}
QtxResourceEdit::Item* QtxListResourceEdit::createItem( const QString& title, const int )
return i;
Category* category = new Category( this, myStack );
- myList->insertItem( title );
- int id = myList->count() - 1;
- myStack->addWidget( category, id );
+ myStack->addWidget( category, category->id() );
+
+ updateVisible();
if ( !myList->selectedItem() )
myList->setSelected( 0, true );
void QtxListResourceEdit::updateState()
{
- if ( myStack->visibleWidget() )
+ if ( myList->selectedItem() && myStack->visibleWidget() )
myStack->show();
else
myStack->hide();
}
+void QtxListResourceEdit::updateVisible()
+{
+ QPtrList<Item> items;
+ childItems( items );
+
+ QString name = myList->text( myList->index( myList->selectedItem() ) );
+
+ myList->clear();
+ for ( QPtrListIterator<Item> it( items ); it.current(); ++it )
+ {
+ if ( it.current()->isEmpty() )
+ continue;
+
+ myList->insertItem( it.current()->title() );
+ }
+
+ int idx = -1;
+ for ( int i = 0; i < (int)myList->count() && idx == -1; i++ )
+ {
+ if ( myList->text( i ) == name )
+ idx = i;
+ }
+
+ myList->setSelected( QMAX( idx, 0 ), true );
+
+ updateState();
+}
+
/*
Class: QtxListResourceEdit::Category
Descr: GUI implementation of preferences category.
{
}
+bool QtxListResourceEdit::Category::isEmpty() const
+{
+ return Item::isEmpty() && myInfo->text().isEmpty();
+}
+
int QtxListResourceEdit::Category::type() const
{
return -1;
QVariant var;
if ( prop == "columns" )
var = QVariant( columns() );
+ else if ( prop == "orientation" )
+ var = QVariant( orientation() );
+ else if ( prop == "frame" )
+ var = QVariant( frameStyle() != QFrame::NoFrame );
return var;
}
if ( !prop.cast( QVariant::Int ) )
return;
- if ( name == QString( "columns" ) && prop.toInt() > 0 )
+ if ( name == QString( "columns" ) && prop.cast( QVariant::Int ) && prop.toInt() > 0 )
setColumns( prop.toInt() );
+ else if ( name == QString( "orientation" ) && prop.cast( QVariant::Int ) )
+ {
+ int o = prop.toInt();
+ if ( o == Qt::Horizontal || o == Qt::Vertical )
+ setOrientation( (Orientation)o );
+ }
+ else if ( name == "frame" && prop.cast( QVariant::Bool ) )
+ {
+ setInsideMargin( prop.toBool() ? 5 : 0 );
+ QGroupBox::setTitle( prop.toBool() ? Item::title() : QString::null );
+ setFrameStyle( prop.toBool() ? QFrame::Box | QFrame::Sunken : QFrame::NoFrame );
+ }
}
void QtxListResourceEdit::Group::setTitle( const QString& title )
item = new StringItem( title, resourceEdit(), this, this );
break;
case Selector:
- item = new ListItem( title, resourceEdit(), this, this );
+ item = new SelectItem( title, resourceEdit(), this, this );
break;
case DblSpin:
item = new DoubleSpinItem( title, resourceEdit(), this, this );
case Space:
item = new Spacer( resourceEdit(), this, this );
break;
+ case GroupBox:
+ item = new Group( title, resourceEdit(), this, this );
+ break;
case Font:
item = new FontItem( title, resourceEdit(), this, this );
break;
+ case DirList:
+ item = new DirListItem( title, resourceEdit(), this, this );
+ break;
+ case File:
+ item = new FileItem( title, resourceEdit(), this, this );
+ break;
}
return item;
}
/*
- Class: QtxListResourceEdit::ListItem
+ Class: QtxListResourceEdit::SelectItem
Descr: GUI implementation of resources list item.
*/
-QtxListResourceEdit::ListItem::ListItem( const QString& title, QtxResourceEdit* edit,
- Item* pItem, QWidget* parent )
+QtxListResourceEdit::SelectItem::SelectItem( const QString& title, QtxResourceEdit* edit,
+ Item* pItem, QWidget* parent )
: PrefItem( Selector, edit, pItem, parent )
{
new QLabel( title, this );
myList->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
}
-QtxListResourceEdit::ListItem::~ListItem()
+QtxListResourceEdit::SelectItem::~SelectItem()
{
}
-void QtxListResourceEdit::ListItem::store()
+void QtxListResourceEdit::SelectItem::store()
{
int idx = myList->currentItem();
if ( myIndex.contains( idx ) )
setInteger( myIndex[idx] );
}
-void QtxListResourceEdit::ListItem::retrieve()
+void QtxListResourceEdit::SelectItem::retrieve()
{
int id = getInteger( -1 );
myList->setCurrentItem( idx );
}
-QVariant QtxListResourceEdit::ListItem::property( const QString& name ) const
+QVariant QtxListResourceEdit::SelectItem::property( const QString& name ) const
{
QVariant val;
if ( name == QString( "strings" ) )
return val;
}
-void QtxListResourceEdit::ListItem::setProperty( const QString& name, const QVariant& val )
+void QtxListResourceEdit::SelectItem::setProperty( const QString& name, const QVariant& val )
{
if ( name == QString( "strings" ) )
setStrings( val );
setIndexes( val );
}
-void QtxListResourceEdit::ListItem::setStrings( const QVariant& var )
+void QtxListResourceEdit::SelectItem::setStrings( const QVariant& var )
{
if ( var.type() != QVariant::StringList )
return;
setStrings( var.toStringList() );
}
-void QtxListResourceEdit::ListItem::setIndexes( const QVariant& var )
+void QtxListResourceEdit::SelectItem::setIndexes( const QVariant& var )
{
if ( var.type() != QVariant::List )
return;
setIndexes( lst );
}
-void QtxListResourceEdit::ListItem::setStrings( const QStringList& lst )
+void QtxListResourceEdit::SelectItem::setStrings( const QStringList& lst )
{
myList->clear();
myList->insertStringList( lst );
}
-void QtxListResourceEdit::ListItem::setIndexes( const QValueList<int>& lst )
+void QtxListResourceEdit::SelectItem::setIndexes( const QValueList<int>& lst )
{
myIndex.clear();
var = QVariant( myInteger->maxValue() );
else if ( name == QString( "step" ) )
var = QVariant( myInteger->lineStep() );
+ else if ( name == QString( "special" ) )
+ var = QVariant( myInteger->specialValueText() );
+ else if ( name == QString( "prefix" ) )
+ var = QVariant( myInteger->prefix() );
+ else if ( name == QString( "suffix" ) )
+ var = QVariant( myInteger->suffix() );
return var;
}
void QtxListResourceEdit::IntegerSpinItem::setProperty( const QString& name, const QVariant& var )
{
QVariant prop = var;
- if ( !prop.cast( QVariant::Int ) )
- return;
- int val = prop.toInt();
- if ( name == QString( "minimum" ) || name == QString( "min" ) )
- myInteger->setMinValue( val );
- else if ( name == QString( "maximum" ) || name == QString( "max" ) )
- myInteger->setMaxValue( val );
- else if ( name == QString( "step" ) && val > 0 )
- myInteger->setLineStep( val );
+ if ( ( name == QString( "minimum" ) || name == QString( "min" ) ) && prop.cast( QVariant::Int ) )
+ myInteger->setMinValue( prop.toInt() );
+ else if ( ( name == QString( "maximum" ) || name == QString( "max" ) ) && prop.cast( QVariant::Int ) )
+ myInteger->setMaxValue( prop.toInt() );
+ else if ( name == QString( "step" ) && prop.cast( QVariant::Int ) && prop.toInt() > 0 )
+ myInteger->setLineStep( prop.toInt() );
+ else if ( name == QString( "special" ) && prop.cast( QVariant::String ) )
+ myInteger->setSpecialValueText( prop.toString() );
+ else if ( name == QString( "prefix" ) && prop.cast( QVariant::String ) )
+ myInteger->setPrefix( prop.toString() );
+ else if ( name == QString( "suffix" ) && prop.cast( QVariant::String ) )
+ myInteger->setSuffix( prop.toString() );
}
/*
var = QVariant( myDouble->precision() );
else if ( name == QString( "step" ) )
var = QVariant( myDouble->lineStep() );
+ else if ( name == QString( "special" ) )
+ var = QVariant( myDouble->specialValueText() );
+ else if ( name == QString( "prefix" ) )
+ var = QVariant( myDouble->prefix() );
+ else if ( name == QString( "suffix" ) )
+ var = QVariant( myDouble->suffix() );
return var;
}
void QtxListResourceEdit::DoubleSpinItem::setProperty( const QString& name, const QVariant& var )
{
QVariant prop = var;
- if ( prop.cast( QVariant::Double ) )
- {
- double val = prop.toDouble();
- if ( name == QString( "minimum" ) || name == QString( "min" ) )
- myDouble->setMinValue( val );
- else if ( name == QString( "maximum" ) || name == QString( "max" ) )
- myDouble->setMaxValue( val );
- else if ( name == QString( "step" ) && val > 0 )
- myDouble->setLineStep( val );
- }
- else
- {
- QVariant prop = var;
- if ( prop.cast( QVariant::Int ) && name == QString( "precision" ) && prop.toInt() > 0 )
- myDouble->setPrecision( prop.toInt() );
- }
+
+ if ( ( name == QString( "minimum" ) || name == QString( "min" ) ) && prop.cast( QVariant::Double ) )
+ myDouble->setMinValue( prop.toDouble() );
+ else if ( ( name == QString( "maximum" ) || name == QString( "max" ) ) && prop.cast( QVariant::Double ) )
+ myDouble->setMaxValue( prop.toDouble() );
+ else if ( name == QString( "step" ) && prop.cast( QVariant::Double ) && prop.toDouble() > 0 )
+ myDouble->setLineStep( prop.toDouble() );
+ else if ( name == QString( "precision" ) && prop.cast( QVariant::Int ) && prop.toInt() > 0 )
+ myDouble->setPrecision( prop.toInt() );
+ else if ( name == QString( "special" ) && prop.cast( QVariant::String ) )
+ myDouble->setSpecialValueText( prop.toString() );
+ else if ( name == QString( "prefix" ) && prop.cast( QVariant::String ) )
+ myDouble->setPrefix( prop.toString() );
+ else if ( name == QString( "suffix" ) && prop.cast( QVariant::String ) )
+ myDouble->setSuffix( prop.toString() );
}
/*
Class: QtxListResourceEdit::FontItem
Descr: GUI implementation of resources font item.
*/
-QtxListResourceEdit::FontItem::FontItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
+QtxListResourceEdit::FontItem::FontItem( const QString& title, QtxResourceEdit* edit,
+ Item* pItem, QWidget* parent )
: PrefItem( Font, edit, pItem, parent )
{
new QLabel( title, this );
- myFontPrs = new QLabel( "", this );
- myFontPrs->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
- myFontPrs->setAutoResize( true );
- myFontPrs->setAlignment( Qt::AlignLeft );
-
- QToolButton* selFont = new QToolButton( this );
- selFont->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
- selFont->setText( "..." );
- connect( selFont, SIGNAL( clicked() ), this, SLOT( onSelectFont() ) );
+ myFamilies = new QtxComboBox( false, this );
+ mySizes = new QtxComboBox( true, this );
+ mySizes->setInsertionPolicy( QComboBox::NoInsertion );
+ myBold = new QCheckBox( tr( "Bold" ), this );
+ myItalic = new QCheckBox( tr( "Italic" ), this );
+ myUnderline = new QCheckBox( tr( "Underline" ), this );
+ myPreview = new QToolButton( this );
+ myPreview->setText( "..." );
+
+ myFamilies->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
+ mySizes->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
+
+ connect( myFamilies, SIGNAL( activated( int ) ), this, SLOT( onActivateFamily( int ) ) );
+ connect( myPreview, SIGNAL( clicked() ), this, SLOT( onPreview() ) );
+
+ setProperty( "system", ( bool )true );
+ setProperty( "widget_flags", ( int )All );
}
QtxListResourceEdit::FontItem::~FontItem()
void QtxListResourceEdit::FontItem::store()
{
- Item::setFont( myFont );
+ QFont f( family(), size() );
+ bool bold, italic, underline;
+ params( bold, italic, underline );
+ f.setBold( bold );
+ f.setItalic( italic );
+ f.setUnderline( underline );
+ Item::setFont( f );
}
void QtxListResourceEdit::FontItem::retrieve()
{
- myFont = getFont();
- buildFontPrs();
+ QFont f = getFont();
+ setFamily( f.family() );
+ setSize( f.pointSize() );
+ setParams( f.bold(), f.italic(), f.underline() );
+}
+
+QVariant QtxListResourceEdit::FontItem::property( const QString& name ) const
+{
+ if( name=="system" )
+ return myIsSystem;
+
+ else if( name=="widget_flags" )
+ return ( int )myFlags;
+
+ if( myIsSystem )
+ {
+ if( name=="families" )
+ {
+ QFontDatabase fdb;
+ return fdb.families();
+ }
+
+ else if( name=="default_family" )
+ {
+ QFontDatabase fdb;
+ QStringList fam = fdb.families();
+ if( fam.count()>0 )
+ return fam.first();
+ else
+ return QString::null;
+ }
+
+ else
+ {
+ QStringList parts = QStringList::split( ":", name );
+ if( parts.count()==2 )
+ {
+ if( parts[1]=="default_bold" || parts[1]=="default_italic" || parts[1]=="default_underline" )
+ return false;
+
+ else if( parts[1]=="sizes" )
+ {
+ QFontDatabase fdb;
+ QValueList<int> sizes = fdb.pointSizes( parts[0] );
+ QValueList<QVariant> vsizes;
+ QValueList<int>::const_iterator anIt = sizes.begin(),
+ aLast = sizes.end();
+ for( ; anIt!=aLast; anIt++ )
+ vsizes.append( *anIt );
+
+ return vsizes;
+ }
+
+ else if( parts[1]=="default_size" )
+ {
+ if( parts[0].isEmpty() )
+ return 0;
+
+ QFontDatabase fdb;
+ QValueList<int> sizes = fdb.pointSizes( parts[0] );
+ if( sizes.count()>0 )
+ return sizes.first();
+ else
+ return 0;
+ }
+ }
+ }
+ }
+
+ else if( myProperties.contains( name ) )
+ return myProperties[ name ];
+
+ return QVariant();
}
-void QtxListResourceEdit::FontItem::buildFontPrs()
+void QtxListResourceEdit::FontItem::setProperty( const QString& name, const QVariant& value )
{
- QStringList fval;
- fval.append( myFont.family() );
- if( myFont.bold() )
- fval.append( "Bold" );
- if( myFont.italic() )
- fval.append( "Italic" );
- fval.append( QString( "%1" ).arg( myFont.pointSize() ) );
+ if( name=="system" )
+ {
+ if( !value.canCast( QVariant::Bool ) )
+ return;
+
+ bool isSystem = value.toBool();
+ if( myIsSystem==isSystem )
+ return;
+
+ myIsSystem = isSystem;
+
+ QVariant families = property( "families" );
+ QString fam = family();
+
+ myFamilies->clear();
+ if( families.canCast( QVariant::StringList ) )
+ {
+ QStringList list = families.toStringList();
+ myFamilies->insertStringList( list );
+ }
+
+ setFamily( fam );
+ setSize( -1 ); //set default size
+ }
+
+ else if( name=="widget_flags" )
+ {
+ if( !value.canCast( QVariant::Int ) )
+ return;
+
+ int wf = value.toInt();
+
+ myFlags = wf;
+ myFamilies ->setShown( wf & Family );
+ mySizes ->setShown( wf & Size );
+ mySizes->lineEdit()->setReadOnly( ( wf & UserSize )==0 );
+ myBold ->setShown( wf & Bold );
+ myItalic ->setShown( wf & Italic );
+ myUnderline->setShown( wf & Underline );
+ bool isSystem = property( "system" ).canCast( QVariant::Bool ) ? property( "system" ).toBool() : false;
+ myPreview->setShown( ( wf & Preview ) && isSystem );
+
+ internalUpdate();
+ }
- myFontPrs->setText( fval.join( ", " ) );
+ else
+ myProperties[ name ] = value;
+}
+
+void QtxListResourceEdit::FontItem::setFamily( const QString& f )
+{
+ QString curtext;
+ if( myFamilies->isShown() )
+ {
+ if( myFamilies->listBox()->findItem( f, Qt::ExactMatch ) )
+ curtext = f;
+ }
+ else
+ {
+ QVariant deffam = property( "default_family" );
+ if( deffam.canCast( QVariant::String ) )
+ curtext = deffam.toString();
+ }
+
+ int idx = -1;
+ for ( int i = 0; i < (int)myFamilies->count() && idx < 0; i++ )
+ {
+ if ( myFamilies->text( i ) == curtext )
+ idx = i;
+ }
+
+ if ( idx >= 0 )
+ myFamilies->setCurrentItem( idx );
+
+ onActivateFamily( idx );
+}
+
+QString QtxListResourceEdit::FontItem::family() const
+{
+ return myFamilies->currentText();
+}
+
+void QtxListResourceEdit::FontItem::setSize( const int s )
+{
+ int cursize = -1;
+ if( mySizes->isShown() && s>0 )
+ {
+ if( ( myFlags & UserSize ) || mySizes->listBox()->findItem( QString( "%1" ).arg( s ), Qt::ExactMatch ) )
+ cursize = s;
+ }
+ else
+ {
+ QVariant defsize = property( QString( "%1:default_size" ).arg( family() ) );
+ if( defsize.canCast( QVariant::Int ) )
+ cursize = defsize.toInt();
+ }
+
+ mySizes->setCurrentText( cursize>0 ? QString( "%1" ).arg( cursize ) : "" );
}
-void QtxListResourceEdit::FontItem::onSelectFont()
+int QtxListResourceEdit::FontItem::size() const
{
+ QString s = mySizes->currentText();
bool ok;
- QFont newFont = QFontDialog::getFont( &ok, myFont, this );
+ int pSize = s.toInt( &ok );
+ return ( ok ? pSize : 0 );
+}
+
+void QtxListResourceEdit::FontItem::setParams( const bool bold, const bool italic, const bool underline )
+{
+ bool curbold = false, curitalic = false, curunderline = false;
+ if( myBold->isShown() )
+ curbold = bold;
+ else
+ {
+ QVariant def = property( QString( "%1:default_bold" ).arg( family() ) );
+ if( def.canCast( QVariant::Bool ) )
+ curbold = def.toBool();
+ }
+ if( myItalic->isShown() )
+ curitalic = italic;
+ else
+ {
+ QVariant def = property( QString( "%1:default_italic" ).arg( family() ) );
+ if( def.canCast( QVariant::Bool ) )
+ curitalic = def.toBool();
+ }
+ if( myUnderline->isShown() )
+ curunderline = underline;
+ else
+ {
+ QVariant def = property( QString( "%1:default_underline" ).arg( family() ) );
+ if( def.canCast( QVariant::Bool ) )
+ curunderline = def.toBool();
+ }
+ myBold->setChecked( curbold );
+ myItalic->setChecked( curitalic );
+ myUnderline->setChecked( curunderline );
+}
+
+void QtxListResourceEdit::FontItem::params( bool& bold, bool& italic, bool& underline )
+{
+ bold = myBold->isChecked();
+ italic = myItalic->isChecked();
+ underline = myUnderline->isChecked();
+}
+
+void QtxListResourceEdit::FontItem::internalUpdate()
+{
+ //update internal selection of font properties
+ setFamily( family() );
+ setSize( size() );
+ bool b1, b2, b3;
+ params( b1, b2, b3 );
+ setParams( b1, b2, b3 );
+}
+
+void QtxListResourceEdit::FontItem::onActivateFamily( int )
+{
+ QVariant sizes = property( QString( "%1:sizes" ).arg( family() ) );
+
+ int s = size();
+ mySizes->clear();
+ if( sizes.canCast( QVariant::List ) )
+ {
+ QValueList<QVariant> list = sizes.toList();
+ QStringList sizeItems;
+ QValueList<QVariant>::const_iterator anIt = list.begin(),
+ aLast = list.end();
+ for( ; anIt!=aLast; anIt++ )
+ if( (*anIt).canCast( QVariant::Int ) && (*anIt).toInt()>0 )
+ sizeItems.append( QString( "%1" ).arg( (*anIt).toInt() ) );
+ mySizes->insertStringList( sizeItems );
+ }
+ setSize( s );
+}
+
+void QtxListResourceEdit::FontItem::onPreview()
+{
+ QFont f( family(), size() );
+ bool bold, italic, underline;
+ params( bold, italic, underline );
+ f.setBold( bold );
+ f.setItalic( italic );
+ f.setUnderline( underline );
+
+ bool ok;
+ f = QFontDialog::getFont( &ok, f );
+
if( ok )
{
- myFont = newFont;
- buildFontPrs();
+ setFamily( f.family() );
+ setSize( f.pointSize() );
+ setParams( f.bold(), f.italic(), f.underline() );
}
}
+
+
+
+
+
+/*
+ Class: QtxListResourceEdit::DirListItem
+ Descr:
+*/
+QtxListResourceEdit::DirListItem::DirListItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
+: PrefItem( Font, edit, pItem, parent )
+{
+ myDirListEditor = new QtxDirListEditor( this );
+}
+
+QtxListResourceEdit::DirListItem::~DirListItem()
+{
+}
+
+void QtxListResourceEdit::DirListItem::store()
+{
+ QStringList list;
+ myDirListEditor->getPathList(list);
+ setString( QString(list.join(";")) );
+}
+
+void QtxListResourceEdit::DirListItem::retrieve()
+{
+ myDirListEditor->setPathList(QStringList::split(";", getString()));
+}
+
+
+
+/*
+ Class: QtxListResourceEdit::FileItem
+ Descr: GUI implementation of resources file item.
+*/
+QtxListResourceEdit::FileItem::FileItem( const QString& title, QtxResourceEdit* edit,
+ Item* pItem, QWidget* parent )
+: PrefItem( Font, edit, pItem, parent ),
+ myFlags( QFileInfo::ReadUser ),
+ myIsExisting( true ),
+ myFileDlg( 0 )
+{
+ new QLabel( title, this );
+ myFile = new QLineEdit( this );
+ myFile->setValidator( new FileValidator( this, myFile ) );
+ myFile->setReadOnly( true );
+ myOpenFile = new QToolButton( this );
+ myOpenFile->setText( "..." );
+ connect( myOpenFile, SIGNAL( clicked() ), this, SLOT( onOpenFile() ) );
+}
+
+QtxListResourceEdit::FileItem::~FileItem()
+{
+ if( myFileDlg )
+ delete myFileDlg;
+}
+
+void QtxListResourceEdit::FileItem::store()
+{
+ setString( myFile->text() );
+}
+
+void QtxListResourceEdit::FileItem::retrieve()
+{
+ myFile->setText( getString() );
+}
+
+QVariant QtxListResourceEdit::FileItem::property( const QString& name ) const
+{
+ if( name=="filter" )
+ return myFilter;
+ else if( name=="existing" )
+ return myIsExisting;
+ else if( name=="flags" )
+ return myFlags;
+
+ return QVariant();
+}
+
+void QtxListResourceEdit::FileItem::setProperty( const QString& name, const QVariant& value )
+{
+ if( name=="filter" )
+ {
+ if( value.canCast( QVariant::String ) )
+ {
+ myFilter.clear();
+ myFilter.append( value.toString() );
+ }
+ else if( value.canCast( QVariant::StringList ) )
+ myFilter = value.toStringList();
+ }
+ else if( name=="existing" && value.canCast( QVariant::Bool ) )
+ myIsExisting = value.toBool();
+
+ else if( name=="flags" && value.canCast( QVariant::UInt ) )
+ myFlags = value.toUInt();
+}
+
+void QtxListResourceEdit::FileItem::onOpenFile()
+{
+ if( !myFileDlg )
+ {
+ myFileDlg = new QFileDialog( "." );
+ connect( myFileDlg, SIGNAL( fileHighlighted( const QString& ) ), this, SLOT( onFileSelected( const QString& ) ) );
+ }
+
+ myFileDlg->setCaption( title() );
+ myFileDlg->setFilters( myFilter );
+ myFileDlg->setMode( myIsExisting ? QFileDialog::ExistingFile : QFileDialog::AnyFile );
+
+ if( myFileDlg->exec()==QDialog::Accepted )
+ {
+ myFile->setText( myFileDlg->selectedFile() );
+ }
+}
+
+bool QtxListResourceEdit::FileItem::isFileCorrect( const QString& f ) const
+{
+ bool res = false;
+ QFileInfo info( f );
+ if( !myIsExisting || info.exists() )
+ res = info.isFile() && info.permission( myFlags );
+
+ return res;
+}
+
+void QtxListResourceEdit::FileItem::onFileSelected( const QString& f )
+{
+ if( myFileDlg && !isFileCorrect( f ) )
+ myFileDlg->setSelection( "" );
+}
+
+
+
+QtxListResourceEdit::FileItem::FileValidator::FileValidator( FileItem* item, QObject* parent )
+: QValidator( parent ),
+ myItem( item )
+{
+}
+
+QtxListResourceEdit::FileItem::FileValidator::~FileValidator()
+{
+}
+
+QValidator::State QtxListResourceEdit::FileItem::FileValidator::validate( QString& f, int& ) const
+{
+ if( myItem && myItem->isFileCorrect( f ) )
+ return QValidator::Acceptable;
+ else
+ return QValidator::Intermediate;
+}