diff options
Diffstat (limited to 'gui/ThemeParser.h')
-rw-r--r-- | gui/ThemeParser.h | 98 |
1 files changed, 9 insertions, 89 deletions
diff --git a/gui/ThemeParser.h b/gui/ThemeParser.h index c5ee55dbbf..108a7263ba 100644 --- a/gui/ThemeParser.h +++ b/gui/ThemeParser.h @@ -33,6 +33,7 @@ #include "common/hashmap.h" #include "common/hash-str.h" #include "common/stack.h" +#include "common/xmlparser.h" #include "graphics/VectorRenderer.h" @@ -305,106 +306,25 @@ func = "fill" namespace GUI { using namespace Graphics; +using namespace Common; -class ThemeParser { - - static const int kParserMaxDepth = 4; - typedef void (ThemeParser::*ParserCallback)(); +class ThemeParser : public XMLParser { typedef void (VectorRenderer::*DrawingFunctionCallback)(const Common::Rect &, const DrawStep &); + typedef bool (ThemeParser::*ParserCallback)(); public: - ThemeParser() { - _callbacks["drawdata"] = &ThemeParser::parserCallback_DRAWDATA; - _callbacks["drawstep"] = &ThemeParser::parserCallback_DRAWSTEP; - } - - ~ThemeParser() {} - - enum ParserState { - kParserNeedKey, - kParserNeedKeyName, + ThemeParser(); - kParserNeedPropertyName, - kParserNeedPropertyOperator, - kParserNeedPropertyValue, - - kParserError - }; - - bool parse(); - void debug_testEval(); - protected: - void parserCallback_DRAWSTEP(); - void parserCallback_DRAWDATA(); + bool keyCallback(Common::String keyName); - bool parseKeyValue(Common::String keyName); - void parseActiveKey(bool closed); - void parserError(const char *errorString); + bool parserCallback_DRAWSTEP(); + bool parserCallback_DRAWDATA(); Graphics::DrawStep *newDrawStep(); - inline bool skipSpaces() { - if (!isspace(_text[_pos])) - return false; - - while (_text[_pos] && isspace(_text[_pos])) - _pos++; - - return true; - } - - inline bool skipComments() { - if (_text[_pos] == '/' && _text[_pos + 1] == '*') { - _pos += 2; - while (_text[_pos++]) { - if (_text[_pos - 2] == '*' && _text[_pos - 1] == '/') - break; - if (_text[_pos] == 0) - parserError("Comment has no closure."); - } - return true; - } - - if (_text[_pos] == '/' && _text[_pos + 1] == '/') { - _pos += 2; - while (_text[_pos] && _text[_pos] != '\n') - _pos++; - return true; - } - - return false; - } - - inline bool isValidNameChar(char c) { - return isalnum(c) || c == '_'; - } - - inline bool parseToken() { - _token.clear(); - while (isValidNameChar(_text[_pos])) - _token += _text[_pos++]; - - return isspace(_text[_pos]) != 0 || _text[_pos] == '>'; - } - - int _pos; - char *_text; - - ParserState _state; - - Common::String _error; - Common::String _token; - - struct ParserNode { - Common::String name; - Common::StringMap values; - }; - - Common::FixedStack<ParserNode*, kParserMaxDepth> _activeKey; - - Common::HashMap<Common::String, ParserCallback, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _callbacks; Common::HashMap<Common::String, DrawingFunctionCallback, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _drawFunctions; + Common::HashMap<Common::String, ParserCallback, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _callbacks; }; } |