1 // Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
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.
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.
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
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // File: QtxPreferenceMgr.cxx
21 // Author: Sergey TELKOV
23 #include "QtxPreferenceMgr.h"
25 #include "QtxResourceMgr.h"
28 #include <QApplication>
31 \class QtxPreferenceItem::Updater
32 \brief Preference item updater.
36 class QtxPreferenceItem::Updater : public QObject
42 static Updater* instance();
44 void updateItem( QtxPreferenceItem* );
45 void removeItem( QtxPreferenceItem* );
48 virtual void customEvent( QEvent* );
51 QList<QtxPreferenceItem*> myItems;
52 static Updater* _Updater;
55 QtxPreferenceItem::Updater* QtxPreferenceItem::Updater::_Updater = 0;
61 QtxPreferenceItem::Updater::Updater()
69 QtxPreferenceItem::Updater::~Updater()
74 \brief Get the only updater instance.
76 \return the only updater instance
78 QtxPreferenceItem::Updater* QtxPreferenceItem::Updater::instance()
81 _Updater = new Updater();
86 \brief Update the preference item.
88 \param item preference item to be updated
90 void QtxPreferenceItem::Updater::updateItem( QtxPreferenceItem* item )
92 if ( !item || myItems.contains( item ) )
95 myItems.append( item );
96 QApplication::postEvent( this, new QEvent( QEvent::User ) );
100 \brief Called when preference item is removed.
102 \param item preference item being removed
104 void QtxPreferenceItem::Updater::removeItem( QtxPreferenceItem* item )
106 myItems.removeAll( item );
110 \brief Custom events provessing. Updates all the items.
112 \param e custom event (not used)
114 void QtxPreferenceItem::Updater::customEvent( QEvent* /*e*/ )
116 QList<QtxPreferenceItem*> lst = myItems;
117 for ( QList<QtxPreferenceItem*>::const_iterator it = lst.begin(); it != lst.end(); ++it )
118 (*it)->updateContents();
122 \class QtxPreferenceItem
123 \brief Base class for implementing of all the preference items.
125 To implement any specific preference item, cubclass from the
126 QtxPreferenceItem and redefine store() and retrieve() methods.
131 \param parent parent preference item
133 QtxPreferenceItem::QtxPreferenceItem( QtxPreferenceItem* parent )
140 parent->insertItem( this );
145 \param title item title
146 \param parent parent preference item
148 QtxPreferenceItem::QtxPreferenceItem( const QString& title, QtxPreferenceItem* parent )
155 parent->insertItem( this );
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
165 QtxPreferenceItem::QtxPreferenceItem( const QString& title, const QString& sect,
166 const QString& param, QtxPreferenceItem* parent )
175 parent->insertItem( this );
181 QtxPreferenceItem::~QtxPreferenceItem()
183 ItemList list = myChildren;
188 myParent->removeItem( this );
190 Updater::instance()->removeItem( this );
194 \brief Get unique item identifier.
197 int QtxPreferenceItem::id() const
203 \brief Get unique item type identifier.
206 int QtxPreferenceItem::rtti() const
208 return QtxPreferenceItem::RTTI();
212 \brief Specify unique item class identifier.
213 \return item class ID
215 int QtxPreferenceItem::RTTI()
221 \brief Get root preference item.
224 QtxPreferenceItem* QtxPreferenceItem::rootItem() const
226 QtxPreferenceItem* item = (QtxPreferenceItem*)this;
227 while ( item->parentItem() )
228 item = item->parentItem();
233 \brief Get parent preference item.
236 QtxPreferenceItem* QtxPreferenceItem::parentItem() const
242 \brief Append child preference item.
244 Removes (if necessary) the item from the previous parent.
246 \param item item to be added
249 void QtxPreferenceItem::appendItem( QtxPreferenceItem* item )
251 insertItem( item, 0 );
255 \brief Insert child preference item before specified item.
256 If the before item is 0 then new item is appended.
258 Removes (if necessary) the item from the previous parent.
260 \param item item to be added
261 \param before item before which is inserted new \aitem
264 void QtxPreferenceItem::insertItem( QtxPreferenceItem* item, QtxPreferenceItem* before )
269 if ( myChildren.contains( item ) && item == before )
272 if ( myChildren.contains( item ) )
273 myChildren.removeAll( item );
275 int idx = myChildren.indexOf( before );
277 idx = myChildren.count();
279 if ( item->parentItem() && item->parentItem() != this )
280 item->parentItem()->removeItem( item );
282 item->myParent = this;
283 myChildren.insert( idx, item );
289 \brief Remove child preference item.
290 \param item item to be removed
293 void QtxPreferenceItem::removeItem( QtxPreferenceItem* item )
295 if ( !item || !myChildren.contains( item ) )
299 myChildren.removeAll( item );
305 \brief Get all child preference items.
306 \param rec recursion boolean flag
307 \return list of child items
309 QList<QtxPreferenceItem*> QtxPreferenceItem::childItems( const bool rec ) const
311 QList<QtxPreferenceItem*> lst = myChildren;
314 for ( ItemList::const_iterator it = myChildren.begin(); it != myChildren.end(); ++it )
315 lst += (*it)->childItems( rec );
322 \brief Get preference item depth.
325 int QtxPreferenceItem::depth() const
327 return parentItem() ? parentItem()->depth() + 1 : 0;
331 \brief Get child preference items number.
332 \return number of child items
335 int QtxPreferenceItem::count() const
337 return myChildren.count();
341 \brief Check if the item has children.
342 \return \c true if item does not have children
345 bool QtxPreferenceItem::isEmpty() const
347 return myChildren.isEmpty();
351 \brief Get preference item icon.
355 QIcon QtxPreferenceItem::icon() const
361 \brief Get preference item title.
365 QString QtxPreferenceItem::title() const
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
376 void QtxPreferenceItem::resource( QString& sec, QString& param ) const
383 \brief Set prefence item icon.
384 \param ico new item icon
387 void QtxPreferenceItem::setIcon( const QIcon& ico )
389 if ( myIcon.serialNumber() == ico.serialNumber() )
397 \brief Set preference item title .
398 \param title new item title
401 void QtxPreferenceItem::setTitle( const QString& title )
403 if ( myTitle == title )
411 \brief Assign resource file settings to the preference item.
412 \param sec resource file section name
413 \param param resource file parameter name
416 void QtxPreferenceItem::setResource( const QString& sec, const QString& param )
423 \brief Update preference item.
425 void QtxPreferenceItem::updateContents()
427 Updater::instance()->removeItem( this );
431 \brief Get preference item option value.
432 \param name option name
433 \return property value or null QVariant if option is not set
436 QVariant QtxPreferenceItem::option( const QString& name ) const
438 return optionValue( name.toLower() );
442 \brief Set preference item option value.
443 \param name option name
444 \param val new property value
447 void QtxPreferenceItem::setOption( const QString& name, const QVariant& val )
449 QVariant old = optionValue( name.toLower() );
450 setOptionValue( name.toLower(), val );
451 if ( old != optionValue( name.toLower() ) )
455 bool QtxPreferenceItem::isEvaluateValues() const
460 void QtxPreferenceItem::setEvaluateValues( const bool on )
466 \fn void QtxPreferenceItem::store();
467 \brief Save preference item (for example, to the resource file).
469 This method should be implemented in the subclasses.
475 \fn virtual void QtxPreferenceItem::retrieve();
476 \brief Restore preference item (for example, from the resource file).
478 This method should be implemented in the subclasses.
484 \brief Get the value of the associated resource file setting.
485 \return associated resource file setting value
486 \sa setResourceValue()
488 QString QtxPreferenceItem::resourceValue() const
494 \brief Get the value of the associated resource file setting.
495 \param val new associated resource file setting value
498 void QtxPreferenceItem::setResourceValue( const QString& val )
504 \brief Get the resources manager.
505 \return resource manager pointer or 0 if it is not defined
507 QtxResourceMgr* QtxPreferenceItem::resourceMgr() const
509 QtxPreferenceMgr* mgr = preferenceMgr();
510 return mgr ? mgr->resourceMgr() : 0;
514 \brief Get the parent preferences manager.
515 \return preferences manager or 0 if it is not defined
517 QtxPreferenceMgr* QtxPreferenceItem::preferenceMgr() const
519 return parentItem() ? parentItem()->preferenceMgr() : 0;
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
528 QtxPreferenceItem* QtxPreferenceItem::findItem( const int id, const bool rec ) const
530 QtxPreferenceItem* item = 0;
531 for ( ItemList::const_iterator it = myChildren.begin(); it != myChildren.end() && !item; ++it )
533 QtxPreferenceItem* i = *it;
537 item = i->findItem( id, rec );
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
548 QtxPreferenceItem* QtxPreferenceItem::findItem( const QString& title, const bool rec ) const
550 QtxPreferenceItem* item = 0;
551 for ( ItemList::const_iterator it = myChildren.begin(); it != myChildren.end() && !item; ++it )
553 QtxPreferenceItem* i = *it;
554 if ( i->title() == title )
557 item = i->findItem( title, rec );
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
569 QtxPreferenceItem* QtxPreferenceItem::findItem( const QString& title, const int id, const bool rec ) const
571 QtxPreferenceItem* item = 0;
572 for ( ItemList::const_iterator it = myChildren.begin(); it != myChildren.end() && !item; ++it )
574 QtxPreferenceItem* i = *it;
575 if ( i->title() == title && i->id() == id )
578 item = i->findItem( title, id, rec );
583 void QtxPreferenceItem::activate()
587 void QtxPreferenceItem::ensureVisible()
590 parentItem()->ensureVisible( this );
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
599 int QtxPreferenceItem::getInteger( const int val ) const
601 QtxResourceMgr* resMgr = resourceMgr();
602 return resMgr ? resMgr->integerValue( mySection, myParameter, val ) : val;
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
611 double QtxPreferenceItem::getDouble( const double val ) const
613 QtxResourceMgr* resMgr = resourceMgr();
614 return resMgr ? resMgr->doubleValue( mySection, myParameter, val ) : val;
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
623 bool QtxPreferenceItem::getBoolean( const bool val ) const
625 QtxResourceMgr* resMgr = resourceMgr();
626 return resMgr ? resMgr->booleanValue( mySection, myParameter, val ) : val;
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
635 QString QtxPreferenceItem::getString( const QString& val ) const
638 QtxResourceMgr* resMgr = resourceMgr();
640 resMgr->value( mySection, myParameter, res, isEvaluateValues() );
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
650 QColor QtxPreferenceItem::getColor( const QColor& val ) const
652 QtxResourceMgr* resMgr = resourceMgr();
653 return resMgr ? resMgr->colorValue( mySection, myParameter, val ) : val;
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
662 QFont QtxPreferenceItem::getFont( const QFont& val ) const
664 QtxResourceMgr* resMgr = resourceMgr();
665 return resMgr ? resMgr->fontValue( mySection, myParameter, val ) : val;
669 \brief Set integer resources value corresponding to the item.
673 void QtxPreferenceItem::setInteger( const int val )
675 QtxResourceMgr* resMgr = resourceMgr();
677 resMgr->setValue( mySection, myParameter, val );
681 \brief Set double resources value corresponding to the item.
685 void QtxPreferenceItem::setDouble( const double val )
687 QtxResourceMgr* resMgr = resourceMgr();
689 resMgr->setValue( mySection, myParameter, val );
693 \brief Set boolean resources value corresponding to the item.
697 void QtxPreferenceItem::setBoolean( const bool val )
699 QtxResourceMgr* resMgr = resourceMgr();
701 resMgr->setValue( mySection, myParameter, val );
705 \brief Set string resources value corresponding to the item.
709 void QtxPreferenceItem::setString( const QString& val )
711 QtxResourceMgr* resMgr = resourceMgr();
713 resMgr->setValue( mySection, myParameter, val );
717 \brief Set color resources value corresponding to the item.
721 void QtxPreferenceItem::setColor( const QColor& val )
723 QtxResourceMgr* resMgr = resourceMgr();
725 resMgr->setValue( mySection, myParameter, val );
729 \brief Set font resources value corresponding to the item.
733 void QtxPreferenceItem::setFont( const QFont& val )
735 QtxResourceMgr* resMgr = resourceMgr();
737 resMgr->setValue( mySection, myParameter, val );
741 \brief Callback function which is called when the child
742 preference item is added.
744 This function can be reimplemented in the subclasses to customize
745 child item addition operation. Base implementation does nothing.
747 \param item child item being added
748 \sa itemRemoved(), itemChanged()
750 void QtxPreferenceItem::itemAdded( QtxPreferenceItem* /*item*/ )
755 \brief Callback function which is called when the child
756 preference item is removed.
758 This function can be reimplemented in the subclasses to customize
759 child item removal operation. Base implementation does nothing.
761 \param item child item being removed
762 \sa itemAdded(), itemChanged()
764 void QtxPreferenceItem::itemRemoved( QtxPreferenceItem* /*item*/ )
769 \brief Callback function which is called when the child
770 preference item is modified.
772 This function can be reimplemented in the subclasses to customize
773 child item modifying operation. Base implementation does nothing.
775 \param item child item being modified
776 \sa itemAdded(), itemRemoved()
778 void QtxPreferenceItem::itemChanged( QtxPreferenceItem* )
782 void QtxPreferenceItem::ensureVisible( QtxPreferenceItem* )
788 \brief Initiate item updating.
790 void QtxPreferenceItem::triggerUpdate()
792 Updater::instance()->updateItem( this );
796 \brief Get preference item option value.
798 This function can be reimplemented in the subclasses.
799 Base implementation does nothing.
801 \param name option name
802 \return property value or null QVariant if option is not set
805 QVariant QtxPreferenceItem::optionValue( const QString& name ) const
808 if ( name == "eval" || name == "evaluation" || name == "subst" || name == "substitution" )
809 val = isEvaluateValues();
810 else if ( name == "title" )
816 \brief Set preference item option value.
818 This function can be reimplemented in the subclasses.
819 Base implementation does nothing.
821 \param name option name
822 \param val new property value
825 void QtxPreferenceItem::setOptionValue( const QString& name, const QVariant& val )
827 if ( name == "eval" || name == "evaluation" || name == "subst" || name == "substitution" )
829 if ( val.canConvert( QVariant::Bool ) )
830 setEvaluateValues( val.toBool() );
832 else if ( name == "title" )
834 if ( val.canConvert( QVariant::String ) )
835 setTitle( val.toString() );
840 \brief Initiate item changing call back operation.
842 void QtxPreferenceItem::sendItemChanges()
845 parentItem()->itemChanged( this );
849 \brief Generate unique preference item identifier.
850 \return unique item ID
852 int QtxPreferenceItem::generateId()
859 \class QtxPreferenceMgr
860 \brief Class for managing preferences items.
865 \param mgr resources manager
867 QtxPreferenceMgr::QtxPreferenceMgr( QtxResourceMgr* mgr )
868 : QtxPreferenceItem( 0 ),
876 QtxPreferenceMgr::~QtxPreferenceMgr()
881 \brief Get the resources manager.
882 \return resource manager pointer or 0 if it is not defined
884 QtxResourceMgr* QtxPreferenceMgr::resourceMgr() const
890 \brief Get the parent preferences manager.
891 \return pointer to itself
893 QtxPreferenceMgr* QtxPreferenceMgr::preferenceMgr() const
895 return (QtxPreferenceMgr*)this;
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
905 QVariant QtxPreferenceMgr::option( const int id, const QString& propName ) const
908 QtxPreferenceItem* i = findItem( id, true );
910 propValue = i->option( propName );
915 \brief Set preference item option value.
916 \param id preference item ID
917 \param propName option name
918 \param propValue new property value
921 void QtxPreferenceMgr::setOption( const int id, const QString& propName, const QVariant& propValue )
923 QtxPreferenceItem* i = findItem( id, true );
925 i->setOption( propName, propValue );
929 \brief Store all preferences item to the resource manager.
932 void QtxPreferenceMgr::store()
935 resourceValues( before );
937 QList<QtxPreferenceItem*> items = childItems( true );
938 for ( QList<QtxPreferenceItem*>::iterator it = items.begin(); it != items.end(); ++it )
942 resourceValues( after );
945 differentValues( before, after, changed );
947 changedResources( changed );
951 \brief Retrieve all preference items from the resource manager.
954 void QtxPreferenceMgr::retrieve()
956 QList<QtxPreferenceItem*> items = childItems( true );
957 for ( QList<QtxPreferenceItem*>::iterator it = items.begin(); it != items.end(); ++it )
962 \brief Dumps all values to the backup container.
965 void QtxPreferenceMgr::toBackup()
968 resourceValues( myBackup );
972 \brief Restore all values from the backup container.
975 void QtxPreferenceMgr::fromBackup()
978 resourceValues( before );
980 setResourceValues( myBackup );
983 resourceValues( after );
986 differentValues( before, after, changed );
988 changedResources( changed );
992 \brief Update preferences manager.
994 Base implementation does nothing.
996 void QtxPreferenceMgr::update()
1001 \brief Get all resources items values.
1002 \param map used as container filled with the resources values (<ID>:<value>)
1003 \sa setResourceValues()
1005 void QtxPreferenceMgr::resourceValues( QMap<int, QString>& map ) const
1008 QtxResourceMgr* resMgr = resourceMgr();
1009 QList<QtxPreferenceItem*> items = childItems( true );
1010 for ( QList<QtxPreferenceItem*>::const_iterator it = items.begin(); it != items.end(); ++it )
1012 QtxPreferenceItem* item = *it;
1013 item->resource( sect, name );
1014 if ( resMgr->hasValue( sect, name ) )
1015 map.insert( item->id(), item->resourceValue() );
1020 \brief Get all resources items values.
1021 \param map used as container filled with the resources values
1023 \sa setResourceValues()
1025 void QtxPreferenceMgr::resourceValues( ResourceMap& map ) const
1028 QtxResourceMgr* resMgr = resourceMgr();
1029 QList<QtxPreferenceItem*> items = childItems( true );
1030 for ( QList<QtxPreferenceItem*>::const_iterator it = items.begin(); it != items.end(); ++it )
1032 QtxPreferenceItem* item = *it;
1033 item->resource( sect, name );
1034 if ( resMgr->hasValue( sect, name ) )
1035 map.insert( item, item->resourceValue() );
1040 \brief Set all resources items values.
1041 \param map map with resources values (<ID>:<value>)
1042 \sa resourceValues()
1044 void QtxPreferenceMgr::setResourceValues( QMap<int, QString>& map ) const
1046 for ( QMap<int, QString>::const_iterator it = map.begin(); it != map.end(); ++it )
1048 QtxPreferenceItem* i = findItem( it.key(), true );
1050 i->setResourceValue( it.value() );
1055 \brief Set all resources items values.
1056 \param map map with resources values (<item>:<value>)
1057 \sa resourceValues()
1059 void QtxPreferenceMgr::setResourceValues( ResourceMap& map ) const
1061 for ( ResourceMap::const_iterator it = map.begin(); it != map.end(); ++it )
1062 it.key()->setResourceValue( it.value() );
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
1073 void QtxPreferenceMgr::differentValues( const QMap<int, QString>& map1, const QMap<int, QString>& map2,
1074 QMap<int, QString>& resMap, const bool fromFirst ) const
1077 const QMap<int, QString>& later = fromFirst ? map1 : map2;
1078 const QMap<int, QString>& early = fromFirst ? map2 : map1;
1080 for ( QMap<int, QString>::const_iterator it = later.begin(); it != later.end(); ++it )
1082 if ( !early.contains( it.key() ) || early[it.key()] != it.value() )
1083 resMap.insert( it.key(), it.value() );
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
1095 void QtxPreferenceMgr::differentValues( const ResourceMap& map1, const ResourceMap& map2,
1096 ResourceMap& resMap, const bool fromFirst ) const
1099 const ResourceMap& later = fromFirst ? map1 : map2;
1100 const ResourceMap& early = fromFirst ? map2 : map1;
1102 for ( ResourceMap::const_iterator it = later.begin(); it != later.end(); ++it )
1104 if ( !early.contains( it.key() ) || early[it.key()] != it.value() )
1105 resMap.insert( it.key(), it.value() );
1110 \brief Perform custom activity on resource changing.
1112 This method is called from store() and fromBackup() methods.
1113 Base implementation does nothing.
1115 \sa store(), fromBackup()
1117 void QtxPreferenceMgr::changedResources( const ResourceMap& )