/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * $URL$ * $Id$ * */ #ifndef COMMON_VIRTUAL_KEYBOARD_PARSER #define COMMON_VIRTUAL_KEYBOARD_PARSER #include "common/xmlparser.h" #include "backends/common/virtual-keyboard.h" /** TODO - information about optional attributes and their default values *************************************** ** Virtual Keyboard Pack File Format ** *************************************** The new virtual keyboard for ScummVM is implemented in the same way as a HTML ImageMap. It uses a single bitmap of the entire keyboard layout and then a image map description allows certain areas of the bitmap to be given special actions. Most of these actions will be a virtual key press event, but there will also be special keys that will change the keyboard layout or close the keyboard. The HTML image map description is contained in a larger XML file that can describe all the different modes of the keyboard, and also different keyboard layouts for different screen resolutions. ******************************************** ** Example keyboard pack description file ** ******************************************** ... ... ... ... ... ************************* ** Description of tags ** ************************* This is the required, root element of the file format. attributes: - modes: lists all the modes that the keyboard pack contains - initial_mode: which mode the keyboard should show initially - v_align/h_align: where on the screen should the keyboard appear initially child tags: - mode ------------------------------------------------------------------------------- This tag encapsulates a single mode of the keyboard. Within are a number of layouts, which provide the specific implementation at different resolutions. attributes: - name: the name of the mode - resolutions: list of the different layout resolutions child tags: - layout - event ------------------------------------------------------------------------------- These tags describe a particular event that will be triggered by a mouse click on a particular area. The target attribute of each image map area should be the same as an event's name. attributes: - name: name of the event - type: what sort of event is it (key | switch_mode | close) - for key events - code / ascii / modifiers: describe a key press in ScummVM KeyState format - for switch_mode events - mode: the mode that should be switched to ------------------------------------------------------------------------------- These tags encapsulate an implementation of a mode at a particular resolution. attributes: - resolution: the screen resolution that this layout is designed for - bitmap: filename of the 24-bit bitmap that will be used for this layout - transparent_color: color in r,b,g format that will be used for keycolor transparency. child nodes: - map: this describes the image map using the same format as html image maps ------------------------------------------------------------------------------- These tags describe the image map for a particular layout. It uses the exact same format as HTML image maps. The only area shapes that are supported are rectangles and polygons. The target attribute of each area should be the name of an event for this mode (see tag). For information on HTML image map format see - http://www.w3schools.com/TAGS/tag_map.asp - http://www.w3schools.com/TAGS/tag_area.asp */ namespace Common { enum ParseMode { kParseFull, // when loading keyboard pack for first time kParseCheckResolutions // when re-parsing following a change in screen size }; class VirtualKeyboardParser : public Common::XMLParser { typedef bool (VirtualKeyboardParser::*ParserCallback)(); public: VirtualKeyboardParser(VirtualKeyboard *kbd); void setParseMode(ParseMode m) { _parseMode = m; } protected: VirtualKeyboard *_keyboard; /** internal state variables of parser */ ParseMode _parseMode; VirtualKeyboard::Mode *_mode; // pointer to mode currently being parsed Common::String _initialModeName; bool _kbdParsed; bool _layoutParsed; bool keyCallback(Common::String keyName); bool closedKeyCallback(Common::String keyName); void cleanup(); bool parserCallback_Keyboard(); bool parserCallback_Mode(); bool parserCallback_Event(); bool parserCallback_Layout(); bool parserCallback_Map(); bool parserCallback_Area(); bool parserCallback_KeyboardClosed(); bool parserCallback_ModeClosed(); byte parseFlags(const String& flags); bool parseRect(Common::Rect *rect, const String& coords); bool parsePolygon(Common::Polygon *poly, const String& coords); Common::HashMap _callbacks; Common::HashMap _closedCallbacks; }; } // end of namespace GUI #endif