Salome HOME
Fix for bug 10438: Crash during Explode on Blocks operation (Global selection on...
[modules/gui.git] / src / Qtx / QtxListResourceEdit.cxx
index 5a6c1867a349439a9ffac9280c1d9d0cf533355a..34e73a4711e7f41c8a86855424e135478ca2c671 100644 (file)
@@ -4,6 +4,7 @@
 #include "QtxListResourceEdit.h"
 
 #include <qhbox.h>
+#include <qvbox.h>
 #include <qlabel.h>
 #include <qlayout.h>
 #include <qlistbox.h>
 #include <qobjectlist.h>
 #include <qcolordialog.h>
 #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
@@ -28,16 +36,17 @@ QtxListResourceEdit::QtxListResourceEdit( QtxResourceMgr* mgr, QWidget* parent )
 : QFrame( parent ),
 QtxResourceEdit( mgr )
 {
-  QHBoxLayout* main = new QHBoxLayout( this, 0, 5 );
-
-  myList  = new QListBox( this );
-  myStack = new QWidgetStack( this );
+  QVBoxLayout* main = new QVBoxLayout( this, 0, 5 );
+  QGroupBox* base = new QGroupBox( 1, Qt::Vertical, "", this );
+  base->setFrameStyle( QFrame::NoFrame );
+  base->setInsideMargin( 0 );
+  main->addWidget( base );
 
-  myList->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ) );
-  myStack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+  myList  = new QListBox( base );
+  myStack = new QWidgetStack( base );
 
-  main->addWidget( myList );
-  main->addWidget( myStack );
+  myList->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) );
+  myStack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
 
   myList->setSelectionMode( QListBox::Single );
 
@@ -52,13 +61,51 @@ QtxListResourceEdit::~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 )
@@ -68,9 +115,9 @@ QtxResourceEdit::Item* QtxListResourceEdit::createItem( const QString& title, co
     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 );
@@ -99,12 +146,40 @@ void QtxListResourceEdit::changedResources( const QMap<Item*, QString>& map )
 
 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.
@@ -134,6 +209,11 @@ QtxListResourceEdit::Category::~Category()
 {
 }
 
