Salome HOME
*** empty log message ***
[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( false, 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   myFamilies->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
940   mySizes->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
941
942   connect( myFamilies, SIGNAL( activated( int ) ), this, SLOT( onActivateFamily( int ) ) );
943
944   setProperty( "widget_flags", ( int )All );
945   setProperty( "system", ( bool )true );
946 }
947
948 QtxListResourceEdit::FontItem::~FontItem()
949 {
950 }
951
952 void QtxListResourceEdit::FontItem::store()
953 {
954   QFont f( family(), size() );
955   bool bold, italic, underline;
956   params( bold, italic, underline );
957   f.setBold( bold );
958   f.setItalic( italic );
959   f.setUnderline( underline );
960   Item::setFont( f );
961 }
962
963 void QtxListResourceEdit::FontItem::retrieve()
964 {
965   QFont f = getFont();
966   setFamily( f.family() );
967   setSize( f.pointSize() );
968   setParams( f.bold(), f.italic(), f.underline() );
969 }
970
971 QVariant QtxListResourceEdit::FontItem::property( const QString& name ) const
972 {
973   if( name=="system" )
974     return myIsSystem;
975
976   else if( name=="widget_flags" )
977     return ( int )myFlags;
978   
979   if( myIsSystem )
980   {
981     if( name=="families" )
982     {
983       QFontDatabase fdb;
984       return fdb.families();
985     }
986
987     else if( name=="default_family" )
988     {
989       QFontDatabase fdb;
990       QStringList fam = fdb.families();
991       if( fam.count()>0 )
992         return fam.first();
993       else
994         return QString::null;
995     }
996
997     else
998     {
999       QStringList parts = QStringList::split( ":", name );
1000       if( parts.count()==2 )
1001       {
1002         if( parts[1]=="default_bold" || parts[1]=="default_italic" || parts[1]=="default_underline" )
1003           return false;
1004
1005         else if( parts[1]=="sizes" )
1006         {
1007           QFontDatabase fdb;
1008           QValueList<int> sizes = fdb.pointSizes( parts[0] );
1009           QValueList<QVariant> vsizes;
1010           QValueList<int>::const_iterator anIt = sizes.begin(),
1011                                           aLast = sizes.end();
1012           for( ; anIt!=aLast; anIt++ )
1013             vsizes.append( *anIt );
1014
1015           return vsizes;
1016         }
1017
1018         else if( parts[1]=="default_size" )
1019         {
1020           if( parts[0].isEmpty() )
1021             return 0;
1022             
1023           QFontDatabase fdb;
1024           QValueList<int> sizes = fdb.pointSizes( parts[0] );
1025           if( sizes.count()>0 )
1026             return sizes.first();
1027           else
1028             return 0;
1029         }
1030       }
1031     }
1032   }
1033
1034   else if( myProperties.contains( name ) )
1035     return myProperties[ name ];
1036
1037   return QVariant();
1038 }
1039
1040 void QtxListResourceEdit::FontItem::setProperty( const QString& name, const QVariant& value )
1041 {
1042   if( name=="system" )
1043   {
1044     if( !value.canCast( QVariant::Bool ) )
1045       return;
1046
1047     bool isSystem = value.toBool();
1048     if( myIsSystem==isSystem )
1049       return;
1050
1051     myIsSystem = isSystem;
1052
1053     QVariant families = property( "families" );
1054     QString fam = family();
1055
1056     myFamilies->clear();
1057     if( families.canCast( QVariant::StringList ) )
1058     {
1059       QStringList list = families.toStringList();
1060       myFamilies->insertStringList( list );
1061     }
1062
1063     setFamily( fam );
1064     setSize( -1 ); //set default size
1065     onActivateFamily( -1 );
1066   }
1067   
1068   else if( name=="widget_flags" )
1069   {
1070     if( !value.canCast( QVariant::Int ) )
1071       return;
1072
1073     int wf = value.toInt();
1074     
1075     myFlags = wf;
1076     myFamilies ->setShown( wf & Family );
1077     mySizes    ->setShown( wf & Size );
1078     mySizes->lineEdit()->setReadOnly( ( wf & UserSize )==0 );
1079     myBold     ->setShown( wf & Bold );
1080     myItalic   ->setShown( wf & Italic );
1081     myUnderline->setShown( wf & Underline );
1082
1083     internalUpdate();
1084   }
1085   
1086   else
1087     myProperties[ name ] = value;
1088 }
1089
1090 void QtxListResourceEdit::FontItem::setFamily( const QString& f )
1091 {
1092   QString curtext;
1093   if( myFamilies->isShown() )
1094   {
1095     if( myFamilies->listBox()->findItem( f, Qt::ExactMatch ) )
1096       curtext = f;
1097   }
1098   else
1099   {
1100     QVariant deffam = property( "default_family" );
1101     if( deffam.canCast( QVariant::String ) )
1102       curtext = deffam.toString();
1103   }
1104
1105   int idx = -1;
1106   for ( int i = 0; i < (int)myFamilies->count() && idx < 0; i++ )
1107   {
1108     if ( myFamilies->text( i ) == curtext )
1109       idx = i;
1110   }
1111
1112   if ( idx >= 0 )
1113     myFamilies->setCurrentItem( idx );
1114 }
1115
1116 QString QtxListResourceEdit::FontItem::family() const
1117 {
1118   return myFamilies->currentText();
1119 }
1120
1121 void QtxListResourceEdit::FontItem::setSize( const int s )
1122 {
1123   int cursize = -1;
1124   if( mySizes->isShown() && s>0 )
1125   {
1126     if( ( myFlags & UserSize ) || mySizes->listBox()->findItem( QString( "%1" ).arg( s ), Qt::ExactMatch ) )
1127       cursize = s;
1128   }
1129   else
1130   {
1131     QVariant defsize = property( QString( "%1:default_size" ).arg( family() ) );
1132     if( defsize.canCast( QVariant::Int ) )
1133       cursize = defsize.toInt();
1134   }
1135
1136   mySizes->setCurrentText( cursize>0 ? QString( "%1" ).arg( cursize ) : "" );
1137 }
1138
1139 int QtxListResourceEdit::FontItem::size() const
1140 {
1141   QString s = mySizes->currentText();
1142   bool ok;
1143   int pSize = s.toInt( &ok );
1144   return ( ok ? pSize : 0 );
1145 }
1146
1147 void QtxListResourceEdit::FontItem::setParams( const bool bold, const bool italic, const bool underline )
1148 {
1149   bool curbold = false, curitalic = false, curunderline = false;
1150   if( myBold->isShown() )
1151     curbold = bold;
1152   else
1153   {
1154     QVariant def = property( QString( "%1:default_bold" ).arg( family() ) );
1155     if( def.canCast( QVariant::Bool ) )
1156       curbold = def.toBool();
1157   }
1158   if( myItalic->isShown() )
1159     curitalic = italic;
1160   else
1161   {
1162     QVariant def = property( QString( "%1:default_italic" ).arg( family() ) );
1163     if( def.canCast( QVariant::Bool ) )
1164       curitalic = def.toBool();
1165   }
1166   if( myUnderline->isShown() )
1167     curunderline = underline;
1168   else
1169   {
1170     QVariant def = property( QString( "%1:default_underline" ).arg( family() ) );
1171     if( def.canCast( QVariant::Bool ) )
1172       curunderline = def.toBool();
1173   }
1174   myBold->setChecked( curbold );
1175   myItalic->setChecked( curitalic );
1176   myUnderline->setChecked( curunderline );
1177 }
1178
1179 void QtxListResourceEdit::FontItem::params( bool& bold, bool& italic, bool& underline )
1180 {
1181   bold = myBold->isChecked();
1182   italic = myItalic->isChecked();
1183   underline = myUnderline->isChecked();
1184 }
1185
1186 void QtxListResourceEdit::FontItem::internalUpdate()
1187 {
1188   //update internal selection of font properties
1189   setFamily( family() );
1190   setSize( size() );
1191   bool b1, b2, b3;
1192   params( b1, b2, b3 );
1193   setParams( b1, b2, b3 );
1194 }
1195
1196 void QtxListResourceEdit::FontItem::onActivateFamily( int )
1197 {
1198   QVariant sizes = property( QString( "%1:sizes" ).arg( family() ) );
1199
1200   int s = size();
1201   mySizes->clear();
1202   if( sizes.canCast( QVariant::List ) )
1203   {
1204     QValueList<QVariant> list = sizes.toList();
1205     QStringList sizeItems;
1206     QValueList<QVariant>::const_iterator anIt = list.begin(),
1207                                          aLast = list.end();
1208     for( ; anIt!=aLast; anIt++ )
1209       if( (*anIt).canCast( QVariant::Int ) && (*anIt).toInt()>0 )
1210         sizeItems.append( QString( "%1" ).arg( (*anIt).toInt() ) );
1211     mySizes->insertStringList( sizeItems );
1212   }
1213   setSize( s );
1214 }
1215
1216
1217
1218
1219 /*
1220   Class: QtxListResourceEdit::DirListItem
1221   Descr: 
1222 */
1223 QtxListResourceEdit::DirListItem::DirListItem( const QString& title, QtxResourceEdit* edit, Item* pItem, QWidget* parent )
1224 : PrefItem( Font, edit, pItem, parent )
1225 {
1226   myDirListEditor = new QtxDirListEditor( this ); 
1227 }
1228
1229 QtxListResourceEdit::DirListItem::~DirListItem()
1230 {
1231 }
1232
1233 void QtxListResourceEdit::DirListItem::store()
1234 {
1235   QStringList list;
1236   myDirListEditor->getPathList(list);
1237   setString( QString(list.join(";")) );
1238 }
1239
1240 void QtxListResourceEdit::DirListItem::retrieve()
1241 {
1242   myDirListEditor->setPathList(QStringList::split(";", getString()));
1243 }