joachim99@69: /*************************************************************************** joachim99@77: * Copyright (C) 2004-2007 by Joachim Eibl * joachim99@69: * joachim.eibl at gmx.de * joachim99@69: * * joachim99@69: * This program is free software; you can redistribute it and/or modify * joachim99@69: * it under the terms of the GNU General Public License as published by * joachim99@69: * the Free Software Foundation; either version 2 of the License, or * joachim99@69: * (at your option) any later version. * joachim99@69: * * joachim99@69: * This program is distributed in the hope that it will be useful, * joachim99@69: * but WITHOUT ANY WARRANTY; without even the implied warranty of * joachim99@69: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * joachim99@69: * GNU General Public License for more details. * joachim99@69: * * joachim99@69: * You should have received a copy of the GNU General Public License * joachim99@69: * along with this program; if not, write to the * joachim99@69: * Free Software Foundation, Inc., * joachim99@69: * 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. * joachim99@69: ***************************************************************************/ joachim99@69: joachim99@69: #include "common.h" joachim99@69: #include joachim99@69: #include joachim99@69: #include joachim99@69: #include joachim99@69: #include joachim99@69: #include joachim99@69: #include joachim99@69: joachim99@69: ValueMap::ValueMap() joachim99@69: { joachim99@69: } joachim99@69: joachim99@69: ValueMap::~ValueMap() joachim99@69: { joachim99@69: } joachim99@69: joachim99@69: void ValueMap::save( QTextStream& ts ) joachim99@69: { joachim99@69: std::map::iterator i; joachim99@69: for( i=m_map.begin(); i!=m_map.end(); ++i) joachim99@69: { joachim99@69: QString key = i->first; joachim99@69: QString val = i->second; joachim99@69: ts << key << "=" << val << "\n"; joachim99@69: } joachim99@69: } joachim99@69: joachim99@69: QString ValueMap::getAsString() joachim99@69: { joachim99@69: QString result; joachim99@69: std::map::iterator i; joachim99@69: for( i=m_map.begin(); i!=m_map.end(); ++i) joachim99@69: { joachim99@69: QString key = i->first; joachim99@69: QString val = i->second; joachim99@69: result += key + "=" + val + "\n"; joachim99@69: } joachim99@69: return result; joachim99@69: } joachim99@69: joachim99@69: void ValueMap::load( QTextStream& ts ) joachim99@69: { joachim99@70: while ( !ts.atEnd() ) joachim99@69: { // until end of file... joachim99@69: QString s = ts.readLine(); // line of text excluding '\n' joachim99@75: int pos = s.indexOf('='); joachim99@69: if( pos > 0 ) // seems not to have a tag joachim99@69: { joachim99@69: QString key = s.left(pos); joachim99@69: QString val = s.mid(pos+1); joachim99@69: m_map[key] = val; joachim99@69: } joachim99@69: } joachim99@69: } joachim99@69: /* joachim99@69: void ValueMap::load( const QString& s ) joachim99@69: { joachim99@69: int pos=0; joachim99@69: while ( pos<(int)s.length() ) joachim99@69: { // until end of file... joachim99@69: int pos2 = s.find('=', pos); joachim99@69: int pos3 = s.find('\n', pos2 ); joachim99@69: if (pos3<0) joachim99@69: pos3=s.length(); joachim99@69: if( pos2 > 0 ) // seems not to have a tag joachim99@69: { joachim99@69: QString key = s.mid(pos, pos2-pos); joachim99@69: QString val = s.mid(pos2+1, pos3-pos2-1); joachim99@69: m_map[key] = val; joachim99@69: } joachim99@69: pos = pos3; joachim99@69: } joachim99@69: } joachim99@69: */ joachim99@69: joachim99@69: // safeStringJoin and safeStringSplit allow to convert a stringlist into a string and back joachim99@69: // safely, even if the individual strings in the list contain the separator character. joachim99@69: QString safeStringJoin(const QStringList& sl, char sepChar, char metaChar ) joachim99@69: { joachim99@69: // Join the strings in the list, using the separator ',' joachim99@69: // If a string contains the separator character, it will be replaced with "\,". joachim99@69: // Any occurances of "\" (one backslash) will be replaced with "\\" (2 backslashes) joachim99@69: joachim99@69: assert(sepChar!=metaChar); joachim99@69: joachim99@69: QString sep; joachim99@69: sep += sepChar; joachim99@69: QString meta; joachim99@69: meta += metaChar; joachim99@69: joachim99@69: QString safeString; joachim99@69: joachim99@69: QStringList::const_iterator i; joachim99@69: for (i=sl.begin(); i!=sl.end(); ++i) joachim99@69: { joachim99@69: QString s = *i; joachim99@69: s.replace(meta, meta+meta); // "\" -> "\\" joachim99@69: s.replace(sep, meta+sep); // "," -> "\," joachim99@69: if ( i==sl.begin() ) joachim99@69: safeString = s; joachim99@69: else joachim99@69: safeString += sep + s; joachim99@69: } joachim99@69: return safeString; joachim99@69: } joachim99@69: joachim99@69: // Split a string that was joined with safeStringJoin joachim99@69: QStringList safeStringSplit(const QString& s, char sepChar, char metaChar ) joachim99@69: { joachim99@69: assert(sepChar!=metaChar); joachim99@69: QStringList sl; joachim99@69: // Miniparser joachim99@69: int i=0; joachim99@69: int len=s.length(); joachim99@69: QString b; joachim99@69: for(i=0;i0 ) joachim99@69: { joachim99@75: pos = s.indexOf( sep, pos ); joachim99@69: --idx; joachim99@69: if (pos<0) break; joachim99@69: ++pos; joachim99@69: } joachim99@69: if ( pos>=0 ) joachim99@69: { joachim99@75: int pos2 = s.indexOf( sep, pos ); joachim99@69: if ( pos2>0 ) joachim99@69: return s.mid(pos, pos2-pos); joachim99@69: else joachim99@69: return s.mid(pos); joachim99@69: } joachim99@69: joachim99@69: return ""; joachim99@69: } joachim99@69: joachim99@69: static int num( QString& s, int idx ) joachim99@69: { joachim99@69: return subSection( s, idx, ',').toInt(); joachim99@69: } joachim99@69: joachim99@69: void ValueMap::writeEntry(const QString& k, const QFont& v ) joachim99@69: { joachim99@69: m_map[k] = v.family() + "," + QString::number(v.pointSize()) + "," + (v.bold() ? "bold" : "normal"); joachim99@69: } joachim99@69: joachim99@69: void ValueMap::writeEntry(const QString& k, const QColor& v ) joachim99@69: { joachim99@69: m_map[k] = numStr(v.red()) + "," + numStr(v.green()) + "," + numStr(v.blue()); joachim99@69: } joachim99@69: joachim99@69: void ValueMap::writeEntry(const QString& k, const QSize& v ) joachim99@69: { joachim99@69: m_map[k] = numStr(v.width()) + "," + numStr(v.height()); joachim99@69: } joachim99@69: joachim99@69: void ValueMap::writeEntry(const QString& k, const QPoint& v ) joachim99@69: { joachim99@69: m_map[k] = numStr(v.x()) + "," + numStr(v.y()); joachim99@69: } joachim99@69: joachim99@69: void ValueMap::writeEntry(const QString& k, int v ) joachim99@69: { joachim99@69: m_map[k] = numStr(v); joachim99@69: } joachim99@69: joachim99@69: void ValueMap::writeEntry(const QString& k, bool v ) joachim99@69: { joachim99@69: m_map[k] = numStr(v); joachim99@69: } joachim99@69: joachim99@69: void ValueMap::writeEntry(const QString& k, const QString& v ) joachim99@69: { joachim99@69: m_map[k] = v; joachim99@69: } joachim99@69: joachim99@69: void ValueMap::writeEntry(const QString& k, const char* v ) joachim99@69: { joachim99@69: m_map[k] = v; joachim99@69: } joachim99@69: joachim99@69: void ValueMap::writeEntry(const QString& k, const QStringList& v, char separator ) joachim99@69: { joachim99@69: m_map[k] = safeStringJoin(v, separator); joachim99@69: } joachim99@69: joachim99@69: joachim99@80: QFont ValueMap::readFontEntry(const QString& k, const QFont* defaultVal ) joachim99@69: { joachim99@69: QFont f = *defaultVal; joachim99@69: std::map::iterator i = m_map.find( k ); joachim99@69: if ( i!=m_map.end() ) joachim99@69: { joachim99@69: f.setFamily( subSection( i->second, 0, ',' ) ); joachim99@69: f.setPointSize( subSection( i->second, 1, ',' ).toInt() ); joachim99@69: f.setBold( subSection( i->second, 2, ',' )=="bold" ); joachim99@69: //f.fromString(i->second); joachim99@69: } joachim99@69: joachim99@69: return f; joachim99@69: } joachim99@69: joachim99@80: QColor ValueMap::readColorEntry(const QString& k, const QColor* defaultVal ) joachim99@69: { joachim99@69: QColor c= *defaultVal; joachim99@69: std::map::iterator i = m_map.find( k ); joachim99@69: if ( i!=m_map.end() ) joachim99@69: { joachim99@69: QString s = i->second; joachim99@69: c = QColor( num(s,0),num(s,1),num(s,2) ); joachim99@69: } joachim99@69: joachim99@69: return c; joachim99@69: } joachim99@69: joachim99@80: QSize ValueMap::readSizeEntry(const QString& k, const QSize* defaultVal ) joachim99@69: { joachim99@69: QSize size = defaultVal ? *defaultVal : QSize(600,400); joachim99@69: std::map::iterator i = m_map.find( k ); joachim99@69: if ( i!=m_map.end() ) joachim99@69: { joachim99@69: joachim99@69: QString s = i->second; joachim99@69: size = QSize( num(s,0),num(s,1) ); joachim99@69: } joachim99@69: joachim99@69: return size; joachim99@69: } joachim99@69: joachim99@80: QPoint ValueMap::readPointEntry(const QString& k, const QPoint* defaultVal) joachim99@69: { joachim99@69: QPoint point = defaultVal ? *defaultVal : QPoint(0,0); joachim99@69: std::map::iterator i = m_map.find( k ); joachim99@69: if ( i!=m_map.end() ) joachim99@69: { joachim99@69: QString s = i->second; joachim99@69: point = QPoint( num(s,0),num(s,1) ); joachim99@69: } joachim99@69: joachim99@69: return point; joachim99@69: } joachim99@69: joachim99@69: bool ValueMap::readBoolEntry(const QString& k, bool bDefault ) joachim99@69: { joachim99@69: bool b = bDefault; joachim99@69: std::map::iterator i = m_map.find( k ); joachim99@69: if ( i!=m_map.end() ) joachim99@69: { joachim99@69: QString s = i->second; joachim99@69: b = (bool)num(s,0); joachim99@69: } joachim99@69: joachim99@69: return b; joachim99@69: } joachim99@69: joachim99@69: int ValueMap::readNumEntry(const QString& k, int iDefault ) joachim99@69: { joachim99@69: int ival = iDefault; joachim99@69: std::map::iterator i = m_map.find( k ); joachim99@69: if ( i!=m_map.end() ) joachim99@69: { joachim99@69: QString s = i->second; joachim99@69: ival = num(s,0); joachim99@69: } joachim99@69: joachim99@69: return ival; joachim99@69: } joachim99@69: joachim99@80: QString ValueMap::readStringEntry(const QString& k, const QString& sDefault ) joachim99@69: { joachim99@69: QString sval = sDefault; joachim99@69: std::map::iterator i = m_map.find( k ); joachim99@69: if ( i!=m_map.end() ) joachim99@69: { joachim99@69: sval = i->second; joachim99@69: } joachim99@69: joachim99@69: return sval; joachim99@69: } joachim99@69: joachim99@69: QStringList ValueMap::readListEntry(const QString& k, const QStringList& defaultVal, char separator ) joachim99@69: { joachim99@69: QStringList strList; joachim99@69: joachim99@69: std::map::iterator i = m_map.find( k ); joachim99@69: if ( i!=m_map.end() ) joachim99@69: { joachim99@69: strList = safeStringSplit( i->second, separator ); joachim99@69: return strList; joachim99@69: } joachim99@69: else joachim99@69: return defaultVal; joachim99@69: } joachim99@80: joachim99@80: QString ValueMap::readEntry (const QString& s, const QString& defaultVal ) { return readStringEntry(s, defaultVal); } joachim99@80: QString ValueMap::readEntry (const QString& s, const char* defaultVal ) { return readStringEntry(s, QString::fromLatin1(defaultVal) ); } joachim99@80: QFont ValueMap::readEntry (const QString& s, const QFont& defaultVal ){ return readFontEntry(s,&defaultVal); } joachim99@80: QColor ValueMap::readEntry(const QString& s, const QColor defaultVal ){ return readColorEntry(s,&defaultVal); } joachim99@80: QSize ValueMap::readEntry (const QString& s, const QSize defaultVal ){ return readSizeEntry(s,&defaultVal); } joachim99@80: QPoint ValueMap::readEntry(const QString& s, const QPoint defaultVal ){ return readPointEntry(s,&defaultVal); } joachim99@80: bool ValueMap::readEntry (const QString& s, bool bDefault ){ return readBoolEntry(s,bDefault); } joachim99@80: int ValueMap::readEntry (const QString& s, int iDefault ){ return readNumEntry(s,iDefault); } joachim99@80: QStringList ValueMap::readEntry (const QString& s, const QStringList& defaultVal, char separator ){ return readListEntry(s,defaultVal,separator); }