]> SALOME platform Git repositories - modules/gui.git/blob - src/Qtx/QtxListResourceEdit.cxx
Salome HOME
new variant of font item
[modules/gui.git] / src / Qtx / QtxListResourceEdit.cxx
1 // File:      QtxListResourceEdit.cxx
2 // Author:    Sergey TELKOV
3
4 #include "QtxListResourceEdit.h"
5
6 #include <qhbox.h>
7 #include <qvbox.h>
8 #include <qlabel.h>
9 #include <qlayout.h>
10 #include <qlistbox.h>
11 #include <qcombobox.h>
12 #include <qlineedit.h>
13 #include <qcheckbox.h>
14 #include <qtabwidget.h>
15 #include <qvalidator.h>
16 #include <qobjectlist.h>
17 #include <qcolordialog.h>
18 #include <qwidgetstack.h>
19 #include <qtoolbutton.h>
20 #include <qfontdialog.h>
21 #include <qfontdatabase.h>
22
23 #include "QtxIntSpinBox.h"
24 #include "QtxDblSpinBox.h"
25 #include "QtxComboBox.h"
26 #include "QtxDirListEditor.h"
27
28 /*
29   Class: QtxListResourceEdit
30   Descr: GUI implementation of QtxResourceEdit - manager of resources
31 */
32
33 QtxListResourceEdit::QtxListResourceEdit( QtxResourceMgr* mgr, QWidget* parent )
34 : QFrame( parent ),
35 QtxResourceEdit( mgr )
36 {
37   QVBoxLayout* main = new QVBoxLayout( this, 0, 5 );
38   QGroupBox* base = new QGroupBox( 1, Qt::Vertical, "", this );
39   base->setFrameStyle( QFrame::NoFrame );
40   base->setInsideMargin( 0 );
41   main->addWidget( base );
42
43   myList  = new QListBox( base );
44   myStack = new QWidgetStack( base );
45
46   myList->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) );
47   myStack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
48
49   myList->setSelectionMode( QListBox::Single );
50
51   connect( myList, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
52
53   setFocusProxy( myList );
54
55   updateState();
56 }
57
58 QtxListResourceEdit::~QtxListResourceEdit()
59 {
60 }
61
62 void QtxListResourceEdit::setItemProperty( const int id, const QString& prop, const QVariant& val )
63 {
64   Item* i = item( id );
65   if ( !i )
66     return;
67
68   bool prev = i->isEmpty();
69
70   QtxResourceEdit::setItemProperty( id, prop, val );
71
72   bool next = i->isEmpty();
73
74   if ( prev != next )
75     updateVisible();
76 }
77
78 void QtxListResourceEdit::onSelectionChanged()
79 {
80   QString title = myList->text( myList->index( myList->selectedItem() ) );
81   if ( title.isEmpty() )
82     return;
83
84   Item* i = 0;
85   QPtrList<Item> lst;
86   childItems( lst );
87   for ( QPtrListIterator<Item> it( lst ); it.current() && !i; ++it )
88   {
89     if ( it.current()->title() == title )
90       i = it.current();
91   }
92
93   if ( i )
94     myStack->raiseWidget( i->id() );
95 }
96
97 void QtxListResourceEdit::itemAdded( QtxResourceEdit::Item* i )
98 {
99   if ( !i )
100     return;
101
102   QPtrList<Item> items;
103   childItems( items );
104
105   if ( items.contains( i ) || items.contains( i->parentItem() ) )
106     updateVisible();
107 }
108
109 QtxResourceEdit::Item* QtxListResourceEdit::createItem( const QString& title, const int )
110 {
111   Item* i = item( title, -1 );
112   if ( i )
113     return i;
114
115   Category* category = new Category( this, myStack );
116   myStack->addWidget( category, category->id() );
117
118   updateVisible();
119
120   if ( !myList->selectedItem() )
121     myList->setSelected( 0, true );
122
123   updateState();
124
125   return category;
126 }
127
128 void QtxListResourceEdit::changedResources( const QMap<Item*, QString>& map )
129 {
130   QMap<int, QString> idMap;
131   for ( QMap<Item*, QString>::ConstIterator it = map.begin(); it != map.end(); ++it )
132   {
133     idMap.insert( it.key()->id(), it.data() );
134
135     emit resourceChanged( it.key()->id() );
136
137     QString sec, param;
138     it.key()->resource( sec, param );
139     emit resourceChanged( sec, param );
140   }
141
142   emit resourcesChanged( idMap );
143 }
144
145 void QtxListResourceEdit::updateState()
146 {
147   if ( myList->selectedItem() &&  myStack->visibleWidget() )
148     myStack->show();
149   else
150     myStack->hide();
151 }
152
153 void QtxListResourceEdit::updateVisible()
154 {
155   QPtrList<Item> items;
156   childItems( items );
157
158   QString name = myList->text( myList->index( myList->selectedItem() ) );
159
160   myList->clear();
161   for ( QPtrListIterator<Item> it( items ); it.current(); ++it )
162   {
163     if ( it.current()->isEmpty() )
164       continue;
165
166     myList->insertItem( it.current()->title() );
167   }
168
169   int idx = -1;
170   for ( int i = 0; i < (int)myList->count() && idx == -1; i++ )
171   {
172     if ( myList->text( i ) == name )
173       idx = i;
174   }
175
176   myList->setSelected( QMAX( idx, 0 ), true );
177
178   updateState();
179 }
180
181 /*
182   Class: QtxListResourceEdit::Category
183   Descr: GUI implementation of preferences category.
184 */
185
186 QtxListResourceEdit::Category::Category( QtxListResourceEdit* edit, QWidget* parent )
187 : QFrame( parent ),
188 Item( edit )
189 {
190   QVBoxLayout* main = new QVBoxLayout( this );
191   QGroupBox* base = new QGroupBox( 1, Qt::Horizontal, "", this );
192   base->setFrameStyle( QFrame::NoFrame );
193   base->setInsideMargin( 0 );
194   main->addWidget( base, 1 );
195
196   myTabs = new QTabWidget( base );
197   myInfo = new QLabel( base );
198
199   myInfo->setAlignment( Qt::AlignCenter );
200   myInfo->setFrameStyle( QFrame::WinPanel | QFrame::Raised );
201   myInfo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
202
203   updateState();
204 }
205
206 QtxListResourceEdit::Category::~Category()
207 {
208 }
209
210 bool QtxListResourceEdit::Category::isEmpty() const
211 {
212   return Item::isEmpty() && myInfo->text().isEmpty();
213 }
214
215 int QtxListResourceEdit::Category::type() const
216 {
217   return -1;
218 }
219
220 void QtxListResourceEdit::Category::store()
221 {
222 }
223
224 void QtxListResourceEdit::Category::retrieve()
225 {
226 }
227
228 QVariant QtxListResourceEdit::Category::property( const QString& prop ) const
229 {
230   QVariant var;
231   if ( prop == QString( "information" ) || prop == QString( "info" ) )
232     var = myInfo->text();
233   return var;
234 }
235
236 void QtxListResourceEdit::Category::setProperty( const QString& name, const QVariant& var )
237 {
238   QVariant prop = var;
239   if ( !prop.cast( QVariant::String ) )
240     return;
241
242   if ( name == QString( "information" ) || name == QString( "info" ) )
243     myInfo->setText( prop.toString() );
244
245   updateState();
246 }
247
248 QtxResourceEdit::Item* QtxListResourceEdit::Category::createItem( const QString& title, const int )
249 {
250   Item* i = item( title, id() );
251   if ( i )
252     return i;
253
254   Tab* tab = new Tab( resourceEdit(), this, this );
255   myTabs->addTab( tab, title );
256
257   updateState();
258
259   return tab;
260 }
261
262 void QtxListResourceEdit::Category::updateState()
263 {
264   if ( myTabs->count() )
265     myTabs->show();
266   else
267     myTabs->hide();
268
269   if ( !myTabs->count() && !myInfo->text().isEmpty() )
270     myInfo->show();
271   else
272     myInfo->hide();
273 }
274
275 /*
276   Class: QtxListResourceEdit::Tab
277   Descr: GUI implementation of resources tab.
278 */
279
280 QtxListResourceEdit::Tab::Tab( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
281 : QFrame( parent ),
282 Item( edit, pItem )
283 {
284   QVBoxLayout* main = new QVBoxLayout( this );
285   QVBox* vbox = new QVBox( this );
286   vbox->setMargin( 5 );
287   myMainFrame = vbox;
288   main->addWidget( myMainFrame );
289   main->addStretch( 1 );
290 }
291
292 QtxListResourceEdit::Tab::~Tab()
293 {
294 }
295
296 int QtxListResourceEdit::Tab::type() const
297 {
298   return -1;
299 }
300
301 void QtxListResourceEdit::Tab::store()
302 {
303 }
304
305 void QtxListResourceEdit::Tab::retrieve()
306 {
307 }
308
309 void QtxListResourceEdit::Tab::polish()
310 {
311   QFrame::polish();
312
313   adjustLabels();
314 }
315
316 QtxResourceEdit::Item* QtxListResourceEdit::Tab::createItem( const QString& title, const int )
317 {
318   Item* i = item( title, id() );
319   if ( i )
320     return i;
321
322   Group* group = new Group( title, resourceEdit(), this, myMainFrame );
323
324   return group;
325 }
326
327 void QtxListResourceEdit::Tab::adjustLabels()
328 {
329   QObjectList* labels = queryList( "QLabel" );
330   if ( labels )
331   {
332     int w = 0;
333     for ( QObjectListIt it1( *labels ); it1.current(); ++it1 )
334     {
335       if ( it1.current()->isWidgetType() )
336       {
337         QWidget* wid = (QWidget*)it1.current();
338         w = QMAX( w, wid->sizeHint().width() );
339       }
340     }
341     for ( QObjectListIt it2( *labels ); it2.current(); ++it2 )
342     {
343       if ( it2.current()->isWidgetType() )
344       {
345         QWidget* wid = (QWidget*)it2.current();
346         wid->setMinimumWidth( w );
347       }
348     }
349     delete labels;
350   }
351 }
352
353 /*
354   Class: QtxListResourceEdit::Group
355   Descr: GUI implementation of resources group.
356 */
357
358 QtxListResourceEdit::Group::Group( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
359 : QGroupBox( 2, Qt::Horizontal, title, parent ),
360 Item( edit, pItem )
361 {
362 }
363
364 QtxListResourceEdit::Group::~Group()
365 {
366 }
367
368 int QtxListResourceEdit::Group::type() const
369 {
370   return -1;
371 }
372
373 void QtxListResourceEdit::Group::store()
374 {
375 }
376
377 void QtxListResourceEdit::Group::retrieve()
378 {
379 }
380
381 QVariant QtxListResourceEdit::Group::property( const QString& prop ) const
382 {
383   QVariant var;
384   if ( prop == "columns" )
385     var = QVariant( columns() );
386   else if ( prop == "orientation" )
387     var = QVariant( orientation() );
388   else if ( prop == "frame" )
389     var = QVariant( frameStyle() != QFrame::NoFrame );
390   return var;
391 }
392
393 void QtxListResourceEdit::Group::setProperty( const QString& name, const QVariant& var )
394 {
395   QVariant prop = var;
396   if ( !prop.cast( QVariant::Int ) )
397     return;
398
399   if ( name == QString( "columns" ) && prop.cast( QVariant::Int ) && prop.toInt() > 0 )
400     setColumns( prop.toInt() );
401   else if ( name == QString( "orientation" ) && prop.cast( QVariant::Int ) )
402   {
403     int o = prop.toInt();
404     if ( o == Qt::Horizontal || o == Qt::Vertical )
405       setOrientation( (Orientation)o );
406   }
407   else if ( name == "frame" && prop.cast( QVariant::Bool ) )
408   {
409     setInsideMargin( prop.toBool() ? 5 : 0 );
410     QGroupBox::setTitle( prop.toBool() ? Item::title() : QString::null );
411     setFrameStyle( prop.toBool() ? QFrame::Box | QFrame::Sunken : QFrame::NoFrame );
412   }
413 }
414
415 void QtxListResourceEdit::Group::setTitle( const QString& title )
416 {
417   Item::setTitle( title );
418   QGroupBox::setTitle( title );
419 }
420
421 QtxResourceEdit::Item* QtxListResourceEdit::Group::createItem( const QString& title, const int type )
422 {
423   Item* item = 0;
424
425   switch ( type )
426   {
427   case Color:
428     item = new ColorItem( title, resourceEdit(), this, this );
429     break;
430   case Bool:
431     item = new StateItem( title, resourceEdit(), this, this );
432     break;
433   case String:
434     item = new StringItem( title, resourceEdit(), this, this );
435     break;
436   case Selector:
437     item = new SelectItem( title, resourceEdit(), this, this );
438     break;
439   case DblSpin:
440     item = new DoubleSpinItem( title, resourceEdit(), this, this );
441     break;
442   case IntSpin:
443     item = new IntegerSpinItem( title, resourceEdit(), this, this );
444     break;
445   case Double:
446     item = new DoubleEditItem( title, resourceEdit(), this, this );
447     break;
448   case Integer:
449     item = new IntegerEditItem( title, resourceEdit(), this, this );
450     break;
451   case Space:
452     item = new Spacer( resourceEdit(), this, this );
453     break;
454   case GroupBox:
455     item = new Group( title, resourceEdit(), this, this );
456     break;
457   case Font:
458     item = new FontItem( title, resourceEdit(), this, this );
459     break;
460   case DirList:
461     item = new DirListItem( title, resourceEdit(), this, this );
462     break;
463   }
464
465   return item;
466 }
467
468 /*
469   Class: QtxListResourceEdit::PrefItem
470   Descr: Base class for preferences items.
471 */
472
473 QtxListResourceEdit::PrefItem::PrefItem( const int type, QtxResourceEdit* edit, Item* pi, QWidget* parent )
474 : QHBox( parent ),
475 Item( edit, pi ),
476 myType( type )
477 {
478   setSpacing( 5 );
479 }
480
481 QtxListResourceEdit::PrefItem::~PrefItem()
482 {
483 }
484
485 int QtxListResourceEdit::PrefItem::type() const
486 {
487   return myType;
488 }
489
490 QtxResourceEdit::Item* QtxListResourceEdit::PrefItem::createItem( const QString&, const int )
491 {
492   return 0;
493 }
494
495 /*
496   Class: QtxListResourceEdit::Spacer
497   Descr: GUI implementation of resources spacer.
498 */
499
500 QtxListResourceEdit::Spacer::Spacer( QtxResourceEdit* edit, Item* pItem, QWidget* parent )
501 : PrefItem( Space, edit, pItem, parent )
502 {
503   setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
504 }
505
506 QtxListResourceEdit::Spacer::~Spacer()
507 {
508 }
509
510 void QtxListResourceEdit::Spacer::store()
511 {
512 }
513
514 void QtxListResourceEdit::Spacer::retrieve()
515 {
516 }
517
518 /*
519   Class: QtxListResourceEdit::SelectItem
520   Descr: GUI implementation of resources list item.
521 */
522
523 QtxListResourceEdit::SelectItem::SelectItem( const QString& title, QtxResourceEdit* edit,
524                                              Item* pItem, QWidget* parent )
525 : PrefItem( Selector, edit, pItem, parent )
526 {
527   new QLabel( title, this );
528   myList = new QComboBox( false, this );
529   myList->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
530 }
531
532 QtxListResourceEdit::SelectItem::~SelectItem()
533 {
534 }
535
536 void QtxListResourceEdit::SelectItem::store()
537 {
538   int idx = myList->currentItem();
539   if ( myIndex.contains( idx ) )
540     setInteger( myIndex[idx] );
541 }
542
543 void QtxListResourceEdit::SelectItem::retrieve()
544 {
545   int id = getInteger( -1 );
546
547   int idx = -1;
548   for ( QMap<int, int>::ConstIterator it = myIndex.begin(); it != myIndex.end() && idx == -1; ++it )
549   {
550     if ( it.data() == id )
551       idx = it.key();
552   }
553
554   myList->setCurrentItem( idx );
555 }
556
557 QVariant QtxListResourceEdit::SelectItem::property( const QString& name ) const
558 {
559   QVariant val;
560   if ( name == QString( "strings" ) )
561   {
562     QStringList lst;
563     for ( int i = 0; i < (int)myList->count(); i++ )
564       lst.append( myList->text( i ) );
565     val = QVariant( lst );
566   }
567   else if ( name == QString( "indexes" ) )
568   {
569     QValueList<QVariant> lst;
570     for ( int i = 0; i < (int)myList->count(); i++ )
571       lst.append( myIndex.contains( i ) ? myIndex[i] : 0 );
572     val = QVariant( lst );
573   }
574   return val;
575 }
576
577 void QtxListResourceEdit::SelectItem::setProperty( const QString& name, const QVariant& val )
578 {
579   if ( name == QString( "strings" ) )
580     setStrings( val );
581   else if ( name == QString( "indexes" ) )
582     setIndexes( val );
583 }
584
585 void QtxListResourceEdit::SelectItem::setStrings( const QVariant& var )
586 {
587   if ( var.type() != QVariant::StringList )
588     return;
589
590   setStrings( var.toStringList() );
591 }
592
593 void QtxListResourceEdit::SelectItem::setIndexes( const QVariant& var )
594 {
595   if ( var.type() != QVariant::List )
596     return;
597
598   QValueList<QVariant> varList = var.toList();
599   QValueList<int> lst;
600   for ( QValueList<QVariant>::const_iterator it = varList.begin(); it != varList.end(); ++it )
601   {
602     if ( (*it).canCast( QVariant::Int ) )
603       lst.append( (*it).toInt() );
604   }
605   setIndexes( lst );
606 }
607
608 void QtxListResourceEdit::SelectItem::setStrings( const QStringList& lst )
609 {
610   myList->clear();
611   myList->insertStringList( lst );
612 }
613
614 void QtxListResourceEdit::SelectItem::setIndexes( const QValueList<int>& lst )
615 {
616   myIndex.clear();
617
618   int idx = 0;
619   for ( QValueList<int>::const_iterator it = lst.begin(); it != lst.end(); ++it, idx++ )
620     myIndex.insert( idx, *it );
621 }
622
623 /*
624   Class: QtxListResourceEdit::StateItem
625   Descr: GUI implementation of resources bool item.
626 */
627
628 QtxListResourceEdit::StateItem::StateItem( const QString& title, QtxResourceEdit* edit,
629                                            Item* pItem, QWidget* parent )
630 : PrefItem( Bool, edit, pItem, parent )
631 {
632   myState = new QCheckBox( title, this );
633   myState->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
634 }
635
636 QtxListResourceEdit::StateItem::~StateItem()
637 {
638 }
639
640 void QtxListResourceEdit::StateItem::store()
641 {
642   setBoolean( myState->isChecked() );
643 }
644
645 void QtxListResourceEdit::StateItem::retrieve()
646 {
647   myState->setChecked( getBoolean() );
648 }
649
650 /*
651   Class: QtxListResourceEdit::StringItem
652   Descr: GUI implementation of resources string item.
653 */
654
655 QtxListResourceEdit::StringItem::StringItem( const QString& title, QtxResourceEdit* edit,
656                                              Item* pItem, QWidget* parent )
657 : PrefItem( String, edit, pItem, parent )
658 {
659   new QLabel( title, this );
660   myString = new QLineEdit( this );
661   myString->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
662 }
663
664 QtxListResourceEdit::StringItem::~StringItem()
665 {
666 }
667
668 void QtxListResourceEdit::StringItem::store()
669 {
670   setString( myString->text() );
671 }
672
673 void QtxListResourceEdit::StringItem::retrieve()
674 {
675   myString->setText( getString() );
676 }
677
678 /*
679   Class: QtxListResourceEdit::IntegerEditItem
680   Descr: GUI implementation of resources integer item.
681 */
682
683 QtxListResourceEdit::IntegerEditItem::IntegerEditItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
684 : PrefItem( Integer, edit, pItem, parent )
685 {
686   new QLabel( title, this );
687   myInteger = new QLineEdit( this );
688   myInteger->setValidator( new QIntValidator( myInteger ) );
689   myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
690 }
691
692 QtxListResourceEdit::IntegerEditItem::~IntegerEditItem()
693 {
694 }
695
696 void QtxListResourceEdit::IntegerEditItem::store()
697 {
698   setString( myInteger->text() );
699 }
700
701 void QtxListResourceEdit::IntegerEditItem::retrieve()
702 {
703   myInteger->setText( getString() );
704 }
705
706 /*
707   Class: QtxListResourceEdit::IntegerSpinItem
708   Descr: GUI implementation of resources integer item.
709 */
710
711 QtxListResourceEdit::IntegerSpinItem::IntegerSpinItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
712 : PrefItem( IntSpin, edit, pItem, parent )
713 {
714   new QLabel( title, this );
715   myInteger = new QtxIntSpinBox( this );
716   myInteger->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
717 }
718
719 QtxListResourceEdit::IntegerSpinItem::~IntegerSpinItem()
720 {
721 }
722
723 void QtxListResourceEdit::IntegerSpinItem::store()
724 {
725   setInteger( myInteger->value() );
726 }
727
728 void QtxListResourceEdit::IntegerSpinItem::retrieve()
729 {
730   myInteger->setValue( getInteger() );
731 }
732
733 QVariant QtxListResourceEdit::IntegerSpinItem::property( const QString& name ) const
734 {
735   QVariant var;
736   if ( name == QString( "minimum" ) || name == QString( "min" ) )
737     var = QVariant( myInteger->minValue() );
738   else if ( name == QString( "maximum" ) || name == QString( "max" ) )
739     var = QVariant( myInteger->maxValue() );
740   else if ( name == QString( "step" ) )
741     var = QVariant( myInteger->lineStep() );
742   else if ( name == QString( "special" ) )
743     var = QVariant( myInteger->specialValueText() );
744   else if ( name == QString( "prefix" ) )
745     var = QVariant( myInteger->prefix() );
746   else if ( name == QString( "suffix" ) )
747     var = QVariant( myInteger->suffix() );
748   return var;
749 }
750
751 void QtxListResourceEdit::IntegerSpinItem::setProperty( const QString& name, const QVariant& var )
752 {
753   QVariant prop = var;
754
755   if ( ( name == QString( "minimum" ) || name == QString( "min" ) ) && prop.cast( QVariant::Int ) )
756     myInteger->setMinValue( prop.toInt() );
757   else if ( ( name == QString( "maximum" ) || name == QString( "max" ) ) && prop.cast( QVariant::Int ) )
758     myInteger->setMaxValue( prop.toInt() );
759   else if ( name == QString( "step" ) && prop.cast( QVariant::Int ) && prop.toInt() > 0 )
760     myInteger->setLineStep( prop.toInt() );
761   else if ( name == QString( "special" ) && prop.cast( QVariant::String ) )
762     myInteger->setSpecialValueText( prop.toString() );
763   else if ( name == QString( "prefix" ) && prop.cast( QVariant::String ) )
764     myInteger->setPrefix( prop.toString() );
765   else if ( name == QString( "suffix" ) && prop.cast( QVariant::String ) )
766     myInteger->setSuffix( prop.toString() );
767 }
768
769 /*
770   Class: QtxListResourceEdit::DoubleEditItem
771   Descr: GUI implementation of resources string item.
772 */
773
774 QtxListResourceEdit::DoubleEditItem::DoubleEditItem( const QString& title, QtxResourceEdit* edit,
775                                                      Item* pItem, QWidget* parent )
776 : PrefItem( Double, edit, pItem, parent )
777 {
778   new QLabel( title, this );
779   myDouble = new QLineEdit( this );
780   myDouble->setValidator( new QDoubleValidator( myDouble ) );
781   myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
782 }
783
784 QtxListResourceEdit::DoubleEditItem::~DoubleEditItem()
785 {
786 }
787
788 void QtxListResourceEdit::DoubleEditItem::store()
789 {
790   setString( myDouble->text() );
791 }
792
793 void QtxListResourceEdit::DoubleEditItem::retrieve()
794 {
795   myDouble->setText( getString() );
796 }
797
798 /*
799   Class: QtxListResourceEdit::DoubleSpinItem
800   Descr: GUI implementation of resources double item.
801 */
802
803 QtxListResourceEdit::DoubleSpinItem::DoubleSpinItem( const QString& title, QtxResourceEdit* edit,
804                                                      Item* pItem, QWidget* parent )
805 : PrefItem( DblSpin, edit, pItem, parent )
806 {
807   new QLabel( title, this );
808   myDouble = new QtxDblSpinBox( this );
809   myDouble->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
810 }
811
812 QtxListResourceEdit::DoubleSpinItem::~DoubleSpinItem()
813 {
814 }
815
816 void QtxListResourceEdit::DoubleSpinItem::store()
817 {
818   setDouble( myDouble->value() );
819 }
820
821 void QtxListResourceEdit::DoubleSpinItem::retrieve()
822 {
823   myDouble->setValue( getDouble() );
824 }
825
826 QVariant QtxListResourceEdit::DoubleSpinItem::property( const QString& name ) const
827 {
828   QVariant var;
829   if ( name == QString( "minimum" ) || name == QString( "min" ) )
830     var = QVariant( myDouble->minValue() );
831   else if ( name == QString( "maximum" ) || name == QString( "max" ) )
832     var = QVariant( myDouble->maxValue() );
833   else if ( name == QString( "precision" ) )
834     var = QVariant( myDouble->precision() );
835   else if ( name == QString( "step" ) )
836     var = QVariant( myDouble->lineStep() );
837   else if ( name == QString( "special" ) )
838     var = QVariant( myDouble->specialValueText() );
839   else if ( name == QString( "prefix" ) )
840     var = QVariant( myDouble->prefix() );
841   else if ( name == QString( "suffix" ) )
842     var = QVariant( myDouble->suffix() );
843   return var;
844 }
845
846 void QtxListResourceEdit::DoubleSpinItem::setProperty( const QString& name, const QVariant& var )
847 {
848   QVariant prop = var;
849
850   if ( ( name == QString( "minimum" ) || name == QString( "min" ) ) && prop.cast( QVariant::Double ) )
851     myDouble->setMinValue( prop.toDouble() );
852   else if ( ( name == QString( "maximum" ) || name == QString( "max" ) ) && prop.cast( QVariant::Double ) )
853     myDouble->setMaxValue( prop.toDouble() );
854   else if ( name == QString( "step" ) && prop.cast( QVariant::Double ) && prop.toDouble() > 0 )
855     myDouble->setLineStep( prop.toDouble() );
856   else if ( name == QString( "precision" ) && prop.cast( QVariant::Int ) && prop.toInt() > 0 )
857     myDouble->setPrecision( prop.toInt() );
858   else if ( name == QString( "special" ) && prop.cast( QVariant::String ) )
859     myDouble->setSpecialValueText( prop.toString() );
860   else if ( name == QString( "prefix" ) && prop.cast( QVariant::String ) )
861     myDouble->setPrefix( prop.toString() );
862   else if ( name == QString( "suffix" ) && prop.cast( QVariant::String ) )
863     myDouble->setSuffix( prop.toString() );
864 }
865
866 /*
867   Class: QtxListResourceEdit::ColorItem
868   Descr: GUI implementation of resources color item.
869 */
870
871 QtxListResourceEdit::ColorItem::ColorItem( const QString& title, QtxResourceEdit* edit,
872                                            Item* pItem, QWidget* parent )
873 : PrefItem( Color, edit, pItem, parent )
874 {
875   class ColorSelector : public QLabel
876   {
877   public:
878     ColorSelector( QWidget* parent = 0 ) : QLabel( parent )
879     {
880       setFrameStyle( WinPanel | Raised );
881     }
882     virtual ~ColorSelector() {}
883     virtual QSize minimumSizeHint() const
884     {
885       return QLabel::minimumSizeHint() + QSize( 0, 2 );
886     }
887
888   protected:
889     virtual void mousePressEvent( QMouseEvent* e )
890     {
891       if ( e->button() == LeftButton )
892       {
893         setFrameStyle( WinPanel | Sunken );
894         QColor c = QColorDialog::getColor( paletteBackgroundColor(), this );
895         if ( c.isValid() )
896           setPaletteBackgroundColor( c );
897
898         setFrameStyle( WinPanel | Raised );
899       }
900     }
901   };
902
903   new QLabel( title, this );
904   myColor = new ColorSelector( this );
905   myColor->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
906 }
907
908 QtxListResourceEdit::ColorItem::~ColorItem()
909 {
910 }
911
912 void QtxListResourceEdit::ColorItem::store()
913 {
914   setColor( myColor->paletteBackgroundColor() );
915 }
916
917 void QtxListResourceEdit::ColorItem::retrieve()
918 {
919   myColor->setPaletteBackgroundColor( getColor() );
920 }
921
922
923 /*
924   Class: QtxListResourceEdit::FontItem
925   Descr: GUI implementation of resources font item.
926 */
927 QtxListResourceEdit::FontItem::FontItem( const QString& title, QtxResourceEdit* edit,
928                                          Item* pItem, QWidget* parent )
929 : PrefItem( Font, edit, pItem, parent )
930 {
931   new QLabel( title, this );
932   myFamilies = new QtxComboBox( this );
933   mySizes = new QtxComboBox( true, this );
934   mySizes->setInsertionPolicy( QComboBox::NoInsertion );
935   myBold = new QCheckBox( tr( "Bold" ), this );
936   myItalic = new QCheckBox( tr( "Italic" ), this );
937   myUnderline = new QCheckBox( tr( "Underline" ), this );
938
939   connect( myFamilies, SIGNAL( activated( int ) ), this, SLOT( onActivateFamily( int ) ) );
940
941   setWidgetFlags( All );
942   setIsSystem( true );
943 }
944
945 QtxListResourceEdit::FontItem::~FontItem()
946 {
947 }
948
949 void QtxListResourceEdit::FontItem::store()
950 {
951   QFont f( family(), size() );
952   bool bold, italic, underline;
953   params( bold, italic, underline );
954   f.setBold( bold );
955   f.setItalic( italic );
956   f.setUnderline( underline );
957   Item::setFont( f );
958 }
959
960 void QtxListResourceEdit::FontItem::retrieve()
961 {
962   QFont f = getFont();
963   setFamily( f.family() );
964   setSize( f.pointSize() );
965   setParams( f.bold(), f.italic(), f.underline() );
966 }
967
968 void QtxListResourceEdit::FontItem::setWidgetFlags( const WidgetFlags wf )
969 {
970   myFlags = wf;
971   myFamilies ->setShown( wf & Family );
972   mySizes    ->setShown( wf & Size );
973   mySizes->lineEdit()->setReadOnly( ( wf & UserSize )==0 );
974   myBold     ->setShown( wf & Bold );
975   myItalic   ->setShown( wf & Italic );
976   myUnderline->setShown( wf & Underline );
977
978   internalUpdate();
979 }
980
981 QtxListResourceEdit::FontItem::WidgetFlags QtxListResourceEdit::FontItem::widgetFlags() const
982 {
983   return myFlags;
984 }
985
986 void QtxListResourceEdit::FontItem::setIsSystem( const bool isSystem )
987 {
988   if( myIsSystem==isSystem )
989     return;
990
991   myIsSystem = isSystem;
992
993   QVariant families = property( "families" );
994   QString fam = family();
995
996   myFamilies->clear();
997   if( families.canCast( QVariant::StringList ) )
998   {
999     QStringList list = families.toStringList();
1000     myFamilies->insertStringList( list );
1001   }
1002
1003   setFamily( fam );
1004 }
1005
1006 bool QtxListResourceEdit::FontItem::isSystem() const
1007 {
1008   return myIsSystem;
1009 }
1010
1011 QVariant QtxListResourceEdit::FontItem::property( const QString& name ) const
1012 {
1013   if( isSystem() )
1014   {
1015     if( name=="families" )
1016     {
1017       QFontDatabase fdb;
1018       return fdb.families();
1019     }
1020
1021     else if( name=="default_family" )
1022     {
1023       QFontDatabase fdb;
1024       QStringList fam = fdb.families();
1025       if( fam.count()>0 )
1026         return fam.first();
1027       else
1028         return QString::null;
1029     }
1030
1031     else
1032     {
1033       QStringList parts = QStringList::split( ":", name );
1034       if( parts.count()==2 )
1035       {
1036         if( parts[1]=="default_bold" || parts[1]=="default_italic" || parts[1]=="default_underline" )
1037           return false;
1038
1039         else if( parts[1]=="sizes" )
1040         {
1041           QFontDatabase fdb;
1042           QValueList<int> sizes = fdb.pointSizes( parts[0] );
1043           QValueList<QVariant> vsizes;
1044           QValueList<int>::const_iterator anIt = sizes.begin(),
1045                                           aLast = sizes.end();
1046           for( ; anIt!=aLast; anIt++ )
1047             vsizes.append( *anIt );
1048
1049           return vsizes;
1050         }
1051
1052         else if( parts[1]=="default_size" )
1053         {
1054           QFontDatabase fdb;
1055           QValueList<int> sizes = fdb.pointSizes( parts[0] );
1056           if( sizes.count()>0 )
1057             return sizes.first();
1058           else
1059             return 0;
1060         }
1061       }
1062     }
1063   }
1064
1065   else if( myProperties.contains( name ) )
1066     return myProperties[ name ];
1067
1068   return QVariant();
1069 }
1070
1071 void QtxListResourceEdit::FontItem::setProperty( const QString& name, const QVariant& value )
1072 {
1073   myProperties[ name ] = value;
1074 }
1075
1076 void QtxListResourceEdit::FontItem::setFamily( const QString& f )
1077 {
1078   QString curtext;
1079   if( myFamilies->isShown() )
1080   {
1081     if( myFamilies->listBox()->findItem( f, Qt::ExactMatch ) )
1082       curtext = f;
1083   }
1084   else
1085   {
1086     QVariant deffam = property( "default_family" );
1087     if( deffam.canCast( QVariant::String ) )
1088       curtext = deffam.toString();
1089   }
1090
1091   if( curtext!=family() )
1092     myFamilies->setCurrentText( curtext );
1093 }
1094
1095 QString QtxListResourceEdit::FontItem::family() const
1096 {
1097   return myFamilies->currentText();
1098 }
1099
1100 void QtxListResourceEdit::FontItem::setSize( const int s )
1101 {
1102   int cursize = -1;
1103   if( mySizes->isShown() )
1104   {
1105     if( ( myFlags & UserSize ) || mySizes->listBox()->findItem( QString( "%1" ).arg( s ), Qt::ExactMatch ) )
1106       cursize = s;
1107   }
1108   else
1109   {
1110     QVariant defsize = property( QString( "%1:default_size" ).arg( family() ) );
1111     if( defsize.canCast( QVariant::Int ) )
1112       cursize = defsize.toInt();
1113   }
1114
1115   mySizes->setCurrentText( cursize>0 ? QString( "%1" ).arg( cursize ) : "" );
1116 }
1117
1118 int QtxListResourceEdit::FontItem::size() const
1119 {
1120   QString s = mySizes->currentText();
1121   bool ok;
1122   int pSize = s.toInt( &ok );
1123   return ( ok ? pSize : 0 );
1124 }
1125
1126 void QtxListResourceEdit::FontItem::setParams( const bool bold, const bool italic, const bool underline )
1127 {
1128   bool curbold = false, curitalic = false, curunderline = false;
1129   if( myBold->isShown() )
1130     curbold = bold;
1131   else
1132   {
1133     QVariant def = property( QString( "%1:default_bold" ).arg( family() ) );
1134     if( def.canCast( QVariant::Bool ) )
1135       curbold = def.toBool();
1136   }
1137   if( myItalic->isShown() )
1138     curitalic = italic;
1139   else
1140   {
1141     QVariant def = property( QString( "%1:default_italic" ).arg( family() ) );
1142     if( def.canCast( QVariant::Bool ) )
1143       curitalic = def.toBool();
1144   }
1145   if( myUnderline->isShown() )
1146     curunderline = underline;
1147   else
1148   {
1149     QVariant def = property( QString( "%1:default_underline" ).arg( family() ) );
1150     if( def.canCast( QVariant::Bool ) )
1151       curunderline = def.toBool();
1152   }
1153   myBold->setChecked( curbold );
1154   myItalic->setChecked( curitalic );
1155   myUnderline->setChecked( curunderline );
1156 }
1157
1158 void QtxListResourceEdit::FontItem::params( bool& bold, bool& italic, bool& underline )
1159 {
1160   bold = myBold->isChecked();
1161   italic = myItalic->isChecked();
1162   underline = myUnderline->isChecked();
1163 }
1164
1165 void QtxListResourceEdit::FontItem::internalUpdate()
1166 {
1167   //update internal selection of font properties
1168   setFamily( family() );
1169   setSize( size() );
1170   bool b1, b2, b3;
1171   params( b1, b2, b3 );
1172   setParams( b1, b2, b3 );
1173 }
1174
1175 void QtxListResourceEdit::FontItem::onActivateFamily( int )
1176 {
1177   QVariant sizes = property( QString( "%1:sizes" ).arg( family() ) );
1178
1179   int s = size();
1180   mySizes->clear();
1181   if( sizes.canCast( QVariant::List ) )
1182   {
1183     QValueList<QVariant> list = sizes.toList();
1184     QStringList sizeItems;
1185     QValueList<QVariant>::const_iterator anIt = list.begin(),
1186                                          aLast = list.end();
1187     for( ; anIt!=aLast; anIt++ )
1188       if( (*anIt).canCast( QVariant::Int ) && (*anIt).toInt()>0 )
1189         sizeItems.append( QString( "%1" ).arg( (*anIt).toInt() ) );
1190     mySizes->insertStringList( sizeItems );
1191   }
1192   setSize( s );
1193 }
1194
1195
1196
1197
1198 /*
1199   Class: QtxListResourceEdit::DirListItem
1200   Descr: 
1201 */
1202 QtxListResourceEdit::DirListItem::DirListItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
1203 : PrefItem( Font, edit, pItem, parent )
1204 {
1205   myDirListEditor = new QtxDirListEditor( this ); 
1206 }
1207
1208 QtxListResourceEdit::DirListItem::~DirListItem()
1209 {
1210 }
1211
1212 void QtxListResourceEdit::DirListItem::store()
1213 {
1214   QStringList list;
1215   myDirListEditor->getPathList(list);
1216   setString( QString(list.join(";")) );
1217 }
1218
1219 void QtxListResourceEdit::DirListItem::retrieve()
1220 {
1221   myDirListEditor->setPathList(QStringList::split(";", getString()));
1222 }