Salome HOME
2aefece23c649fd222ff7b63c1eb9d5114a7b45a
[modules/gui.git] / src / Qtx / QtxPreferenceMgr.cxx
1 // Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 // File:      QtxPreferenceMgr.cxx
21 // Author:    Sergey TELKOV
22 //
23 #include "QtxPreferenceMgr.h"
24
25 #include "QtxResourceMgr.h"
26
27 #include <QEvent>
28 #include <QApplication>
29
30 /*!
31   \class QtxPreferenceItem::Updater
32   \brief Preference item updater.
33   \internal
34 */
35
36 class QtxPreferenceItem::Updater : public QObject
37 {
38   Updater();
39 public:
40   ~Updater();
41
42   static Updater*           instance();
43
44   void                      updateItem( QtxPreferenceItem* );
45   void                      removeItem( QtxPreferenceItem* );
46
47 protected:
48   virtual void              customEvent( QEvent* );
49
50 private:
51   QList<QtxPreferenceItem*> myItems;
52   static Updater*           _Updater;
53 };
54
55 QtxPreferenceItem::Updater* QtxPreferenceItem::Updater::_Updater = 0;
56
57 /*!
58   \brief Constructor.
59   \internal
60 */
61 QtxPreferenceItem::Updater::Updater()
62 {
63 }
64
65 /*!
66   \brief Destructor.
67   \internal
68 */
69 QtxPreferenceItem::Updater::~Updater()
70 {
71 }
72
73 /*!
74   \brief Get the only updater instance.
75   \internal
76   \return the only updater instance
77 */
78 QtxPreferenceItem::Updater* QtxPreferenceItem::Updater::instance()
79 {
80   if ( !_Updater )
81     _Updater = new Updater();
82   return _Updater;
83 }
84
85 /*!
86   \brief Update the preference item.
87   \internal
88   \param item preference item to be updated
89 */
90 void QtxPreferenceItem::Updater::updateItem( QtxPreferenceItem* item )
91 {
92   if ( !item || myItems.contains( item ) )
93     return;
94
95   myItems.append( item );
96   QApplication::postEvent( this, new QEvent( QEvent::User ) );
97 }
98
99 /*!
100   \brief Called when preference item is removed.
101   \internal
102   \param item preference item being removed
103 */
104 void QtxPreferenceItem::Updater::removeItem( QtxPreferenceItem* item )
105 {
106   myItems.removeAll( item );
107 }
108
109 /*!
110   \brief Custom events provessing. Updates all the items.
111   \internal
112   \param e custom event (not used)
113 */
114 void QtxPreferenceItem::Updater::customEvent( QEvent* /*e*/ )
115 {
116   QList<QtxPreferenceItem*> lst = myItems;
117   for ( QList<QtxPreferenceItem*>::const_iterator it = lst.begin(); it != lst.end(); ++it )
118     (*it)->updateContents();
119 }
120
121 /*!
122   \class QtxPreferenceItem
123   \brief Base class for implementing of all the preference items.
124
125   To implement any specific preference item, cubclass from the
126   QtxPreferenceItem and redefine store() and retrieve() methods.
127 */
128
129 /*!
130   \brief Constructor.
131   \param parent parent preference item
132 */
133 QtxPreferenceItem::QtxPreferenceItem( QtxPreferenceItem* parent )
134 : myParent( 0 ),
135 myEval( true )
136 {
137   myId = generateId();
138
139   if ( parent )
140     parent->insertItem( this );
141 }
142
143 /*!
144   \brief Constructor.
145   \param title item title
146   \param parent parent preference item
147 */
148 QtxPreferenceItem::QtxPreferenceItem( const QString& title, QtxPreferenceItem* parent )
149 : myParent( 0 ),
150   myTitle( title )
151 {
152   myId = generateId();
153
154   if ( parent )
155     parent->insertItem( this );
156 }
157
158 /*!
159   \brief Constructor.
160   \param title item title
161   \param sect resource file section to be associated with the item
162   \param param resource file parameter to be associated with the item
163   \param parent parent preference item
164 */
165 QtxPreferenceItem::QtxPreferenceItem( const QString& title, const QString& sect,
166                                       const QString& param, QtxPreferenceItem* parent )
167 : myParent( 0 ),
168   myTitle( title ),
169   mySection( sect ),
170   myParameter( param )
171 {
172   myId = generateId();
173
174   if ( parent )
175     parent->insertItem( this );
176 }
177
178 /*!
179   \brief Destructor.
180 */
181 QtxPreferenceItem::~QtxPreferenceItem()
182 {
183   ItemList list = myChildren;
184   myChildren.clear();
185   qDeleteAll( list );
186
187   if ( myParent )
188     myParent->removeItem( this );
189
190   Updater::instance()->removeItem( this );
191 }
192
193 /*!
194   \brief Get unique item identifier.
195   \return item ID
196 */
197 int QtxPreferenceItem::id() const
198 {
199   return myId;
200 }
201
202 /*!
203   \brief Get unique item type identifier.
204   \return item type ID
205 */
206 int QtxPreferenceItem::rtti() const
207 {
208   return QtxPreferenceItem::RTTI();
209 }
210
211 /*!
212   \brief Specify unique item class identifier.
213   \return item class ID
214 */
215 int QtxPreferenceItem::RTTI()
216 {
217   return 1;
218 }
219
220 /*!
221   \brief Get root preference item.
222   \return root item
223 */
224 QtxPreferenceItem* QtxPreferenceItem::rootItem() const
225 {
226   QtxPreferenceItem* item = (QtxPreferenceItem*)this;
227   while ( item->parentItem() )
228     item = item->parentItem();
229   return item;
230 }
231
232 /*!
233   \brief Get parent preference item.
234   \return parent item
235 */
236 QtxPreferenceItem* QtxPreferenceItem::parentItem() const
237 {
238   return myParent;
239 }
240
241 /*!
242   \brief Append child preference item.
243
244   Removes (if necessary) the item from the previous parent.
245
246   \param item item to be added
247   \sa removeItem()
248 */
249 void QtxPreferenceItem::appendItem( QtxPreferenceItem* item )
250 {
251   insertItem( item, 0 );
252 }
253
254 /*!
255   \brief Insert child preference item before specified item.
256   If the before item is 0 then new item is appended.
257
258   Removes (if necessary) the item from the previous parent.
259
260   \param item item to be added
261   \param before item before which is inserted new \aitem
262   \sa removeItem()
263 */
264 void QtxPreferenceItem::insertItem( QtxPreferenceItem* item, QtxPreferenceItem* before )
265 {
266   if ( !item )
267     return;
268
269   if ( myChildren.contains( item ) && item == before )
270     return;
271
272   if ( myChildren.contains( item ) )
273     myChildren.removeAll( item );
274
275   int idx = myChildren.indexOf( before );
276   if ( idx < 0 )
277     idx = myChildren.count();
278
279   if ( item->parentItem() && item->parentItem() != this )
280     item->parentItem()->removeItem( item );
281
282   item->myParent = this;
283   myChildren.insert( idx, item );
284
285   itemAdded( item );
286 }
287
288 /*!
289   \brief Remove child preference item.
290   \param item item to be removed
291   \sa insertItem()
292 */
293 void QtxPreferenceItem::removeItem( QtxPreferenceItem* item )
294 {
295   if ( !item || !myChildren.contains( item ) )
296     return;
297
298   item->myParent = 0;
299   myChildren.removeAll( item );
300
301   itemRemoved( item );
302 }
303
304 /*!
305   \brief Get all child preference items.
306   \param rec recursion boolean flag
307   \return list of child items
308 */
309 QList<QtxPreferenceItem*> QtxPreferenceItem::childItems( const bool rec ) const
310 {
311   QList<QtxPreferenceItem*> lst = myChildren;
312   if ( rec )
313   {
314     for ( ItemList::const_iterator it = myChildren.begin(); it != myChildren.end(); ++it )
315       lst += (*it)->childItems( rec );
316   }
317
318   return lst;
319 }
320
321 /*!
322   \brief Get preference item depth.
323   \return item depth
324 */
325 int QtxPreferenceItem::depth() const
326 {
327   return parentItem() ? parentItem()->depth() + 1 : 0;
328 }
329
330 /*!
331   \brief Get child preference items number.
332   \return number of child items
333   \sa isEmpty()
334 */
335 int QtxPreferenceItem::count() const
336 {
337   return myChildren.count();
338 }
339
340 /*!
341   \brief Check if the item has children.
342   \return \c true if item does not have children
343   \sa count()
344 */
345 bool QtxPreferenceItem::isEmpty() const
346 {
347   return myChildren.isEmpty();
348 }
349
350 /*!
351   \brief Get preference item icon.
352   \return item icon
353   \sa setIcon()
354 */
355 QIcon QtxPreferenceItem::icon() const
356 {
357   return myIcon;
358 }
359
360 /*!
361   \brief Get preference item title.
362   \return item title
363   \sa setTitle()
364 */
365 QString QtxPreferenceItem::title() const
366 {
367   return myTitle;
368 }
369
370 /*!
371   \brief Get resource file settings associated to the preference item.
372   \param sec used to return resource file section name
373   \param param used to return resource file parameter name
374   \sa setResource()
375 */
376 void QtxPreferenceItem::resource( QString& sec, QString& param ) const
377 {
378   sec = mySection;
379   param = myParameter;
380 }
381
382 /*!
383   \brief Set prefence item icon.
384   \param ico new item icon
385   \sa icon()
386 */
387 void QtxPreferenceItem::setIcon( const QIcon& ico )
388 {
389   if ( myIcon.serialNumber() == ico.serialNumber() )
390     return;
391
392   myIcon = ico;
393   sendItemChanges();
394 }
395
396 /*!
397   \brief Set preference item title .
398   \param title new item title
399   \sa title()
400 */
401 void QtxPreferenceItem::setTitle( const QString& title )
402 {
403   if ( myTitle == title )
404     return;
405
406   myTitle = title;
407   sendItemChanges();
408 }
409
410 /*!
411   \brief Assign resource file settings to the preference item.
412   \param sec resource file section name
413   \param param resource file parameter name
414   \sa resource()
415 */
416 void QtxPreferenceItem::setResource( const QString& sec, const QString& param )
417 {
418   mySection = sec;
419   myParameter = param;
420 }
421
422 /*!
423   \brief Update preference item.
424 */
425 void QtxPreferenceItem::updateContents()
426 {
427   Updater::instance()->removeItem( this );
428 }
429
430 /*!
431   \brief Get preference item option value.
432   \param name option name
433   \return property value or null QVariant if option is not set
434   \sa setOption()
435 */
436 QVariant QtxPreferenceItem::option( const QString& name ) const
437 {
438   return optionValue( name.toLower() );
439 }
440
441 /*!
442   \brief Set preference item option value.
443   \param name option name
444   \param val new property value
445   \sa option()
446 */
447 void QtxPreferenceItem::setOption( const QString& name, const QVariant& val )
448 {
449   QVariant old = optionValue( name.toLower() );
450   setOptionValue( name.toLower(), val );
451   if ( old != optionValue( name.toLower() ) )
452     sendItemChanges();
453 }
454
455 bool QtxPreferenceItem::isEvaluateValues() const
456 {
457   return myEval;
458 }
459
460 void QtxPreferenceItem::setEvaluateValues( const bool on )
461 {
462   myEval = on;
463 }
464
465 /*!
466   \fn void QtxPreferenceItem::store();
467   \brief Save preference item (for example, to the resource file).
468
469   This method should be implemented in the subclasses.
470
471   \sa retrieve()
472 */
473
474 /*!
475   \fn virtual void QtxPreferenceItem::retrieve();
476   \brief Restore preference item (for example, from the resource file).
477
478   This method should be implemented in the subclasses.
479
480   \sa store()
481 */
482
483 /*!
484   \brief Get the value of the associated resource file setting.
485   \return associated resource file setting value
486   \sa setResourceValue()
487 */
488 QString QtxPreferenceItem::resourceValue() const
489 {
490   return getString();
491 }
492
493 /*!
494   \brief Get the value of the associated resource file setting.
495   \param val new associated resource file setting value
496   \sa resourceValue()
497 */
498 void QtxPreferenceItem::setResourceValue( const QString& val )
499 {
500   setString( val );
501 }
502
503 /*!
504   \brief Get the resources manager.
505   \return resource manager pointer or 0 if it is not defined
506 */
507 QtxResourceMgr* QtxPreferenceItem::resourceMgr() const
508 {
509   QtxPreferenceMgr* mgr = preferenceMgr();
510   return mgr ? mgr->resourceMgr() : 0;
511 }
512
513 /*!
514   \brief Get the parent preferences manager.
515   \return preferences manager or 0 if it is not defined
516 */
517 QtxPreferenceMgr* QtxPreferenceItem::preferenceMgr() const
518 {
519   return parentItem() ? parentItem()->preferenceMgr() : 0;
520 }
521
522 /*!
523   \brief Find the item by the specified identifier.
524   \param id child item ID
525   \param rec if \c true recursive search is done
526   \return child item or 0 if it is not found
527 */
528 QtxPreferenceItem* QtxPreferenceItem::findItem( const int id, const bool rec ) const
529 {
530   QtxPreferenceItem* item = 0;
531   for ( ItemList::const_iterator it = myChildren.begin(); it != myChildren.end() && !item; ++it )
532   {
533     QtxPreferenceItem* i = *it;
534     if ( i->id() == id )
535       item = i;
536     else if ( rec )
537       item = i->findItem( id, rec );
538   }
539   return item;
540 }
541
542 /*!
543   \brief Find the item by the specified title.
544   \param title child item title
545   \param rec if \c true recursive search is done
546   \return child item or 0 if it is not found
547 */
548 QtxPreferenceItem* QtxPreferenceItem::findItem( const QString& title, const bool rec ) const
549 {
550   QtxPreferenceItem* item = 0;
551   for ( ItemList::const_iterator it = myChildren.begin(); it != myChildren.end() && !item; ++it )
552   {
553     QtxPreferenceItem* i = *it;
554     if ( i->title() == title )
555       item = i;
556     else if ( rec )
557       item = i->findItem( title, rec );
558   }
559   return item;
560 }
561
562 /*!
563   \brief Find the item by the specified title and identifier.
564   \param title child item title
565   \param id child item ID
566   \param rec if \c true recursive search is done
567   \return child item or 0 if it is not found
568 */
569 QtxPreferenceItem* QtxPreferenceItem::findItem( const QString& title, const int id, const bool rec ) const
570 {
571   QtxPreferenceItem* item = 0;
572   for ( ItemList::const_iterator it = myChildren.begin(); it != myChildren.end() && !item; ++it )
573   {
574     QtxPreferenceItem* i = *it;
575     if ( i->title() == title && i->id() == id )
576       item = i;
577     else if ( rec )
578       item = i->findItem( title, id, rec );
579   }
580   return item;
581 }
582
583 void QtxPreferenceItem::activate()
584 {
585 }
586
587 void QtxPreferenceItem::ensureVisible()
588 {
589   if ( parentItem() )
590     parentItem()->ensureVisible( this );
591 }
592
593 /*!
594   \brief Get integer resources value corresponding to the item.
595   \param val default value (returned if there is no such resource)
596   \return integer value of the associated resource
597   \sa setInteger()
598 */
599 int QtxPreferenceItem::getInteger( const int val ) const
600 {
601   QtxResourceMgr* resMgr = resourceMgr();
602   return resMgr ? resMgr->integerValue( mySection, myParameter, val ) : val;
603 }
604
605 /*!
606   \brief Get double resources value corresponding to the item.
607   \param val default value (returned if there is no such resource)
608   \return double value of the associated resource
609   \sa setDouble()
610 */
611 double QtxPreferenceItem::getDouble( const double val ) const
612 {
613   QtxResourceMgr* resMgr = resourceMgr();
614   return resMgr ? resMgr->doubleValue( mySection, myParameter, val ) : val;
615 }
616
617 /*!
618   \brief Get boolean resources value corresponding to the item.
619   \param val default value (returned if there is no such resource)
620   \return boolean value of the associated resource
621   \sa setBoolean()
622 */
623 bool QtxPreferenceItem::getBoolean( const bool val ) const
624 {
625   QtxResourceMgr* resMgr = resourceMgr();
626   return resMgr ? resMgr->booleanValue( mySection, myParameter, val ) : val;
627 }
628
629 /*!
630   \brief Get string resources value corresponding to the item.
631   \param val default value (returned if there is no such resource)
632   \return string value of the associated resource
633   \sa setString()
634 */
635 QString QtxPreferenceItem::getString( const QString& val ) const
636 {
637   QString res = val;
638   QtxResourceMgr* resMgr = resourceMgr();
639   if ( resMgr )
640     resMgr->value( mySection, myParameter, res, isEvaluateValues() );
641   return res;
642 }
643
644 /*!
645   \brief Get color resources value corresponding to the item.
646   \param val default value (returned if there is no such resource)
647   \return color value of the associated resource
648   \sa setColor()
649 */
650 QColor QtxPreferenceItem::getColor( const QColor& val ) const
651 {
652   QtxResourceMgr* resMgr = resourceMgr();
653   return resMgr ? resMgr->colorValue( mySection, myParameter, val ) : val;
654 }
655
656 /*!
657   \brief Get font resources value corresponding to the item.
658   \param val default value (returned if there is no such resource)
659   \return font value of the associated resource
660   \sa setFont()
661 */
662 QFont QtxPreferenceItem::getFont( const QFont& val ) const
663 {
664   QtxResourceMgr* resMgr = resourceMgr();
665   return resMgr ? resMgr->fontValue( mySection, myParameter, val ) : val;
666 }
667
668 /*!
669   \brief Set integer resources value corresponding to the item.
670   \param val new value
671   \sa getInteger()
672 */
673 void QtxPreferenceItem::setInteger( const int val )
674 {
675   QtxResourceMgr* resMgr = resourceMgr();
676   if ( resMgr )
677     resMgr->setValue( mySection, myParameter, val );
678 }
679
680 /*!
681   \brief Set double resources value corresponding to the item.
682   \param val new value
683   \sa getDouble()
684 */
685 void QtxPreferenceItem::setDouble( const double val )
686 {
687   QtxResourceMgr* resMgr = resourceMgr();
688   if ( resMgr )
689     resMgr->setValue( mySection, myParameter, val );
690 }
691
692 /*!
693   \brief Set boolean resources value corresponding to the item.
694   \param val new value
695   \sa getBoolean()
696 */
697 void QtxPreferenceItem::setBoolean( const bool val )
698 {
699   QtxResourceMgr* resMgr = resourceMgr();
700   if ( resMgr )
701     resMgr->setValue( mySection, myParameter, val );
702 }
703
704 /*!
705   \brief Set string resources value corresponding to the item.
706   \param val new value
707   \sa getString()
708 */
709 void QtxPreferenceItem::setString( const QString& val )
710 {
711   QtxResourceMgr* resMgr = resourceMgr();
712   if ( resMgr )
713     resMgr->setValue( mySection, myParameter, val );
714 }
715
716 /*!
717   \brief Set color resources value corresponding to the item.
718   \param val new value
719   \sa getColor()
720 */
721 void QtxPreferenceItem::setColor( const QColor& val )
722 {
723   QtxResourceMgr* resMgr = resourceMgr();
724   if ( resMgr )
725     resMgr->setValue( mySection, myParameter, val );
726 }
727
728 /*!
729   \brief Set font resources value corresponding to the item.
730   \param val new value
731   \sa getFont()
732 */
733 void QtxPreferenceItem::setFont( const QFont& val )
734 {
735   QtxResourceMgr* resMgr = resourceMgr();
736   if ( resMgr )
737     resMgr->setValue( mySection, myParameter, val );
738 }
739
740 /*!
741   \brief Callback function which is called when the child
742   preference item is added.
743
744   This function can be reimplemented in the subclasses to customize
745   child item addition operation. Base implementation does nothing.
746
747   \param item child item being added
748   \sa itemRemoved(), itemChanged()
749 */
750 void QtxPreferenceItem::itemAdded( QtxPreferenceItem* /*item*/ )
751 {
752 }
753
754 /*!
755   \brief Callback function which is called when the child
756   preference item is removed.
757
758   This function can be reimplemented in the subclasses to customize
759   child item removal operation. Base implementation does nothing.
760
761   \param item child item being removed
762   \sa itemAdded(), itemChanged()
763 */
764 void QtxPreferenceItem::itemRemoved( QtxPreferenceItem* /*item*/ )
765 {
766 }
767
768 /*!
769   \brief Callback function which is called when the child
770   preference item is modified.
771
772   This function can be reimplemented in the subclasses to customize
773   child item modifying operation. Base implementation does nothing.
774
775   \param item child item being modified
776   \sa itemAdded(), itemRemoved()
777 */
778 void QtxPreferenceItem::itemChanged( QtxPreferenceItem* )
779 {
780 }
781
782 void QtxPreferenceItem::ensureVisible( QtxPreferenceItem* )
783 {
784   ensureVisible();
785 }
786
787 /*!
788   \brief Initiate item updating.
789 */
790 void QtxPreferenceItem::triggerUpdate()
791 {
792   Updater::instance()->updateItem( this );
793 }
794
795 /*!
796   \brief Get preference item option value.
797
798   This function can be reimplemented in the subclasses.
799   Base implementation does nothing.
800
801   \param name option name
802   \return property value or null QVariant if option is not set
803   \sa setOptionValue()
804 */
805 QVariant QtxPreferenceItem::optionValue( const QString& name ) const
806 {
807   QVariant val;
808   if ( name == "eval" || name == "evaluation" || name == "subst" || name == "substitution" )
809     val = isEvaluateValues();
810   else if ( name == "title" )
811     val = title();
812   return val;
813 }
814
815 /*!
816   \brief Set preference item option value.
817
818   This function can be reimplemented in the subclasses.
819   Base implementation does nothing.
820
821   \param name option name
822   \param val new property value
823   \sa optionValue()
824 */
825 void QtxPreferenceItem::setOptionValue( const QString& name, const QVariant& val )
826 {
827   if ( name == "eval" || name == "evaluation" || name == "subst" || name == "substitution" )
828   {
829     if ( val.canConvert( QVariant::Bool ) )
830       setEvaluateValues( val.toBool() );
831   }
832   else if ( name == "title" )
833   {
834     if ( val.canConvert( QVariant::String ) )
835       setTitle( val.toString() );
836   }
837 }
838
839 /*!
840   \brief Initiate item changing call back operation.
841 */
842 void QtxPreferenceItem::sendItemChanges()
843 {
844   if ( parentItem() )
845     parentItem()->itemChanged( this );
846 }
847
848 /*!
849   \brief Generate unique preference item identifier.
850   \return unique item ID
851 */
852 int QtxPreferenceItem::generateId()
853 {
854   static int _id = 0;
855   return _id++;
856 }
857
858 /*!
859   \class QtxPreferenceMgr
860   \brief Class for managing preferences items.
861 */
862
863 /*!
864   \brief Constructor.
865   \param mgr resources manager
866 */
867 QtxPreferenceMgr::QtxPreferenceMgr( QtxResourceMgr* mgr )
868 : QtxPreferenceItem( 0 ),
869   myResMgr( mgr )
870 {
871 }
872
873 /*!
874   \brief Destructor.
875 */
876 QtxPreferenceMgr::~QtxPreferenceMgr()
877 {
878 }
879
880 /*!
881   \brief Get the resources manager.
882   \return resource manager pointer or 0 if it is not defined
883 */
884 QtxResourceMgr* QtxPreferenceMgr::resourceMgr() const
885 {
886   return myResMgr;
887 }
888
889 /*!
890   \brief Get the parent preferences manager.
891   \return pointer to itself
892 */
893 QtxPreferenceMgr* QtxPreferenceMgr::preferenceMgr() const
894 {
895   return (QtxPreferenceMgr*)this;
896 }
897
898 /*!
899   \brief Get preference item option value.
900   \param id preference item ID
901   \param propName option name
902   \return property value or null QVariant if option is not set
903   \sa setOption()
904 */
905 QVariant QtxPreferenceMgr::option( const int id, const QString& propName ) const
906 {
907   QVariant propValue;
908   QtxPreferenceItem* i = findItem( id, true );
909   if ( i )
910     propValue = i->option( propName );
911   return propValue;
912 }
913
914 /*!
915   \brief Set preference item option value.
916   \param id preference item ID
917   \param propName option name
918   \param propValue new property value
919   \sa option()
920 */
921 void QtxPreferenceMgr::setOption( const int id, const QString& propName, const QVariant& propValue )
922 {
923   QtxPreferenceItem* i = findItem( id, true );
924   if ( i )
925     i->setOption( propName, propValue );
926 }
927
928 /*!
929   \brief Store all preferences item to the resource manager.
930   \sa retrieve()
931 */
932 void QtxPreferenceMgr::store()
933 {
934   ResourceMap before;
935   resourceValues( before );
936
937   QList<QtxPreferenceItem*> items = childItems( true );
938   for ( QList<QtxPreferenceItem*>::iterator it = items.begin(); it != items.end(); ++it )
939     (*it)->store();
940
941   ResourceMap after;
942   resourceValues( after );
943
944   ResourceMap changed;
945   differentValues( before, after, changed );
946
947   changedResources( changed );
948 }
949
950 /*!
951   \brief Retrieve all preference items from the resource manager.
952   \sa store()
953 */
954 void QtxPreferenceMgr::retrieve()
955 {
956   QList<QtxPreferenceItem*> items = childItems( true );
957   for ( QList<QtxPreferenceItem*>::iterator it = items.begin(); it != items.end(); ++it )
958     (*it)->retrieve();
959 }
960
961 /*!
962   \brief Dumps all values to the backup container.
963   \sa fromBackup()
964 */
965 void QtxPreferenceMgr::toBackup()
966 {
967   myBackup.clear();
968   resourceValues( myBackup );
969 }
970
971 /*!
972   \brief Restore all values from the backup container.
973   \sa toBackup()
974 */
975 void QtxPreferenceMgr::fromBackup()
976 {
977   ResourceMap before;
978   resourceValues( before );
979
980   setResourceValues( myBackup );
981
982   ResourceMap after;
983   resourceValues( after );
984
985   ResourceMap changed;
986   differentValues( before, after, changed );
987
988   changedResources( changed );
989 }
990
991 /*!
992   \brief Update preferences manager.
993
994   Base implementation does nothing.
995 */
996 void QtxPreferenceMgr::update()
997 {
998 }
999
1000 /*!
1001   \brief Get all resources items values.
1002   \param map used as container filled with the resources values (<ID>:<value>)
1003   \sa setResourceValues()
1004 */
1005 void QtxPreferenceMgr::resourceValues( QMap<int, QString>& map ) const
1006 {
1007   QString sect, name;
1008   QtxResourceMgr* resMgr = resourceMgr();
1009   QList<QtxPreferenceItem*> items = childItems( true );
1010   for ( QList<QtxPreferenceItem*>::const_iterator it = items.begin(); it != items.end(); ++it )
1011   {
1012     QtxPreferenceItem* item = *it;
1013     item->resource( sect, name );
1014     if ( resMgr->hasValue( sect, name ) )
1015       map.insert( item->id(), item->resourceValue() );
1016   }
1017 }
1018
1019 /*!
1020   \brief Get all resources items values.
1021   \param map used as container filled with the resources values
1022   (<item>:<value>)
1023   \sa setResourceValues()
1024 */
1025 void QtxPreferenceMgr::resourceValues( ResourceMap& map ) const
1026 {
1027   QString sect, name;
1028   QtxResourceMgr* resMgr = resourceMgr();
1029   QList<QtxPreferenceItem*> items = childItems( true );
1030   for ( QList<QtxPreferenceItem*>::const_iterator it = items.begin(); it != items.end(); ++it )
1031   {
1032     QtxPreferenceItem* item = *it;
1033     item->resource( sect, name );
1034     if ( resMgr->hasValue( sect, name ) )
1035       map.insert( item, item->resourceValue() );
1036   }
1037 }
1038
1039 /*!
1040   \brief Set all resources items values.
1041   \param map map with resources values (<ID>:<value>)
1042   \sa resourceValues()
1043 */
1044 void QtxPreferenceMgr::setResourceValues( QMap<int, QString>& map ) const
1045 {
1046   for ( QMap<int, QString>::const_iterator it = map.begin(); it != map.end(); ++it )
1047   {
1048     QtxPreferenceItem* i = findItem( it.key(), true );
1049     if ( i )
1050       i->setResourceValue( it.value() );
1051   }
1052 }
1053
1054 /*!
1055   \brief Set all resources items values.
1056   \param map map with resources values (<item>:<value>)
1057   \sa resourceValues()
1058 */
1059 void QtxPreferenceMgr::setResourceValues( ResourceMap& map ) const
1060 {
1061   for ( ResourceMap::const_iterator it = map.begin(); it != map.end(); ++it )
1062     it.key()->setResourceValue( it.value() );
1063 }
1064
1065 /*!
1066   \brief Compare two maps of resources values to find differences.
1067   \param map1 first map
1068   \param map2 second map
1069   \param resMap map to be filled with different values
1070   \param fromFirst if \c true, then \a resMap will be filled with the values
1071   from \a map1, otherwise - from \a map2
1072 */
1073 void QtxPreferenceMgr::differentValues( const QMap<int, QString>& map1, const QMap<int, QString>& map2,
1074                                         QMap<int, QString>& resMap, const bool fromFirst ) const
1075 {
1076   resMap.clear();
1077   const QMap<int, QString>& later = fromFirst ? map1 : map2;
1078   const QMap<int, QString>& early = fromFirst ? map2 : map1;
1079
1080   for ( QMap<int, QString>::const_iterator it = later.begin(); it != later.end(); ++it )
1081   {
1082     if ( !early.contains( it.key() ) || early[it.key()] != it.value() )
1083       resMap.insert( it.key(), it.value() );
1084   }
1085 }
1086
1087 /*!
1088   \brief Compare two maps of resources values to find differences.
1089   \param map1 first map
1090   \param map2 second map
1091   \param resMap map to be filled with different values
1092   \param fromFirst if \c true, then \a resMap will be filled with the values
1093   from \a map1, otherwise - from \a map2
1094 */
1095 void QtxPreferenceMgr::differentValues( const ResourceMap& map1, const ResourceMap& map2,
1096                                         ResourceMap& resMap, const bool fromFirst ) const
1097 {
1098   resMap.clear();
1099   const ResourceMap& later = fromFirst ? map1 : map2;
1100   const ResourceMap& early = fromFirst ? map2 : map1;
1101
1102   for ( ResourceMap::const_iterator it = later.begin(); it != later.end(); ++it )
1103   {
1104     if ( !early.contains( it.key() ) || early[it.key()] != it.value() )
1105       resMap.insert( it.key(), it.value() );
1106   }
1107 }
1108
1109 /*!
1110   \brief Perform custom activity on resource changing.
1111
1112   This method is called from store() and fromBackup() methods.
1113   Base implementation does nothing.
1114
1115   \sa store(), fromBackup()
1116 */
1117 void QtxPreferenceMgr::changedResources( const ResourceMap& )
1118 {
1119 }