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