1 #include "QtxResourceMgr.h"
7 #include <qtranslator.h>
8 #include <qapplication.h>
17 Class: QtxResourceMgr::Resources
21 QtxResourceMgr::Resources::Resources( const QString& fileName )
22 : myFileName( fileName )
26 QtxResourceMgr::Resources::~Resources()
30 QString QtxResourceMgr::Resources::file() const
35 void QtxResourceMgr::Resources::setFile( const QString& fn )
40 QString QtxResourceMgr::Resources::value( const QString& sect, const QString& name, const bool subst ) const
44 if ( hasValue( sect, name ) )
46 val = section( sect )[name];
48 val = makeSubstitution( val, sect, name );
53 void QtxResourceMgr::Resources::setValue( const QString& sect, const QString& name, const QString& val )
55 Section& s = section( sect );
56 s.insert( name, val );
59 bool QtxResourceMgr::Resources::hasSection( const QString& sect ) const
61 return mySections.contains( sect );
64 bool QtxResourceMgr::Resources::hasValue( const QString& sect, const QString& name ) const
66 return hasSection( sect ) && section( sect ).contains( name );
69 void QtxResourceMgr::Resources::removeSection( const QString& sect )
71 mySections.remove( sect );
74 void QtxResourceMgr::Resources::removeValue( const QString& sect, const QString& name )
76 if ( !hasSection( sect ) )
79 Section& s = section( sect );
83 mySections.remove( sect );
86 void QtxResourceMgr::Resources::clear()
91 QStringList QtxResourceMgr::Resources::sections() const
93 return mySections.keys();
96 QStringList QtxResourceMgr::Resources::parameters( const QString& sec ) const
98 if ( !hasSection( sec ) )
101 return section( sec ).keys();
104 QString QtxResourceMgr::Resources::path( const QString& sec, const QString& prefix, const QString& name ) const
106 QString filePath = fileName( sec, prefix, name );
107 if ( !filePath.isEmpty() )
109 if ( !QFileInfo( filePath ).exists() )
110 filePath = QString::null;
115 QtxResourceMgr::Section& QtxResourceMgr::Resources::section( const QString& sn )
117 if ( !mySections.contains( sn ) )
118 mySections.insert( sn, Section() );
120 return mySections[sn];
123 const QtxResourceMgr::Section& QtxResourceMgr::Resources::section( const QString& sn ) const
125 return mySections[sn];
128 QString QtxResourceMgr::Resources::fileName( const QString& sect, const QString& prefix, const QString& name ) const
131 if ( hasValue( sect, prefix ) )
133 path = value( sect, prefix, true );
134 if ( !path.isEmpty() )
136 if ( QFileInfo( path ).isRelative() )
137 path = Qtx::addSlash( QFileInfo( myFileName ).dirPath( true ) ) + path;
139 path = Qtx::addSlash( path ) + name;
142 return QDir::convertSeparators( path );
145 QPixmap QtxResourceMgr::Resources::loadPixmap( const QString& sect, const QString& prefix, const QString& name ) const
147 return QPixmap( fileName( sect, prefix, name ) );
150 QTranslator* QtxResourceMgr::Resources::loadTranslator( const QString& sect, const QString& prefix, const QString& name ) const
152 QTranslator* trans = new QTranslator( 0 );
153 if ( !trans->load( fileName( sect, prefix, name ) ) )
161 QString QtxResourceMgr::Resources::environmentVariable( const QString& str, int& start, int& len ) const
163 QString varName = QString::null;
166 QRegExp rx( "\\$\\{([a-zA-Z]+[a-zA-Z0-9_]*)\\}|\\$\\(([a-zA-Z]+[a-zA-Z0-9_]*)\\)|\\$([a-zA-Z]+[a-zA-Z0-9_]*)|\\%([a-zA-Z]+[a-zA-Z0-9_]*)\\%" );
168 int pos = rx.search( str, start );
172 len = rx.matchedLength();
173 QStringList caps = rx.capturedTexts();
174 for ( uint i = 1; i <= caps.count() && varName.isEmpty(); i++ )
175 varName = *caps.at( i );
180 QString QtxResourceMgr::Resources::makeSubstitution( const QString& str, const QString& sect, const QString& name ) const
184 QMap<QString, int> ignoreMap;
185 ignoreMap.insert( name, 0 );
187 int start( 0 ), len( 0 );
190 QString envName = environmentVariable( res, start, len );
191 if ( envName.isNull() )
194 QString newStr = QString::null;
195 if ( ::getenv( envName ) )
196 newStr = QString( ::getenv( envName ) );
198 if ( newStr.isNull() )
200 if ( ignoreMap.contains( envName ) )
206 if ( hasValue( sect, envName ) )
207 newStr = value( sect, envName, false );
208 ignoreMap.insert( envName, 0 );
210 res.replace( start, len, newStr );
217 Class: QtxResourceMgr::IniFormat
221 class QtxResourceMgr::IniFormat : public Format
228 virtual bool load( const QString&, QMap<QString, Section>& );
229 virtual bool save( const QString&, const QMap<QString, Section>& );
232 QtxResourceMgr::IniFormat::IniFormat()
237 QtxResourceMgr::IniFormat::~IniFormat()
241 bool QtxResourceMgr::IniFormat::load( const QString& fname, QMap<QString, Section>& secMap )
244 if ( !file.open( IO_ReadOnly ) )
247 QTextStream ts( &file );
254 QString separator = option( "separator" );
255 if ( separator.isNull() )
256 separator = QString( "=" );
258 QString comment = option( "comment" );
259 if ( comment.isNull() )
260 comment = QString( "#" );
264 data = ts.readLine();
270 data = data.stripWhiteSpace();
271 if ( data.isEmpty() )
274 if ( data.startsWith( comment ) )
277 QRegExp rx( "^\\[([\\w\\s]*)\\]$" );
278 if ( rx.search( data ) != -1 )
280 section = rx.cap( 1 );
281 if ( section.isEmpty() )
284 qWarning( QString( "Empty section in line %1" ).arg( line ) );
287 else if ( data.contains( "=" ) && !section.isEmpty() )
289 int pos = data.find( separator );
290 QString key = data.left( pos - 1 ).stripWhiteSpace();
291 QString val = data.mid( pos + 1 ).stripWhiteSpace();
292 secMap[section].insert( key, val );
297 section.isEmpty() ? qWarning( "Current section is empty" ) :
298 qWarning( QString( "Error in line: %1" ).arg( line ) );
307 bool QtxResourceMgr::IniFormat::save( const QString& fname, const QMap<QString, Section>& secMap )
310 if ( !file.open( IO_WriteOnly ) )
314 for ( QMap<QString, Section>::ConstIterator it = secMap.begin(); it != secMap.end() && res; ++it )
316 QString data = QString( "[%1]\n" ).arg( it.key() );
317 for ( Section::ConstIterator iter = it.data().begin(); iter != it.data().end(); ++iter )
318 data += iter.key() + " = " + iter.data() + "\n";
321 res = file.writeBlock( data.latin1(), data.length() ) == (int)data.length();
330 Class: QtxResourceMgr::XmlFormat
334 class QtxResourceMgr::XmlFormat : public Format
341 virtual bool load( const QString&, QMap<QString, Section>& );
342 virtual bool save( const QString&, const QMap<QString, Section>& );
345 QString docTag() const;
346 QString sectionTag() const;
347 QString parameterTag() const;
348 QString nameAttribute() const;
349 QString valueAttribute() const;
352 QtxResourceMgr::XmlFormat::XmlFormat()
357 QtxResourceMgr::XmlFormat::~XmlFormat()
361 bool QtxResourceMgr::XmlFormat::load( const QString& fname, QMap<QString, Section>& secMap )
368 if ( !file.open( IO_ReadOnly ) )
373 res = doc.setContent( &file );
379 QDomElement root = doc.documentElement();
380 if ( root.isNull() || root.tagName() != docTag() )
383 QDomNode sectNode = root.firstChild();
384 while ( res && !sectNode.isNull() )
386 res = sectNode.isElement();
389 QDomElement sectElem = sectNode.toElement();
390 if ( sectElem.tagName() == sectionTag() && sectElem.hasAttribute( nameAttribute() ) )
392 QString section = sectElem.attribute( nameAttribute() );
393 QDomNode paramNode = sectNode.firstChild();
394 while ( res && !paramNode.isNull() )
396 res = paramNode.isElement();
399 QDomElement paramElem = paramNode.toElement();
400 if ( paramElem.tagName() == parameterTag() &&
401 paramElem.hasAttribute( nameAttribute() ) && paramElem.hasAttribute( valueAttribute() ) )
403 QString paramName = paramElem.attribute( nameAttribute() );
404 QString paramValue = paramElem.attribute( valueAttribute() );
406 secMap[section].insert( paramName, paramValue );
412 res = paramNode.isComment();
414 paramNode = paramNode.nextSibling();
421 res = sectNode.isComment(); // if it's a comment -- let it be, pass it..
423 sectNode = sectNode.nextSibling();
431 bool QtxResourceMgr::XmlFormat::save( const QString& fname, const QMap<QString, Section>& secMap )
438 if ( !file.open( IO_WriteOnly ) )
441 QDomDocument doc( docTag() );
442 QDomElement root = doc.createElement( docTag() );
443 doc.appendChild( root );
445 for ( QMap<QString, Section>::ConstIterator it = secMap.begin(); it != secMap.end(); ++it )
447 QDomElement sect = doc.createElement( sectionTag() );
448 sect.setAttribute( nameAttribute(), it.key() );
449 root.appendChild( sect );
450 for ( QMap<QString, QString>::ConstIterator iter = it.data().begin(); iter != it.data().end(); ++iter )
452 QDomElement val = doc.createElement( parameterTag() );
453 val.setAttribute( nameAttribute(), iter.key() );
454 val.setAttribute( valueAttribute(), iter.data() );
455 sect.appendChild( val );
459 QString docStr = doc.toString();
460 res = file.writeBlock( docStr.latin1(), docStr.length() ) == (int)docStr.length();
468 QString QtxResourceMgr::XmlFormat::docTag() const
470 QString tag = option( "doc_tag" );
472 tag = QString( "document" );
476 QString QtxResourceMgr::XmlFormat::sectionTag() const
478 QString tag = option( "section_tag" );
480 tag = QString( "section" );
484 QString QtxResourceMgr::XmlFormat::parameterTag() const
486 QString tag = option( "parameter_tag" );
488 tag = QString( "parameter" );
492 QString QtxResourceMgr::XmlFormat::nameAttribute() const
494 QString str = option( "name_attribute" );
496 str = QString( "name" );
500 QString QtxResourceMgr::XmlFormat::valueAttribute() const
502 QString str = option( "value_attribute" );
504 str = QString( "value" );
509 Class: QtxResourceMgr::Format
513 QtxResourceMgr::Format::Format( const QString& fmt )
518 QtxResourceMgr::Format::~Format()
522 QString QtxResourceMgr::Format::format() const
527 QStringList QtxResourceMgr::Format::options() const
532 QString QtxResourceMgr::Format::option( const QString& opt ) const
535 if ( myOpt.contains( opt ) )
539 void QtxResourceMgr::Format::setOption( const QString& opt, const QString& val )
541 myOpt.insert( opt, val );
544 bool QtxResourceMgr::Format::load( Resources* res )
549 QMap<QString, Section> sections;
550 bool status = load( res->myFileName, sections );
552 res->mySections = sections;
554 qDebug( "QtxResourceMgr: Could not load resource file \"%s\"", res->myFileName.latin1() );
559 bool QtxResourceMgr::Format::save( Resources* res )
564 Qtx::mkDir( Qtx::dir( res->myFileName ) );
566 return save( res->myFileName, res->mySections );
570 Class: QtxResourceMgr
574 QtxResourceMgr::QtxResourceMgr( const QString& appName, const QString& resVarTemplate )
575 : myAppName( appName )
577 QString envVar = !resVarTemplate.isEmpty() ? resVarTemplate : QString( "%1Resources" );
578 if ( envVar.contains( "%1" ) )
579 envVar = envVar.arg( appName );
582 if ( ::getenv( envVar ) )
583 dirs = ::getenv( envVar );
585 setDirList( QStringList::split( ";", dirs ) );
587 installFormat( new XmlFormat() );
588 installFormat( new IniFormat() );
590 setOption( "translators", QString( "%P_msg_%L.qm|%P_images.qm" ) );
593 QtxResourceMgr::~QtxResourceMgr()
595 QStringList prefList = myTranslator.keys();
596 for ( QStringList::const_iterator it = prefList.begin(); it != prefList.end(); ++it )
597 removeTranslators( *it );
600 QString QtxResourceMgr::appName() const
605 QStringList QtxResourceMgr::dirList() const
610 void QtxResourceMgr::setDirList( const QStringList& dl )
613 for ( ResListIterator it( myResources ); it.current(); ++it )
619 void QtxResourceMgr::initialize( const bool autoLoad ) const
621 if ( !myResources.isEmpty() )
624 QtxResourceMgr* that = (QtxResourceMgr*)this;
626 that->myResources.append( new Resources( userFileName( appName() ) ) );
627 for ( QStringList::const_iterator it = myDirList.begin(); it != myDirList.end(); ++it )
629 QString path = Qtx::addSlash( *it ) + globalFileName( appName() );
630 that->myResources.append( new Resources( path ) );
637 void QtxResourceMgr::clear()
639 for ( ResListIterator it( myResources ); it.current(); ++it )
640 it.current()->clear();
643 QString QtxResourceMgr::currentSection() const
648 void QtxResourceMgr::setCurrentSection( const QString& str )
653 bool QtxResourceMgr::value( const QString& name, int& val ) const
655 return value( currentSection(), name, val );
658 bool QtxResourceMgr::value( const QString& name, double& val ) const
660 return value( currentSection(), name, val );
663 bool QtxResourceMgr::value( const QString& name, bool& val ) const
665 return value( currentSection(), name, val );
668 bool QtxResourceMgr::value( const QString& name, QColor& val ) const
670 return value( currentSection(), name, val );
673 bool QtxResourceMgr::value( const QString& name, QFont& val ) const
675 return value( currentSection(), name, val );
678 bool QtxResourceMgr::value( const QString& name, QString& val, const bool subst ) const
680 return value( currentSection(), name, val, subst );
683 bool QtxResourceMgr::value( const QString& sect, const QString& name, int& iVal ) const
686 if ( !value( sect, name, val, true ) )
690 iVal = val.toInt( &ok );
695 bool QtxResourceMgr::value( const QString& sect, const QString& name, double& dVal ) const
698 if ( !value( sect, name, val, true ) )
702 dVal = val.toDouble( &ok );
707 bool QtxResourceMgr::value( const QString& sect, const QString& name, bool& bVal ) const
710 if ( !value( sect, name, val, true ) )
713 static QMap<QString, bool> boolMap;
714 if ( boolMap.isEmpty() )
716 boolMap["true"] = boolMap["yes"] = boolMap["on"] = true;
717 boolMap["false"] = boolMap["no"] = boolMap["off"] = false;
721 bool res = boolMap.contains( val );
726 double num = val.toDouble( &res );
734 bool QtxResourceMgr::value( const QString& sect, const QString& name, QColor& cVal ) const
737 if ( !value( sect, name, val, true ) )
741 QStringList vals = QStringList::split( ",", val, true );
744 for ( QStringList::const_iterator it = vals.begin(); it != vals.end() && res; ++it )
745 nums.append( (*it).toInt( &res ) );
747 if ( res && nums.count() >= 3 )
748 cVal.setRgb( nums[0], nums[1], nums[2] );
751 int pack = val.toInt( &res );
753 Qtx::rgbSet( pack, cVal );
759 bool QtxResourceMgr::value( const QString& sect, const QString& name, QFont& fVal ) const
761 QString val = stringValue( sect, name, "" );
762 QStringList font_values = QStringList::split( ",", val );
763 if( font_values.count()<2 || font_values.count()>5 )
766 QString family = font_values[0];
767 bool isBold = false, isItalic = false, isUnderline = false, isOk = false;
769 for( int i=1, n=font_values.count(); i<n; i++ )
771 QString curval = font_values[i].stripWhiteSpace().lower();
772 if( !isBold && curval=="bold" )
774 else if( !isItalic && curval=="italic" )
776 else if( !isUnderline && curval=="underline" )
780 pSize = curval.toInt( &isOk );
786 if( pSize>0 && !family.isEmpty() )
788 fVal = QFont( family, pSize );
789 fVal.setBold( isBold );
790 fVal.setItalic( isItalic );
791 fVal.setUnderline( isUnderline );
798 bool QtxResourceMgr::value( const QString& sect, const QString& name, QString& val, const bool subst ) const
803 for ( ResListIterator it( myResources ); it.current() && !ok; ++it )
805 ok = it.current()->hasValue( sect, name );
807 val = it.current()->value( sect, name, subst );
813 int QtxResourceMgr::integerValue( const QString& name, const int def ) const
815 return integerValue( currentSection(), name, def );
818 double QtxResourceMgr::doubleValue( const QString& name, const double def ) const
820 return doubleValue( currentSection(), name, def );
823 bool QtxResourceMgr::booleanValue( const QString& name, const bool def ) const
825 return booleanValue( currentSection(), name, def );
828 QFont QtxResourceMgr::fontValue( const QString& name, const QFont& def ) const
830 return fontValue( currentSection(), name, def );
833 QColor QtxResourceMgr::colorValue( const QString& name, const QColor& def ) const
835 return colorValue( currentSection(), name, def );
838 QString QtxResourceMgr::stringValue( const QString& name, const char* def ) const
840 return stringValue( currentSection(), name, def );
843 int QtxResourceMgr::integerValue( const QString& sect, const QString& name, const int def ) const
846 if ( !value( sect, name, val ) )
851 double QtxResourceMgr::doubleValue( const QString& sect, const QString& name, const double def ) const
854 if ( !value( sect, name, val ) )
859 bool QtxResourceMgr::booleanValue( const QString& sect, const QString& name, const bool def ) const
862 if ( !value( sect, name, val ) )
867 QFont QtxResourceMgr::fontValue( const QString& sect, const QString& name, const QFont& def ) const
870 if( !value( sect, name, font ) )
875 QColor QtxResourceMgr::colorValue( const QString& sect, const QString& name, const QColor& def ) const
878 if ( !value( sect, name, val ) )
883 QString QtxResourceMgr::stringValue( const QString& sect, const QString& name, const char* def ) const
886 if ( !value( sect, name, val ) )
891 bool QtxResourceMgr::hasValue( const QString& name ) const
893 return hasValue( currentSection(), name );
896 bool QtxResourceMgr::hasValue( const QString& sect, const QString& name ) const
901 for ( ResListIterator it( myResources ); it.current() && !ok; ++it )
902 ok = it.current()->hasValue( sect, name );
907 bool QtxResourceMgr::hasSection( const QString& sect ) const
912 for ( ResListIterator it( myResources ); it.current() && !ok; ++it )
913 ok = it.current()->hasSection( sect );
918 void QtxResourceMgr::setValue( const QString& name, int val )
920 setValue( currentSection(), name, val );
923 void QtxResourceMgr::setValue( const QString& name, double val )
925 setValue( currentSection(), name, val );
928 void QtxResourceMgr::setValue( const QString& name, bool val )
930 setValue( currentSection(), name, val );
933 void QtxResourceMgr::setValue( const QString& name, const QColor& val )
935 setValue( currentSection(), name, val );
938 void QtxResourceMgr::setValue( const QString& name, const QFont& val )
940 setValue( currentSection(), name, val );
943 void QtxResourceMgr::setValue( const QString& name, const QString& val )
945 setValue( currentSection(), name, val );
948 void QtxResourceMgr::setValue( const QString& sect, const QString& name, int val )
950 setValue( sect, name, QString::number( val ) );
953 void QtxResourceMgr::setValue( const QString& sect, const QString& name, double val )
955 setValue( sect, name, QString::number( val, 'g', 12 ) );
958 void QtxResourceMgr::setValue( const QString& sect, const QString& name, bool val )
960 setValue( sect, name, QString( val ? "true" : "false" ) );
963 void QtxResourceMgr::setValue( const QString& sect, const QString& name, const QColor& val )
965 setValue( sect, name, QString( "%1, %2, %3").arg( val.red() ).arg( val.green() ).arg( val.blue() ) );
968 void QtxResourceMgr::setValue( const QString& sect, const QString& name, const QFont& f )
971 val.append( f.family() );
973 val.append( "Bold" );
975 val.append( "Italic" );
977 val.append( "Underline" );
978 val.append( QString( "%1" ).arg( f.pointSize() ) );
980 setValue( sect, name, val.join( "," ) );
983 void QtxResourceMgr::setValue( const QString& sect, const QString& name, const QString& val )
987 if ( !myResources.isEmpty() )
988 myResources.first()->setValue( sect, name, val );
991 void QtxResourceMgr::remove( const QString& name )
993 remove( currentSection(), name );
996 void QtxResourceMgr::remove( const QString& sect, const QString& name )
1000 for ( ResListIterator it( myResources ); it.current(); ++it )
1001 it.current()->removeValue( sect, name );
1004 void QtxResourceMgr::removeSection( const QString& sect )
1008 for ( ResListIterator it( myResources ); it.current(); ++it )
1009 it.current()->removeSection( sect );
1012 QString QtxResourceMgr::currentFormat() const
1015 if ( !myFormats.isEmpty() )
1016 fmt = myFormats.getFirst()->format();
1020 void QtxResourceMgr::setCurrentFormat( const QString& fmt )
1022 Format* form = format( fmt );
1026 myFormats.remove( form );
1027 myFormats.prepend( form );
1029 if ( myResources.isEmpty() )
1032 ResListIterator resIt( myResources );
1033 if ( resIt.current() )
1034 resIt.current()->setFile( userFileName( appName() ) );
1037 for ( QStringList::const_iterator it = myDirList.begin(); it != myDirList.end() && resIt.current(); ++it, ++resIt )
1038 resIt.current()->setFile( Qtx::addSlash( *it ) + globalFileName( appName() ) );
1041 QtxResourceMgr::Format* QtxResourceMgr::format( const QString& fmt ) const
1044 for ( FormatListIterator it( myFormats ); it.current() && !form; ++it )
1046 if ( it.current()->format() == fmt )
1047 form = it.current();
1053 void QtxResourceMgr::installFormat( QtxResourceMgr::Format* form )
1055 if ( !myFormats.contains( form ) )
1056 myFormats.prepend( form );
1059 void QtxResourceMgr::removeFormat( QtxResourceMgr::Format* form )
1061 myFormats.remove( form );
1064 QStringList QtxResourceMgr::options() const
1066 return myOptions.keys();
1069 QString QtxResourceMgr::option( const QString& opt ) const
1072 if ( myOptions.contains( opt ) )
1073 val = myOptions[opt];
1077 void QtxResourceMgr::setOption( const QString& opt, const QString& val )
1079 myOptions.insert( opt, val );
1082 bool QtxResourceMgr::load()
1084 initialize( false );
1086 Format* fmt = format( currentFormat() );
1091 for ( ResListIterator it( myResources ); it.current(); ++it )
1092 res = fmt->load( it.current() ) && res;
1097 bool QtxResourceMgr::save()
1099 initialize( false );
1101 Format* fmt = format( currentFormat() );
1105 if ( myResources.isEmpty() )
1108 return fmt->save( myResources.getFirst() );
1111 QStringList QtxResourceMgr::sections() const
1115 QMap<QString, int> map;
1116 for ( ResListIterator it( myResources ); it.current(); ++it )
1118 QStringList lst = it.current()->sections();
1119 for ( QStringList::const_iterator itr = lst.begin(); itr != lst.end(); ++itr )
1120 map.insert( *itr, 0 );
1124 for ( QMap<QString, int>::ConstIterator iter = map.begin(); iter != map.end(); ++iter )
1125 res.append( iter.key() );
1130 QStringList QtxResourceMgr::parameters( const QString& sec ) const
1134 QMap<QString, int> map;
1135 for ( ResListIterator it( myResources ); it.current(); ++it )
1137 QStringList lst = it.current()->parameters( sec );
1138 for ( QStringList::const_iterator itr = lst.begin(); itr != lst.end(); ++itr )
1139 map.insert( *itr, 0 );
1143 for ( QMap<QString, int>::ConstIterator iter = map.begin(); iter != map.end(); ++iter )
1144 res.append( iter.key() );
1149 QString QtxResourceMgr::path( const QString& sect, const QString& prefix, const QString& name ) const
1152 for ( ResListIterator it( myResources ); it.current() && res.isEmpty(); ++it )
1153 res = it.current()->path( sect, prefix, name );
1157 QString QtxResourceMgr::resSection() const
1159 QString res = option( "res_section_name" );
1160 if ( res.isEmpty() )
1161 res = QString( "resources" );
1165 QString QtxResourceMgr::langSection() const
1167 QString res = option( "lang_section_name" );
1168 if ( res.isEmpty() )
1169 res = QString( "language" );
1173 QPixmap QtxResourceMgr::defaultPixmap() const
1175 return myDefaultPix;
1178 void QtxResourceMgr::setDefaultPixmap( const QPixmap& pix )
1183 QPixmap QtxResourceMgr::loadPixmap( const QString& prefix, const QString& name ) const
1185 return loadPixmap( prefix, name, true );
1188 QPixmap QtxResourceMgr::loadPixmap( const QString& prefix, const QString& name, const bool useDef ) const
1190 return loadPixmap( prefix, name, useDef ? defaultPixmap() : QPixmap() );
1193 QPixmap QtxResourceMgr::loadPixmap( const QString& prefix, const QString& name, const QPixmap& defPix ) const
1198 for ( ResListIterator it( myResources ); it.current() && pix.isNull(); ++it )
1199 pix = it.current()->loadPixmap( resSection(), prefix, name );
1205 void QtxResourceMgr::loadLanguage( const QString& pref, const QString& l )
1209 QMap<QChar, QString> substMap;
1210 substMap.insert( 'A', appName() );
1213 if ( lang.isEmpty() )
1214 value( langSection(), "language", lang );
1216 if ( lang.isEmpty() )
1218 lang = QString( "en" );
1219 qWarning( QString( "Language not specified. Assumed: %1" ).arg( lang ) );
1222 substMap.insert( 'L', lang );
1225 if ( value( langSection(), "translators", trs, false ) && !trs.isEmpty() )
1227 QStringList translators = QStringList::split( "|", option( "translators" ) );
1228 QStringList newTranslators = QStringList::split( "|", trs );
1229 for ( uint i = 0; i < newTranslators.count(); i++ )
1230 if ( translators.find( newTranslators[i] ) == translators.end() )
1231 translators += newTranslators[i];
1232 setOption( "translators", translators.join( "|" ) );
1235 QStringList trList = QStringList::split( "|", option( "translators" ) );
1236 if ( trList.isEmpty() )
1238 trList.append( "%P_msg_%L.qm" );
1239 qWarning( QString( "Translators not defined. Assumed: %1" ).arg( trList.first() ) );
1242 QStringList prefixList;
1243 if ( !pref.isEmpty() )
1244 prefixList.append( pref );
1246 prefixList = parameters( resSection() );
1248 for ( QStringList::const_iterator iter = prefixList.begin(); iter != prefixList.end(); ++iter )
1250 QString prefix = *iter;
1251 substMap.insert( 'P', prefix );
1254 for ( QStringList::const_iterator it = trList.begin(); it != trList.end(); ++it )
1255 trs.append( substMacro( *it, substMap ).stripWhiteSpace() );
1257 for ( QStringList::const_iterator itr = trs.begin(); itr != trs.end(); ++itr )
1258 loadTranslator( prefix, *itr );
1262 void QtxResourceMgr::loadTranslator( const QString& prefix, const QString& name )
1266 QTranslator* trans = 0;
1267 for ( ResListIterator it( myResources ); it.current() && !trans; ++it )
1268 trans = it.current()->loadTranslator( resSection(), prefix, name );
1273 if ( !myTranslator[prefix].contains( trans ) )
1274 myTranslator[prefix].append( trans );
1275 qApp->installTranslator( trans );
1278 void QtxResourceMgr::removeTranslators( const QString& prefix )
1280 if ( !myTranslator.contains( prefix ) )
1283 for ( TransListIterator it( myTranslator[prefix] ); it.current(); ++it )
1285 qApp->removeTranslator( it.current() );
1286 delete it.current();
1289 myTranslator.remove( prefix );
1292 void QtxResourceMgr::raiseTranslators( const QString& prefix )
1294 if ( !myTranslator.contains( prefix ) )
1297 for ( TransListIterator it( myTranslator[prefix] ); it.current(); ++it )
1299 qApp->removeTranslator( it.current() );
1300 qApp->installTranslator( it.current() );
1304 void QtxResourceMgr::refresh()
1306 QStringList sl = sections();
1307 for ( QStringList::const_iterator it = sl.begin(); it != sl.end(); ++it )
1309 QStringList pl = parameters( *it );
1310 for ( QStringList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
1311 setValue( *it, *itr, stringValue( *it, *itr ) );
1315 QString QtxResourceMgr::userFileName( const QString& appName ) const
1318 QString pathName = QDir::homeDirPath();
1321 fileName = QString( "%1.%2" ).arg( appName ).arg( currentFormat() );
1323 fileName = QString( ".%1rc" ).arg( appName );
1326 if ( !fileName.isEmpty() )
1327 pathName = Qtx::addSlash( pathName ) + fileName;
1332 QString QtxResourceMgr::globalFileName( const QString& appName ) const
1334 return QString( "%1.%2" ).arg( appName ).arg( currentFormat() );
1337 QString QtxResourceMgr::substMacro( const QString& src, const QMap<QChar, QString>& substMap ) const
1341 QRegExp rx( "%[A-Za-z%]" );
1344 while ( ( idx = rx.search( trg, idx ) ) >= 0 )
1346 QChar spec = trg.at( idx + 1 );
1350 else if ( substMap.contains( spec ) )
1351 subst = substMap[spec];
1353 if ( !subst.isEmpty() )
1355 trg.replace( idx, rx.matchedLength(), subst );
1356 idx += subst.length();
1359 idx += rx.matchedLength();