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