Salome HOME
Fix for bug 10438: Crash during Explode on Blocks operation (Global selection on...
[modules/gui.git] / src / Qtx / QtxResourceEdit.cxx
1 // File:      QtxResourceEdit.cxx
2 // Author:    Sergey TELKOV
3
4 #include "QtxResourceEdit.h"
5
6 #include "QtxResourceMgr.h"
7
8 /*
9   Class: QtxResourceEdit
10   Descr: Class for managing preferences items
11 */
12
13 QtxResourceEdit::QtxResourceEdit( QtxResourceMgr* mgr )
14 : myResMgr( mgr )
15 {
16 }
17
18 QtxResourceEdit::~QtxResourceEdit()
19 {
20   for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end(); ++it )
21     delete it.data();
22 }
23
24 QtxResourceMgr* QtxResourceEdit::resourceMgr() const
25 {
26   return myResMgr;
27 }
28
29 int QtxResourceEdit::addItem( const QString& label, const int pId, const int type,
30                               const QString& section, const QString& param )
31 {
32   Item* i = createItem( label, type, pId );
33   if ( !i )
34     return -1;
35
36   if ( !myItems.contains( i->id() ) )
37   {
38     myItems.insert( i->id(), i );
39
40     i->setTitle( label );
41     i->setResource( section, param );
42
43     if ( !i->parentItem() && !myChildren.contains( i ) )
44       myChildren.append( i );
45
46     itemAdded( i );
47   }
48
49   return i->id();
50 }
51
52 QVariant QtxResourceEdit::itemProperty( const int id, const QString& propName ) const
53 {
54   QVariant propValue;
55   Item* i = item( id );
56   if ( i )
57     propValue = i->property( propName );
58   return propValue;
59 }
60
61 void QtxResourceEdit::setItemProperty( const int id, const QString& propName, const QVariant& propValue )
62 {
63   Item* i = item( id );
64   if ( i )
65     i->setProperty( propName, propValue );
66 }
67
68 void QtxResourceEdit::resource( const int id, QString& sec, QString& param ) const
69 {
70   Item* i = item( id );
71   if ( i )
72     i->resource( sec, param );
73 }
74
75 void QtxResourceEdit::store()
76 {
77   QMap<Item*, QString> before;
78   resourceValues( before );
79
80   for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end(); ++it )
81     it.data()->store();
82
83   QMap<Item*, QString> after;
84   resourceValues( after );
85
86   QMap<Item*, QString> changed;
87   differentValues( before, after, changed );
88
89   changedResources( changed );
90 }
91
92 void QtxResourceEdit::retrieve()
93 {
94   for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end(); ++it )
95     it.data()->retrieve();
96 }
97
98 void QtxResourceEdit::toBackup()
99 {
100   myBackup.clear();
101   resourceValues( myBackup );
102 }
103
104 void QtxResourceEdit::fromBackup()
105 {
106   QMap<Item*, QString> before;
107   resourceValues( before );
108
109   setResourceValues( myBackup );
110
111   QMap<Item*, QString> after;
112   resourceValues( after );
113
114   QMap<Item*, QString> changed;
115   differentValues( before, after, changed );
116
117   changedResources( changed );
118 }
119
120 void QtxResourceEdit::update()
121 {
122 }
123
124 QtxResourceEdit::Item* QtxResourceEdit::item( const int id ) const
125 {
126   Item* i = 0;
127   if ( myItems.contains( id ) )
128     i = myItems[id];
129   return i;
130 }
131
132 QtxResourceEdit::Item* QtxResourceEdit::item( const QString& title ) const
133 {
134   Item* i = 0;
135   for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end() && !i; ++it )
136   {
137     if ( it.data()->title() == title )
138       i = it.data();
139   }
140   return i;
141 }
142
143 QtxResourceEdit::Item* QtxResourceEdit::item( const QString& title, const int pId ) const
144 {
145   Item* i = 0;
146   Item* pItem = item( pId );
147   for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end() && !i; ++it )
148   {
149     if ( it.data()->parentItem() == pItem && it.data()->title() == title )
150       i = it.data();
151   }
152   return i;
153 }
154
155 QtxResourceEdit::Item* QtxResourceEdit::createItem( const QString& label, const int type, const int pId )
156 {
157   Item* i = 0;
158   if ( pId < 0 )
159     i = createItem( label, type );
160   else
161   {
162     Item* pItem = item( pId );
163     if ( pItem )
164     {
165       i = pItem->createItem( label, type );
166       pItem->insertChild( i );
167     }
168   }
169
170   return i;
171 }
172
173 void QtxResourceEdit::removeItem( Item* item )
174 {
175   if ( !item )
176     return;
177
178   myChildren.remove( item );
179   myItems.remove( item->id() );
180
181   itemRemoved( item );
182 }
183
184 void QtxResourceEdit::childItems( QPtrList<Item>& lst ) const
185 {
186   lst.clear();
187   for ( QPtrListIterator<Item> it( myChildren ); it.current(); ++it )
188     lst.append( it.current() );
189 }
190
191 void QtxResourceEdit::resourceValues( QMap<int, QString>& map ) const
192 {
193   for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end(); ++it )
194     map.insert( it.key(), it.data()->resourceValue() );
195 }
196
197 void QtxResourceEdit::resourceValues( QMap<Item*, QString>& map ) const
198 {
199   for ( ItemMap::ConstIterator it = myItems.begin(); it != myItems.end(); ++it )
200     map.insert( it.data(), it.data()->resourceValue() );
201 }
202
203 void QtxResourceEdit::setResourceValues( QMap<int, QString>& map ) const
204 {
205   for ( QMap<int, QString>::ConstIterator it = map.begin(); it != map.end(); ++it )
206   {
207     Item* i = item( it.key() );
208     if ( i )
209       i->setResourceValue( it.data() );
210   }
211 }
212
213 void QtxResourceEdit::setResourceValues( QMap<Item*, QString>& map ) const
214 {
215   for ( QMap<Item*, QString>::ConstIterator it = map.begin(); it != map.end(); ++it )
216     it.key()->setResourceValue( it.data() );
217 }
218
219
220 void QtxResourceEdit::differentValues( const QMap<int, QString>& map1, const QMap<int, QString>& map2,
221                                        QMap<int, QString>& resMap, const bool fromFirst ) const
222 {
223   resMap.clear();
224   const QMap<int, QString>& later = fromFirst ? map1 : map2;
225   const QMap<int, QString>& early = fromFirst ? map2 : map1;
226
227   for ( QMap<int, QString>::ConstIterator it = later.begin(); it != later.end(); ++it )
228   {
229     if ( !early.contains( it.key() ) || early[it.key()] != it.data() )
230       resMap.insert( it.key(), it.data() );
231   }
232 }
233
234 void QtxResourceEdit::differentValues( const QMap<Item*, QString>& map1, const QMap<Item*, QString>& map2,
235                                        QMap<Item*, QString>& resMap, const bool fromFirst ) const
236 {
237   resMap.clear();
238   const QMap<Item*, QString>& later = fromFirst ? map1 : map2;
239   const QMap<Item*, QString>& early = fromFirst ? map2 : map1;
240
241   for ( QMap<Item*, QString>::ConstIterator it = later.begin(); it != later.end(); ++it )
242   {
243     if ( !early.contains( it.key() ) || early[it.key()] != it.data() )
244       resMap.insert( it.key(), it.data() );
245   }
246 }
247
248 void QtxResourceEdit::changedResources( const QMap<Item*, QString>& )
249 {
250 }
251
252 void QtxResourceEdit::itemAdded( Item* )
253 {
254 }
255
256 void QtxResourceEdit::itemRemoved( Item* )
257 {
258 }
259
260 /*
261   Class: QtxResourceEdit::Item
262   Descr: Class for incapsulation of one preference item
263 */
264
265 QtxResourceEdit::Item::Item( QtxResourceEdit* edit, Item* parent )
266 : myEdit( edit ),
267 myParent( 0 )
268 {
269   myId = generateId();
270
271   if ( parent )
272     parent->insertChild( this );
273 }
274
275 QtxResourceEdit::Item::~Item()
276 {
277   if ( resourceEdit() )
278     resourceEdit()->removeItem( this );
279 }
280
281 int QtxResourceEdit::Item::id() const
282 {
283   return myId;
284 }
285
286 QtxResourceEdit::Item* QtxResourceEdit::Item::parentItem() const
287 {
288   return myParent;
289 }
290
291 void QtxResourceEdit::Item::insertChild( Item* item )
292 {
293   if ( !item || myChildren.contains( item ) )
294     return;
295
296   if ( item->parentItem() && item->parentItem() != this )
297     item->parentItem()->removeChild( item );
298
299   item->myParent = this;
300   myChildren.append( item );
301 }
302
303 void QtxResourceEdit::Item::removeChild( Item* item )
304 {
305   if ( !item || !myChildren.contains( item ) )
306     return;
307
308   myChildren.remove( item );
309   item->myParent = 0;
310 }
311
312 void QtxResourceEdit::Item::childItems( QPtrList<Item>& lst ) const
313 {
314   for ( ItemListIterator it( myChildren ); it.current(); ++it )
315     lst.append( it.current() );
316 }
317
318 bool QtxResourceEdit::Item::isEmpty() const
319 {
320   return myChildren.isEmpty();
321 }
322
323 QString QtxResourceEdit::Item::title() const
324 {
325   return myTitle;
326 }
327
328 void QtxResourceEdit::Item::resource( QString& sec, QString& param ) const
329 {
330   sec = myResSection;
331   param = myResParameter;
332 }
333
334 void QtxResourceEdit::Item::setTitle( const QString& title )
335 {
336   myTitle = title;
337 }
338
339 void QtxResourceEdit::Item::setResource( const QString& sec, const QString& param )
340 {
341   myResSection = sec;
342   myResParameter = param;
343 }
344
345 void QtxResourceEdit::Item::update()
346 {
347 }
348
349 QVariant QtxResourceEdit::Item::property( const QString& ) const
350 {
351   return QVariant();
352 }
353
354 void QtxResourceEdit::Item::setProperty( const QString&, const QVariant& )
355 {
356 }
357
358 QString QtxResourceEdit::Item::resourceValue() const
359 {
360   return getString();
361 }
362
363 void QtxResourceEdit::Item::setResourceValue( const QString& val )
364 {
365   setString( val );
366 }
367
368 QtxResourceMgr* QtxResourceEdit::Item::resourceMgr() const
369 {
370   QtxResourceMgr* resMgr = 0;
371   if ( resourceEdit() )
372     resMgr = resourceEdit()->resourceMgr();
373   return resMgr;
374 }
375
376 QtxResourceEdit* QtxResourceEdit::Item::resourceEdit() const
377 {
378   return myEdit;
379 }
380
381 int QtxResourceEdit::Item::getInteger( const int val ) const
382 {
383   QtxResourceMgr* resMgr = resourceMgr();
384   return resMgr ? resMgr->integerValue( myResSection, myResParameter, val ) : val;
385 }
386
387 double QtxResourceEdit::Item::getDouble( const double val ) const
388 {
389   QtxResourceMgr* resMgr = resourceMgr();
390   return resMgr ? resMgr->doubleValue( myResSection, myResParameter, val ) : val;
391 }
392
393 bool QtxResourceEdit::Item::getBoolean( const bool val ) const
394 {
395   QtxResourceMgr* resMgr = resourceMgr();
396   return resMgr ? resMgr->booleanValue( myResSection, myResParameter, val ) : val;
397 }
398
399 QString QtxResourceEdit::Item::getString( const QString& val ) const
400 {
401   QtxResourceMgr* resMgr = resourceMgr();
402   return resMgr ? resMgr->stringValue( myResSection, myResParameter, val ) : val;
403 }
404
405 QColor QtxResourceEdit::Item::getColor( const QColor& val ) const
406 {
407   QtxResourceMgr* resMgr = resourceMgr();
408   return resMgr ? resMgr->colorValue( myResSection, myResParameter, val ) : val;
409 }
410
411 QFont QtxResourceEdit::Item::getFont( const QFont& val ) const
412 {
413   QtxResourceMgr* resMgr = resourceMgr();
414   return resMgr ? resMgr->fontValue( myResSection, myResParameter, val ) : val;
415 }
416
417 void QtxResourceEdit::Item::setInteger( const int val )
418 {
419   QtxResourceMgr* resMgr = resourceMgr();
420   if ( resMgr )
421     resMgr->setValue( myResSection, myResParameter, val );
422 }
423
424 void QtxResourceEdit::Item::setDouble( const double val )
425 {
426   QtxResourceMgr* resMgr = resourceMgr();
427   if ( resMgr )
428     resMgr->setValue( myResSection, myResParameter, val );
429 }
430
431 void QtxResourceEdit::Item::setBoolean( const bool val )
432 {
433   QtxResourceMgr* resMgr = resourceMgr();
434   if ( resMgr )
435     resMgr->setValue( myResSection, myResParameter, val );
436 }
437
438 void QtxResourceEdit::Item::setString( const QString& val )
439 {
440   QtxResourceMgr* resMgr = resourceMgr();
441   if ( resMgr )
442     resMgr->setValue( myResSection, myResParameter, val );
443 }
444
445 void QtxResourceEdit::Item::setColor( const QColor& val )
446 {
447   QtxResourceMgr* resMgr = resourceMgr();
448   if ( resMgr )
449     resMgr->setValue( myResSection, myResParameter, val );
450 }
451
452 void QtxResourceEdit::Item::setFont( const QFont& val )
453 {
454   QtxResourceMgr* resMgr = resourceMgr();
455   if ( resMgr )
456     resMgr->setValue( myResSection, myResParameter, val );
457 }
458
459 QtxResourceEdit::Item* QtxResourceEdit::Item::item( const int id ) const
460 {
461   return resourceEdit() ? resourceEdit()->item( id ) : 0;
462 }
463
464 QtxResourceEdit::Item* QtxResourceEdit::Item::item( const QString& title ) const
465 {
466   return resourceEdit() ? resourceEdit()->item( title ) : 0;
467 }
468
469 QtxResourceEdit::Item* QtxResourceEdit::Item::item( const QString& title, const int id ) const
470 {
471   return resourceEdit() ? resourceEdit()->item( title, id ) : 0;
472 }
473
474 int QtxResourceEdit::Item::generateId()
475 {
476   static int _id = 0;
477   return _id++;
478 }