Salome HOME
7b0855d08a110c8561c76ee7f83f8b836d308891
[modules/gui.git] / src / Qtx / QtxResourceMgr.h
1 #ifndef QTX_RESOURCEMGR_H
2 #define QTX_RESOURCEMGR_H
3
4 #include "Qtx.h"
5
6 #include <qmap.h>
7 #include <qcolor.h>
8 #include <qfont.h>
9 #include <qpixmap.h>
10 #include <qstringlist.h>
11 #include <qtranslator.h>
12 #include <qvaluelist.h>
13
14 class QPixmap;
15
16 #ifdef WIN32
17 #pragma warning( disable:4251 )
18 #endif
19
20 /*!
21   Class: QtxResourceMgr
22 */
23
24 class QTX_EXPORT QtxResourceMgr
25 {
26   class IniFormat;
27   class XmlFormat;
28   class Resources;
29
30 public:
31   class Format;
32
33   template <class Key, class Value> class IMap;
34   template <class Key, class Value> class IMapIterator;
35   template <class Key, class Value> class IMapConstIterator;
36
37 #ifdef QTX_NO_INDEXED_MAP
38   typedef QMap<QString, QString> Section;
39 #else
40   typedef IMap<QString, QString> Section;
41 #endif
42
43 public:
44   QtxResourceMgr( const QString&, const QString& = QString::null );
45   virtual ~QtxResourceMgr();
46
47   QString         appName() const;
48   QStringList     dirList() const;
49
50   bool            checkExisting() const;
51   virtual void    setCheckExisting( const bool );
52
53   void            clear();
54
55   bool            value( const QString&, const QString&, int& ) const;
56   bool            value( const QString&, const QString&, double& ) const;
57   bool            value( const QString&, const QString&, bool& ) const;
58   bool            value( const QString&, const QString&, QColor& ) const;
59   bool            value( const QString&, const QString&, QFont& ) const;  
60   bool            value( const QString&, const QString&, QString&, const bool = true ) const;
61
62   int             integerValue( const QString&, const QString&, const int = 0 ) const;
63   double          doubleValue( const QString&, const QString&, const double = 0 ) const;
64   bool            booleanValue( const QString&, const QString&, const bool = false ) const;
65   QFont           fontValue( const QString&, const QString&, const QFont& = QFont() ) const;
66   QColor          colorValue( const QString&, const QString&, const QColor& = QColor() ) const;
67   QString         stringValue( const QString&, const QString&, const QString& = QString::null ) const;
68
69   bool            hasSection( const QString& ) const;
70   bool            hasValue( const QString&, const QString& ) const;
71
72   void            setValue( const QString&, const QString&, const int );
73   void            setValue( const QString&, const QString&, const double );
74   void            setValue( const QString&, const QString&, const bool );
75   void            setValue( const QString&, const QString&, const QFont& );
76   void            setValue( const QString&, const QString&, const QColor& );
77   void            setValue( const QString&, const QString&, const QString& );
78
79   void            remove( const QString& );
80   void            remove( const QString&, const QString& );
81
82   QString         currentFormat() const;
83   void            setCurrentFormat( const QString& );
84
85   Format*         format( const QString& ) const;
86   void            installFormat( Format* );
87   void            removeFormat( Format* );
88
89   QStringList     options() const;
90   QString         option( const QString& ) const;
91   void            setOption( const QString&, const QString& );
92
93   QPixmap         defaultPixmap() const;
94   virtual void    setDefaultPixmap( const QPixmap& );
95
96   QString         resSection() const;
97   QString         langSection() const;
98
99   QPixmap         loadPixmap( const QString&, const QString& ) const;
100   QPixmap         loadPixmap( const QString&, const QString&, const bool ) const;
101   QPixmap         loadPixmap( const QString&, const QString&, const QPixmap& ) const;
102   void            loadLanguage( const QString& = QString::null, const QString& = QString::null );
103
104   void            raiseTranslators( const QString& );
105   void            removeTranslators( const QString& );
106   void            loadTranslator( const QString&, const QString& );
107   void            loadTranslators( const QString&, const QStringList& );
108
109   QString         path( const QString&, const QString&, const QString& ) const;
110
111   bool            load();
112   bool            save();
113
114   QStringList     sections() const;
115   QStringList     parameters( const QString& ) const;
116
117   void            refresh();
118
119 protected:
120   virtual void    setDirList( const QStringList& );
121   virtual void    setResource( const QString&, const QString&, const QString& );
122
123   virtual QString userFileName( const QString& ) const;
124   virtual QString globalFileName( const QString& ) const;
125
126 private:
127   void            initialize( const bool = true ) const;
128   QString         substMacro( const QString&, const QMap<QChar, QString>& ) const;
129
130 private:
131   typedef QPtrList<Resources>           ResList;
132   typedef QPtrList<Format>              FormatList;
133   typedef QMap<QString, QString>        OptionsMap;
134   typedef QPtrListIterator<Resources>   ResListIterator;
135   typedef QPtrListIterator<Format>      FormatListIterator;
136
137   typedef QPtrList<QTranslator>         TransList;
138   typedef QMap<QString, TransList>      TransListMap;
139   typedef QPtrListIterator<QTranslator> TransListIterator;
140
141 private:
142   QString         myAppName;
143   QStringList     myDirList;
144   FormatList      myFormats;
145   OptionsMap      myOptions;
146   ResList         myResources;
147   bool            myCheckExist;
148   TransListMap    myTranslator;
149   QPixmap         myDefaultPix;
150 };
151
152 /*!
153   Class: QtxResourceMgr::Format
154 */
155
156 class QTX_EXPORT QtxResourceMgr::Format
157 {
158 public:
159   Format( const QString& );
160   ~Format();
161
162   QString                format() const;
163
164   QStringList            options() const;
165   QString                option( const QString& ) const;
166   void                   setOption( const QString&, const QString& );
167
168   bool                   load( Resources* );
169   bool                   save( Resources* );
170
171 protected:
172   virtual bool           load( const QString&, QMap<QString, Section>& ) = 0;
173   virtual bool           save( const QString&, const QMap<QString, Section>& ) = 0;
174
175 private:
176   QString                myFmt;
177   QMap<QString, QString> myOpt;
178 };
179
180 /*!
181   Class: QtxResourceMgr::Resources
182 */
183
184 class QtxResourceMgr::Resources
185 {
186 public:
187   Resources( const QString& );
188   virtual ~Resources();
189
190   QString                file() const;
191   void                   setFile( const QString& );
192
193   QString                value( const QString&, const QString&, const bool ) const;
194   void                   setValue( const QString&, const QString&, const QString& );
195
196   bool                   hasSection( const QString& ) const;
197   bool                   hasValue( const QString&, const QString& ) const;
198
199   void                   removeSection( const QString& );
200   void                   removeValue( const QString&, const QString& );
201
202   QPixmap                loadPixmap( const QString&, const QString&, const QString& ) const;
203   QTranslator*           loadTranslator( const QString&, const QString&, const QString& ) const;
204
205   QString                environmentVariable( const QString&, int&, int& ) const;
206   QString                makeSubstitution( const QString&, const QString&, const QString& ) const;
207
208   void                   clear();
209
210   QStringList            sections() const;
211   QStringList            parameters( const QString& ) const;
212
213   QString                path( const QString&, const QString&, const QString& ) const;
214
215 private:
216   Section&               section( const QString& );
217   const Section&         section( const QString& ) const;
218
219   QString                fileName( const QString&, const QString&, const QString& ) const;
220
221 private:
222   typedef QMap<QString, Section> SectionMap;
223
224 private:
225   SectionMap             mySections;
226   QString                myFileName;
227
228   friend class QtxResourceMgr::Format;
229 };
230
231 /*!
232   Class: QtxResourceMgr::IMapIterator
233 */
234
235 template <class Key, class Value> class QtxResourceMgr::IMapIterator
236 {
237 public:
238   IMapIterator()                           : myMap( 0 ), myIndex( 0 )                                   { init(); }
239   IMapIterator( const IMap<Key,Value>* m ) : myMap( const_cast< IMap<Key,Value>* >( m ) ), myIndex( 0 ) { init(); }
240   IMapIterator( const IMapIterator& i )    : myMap( i.myMap ), myIndex( i.myIndex )                     { init(); }
241
242   bool operator==( const IMapIterator& i ) { return !operator!=( i );                                   }
243   bool operator!=( const IMapIterator& i ) { return !myMap || myMap != i.myMap || myIndex != i.myIndex; }
244   
245   operator bool() const { return myIndex >= 0; }
246
247   const Key&   key() const  { return myMap->key( myIndex );   }
248   Value&       data()       { return myMap->value( myIndex ); }
249   const Value& data() const { return myMap->value( myIndex ); }
250
251   Value& operator*() { return data(); }
252
253   IMapIterator& operator++()      { myIndex++; init(); return *this;                     }
254   IMapIterator  operator++( int ) { IMapIterator i = *this; myIndex++; init(); return i; }
255   IMapIterator& operator--()      { myIndex--; init(); return *this;                     }
256   IMapIterator  operator--( int ) { IMapIterator i = *this; myIndex--; init(); return i; }
257
258 private:
259   IMapIterator( const IMap<Key,Value>* m, const int index ) : myMap( const_cast< IMap<Key,Value>* >( m ) ), myIndex( index ) { init(); }
260   void init() { if ( !myMap || myIndex >= myMap->count() ) myIndex = -1; }
261
262 private:
263   IMap<Key,Value>* myMap;
264   int              myIndex;
265
266   friend class IMap<Key, Value>;
267   friend class IMapConstIterator<Key, Value>;
268 };
269
270 /*!
271   Class: QtxResourceMgr::IMapConstIterator
272 */
273
274 template <class Key, class Value> class QtxResourceMgr::IMapConstIterator
275 {
276 public:
277   IMapConstIterator()                                    : myMap( 0 ), myIndex( 0 )                                    { init(); }
278   IMapConstIterator( const IMap<Key,Value>* m )          : myMap( const_cast< IMap<Key,Value>* >( m )  ), myIndex( 0 ) { init(); }
279   IMapConstIterator( const IMapConstIterator& i )        : myMap( i.myMap ), myIndex( i.myIndex )                      { init(); }
280   IMapConstIterator( const IMapIterator<Key, Value>& i ) : myMap( i.myMap ), myIndex( i.myIndex )                      { init(); }
281   
282   bool operator==( const IMapConstIterator& i ) { return !operator!=( i );                                   }
283   bool operator!=( const IMapConstIterator& i ) { return !myMap || myMap != i.myMap || myIndex != i.myIndex; }
284   
285   operator bool() const { return myIndex >= 0; }
286   
287   const Key&   key() const  { return myMap->key( myIndex );   }
288   const Value& data() const { return myMap->value( myIndex ); }
289   
290   const Value& operator*() const { return data(); }
291   
292   IMapConstIterator& operator++()      { myIndex++; init(); return *this;                          }
293   IMapConstIterator  operator++( int ) { IMapConstIterator i = *this; myIndex++; init(); return i; }
294   IMapConstIterator& operator--()      { myIndex--; init(); return *this;                          }
295   IMapConstIterator  operator--( int ) { IMapConstIterator i = *this; myIndex--; init(); return i; }
296   
297 private:
298   IMapConstIterator( const IMap<Key,Value>* m, const int index ): myMap( const_cast< IMap<Key,Value>* >( m ) ), myIndex( index ) { init(); }
299   void init() { if ( !myMap || myIndex >= myMap->count() ) myIndex = -1; }
300   
301 private:
302   IMap<Key,Value>* myMap;
303   int              myIndex;
304   
305   friend class IMap<Key,Value>;
306 };
307
308 /*!
309   Class: QtxResourceMgr::IMap
310 */
311
312 template <class Key, class Value> class QtxResourceMgr::IMap
313 {
314 public:
315   typedef IMapIterator<Key,Value>      Iterator;
316   typedef IMapConstIterator<Key,Value> ConstIterator;
317
318 public:
319   IMap() {}
320   IMap( const IMap& m ) : myKeys( m.myKeys ), myData( m.myData ) {}
321   IMap& operator=( const IMap& m ) { myKeys = m.myKeys; myData = m.myData; return *this; }
322   
323   int  count() const   { return myData.count(); }
324   int  size() const    { return myData.count(); }
325   bool empty() const   { return myData.empty(); }
326   bool isEmpty() const { return myData.empty(); }
327   
328   void clear() { myKeys.clear(); myData.clear(); }
329   
330   QValueList<Key>   keys()   const { return myKeys; }
331   QValueList<Value> values() const { QValueList<Value> l; for ( int i = 0; i < count(); i++ ) l.append( value( i ) ); return l; }
332   bool              contains ( const Key& key ) const { return myData.contains( key ); }
333   
334   Iterator      begin()       { return Iterator( this );               }
335   Iterator      end()         { return Iterator( this, count() );      }
336   ConstIterator begin() const { return ConstIterator( this );          }
337   ConstIterator end() const   { return ConstIterator( this, count() ); }
338   
339   Iterator insert( const Key& key, const Value& value, bool overwrite = true )
340   { 
341     if ( myData.find( key ) == myData.end() || overwrite )
342     {
343       if ( myData.find( key ) != myData.end() && overwrite )
344         myKeys.remove( myKeys.find( key ) );
345       myKeys.append( key );
346       myData[key] = value;
347     }
348     return Iterator( this, index( key ) );
349   }
350
351   Iterator replace( const Key& key, const Value& value )
352   { 
353     if ( myData.find( key ) == myData.end() )
354       myKeys.append( key );
355     myData[ key ] = value;
356     return Iterator( this, index( key ) );
357   }
358
359   int           index( const Key& key ) const { return myKeys.findIndex( key );      }
360   Iterator      at( const int index )         { return Iterator( this, index );      }
361   ConstIterator at( const int index ) const   { return ConstIterator( this, index ); }
362
363   Key& key( const int index )
364   {
365     if ( index < 0 || index >= (int)myKeys.count() ) 
366       return dummyKey;
367     return myKeys[index];
368   }
369
370   Value& value( const int index )
371   {
372     if ( index < 0 || index >= (int)myKeys.count() ) 
373       return dummyValue;
374     return myData[ myKeys[index] ];
375   }
376
377   Value& operator[]( const Key& key )
378   {
379     if ( myData.find( key ) == myData.end() )
380       insert( key, Value() );
381     return myData[ key ];
382   }
383
384   const Value& operator[]( const Key& key ) const
385   {
386     if ( myData.find( key ) == myData.end() )
387       return dummyValue;
388     return myData[ key ];
389   }
390
391   void erase( Iterator it )     { remove( it );    }
392   void erase( const Key& key )  { remove( key );   }
393   void erase( const int index ) { remove( index ); }
394   void remove( Iterator it )    { if ( it.myMap != this ) return; remove( it.myIndex ); }
395   void remove( const Key& key ) { remove( index( key ) ); }
396   void remove( const int index )
397   {
398     if ( index >= 0 && index < (int)myKeys.count() )
399     {
400       myData.remove( myKeys[ index ] );
401       myKeys.remove( myKeys.at( index ) );
402     }
403   }
404
405 private:
406   QValueList<Key> myKeys;
407   QMap<Key,Value> myData;
408   Key             dummyKey;
409   Value           dummyValue;
410
411   friend class IMapIterator<Key,Value>;
412   friend class IMapConstIterator<Key,Value>;
413 };
414
415 #endif