+bool QtxListResourceEdit::Category::isEmpty() const
+{
+  return Item::isEmpty() && myInfo->text().isEmpty();
+}
+
 int QtxListResourceEdit::Category::type() const
 {
   return -1;
@@ -204,10 +284,11 @@ QtxListResourceEdit::Tab::Tab( QtxResourceEdit* edit, Item* pItem, QWidget* pare
 Item( edit, pItem )
 {
   QVBoxLayout* main = new QVBoxLayout( this );
-  myMainFrame = new QGroupBox( 1, Qt::Horizontal, "", this );
-  myMainFrame->setFrameStyle( QFrame::NoFrame );
-  myMainFrame->setInsideMargin( 5 );
+  QVBox* vbox = new QVBox( this );
+  vbox->setMargin( 5 );
+  myMainFrame = vbox;
   main->addWidget( myMainFrame );
+  main->addStretch( 1 );
 }
 
 QtxListResourceEdit::Tab::~Tab()
@@ -304,6 +385,10 @@ QVariant QtxListResourceEdit::Group::property( const QString& prop ) const
   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;
 }
 
@@ -313,8 +398,20 @@ void QtxListResourceEdit::Group::setProperty( const QString& name, const QVarian
   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 )
@@ -338,24 +435,36 @@ QtxResourceEdit::Item* QtxListResourceEdit::Group::createItem( const QString& ti
   case String:
     item = new StringItem( title, resourceEdit(), this, this );
     break;
-  case List:
-    item = new ListItem( title, resourceEdit(), this, this );
+  case Selector:
+    item = new SelectItem( title, resourceEdit(), this, this );
     break;
-  case RealSpin:
+  case DblSpin:
     item = new DoubleSpinItem( title, resourceEdit(), this, this );
     break;
-  case IntegerSpin:
+  case IntSpin:
     item = new IntegerSpinItem( title, resourceEdit(), this, this );
     break;
-  case RealEdit:
+  case Double:
     item = new DoubleEditItem( title, resourceEdit(), this, this );
     break;
-  case IntegerEdit:
+  case Integer:
     item = new IntegerEditItem( title, resourceEdit(), this, this );
     break;
   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;
@@ -396,7 +505,7 @@ QtxResourceEdit::Item* QtxListResourceEdit::PrefItem::createItem( const QString&
 QtxListResourceEdit::Spacer::Spacer( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
 : PrefItem( Space, edit, pItem, parent )
 {
-  setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+  setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
 }
 
 QtxListResourceEdit::Spacer::~Spacer()
@@ -412,31 +521,31 @@ void QtxListResourceEdit::Spacer::retrieve()
 }
 
 /*
-  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 )
-: PrefItem( List, edit, pItem, parent )
+QtxListResourceEdit::SelectItem::SelectItem( const QString& title, QtxResourceEdit* edit,
+                                            Item* pItem, QWidget* parent )
+: PrefItem( Selector, edit, pItem, parent )
 {
   new QLabel( title, this );
   myList = new QComboBox( false, this );
-  myList->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+  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 );
 
@@ -450,7 +559,7 @@ void QtxListResourceEdit::ListItem::retrieve()
   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" ) )
@@ -470,7 +579,7 @@ QVariant QtxListResourceEdit::ListItem::property( const QString& name ) const
   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 );
@@ -478,7 +587,7 @@ void QtxListResourceEdit::ListItem::setProperty( const QString& name, const QVar
     setIndexes( val );
 }
 
-void QtxListResourceEdit::ListItem::setStrings( const QVariant& var )
+void QtxListResourceEdit::SelectItem::setStrings( const QVariant& var )
 {
   if ( var.type() != QVariant::StringList )
     return;
@@ -486,7 +595,7 @@ void QtxListResourceEdit::ListItem::setStrings( const QVariant& var )
   setStrings( var.toStringList() );
 }
 
-void QtxListResourceEdit::ListItem::setIndexes( const QVariant& var )
+void QtxListResourceEdit::SelectItem::setIndexes( const QVariant& var )
 {
   if ( var.type() != QVariant::List )
     return;
@@ -501,13 +610,13 @@ void QtxListResourceEdit::ListItem::setIndexes( const QVariant& var )
   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();
 
@@ -526,7 +635,7 @@ QtxListResourceEdit::StateItem::StateItem( const QString& title, QtxResourceEdit
 : PrefItem( Bool, edit, pItem, parent )
 {
   myState = new QCheckBox( title, this );
-  myState->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+  myState->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
 }
 
 QtxListResourceEdit::StateItem::~StateItem()
@@ -554,7 +663,7 @@ QtxListResourceEdit::StringItem::StringItem( const QString& title, QtxResourceEd
 {
   new QLabel( title, this );
   myString = new QLineEdit( this );
-  myString->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+  myString->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
 }
 
 QtxListResourceEdit::StringItem::~StringItem()
@@ -577,12 +686,12 @@ void QtxListResourceEdit::StringItem::retrieve()
 */
 
 QtxListResourceEdit::IntegerEditItem::IntegerEditItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
-: PrefItem( IntegerEdit, edit, pItem, parent )
+: PrefItem( Integer, edit, pItem, parent )
 {
   new QLabel( title, this );
   myInteger = new QLineEdit( this );
   myInteger->setValidator( new QIntValidator( myInteger ) );
-  myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+  myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
 }
 
 QtxListResourceEdit::IntegerEditItem::~IntegerEditItem()
@@ -605,11 +714,11 @@ void QtxListResourceEdit::IntegerEditItem::retrieve()
 */
 
 QtxListResourceEdit::IntegerSpinItem::IntegerSpinItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
-: PrefItem( IntegerSpin, edit, pItem, parent )
+: PrefItem( IntSpin, edit, pItem, parent )
 {
   new QLabel( title, this );
   myInteger = new QtxIntSpinBox( this );
-  myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+  myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
 }
 
 QtxListResourceEdit::IntegerSpinItem::~IntegerSpinItem()
@@ -635,22 +744,31 @@ QVariant QtxListResourceEdit::IntegerSpinItem::property( const QString& name ) c
     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() );
 }
 
 /*
@@ -660,12 +778,12 @@ void QtxListResourceEdit::IntegerSpinItem::setProperty( const QString& name, con
 
 QtxListResourceEdit::DoubleEditItem::DoubleEditItem( const QString& title, QtxResourceEdit* edit,
                                                      Item* pItem, QWidget* parent )
-: PrefItem( RealEdit, edit, pItem, parent )
+: PrefItem( Double, edit, pItem, parent )
 {
   new QLabel( title, this );
   myDouble = new QLineEdit( this );
   myDouble->setValidator( new QDoubleValidator( myDouble ) );
-  myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+  myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
 }
 
 QtxListResourceEdit::DoubleEditItem::~DoubleEditItem()
@@ -689,11 +807,11 @@ void QtxListResourceEdit::DoubleEditItem::retrieve()
 
 QtxListResourceEdit::DoubleSpinItem::DoubleSpinItem( const QString& title, QtxResourceEdit* edit,
                                                      Item* pItem, QWidget* parent )
-: PrefItem( RealSpin, edit, pItem, parent )
+: PrefItem( DblSpin, edit, pItem, parent )
 {
   new QLabel( title, this );
   myDouble = new QtxDblSpinBox( this );
-  myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+  myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
 }
 
 QtxListResourceEdit::DoubleSpinItem::~DoubleSpinItem()
@@ -721,28 +839,33 @@ QVariant QtxListResourceEdit::DoubleSpinItem::property( const QString& name ) co
     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() );
 }
 
 /*
@@ -784,7 +907,7 @@ QtxListResourceEdit::ColorItem::ColorItem( const QString& title, QtxResourceEdit
 
   new QLabel( title, this );
   myColor = new ColorSelector( this );
-  myColor->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+  myColor->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
 }
 
 QtxListResourceEdit::ColorItem::~ColorItem()
@@ -800,3 +923,476 @@ void QtxListResourceEdit::ColorItem::retrieve()
 {
   myColor->setPaletteBackgroundColor( getColor() );
 }
+
+
+/*
+  Class: QtxListResourceEdit::FontItem
+  Descr: GUI implementation of resources font item.
+*/
+QtxListResourceEdit::FontItem::FontItem( const QString& title, QtxResourceEdit* edit,
+                                         Item* pItem, QWidget* parent )
+: PrefItem( Font, edit, pItem, parent )
+{
+  new QLabel( title, this );
+  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()
+{
+  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()
+{
+  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::setProperty( const QString& name, const QVariant& value )
+{
+  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();
+  }
+  
+  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 ) : "" );
+}
+
+int QtxListResourceEdit::FontItem::size() const
+{
+  QString s = mySizes->currentText();
+  bool ok;
+  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 )
+  {
+    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;
+}