1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // File: QtxPreferenceMgr.cxx
23 // Author: Sergey TELKOV
25 #include "QtxPreferenceMgr.h"
27 #include "QtxResourceMgr.h"
30 #include <QApplication>
33 \class QtxPreferenceItem::Updater
34 \brief Preference item updater.
38 class QtxPreferenceItem::Updater : public QObject
44 static Updater* instance();
46 void updateItem( QtxPreferenceItem* );
47 void removeItem( QtxPreferenceItem* );
50 virtual void customEvent( QEvent* );
53 QList<QtxPreferenceItem*> myItems;
54 static Updater* _Updater;
57 QtxPreferenceItem::Updater* QtxPreferenceItem::Updater::_Updater = 0;
63 QtxPreferenceItem::Updater::Updater()
71 QtxPreferenceItem::Updater::~Updater()
76 \brief Get the only updater instance.
78 \return the only updater instance
80 QtxPreferenceItem::Updater* QtxPreferenceItem::Updater::instance()
83 _Updater = new Updater();
88 \brief Update the preference item.
90 \param item preference item to be updated
92 void QtxPreferenceItem::Updater::updateItem( QtxPreferenceItem* item )
94 if ( !item || myItems.contains( item ) )
97 myItems.append( item );
98 QApplication::postEvent( this, new QEvent( QEvent::User ) );
102 \brief Called when preference item is removed.
104 \param item preference item being removed
106 void QtxPreferenceItem::Updater::removeItem( QtxPreferenceItem* item )
108 myItems.removeAll( item );
112 \brief Custom events provessing. Updates all the items.
114 \param e custom event (not used)
116 void QtxPreferenceItem::Updater::customEvent( QEvent* /*e*/ )
118 QList<QtxPreferenceItem*> lst = myItems;
119 for ( QList<QtxPreferenceItem*>::const_iterator it = lst.begin(); it != lst.end(); ++it )
120 (*it)->updateContents();
124 \class QtxPreferenceItem
125 \brief Base class for implementing of all the preference items.
127 To implement any specific preference item, cubclass from the
128 QtxPreferenceItem and redefine store() and retrieve() methods.
133 \param parent parent preference item
135 QtxPreferenceItem::QtxPreferenceItem( QtxPreferenceItem* parent )
142 parent->insertItem( this );
147 \param title item title
148 \param parent parent preference item
150 QtxPreferenceItem::QtxPreferenceItem( const QString& title, QtxPreferenceItem* parent )
157 parent->insertItem( this );
162 \param title item title
163 \param sect resource file section to be associated with the item
164 \param param resource file parameter to be associated with the item
165 \param parent parent preference item
167 QtxPreferenceItem::QtxPreferenceItem( const QString& title, const QString& sect,
168 const QString& param, QtxPreferenceItem* parent )
177 parent->insertItem( this );
183 QtxPreferenceItem::~QtxPreferenceItem()
185 ItemList list = myChildren;
190 myParent->removeItem( this );
192 Updater::instance()->removeItem( this );
196 \brief Get unique item identifier.
199 int QtxPreferenceItem::id() const
205 \brief Get unique item type identifier.
208 int QtxPreferenceItem::rtti() const
210 return QtxPreferenceItem::RTTI();
214 \brief Specify unique item class identifier.
215 \return item class ID
217 int QtxPreferenceItem::RTTI()
223 \brief Get root preference item.
226 QtxPreferenceItem* QtxPreferenceItem::rootItem() const
228 QtxPreferenceItem* item = (QtxPreferenceItem*)this;
229 while ( item->parentItem() )
230 item = item->parentItem();
235 \brief Get parent preference item.
238 QtxPreferenceItem* QtxPreferenceItem::parentItem() const
244 \brief Append child preference item.
246 Removes (if necessary) the item from the previous parent.
248 \param item item to be added
251 void QtxPreferenceItem::appendItem( QtxPreferenceItem* item )
253 insertItem( item, 0 );
257 \brief Insert child preference item before specified item.
258 If the before item is 0 then new item is appended.
260 Removes (if necessary) the item from the previous parent.
262 \param item item to be added
263 \param before item before which is inserted new \aitem
266 void QtxPreferenceItem::insertItem( QtxPreferenceItem* item, QtxPreferenceItem* before )
271 if ( myChildren.contains( item ) && item == before )
274 if ( myChildren.contains( item ) )
275 myChildren.removeAll( item );
277 int idx = myChildren.indexOf( before );
279 idx = myChildren.count();
281 if ( item->parentItem() && item->parentItem() != this )
282 item->parentItem()->removeItem( item );
284 item->myParent = this;
285 myChildren.insert( idx, item );
291 \brief Remove child preference item.
292 \param item item to be removed
295 void QtxPreferenceItem::removeItem( QtxPreferenceItem* item )
297 if ( !item || !myChildren.contains( item ) )
301 myChildren.removeAll( item );
307 \brief Get all child preference items.
308 \param rec recursion boolean flag
309 \return list of child items
311 QList<QtxPreferenceItem*> QtxPreferenceItem::childItems( const bool rec ) const
313 QList<QtxPreferenceItem*> lst = myChildren;
316 for ( ItemList::const_iterator it = myChildren.begin(); it != myChildren.end(); ++it )
317 lst += (*it)->childItems( rec );
324 \brief Get preference item depth.
327 int QtxPreferenceItem::depth() const
329 return parentItem() ? parentItem()->depth() + 1 : 0;
333 \brief Get child preference items number.
334 \return number of child items
337 int QtxPreferenceItem::count() const
339 return myChildren.count();
343 \brief Check if the item has children.
344 \return \c true if item does not have children
347 bool QtxPreferenceItem::isEmpty() const
349 return myChildren.isEmpty();
353 \brief Get preference item icon.
357 QIcon QtxPreferenceItem::icon() const
363 \brief Get preference item title.
367 QString QtxPreferenceItem::title() const
373 \brief Get resource file settings associated to the preference item.
374 \param sec used to return resource file section name
375 \param param used to return resource file parameter name
378 void QtxPreferenceItem::resource( QString& sec, QString& param ) const
385 \brief Set prefence item icon.
386 \param ico new item icon
389 void QtxPreferenceItem::setIcon( const QIcon& ico )
391 if ( myIcon.serialNumber() == ico.serialNumber() )
399 \brief Set preference item title .
400 \param title new item title
403 void QtxPreferenceItem::setTitle( const QString& title )
405 if ( myTitle == title )
413 \brief Assign resource file settings to the preference item.
414 \param sec resource file section name
415 \param param resource file parameter name
418 void QtxPreferenceItem::setResource( const QString& sec, const QString& param )
425 \brief Update preference item.
427 void QtxPreferenceItem::updateContents()
429 Updater::instance()->removeItem( this );
433 \brief Get preference item option value.
434 \param name option name
435 \return property value or null QVariant if option is not set
438 QVariant QtxPreferenceItem::option( const QString& name ) const
440 return optionValue( name.toLower() );
444 \brief Set preference item option value.
445 \param name option name
446 \param val new property value
449 void QtxPreferenceItem::setOption( const QString& name, const QVariant& val )
451 QVariant old = optionValue( name.toLower() );
452 setOptionValue( name.toLower(), val );
453 if ( old != optionValue( name.toLower() ) )
457 bool QtxPreferenceItem::isEvaluateValues() const
462 void QtxPreferenceItem::setEvaluateValues( const bool on )
468 \fn void QtxPreferenceItem::store();
469 \brief Save preference item (for example, to the resource file).
471 This method should be implemented in the subclasses.
477 \fn virtual void QtxPreferenceItem::retrieve();
478 \brief Restore preference item (for example, from the resource file).
480 This method should be implemented in the subclasses.
486 \brief Get the value of the associated resource file setting.
487 \return associated resource file setting value
488 \sa setResourceValue()
490 QString QtxPreferenceItem::resourceValue() const
496 \brief Get the value of the associated resource file setting.
497 \param val new associated resource file setting value
500 void QtxPreferenceItem::setResourceValue( const QString& val )
506 \brief Get the resources manager.
507 \return resource manager pointer or 0 if it is not defined
509 QtxResourceMgr* QtxPreferenceItem::resourceMgr() const
511 QtxPreferenceMgr* mgr = preferenceMgr();
512 return mgr ? mgr->resourceMgr() : 0;
516 \brief Get the parent preferences manager.
517 \return preferences manager or 0 if it is not defined
519 QtxPreferenceMgr* QtxPreferenceItem::preferenceMgr() const
521 return parentItem() ? parentItem()->preferenceMgr() : 0;
525 \brief Find the item by the specified identifier.
526 \param id child item ID
527 \param rec if \c true recursive search is done
528 \return child item or 0 if it is not found
530 QtxPreferenceItem* QtxPreferenceItem::findItem( const int id, const bool rec ) const
532 QtxPreferenceItem* item = 0;
533 for ( ItemList::const_iterator it = myChildren.begin(); it != myChildren.end() && !item; ++it )
535 QtxPreferenceItem* i = *it;
539 item = i->findItem( id, rec );
545 \brief Find the item by the specified title.
546 \param title child item title
547 \param rec if \c true recursive search is done
548 \return child item or 0 if it is not found
550 QtxPreferenceItem* QtxPreferenceItem::findItem( const QString& title, const bool rec ) const
552 QtxPreferenceItem* item = 0;
553 for ( ItemList::const_iterator it = myChildren.begin(); it != myChildren.end() && !item; ++it )
555 QtxPreferenceItem* i = *it;
556 if ( i->title() == title )
559 item = i->findItem( title, rec );
565 \brief Find the item by the specified title and identifier.
566 \param title child item title
567 \param id child item ID
568 \param rec if \c true recursive search is done
569 \return child item or 0 if it is not found
571 QtxPreferenceItem* QtxPreferenceItem::findItem( const QString& title, const int id, const bool rec ) const
573 QtxPreferenceItem* item = 0;
574 for ( ItemList::const_iterator it = myChildren.begin(); it != myChildren.end() && !item; ++it )
576 QtxPreferenceItem* i = *it;
577 if ( i->title() == title && i->id() == id )
580 item = i->findItem( title, id, rec );
585 void QtxPreferenceItem::activate()
589 void QtxPreferenceItem::ensureVisible()
592 parentItem()->ensureVisible( this );
596 \brief Get integer resources value corresponding to the item.
597 \param val default value (returned if there is no such resource)
598 \return integer value of the associated resource
601 int QtxPreferenceItem::getInteger( const int val ) const
603 QtxResourceMgr* resMgr = resourceMgr();
604 return resMgr ? resMgr->integerValue( mySection, myParameter, val ) : val;
608 \brief Get double resources value corresponding to the item.
609 \param val default value (returned if there is no such resource)
610 \return double value of the associated resource
613 double QtxPreferenceItem::getDouble( const double val ) const
615 QtxResourceMgr* resMgr = resourceMgr();
616 return resMgr ? resMgr->doubleValue( mySection, myParameter, val ) : val;
620 \brief Get boolean resources value corresponding to the item.
621 \param val default value (returned if there is no such resource)
622 \return boolean value of the associated resource
625 bool QtxPreferenceItem::getBoolean( const bool val ) const
627 QtxResourceMgr* resMgr = resourceMgr();
628 return resMgr ? resMgr->booleanValue( mySection, myParameter, val ) : val;
632 \brief Get string resources value corresponding to the item.
633 \param val default value (returned if there is no such resource)
634 \return string value of the associated resource
637 QString QtxPreferenceItem::getString( const QString& val ) const
640 QtxResourceMgr* resMgr = resourceMgr();
642 resMgr->value( mySection, myParameter, res, isEvaluateValues() );
647 \brief Get color resources value corresponding to the item.
648 \param val default value (returned if there is no such resource)
649 \return color value of the associated resource
652 QColor QtxPreferenceItem::getColor( const QColor& val ) const
654 QtxResourceMgr* resMgr = resourceMgr();
655 return resMgr ? resMgr->colorValue( mySection, myParameter, val ) : val;
659 \brief Get font resources value corresponding to the item.
660 \param val default value (returned if there is no such resource)
661 \return font value of the associated resource
664 QFont QtxPreferenceItem::getFont( const QFont& val ) const
666 QtxResourceMgr* resMgr = resourceMgr();
667 return resMgr ? resMgr->fontValue( mySection, myParameter, val ) : val;
671 \brief Set integer resources value corresponding to the item.
675 void QtxPreferenceItem::setInteger( const int val )
677 QtxResourceMgr* resMgr = resourceMgr();
679 resMgr->setValue( mySection, myParameter, val );
683 \brief Set double resources value corresponding to the item.
687 void QtxPreferenceItem::setDouble( const double val )
689 QtxResourceMgr* resMgr = resourceMgr();
691 resMgr->setValue( mySection, myParameter, val );
695 \brief Set boolean resources value corresponding to the item.
699 void QtxPreferenceItem::setBoolean( const bool val )
701 QtxResourceMgr* resMgr = resourceMgr();
703 resMgr->setValue( mySection, myParameter, val );
707 \brief Set string resources value corresponding to the item.
711 void QtxPreferenceItem::setString( const QString& val )
713 QtxResourceMgr* resMgr = resourceMgr();
715 resMgr->setValue( mySection, myParameter, val );
719 \brief Set color resources value corresponding to the item.
723 void QtxPreferenceItem::setColor( const QColor& val )
725 QtxResourceMgr* resMgr = resourceMgr();
727 resMgr->setValue( mySection, myParameter, val );
731 \brief Set font resources value corresponding to the item.
735 void QtxPreferenceItem::setFont( const QFont& val )
737 QtxResourceMgr* resMgr = resourceMgr();
739 resMgr->setValue( mySection, myParameter, val );
743 \brief Callback function which is called when the child
744 preference item is added.
746 This function can be reimplemented in the subclasses to customize
747 child item addition operation. Base implementation does nothing.
749 \param item child item being added
750 \sa itemRemoved(), itemChanged()
752 void QtxPreferenceItem::itemAdded( QtxPreferenceItem* /*item*/ )
757 \brief Callback function which is called when the child
758 preference item is removed.
760 This function can be reimplemented in the subclasses to customize
761 child item removal operation. Base implementation does nothing.
763 \param item child item being removed
764 \sa itemAdded(), itemChanged()
766 void QtxPreferenceItem::itemRemoved( QtxPreferenceItem* /*item*/ )
771 \brief Callback function which is called when the child
772 preference item is modified.
774 This function can be reimplemented in the subclasses to customize
775 child item modifying operation. Base implementation does nothing.
777 \param item child item being modified
778 \sa itemAdded(), itemRemoved()
780 void QtxPreferenceItem::itemChanged( QtxPreferenceItem* )
784 void QtxPreferenceItem::ensureVisible( QtxPreferenceItem* )
790 \brief Initiate item updating.
792 void QtxPreferenceItem::triggerUpdate()
794 Updater::instance()->updateItem( this );
798 \brief Get preference item option value.
800 This function can be reimplemented in the subclasses.
801 Base implementation does nothing.
803 \param name option name
804 \return property value or null QVariant if option is not set
807 QVariant QtxPreferenceItem::optionValue( const QString& name ) const
810 if ( name == "eval" || name == "evaluation" || name == "subst" || name == "substitution" )
811 val = isEvaluateValues();
812 else if ( name == "title" )
818 \brief Set preference item option value.
820 This function can be reimplemented in the subclasses.
821 Base implementation does nothing.
823 \param name option name
824 \param val new property value
827 void QtxPreferenceItem::setOptionValue( const QString& name, const QVariant& val )
829 if ( name == "eval" || name == "evaluation" || name == "subst" || name == "substitution" )
831 if ( val.canConvert( QVariant::Bool ) )
832 setEvaluateValues( val.toBool() );
834 else if ( name == "title" )
836 if ( val.canConvert( QVariant::String ) )
837 setTitle( val.toString() );
842 \brief Initiate item changing call back operation.
844 void QtxPreferenceItem::sendItemChanges()
847 parentItem()->itemChanged( this );
851 \brief Generate unique preference item identifier.
852 \return unique item ID
854 int QtxPreferenceItem::generateId()
861 \class QtxPreferenceMgr
862 \brief Class for managing preferences items.
867 \param mgr resources manager
869 QtxPreferenceMgr::QtxPreferenceMgr( QtxResourceMgr* mgr )
870 : QtxPreferenceItem( 0 ),
878 QtxPreferenceMgr::~QtxPreferenceMgr()
883 \brief Get the resources manager.
884 \return resource manager pointer or 0 if it is not defined
886 QtxResourceMgr* QtxPreferenceMgr::resourceMgr() const
892 \brief Get the parent preferences manager.
893 \return pointer to itself
895 QtxPreferenceMgr* QtxPreferenceMgr::preferenceMgr() const
897 return (QtxPreferenceMgr*)this;
901 \brief Get preference item option value.
902 \param id preference item ID
903 \param propName option name
904 \return property value or null QVariant if option is not set
907 QVariant QtxPreferenceMgr::option( const int id, const QString& propName ) const
910 QtxPreferenceItem* i = findItem( id, true );
912 propValue = i->option( propName );
917 \brief Set preference item option value.
918 \param id preference item ID
919 \param propName option name
920 \param propValue new property value
923 void QtxPreferenceMgr::setOption( const int id, const QString& propName, const QVariant& propValue )
925 QtxPreferenceItem* i = findItem( id, true );
927 i->setOption( propName, propValue );
931 \brief Store all preferences item to the resource manager.
934 void QtxPreferenceMgr::store()
937 resourceValues( before );
939 QList<QtxPreferenceItem*> items = childItems( true );
940 for ( QList<QtxPreferenceItem*>::iterator it = items.begin(); it != items.end(); ++it )
944 resourceValues( after );
947 differentValues( before, after, changed );
949 changedResources( changed );
953 \brief Retrieve all preference items from the resource manager.
956 void QtxPreferenceMgr::retrieve()
958 QList<QtxPreferenceItem*> items = childItems( true );
959 for ( QList<QtxPreferenceItem*>::iterator it = items.begin(); it != items.end(); ++it )
964 \brief Dumps all values to the backup container.
967 void QtxPreferenceMgr::toBackup()
970 resourceValues( myBackup );
974 \brief Restore all values from the backup container.
977 void QtxPreferenceMgr::fromBackup()
980 resourceValues( before );
982 setResourceValues( myBackup );
985 resourceValues( after );
988 differentValues( before, after, changed );
990 changedResources( changed );
994 \brief Update preferences manager.
996 Base implementation does nothing.
998 void QtxPreferenceMgr::update()
1003 \brief Get all resources items values.
1004 \param map used as container filled with the resources values (<ID>:<value>)
1005 \sa setResourceValues()
1007 void QtxPreferenceMgr::resourceValues( QMap<int, QString>& map ) const
1010 QtxResourceMgr* resMgr = resourceMgr();
1011 QList<QtxPreferenceItem*> items = childItems( true );
1012 for ( QList<QtxPreferenceItem*>::const_iterator it = items.begin(); it != items.end(); ++it )
1014 QtxPreferenceItem* item = *it;
1015 item->resource( sect, name );
1016 if ( resMgr->hasValue( sect, name ) )
1017 map.insert( item->id(), item->resourceValue() );
1022 \brief Get all resources items values.
1023 \param map used as container filled with the resources values
1025 \sa setResourceValues()
1027 void QtxPreferenceMgr::resourceValues( ResourceMap& map ) const
1030 QtxResourceMgr* resMgr = resourceMgr();
1031 QList<QtxPreferenceItem*> items = childItems( true );
1032 for ( QList<QtxPreferenceItem*>::const_iterator it = items.begin(); it != items.end(); ++it )
1034 QtxPreferenceItem* item = *it;
1035 item->resource( sect, name );
1036 if ( resMgr->hasValue( sect, name ) )
1037 map.insert( item, item->resourceValue() );
1042 \brief Set all resources items values.
1043 \param map map with resources values (<ID>:<value>)
1044 \sa resourceValues()
1046 void QtxPreferenceMgr::setResourceValues( QMap<int, QString>& map ) const
1048 for ( QMap<int, QString>::const_iterator it = map.begin(); it != map.end(); ++it )
1050 QtxPreferenceItem* i = findItem( it.key(), true );
1052 i->setResourceValue( it.value() );
1057 \brief Set all resources items values.
1058 \param map map with resources values (<item>:<value>)
1059 \sa resourceValues()
1061 void QtxPreferenceMgr::setResourceValues( ResourceMap& map ) const
1063 for ( ResourceMap::const_iterator it = map.begin(); it != map.end(); ++it )
1064 it.key()->setResourceValue( it.value() );
1068 \brief Compare two maps of resources values to find differences.
1069 \param map1 first map
1070 \param map2 second map
1071 \param resMap map to be filled with different values
1072 \param fromFirst if \c true, then \a resMap will be filled with the values
1073 from \a map1, otherwise - from \a map2
1075 void QtxPreferenceMgr::differentValues( const QMap<int, QString>& map1, const QMap<int, QString>& map2,
1076 QMap<int, QString>& resMap, const bool fromFirst ) const
1079 const QMap<int, QString>& later = fromFirst ? map1 : map2;
1080 const QMap<int, QString>& early = fromFirst ? map2 : map1;
1082 for ( QMap<int, QString>::const_iterator it = later.begin(); it != later.end(); ++it )
1084 if ( !early.contains( it.key() ) || early[it.key()] != it.value() )
1085 resMap.insert( it.key(), it.value() );
1090 \brief Compare two maps of resources values to find differences.
1091 \param map1 first map
1092 \param map2 second map
1093 \param resMap map to be filled with different values
1094 \param fromFirst if \c true, then \a resMap will be filled with the values
1095 from \a map1, otherwise - from \a map2
1097 void QtxPreferenceMgr::differentValues( const ResourceMap& map1, const ResourceMap& map2,
1098 ResourceMap& resMap, const bool fromFirst ) const
1101 const ResourceMap& later = fromFirst ? map1 : map2;
1102 const ResourceMap& early = fromFirst ? map2 : map1;
1104 for ( ResourceMap::const_iterator it = later.begin(); it != later.end(); ++it )
1106 if ( !early.contains( it.key() ) || early[it.key()] != it.value() )
1107 resMap.insert( it.key(), it.value() );
1112 \brief Perform custom activity on resource changing.
1114 This method is called from store() and fromBackup() methods.
1115 Base implementation does nothing.
1117 \sa store(), fromBackup()
1119 void QtxPreferenceMgr::changedResources( const ResourceMap& )