menu: reinforce the XML parsing 93/35193/2
authorGiWoong Kim <giwoong.kim@samsung.com>
Tue, 10 Feb 2015 10:16:03 +0000 (19:16 +0900)
committerGiWoong Kim <giwoong.kim@samsung.com>
Tue, 10 Feb 2015 11:23:30 +0000 (20:23 +0900)
declare default menu names
added shortcut parsing
dynamic configuration for scale factor
code cleanup & etc

Change-Id: Ibb50b0a856560ddfede52af5721709220f7230ce
Signed-off-by: GiWoong Kim <giwoong.kim@samsung.com>
12 files changed:
tizen/src/display/qt5_supplement.cpp
tizen/src/display/xmllayoutparser.cpp
tizen/src/display/xmllayoutparser.h
tizen/src/ui/menu/advancedmenuitem.h
tizen/src/ui/menu/contextmenu.cpp
tizen/src/ui/menu/contextmenu.h
tizen/src/ui/menu/menuitem.cpp
tizen/src/ui/menu/menuitem.h
tizen/src/ui/menu/scalemenuitem.cpp
tizen/src/ui/menu/scalemenuitem.h
tizen/src/ui/resource/mobile-720x1280-3btn/layout.xml
tizen/src/ui/resource/wearable-320x320-1btn/layout.xml

index 4321bef6d13211dea1c7168b4b8f29826a1594f9..ac531c2043689c64163ae1a52f7eb0fdc5d134b3 100644 (file)
@@ -170,7 +170,7 @@ void qt5_gui_init(void)
 
     /* position */
     QRect hostBounds = UIUtil::getHostScreenBounds();
-    qDebug() << "host geometry : " << hostBounds;
+    qDebug() << "host geometry :" << hostBounds;
 
     int defaultValueX = hostBounds.x() - 1;
     int defaultValueY = hostBounds.y() - 1;
@@ -380,33 +380,10 @@ void loadMainFormFromXML(QFile *file, UIInformation *uiInfo/* out */)
     QFileInfo fileInfo(*file);
     QXmlStreamReader xml(file);
 
+    /* parse xml */
     XmlLayoutParser parser(fileInfo.absolutePath(), uiInfo);
-
-    QXmlStreamReader::TokenType token;
-    while (xml.atEnd() == false && xml.hasError() == false) {
-        token = xml.readNext();
-        /* If token is just StartDocument, go to next.*/
-        if(token == QXmlStreamReader::StartDocument) {
-            continue;
-        }
-
-        if (token == QXmlStreamReader::StartElement) {
-            if (xml.name() == "EmulatorUI") {
-                continue;
-            }
-
-            if (xml.name() == "layoutVersion") {
-                qDebug() << "layout version :" << xml.readElementText();
-                continue;
-            } else if (xml.name() == "formList") {
-                int cnt = parser.parseMainFormList(xml, uiInfo->mainFormList);
-                qDebug("- formList : %d", cnt);
-            } else if (xml.name() == "menuList") {
-                int cnt = parser.parseMenuList(xml, uiInfo->menuList);
-                qDebug("- menuList : %d", cnt);
-            }
-        }
-    }
+    QString version = parser.parseEmulatorUI(xml);
+    qDebug() << "layout version :" << version;
 
     const bool hasError = xml.hasError();
     xml.clear();
@@ -436,33 +413,10 @@ void loadConFormFromXML(QFile *file, UIInformation *uiInfo/* out */)
     QFileInfo fileInfo(*file);
     QXmlStreamReader xml(file);
 
+    /* parse xml */
     XmlLayoutParser parser(fileInfo.absolutePath(), uiInfo);
-
-    ControllerForm *form = NULL;
-    QXmlStreamReader::TokenType token;
-    while (xml.atEnd() == false && xml.hasError() == false) {
-        token = xml.readNext();
-        /* If token is just StartDocument, go to next.*/
-        if(token == QXmlStreamReader::StartDocument) {
-            continue;
-        }
-
-        if (token == QXmlStreamReader::StartElement) {
-            if (xml.name() == "ControllerUI") {
-                continue;
-            }
-
-            if (xml.name() == "layoutVersion") {
-                qDebug() << "layout version :" << xml.readElementText();
-                continue;
-            } else if (xml.name() == "form") {
-                form = parser.parseControllerForm(xml);
-                if (form != NULL) {
-                    uiInfo->conFormList.append(form);
-                }
-            }
-        }
-    }
+    QString version = parser.parseControllerUI(xml);
+    qDebug() << "layout version :" << version;
 
     const bool hasError = xml.hasError();
     xml.clear();
index 00b250b4fdb1ee9aed5a8b6fb6e7e9a4ac2e438c..c74ffee5363a3cf8b764cf081743a1282f64f868 100644 (file)
  */
 
 #include "xmllayoutparser.h"
-#include "menu/advancedmenuitem.h"
-#include "menu/scalemenuitem.h"
+
+#define NAME_ATTR_KEYWORD "name"
+#define PROP_ATTR_KEYWORD "property"
+#define LAYOUTVER_KEYWORD "layoutVersion"
+#define REGION_KEYWORD "region"
+#define KEYLIST_KEYWORD "keyList"
+#define FORM_KEYWORD "form"
+#define SHORTCUT_KEYWORD "shortcut"
+#define MENULIST_KEYWORD "menuList"
 
 XmlLayoutParser::XmlLayoutParser(QString path, UIInformation *uiInfo)
 {
@@ -42,9 +49,10 @@ QRect XmlLayoutParser::parseRegion(QXmlStreamReader &xml)
     int left = 0, top = 0;
     unsigned int width = 0, height = 0;
 
-    if (xml.name() == "region" &&
+    if (xml.name() == REGION_KEYWORD &&
         xml.tokenType() == QXmlStreamReader::StartElement) {
         QXmlStreamAttributes attributes = xml.attributes();
+
         if (attributes.hasAttribute("left")) {
             left = attributes.value("left").toString().toInt();
         }
@@ -73,7 +81,7 @@ DisplayType *XmlLayoutParser::parseDisplay(QXmlStreamReader &xml)
         token == QXmlStreamReader::EndElement) == false) /* ~ </display> */
     {
         if (token == QXmlStreamReader::StartElement) {
-            if (xml.name() == "region") {
+            if (xml.name() == REGION_KEYWORD) {
                 /* region */
                 displayRegion = parseRegion(xml);
                 qDebug("- display : (%d,%d %dx%d)",
@@ -93,16 +101,12 @@ DisplayType *XmlLayoutParser::parseDisplay(QXmlStreamReader &xml)
 
 HardwareKey *XmlLayoutParser::parseKey(QXmlStreamReader &xml)
 {
-    QString keyName;
     QRect keyRegion;
     int keycode = 0;
     QString keyTooptip;
 
     /* attribute */
-    QXmlStreamAttributes attributes = xml.attributes();
-    if (attributes.hasAttribute("name")) {
-        keyName = attributes.value("name").toString();
-    }
+    QString keyName = xml.attributes().value(NAME_ATTR_KEYWORD).toString();
 
     QXmlStreamReader::TokenType token = xml.readNext();
 
@@ -110,7 +114,7 @@ HardwareKey *XmlLayoutParser::parseKey(QXmlStreamReader &xml)
         token == QXmlStreamReader::EndElement) == false) /* ~ </key> */
     {
         if (token == QXmlStreamReader::StartElement) {
-            if (xml.name() == "region") {
+            if (xml.name() == REGION_KEYWORD) {
                 /* region */
                 keyRegion = parseRegion(xml);
             } else if (xml.name() == "keycode") {
@@ -134,7 +138,7 @@ int XmlLayoutParser::parseKeyList(
     HardwareKey *hwKey = NULL;
     QXmlStreamReader::TokenType token = xml.readNext();
 
-    while (xml.atEnd() == false && (xml.name() == "keyList" &&
+    while (xml.atEnd() == false && (xml.name() == KEYLIST_KEYWORD &&
         token == QXmlStreamReader::EndElement) == false) /* ~ </keyList> */
     {
         if (token == QXmlStreamReader::StartElement) {
@@ -154,19 +158,13 @@ int XmlLayoutParser::parseKeyList(
 
 MainForm *XmlLayoutParser::parseMainForm(QXmlStreamReader &xml)
 {
-    QString formName = "";
-
     /* attribute */
-    QXmlStreamAttributes attributes = xml.attributes();
-    if (attributes.hasAttribute("name")) {
-        formName = attributes.value("name").toString();
-    }
-
+    QString formName = xml.attributes().value(NAME_ATTR_KEYWORD).toString();
     MainForm *form = new MainForm(formName);
 
     QXmlStreamReader::TokenType token = xml.readNext();
 
-    while (xml.atEnd() == false && (xml.name() == "form" &&
+    while (xml.atEnd() == false && (xml.name() == FORM_KEYWORD &&
         token == QXmlStreamReader::EndElement) == false) /* ~ </form> */
     {
         if (token == QXmlStreamReader::StartElement) {
@@ -187,7 +185,10 @@ MainForm *XmlLayoutParser::parseMainForm(QXmlStreamReader &xml)
 
                 form->skinImg[MainForm::pressed].load(
                     xmlPath + QDir::separator() + pressedImageFileName);
-            } else if (xml.name() == "keyList") {
+            } else if (xml.name() == "maskImage") {
+                /* mask image */
+                // TODO:
+            } else if (xml.name() == KEYLIST_KEYWORD) {
                 /* HW keys */
                 int cnt = parseKeyList(xml, form->keyList);
                 qDebug("- keyList : %d", cnt);
@@ -212,7 +213,7 @@ int XmlLayoutParser::parseMainFormList(
         token == QXmlStreamReader::EndElement) == false) /* ~ </formList> */
     {
         if (token == QXmlStreamReader::StartElement) {
-            if (xml.name() == "form") {
+            if (xml.name() == FORM_KEYWORD) {
                 form = parseMainForm(xml);
                 if (form != NULL) {
                     list.append(form);
@@ -228,9 +229,8 @@ int XmlLayoutParser::parseMainFormList(
 
 /* menu */
 int XmlLayoutParser::parseFactorList(
-    QXmlStreamReader &xml, QList<int> &list)
+    QXmlStreamReader &xml, QMap<int, QString> &map)
 {
-    int factor = 0;
     QXmlStreamReader::TokenType token = xml.readNext();
 
     while (xml.atEnd() == false && (xml.name() == "factorList" &&
@@ -238,126 +238,182 @@ int XmlLayoutParser::parseFactorList(
     {
         if (token == QXmlStreamReader::StartElement) {
             if (xml.name() == "factor") {
-                factor = xml.readElementText().toInt();
-                if (factor > 0) {
-                    list.append(factor);
-                }
+                QString value = xml.attributes().value(NAME_ATTR_KEYWORD).toString();
+                map.insert(xml.readElementText().toInt(), value);
             }
         }
 
         token = xml.readNext();
     }
 
-    return list.count();
+    return map.count();
+}
+
+int XmlLayoutParser::parseShortcut(
+    QXmlStreamReader &xml, QMap<QString, QString> &map)
+{
+    QString key = xml.attributes().value(PROP_ATTR_KEYWORD).toString();
+    map.insert(key, xml.readElementText());
+
+    return map.count();
 }
 
-MenuItem *XmlLayoutParser::parseMenuItem(QXmlStreamReader &xml, int menuType)
+AdvancedMenuItem *XmlLayoutParser::parseAdvancedMenuItem(QXmlStreamReader &xml)
 {
-    QString menuName = "";
+    /* attribute */
+    QString menuName = xml.attributes().value(NAME_ATTR_KEYWORD).toString();
+    AdvancedMenuItem *item = new AdvancedMenuItem(menuName);
+
+    QXmlStreamReader::TokenType token = xml.readNext();
+
+    while (xml.atEnd() == false && (xml.name() == "advancedItem" &&
+        token == QXmlStreamReader::EndElement) == false) /* ~ </advancedItem> */
+    {
+        if (token == QXmlStreamReader::StartElement) {
+            if (xml.name() == SHORTCUT_KEYWORD) {
+                parseShortcut(xml, item->getShortcutMap());
+            } else if (xml.name() == MENULIST_KEYWORD) {
+                int cnt = parseMenuList(xml, item->getMenuList());
+                qDebug("- advanced menuList : %d", cnt);
+            }
+        }
+
+        token = xml.readNext();
+    }
 
+    return item;
+}
+
+ScaleMenuItem *XmlLayoutParser::parseScaleMenuItem(QXmlStreamReader &xml)
+{
     /* attribute */
-    QXmlStreamAttributes attributes = xml.attributes();
-    if (attributes.hasAttribute("name")) {
-        menuName = attributes.value("name").toString();
+    QString menuName = xml.attributes().value(NAME_ATTR_KEYWORD).toString();
+    ScaleMenuItem *item = new ScaleMenuItem(menuName);
+
+    QXmlStreamReader::TokenType token = xml.readNext();
+
+    while (xml.atEnd() == false && (xml.name() == "scaleItem" &&
+        token == QXmlStreamReader::EndElement) == false) /* ~ </scaleItem> */
+    {
+        if (token == QXmlStreamReader::StartElement) {
+            if (xml.name() == SHORTCUT_KEYWORD) {
+                parseShortcut(xml, item->getShortcutMap());
+            } else if (xml.name() == "factorList") {
+                int cnt = parseFactorList(xml, item->getFactorMap());
+                qDebug("- scale factorList : %d", cnt);
+            }
+        }
+
+        token = xml.readNext();
     }
 
-    // TODO: shortcut
+    return item;
+}
+
+MenuItem *XmlLayoutParser::parseGeneralMenuItem(
+    QXmlStreamReader &xml, int menuType)
+{
+    QString itemKeyword = xml.name().toString();
+
+    /* attribute */
+    QString menuName = xml.attributes().value(NAME_ATTR_KEYWORD).toString();
+    MenuItem *item = new MenuItem(menuType, menuName);
+
+    QString shortcut;
+    QXmlStreamReader::TokenType token = xml.readNext();
+
+    while (xml.atEnd() == false && (xml.name().compare(itemKeyword) == 0 &&
+        token == QXmlStreamReader::EndElement) == false) /* ~ </xxItem> */
+    {
+        if (token == QXmlStreamReader::StartElement) {
+            if (xml.name() == SHORTCUT_KEYWORD) {
+                parseShortcut(xml, item->getShortcutMap());
+            }
+        }
 
-    switch (menuType) {
-    case MenuItemType::advancedItem:
-        return (MenuItem *)new AdvancedMenuItem(menuName);
-    case MenuItemType::scaleItem:
-        return (MenuItem *)new ScaleMenuItem(menuName);
+        token = xml.readNext();
     }
 
-    return new MenuItem(menuType, menuName);
+    return item;
 }
 
-int XmlLayoutParser::parseMenuListItems(QXmlStreamReader &xml,
-    const QString &keyword, QList<MenuItem *> &list)
+int XmlLayoutParser::parseMenuList(
+    QXmlStreamReader &xml, QList<MenuItem *> &list)
 {
     MenuItem *item = NULL;
     QXmlStreamReader::TokenType token = xml.readNext();
 
-    while (xml.atEnd() == false && (xml.name().compare(keyword) == 0 &&
-        token == QXmlStreamReader::EndElement) == false)
+    while (xml.atEnd() == false && (xml.name() == MENULIST_KEYWORD &&
+        token == QXmlStreamReader::EndElement) == false) /* ~ </menuList> */
     {
         if (token == QXmlStreamReader::StartElement) {
             if (xml.name() == "separator") {
                 item = new MenuItem(MenuItemType::separator, NULL);
-                list.append(item);
-
-                item = NULL;
-            } else if (xml.name() == "advancedList") {
-                item = parseMenuItem(xml, MenuItemType::advancedItem);
                 if (item != NULL) {
                     list.append(item);
-
-                    int cnt = parseAdvancedMenuList(xml,
-                        ((AdvancedMenuItem *)item)->getMenuList());
-                    qDebug("- advanced menuList : %d", cnt);
+                }
+            } else if (xml.name() == "advancedItem") {
+                item = (MenuItem *)parseAdvancedMenuItem(xml);
+                if (item != NULL) {
+                    list.append(item);
                 }
             } else if (xml.name() == "infoItem") {
-                item = parseMenuItem(xml, MenuItemType::infoItem);
+                item = parseGeneralMenuItem(xml, MenuItemType::infoItem);
                 if (item != NULL) {
                     list.append(item);
                 }
             } else if (xml.name() == "onTopItem") {
-                item = parseMenuItem(xml, MenuItemType::onTopItem);
+                item = parseGeneralMenuItem(xml, MenuItemType::onTopItem);
                 if (item != NULL) {
                     list.append(item);
                 }
             } else if (xml.name() == "switchItem") {
-                item = parseMenuItem(xml, MenuItemType::switchItem);
+                item = parseGeneralMenuItem(xml, MenuItemType::switchItem);
                 if (item != NULL) {
                     list.append(item);
                 }
             } else if (xml.name() == "scaleItem") {
-                item = parseMenuItem(xml, MenuItemType::scaleItem);
+                item = (MenuItem *)parseScaleMenuItem(xml);
                 if (item != NULL) {
                     list.append(item);
-
-                    int cnt = parseFactorList(xml,
-                        ((ScaleMenuItem *)item)->getFactorList());
-                    qDebug("- scale factorList : %d", cnt);
                 }
             } else if (xml.name() == "controllerItem") {
-                item = parseMenuItem(xml, MenuItemType::controllerItem);
+                item = parseGeneralMenuItem(xml, MenuItemType::controllerItem);
                 if (item != NULL) {
                     list.append(item);
                 }
             } else if (xml.name() == "hostKeyboardItem") {
-                item = parseMenuItem(xml, MenuItemType::hostKeyboardItem);
+                item = parseGeneralMenuItem(xml, MenuItemType::hostKeyboardItem);
                 if (item != NULL) {
                     list.append(item);
                 }
             } else if (xml.name() == "shellItem") {
-                item = parseMenuItem(xml, MenuItemType::shellItem);
+                item = parseGeneralMenuItem(xml, MenuItemType::shellItem);
                 if (item != NULL) {
                     list.append(item);
                 }
             } else if (xml.name() == "controlPanelItem") {
-                item = parseMenuItem(xml, MenuItemType::controlPanelItem);
+                item = parseGeneralMenuItem(xml, MenuItemType::controlPanelItem);
                 if (item != NULL) {
                     list.append(item);
                 }
             } else if (xml.name() == "screenShotItem") {
-                item = parseMenuItem(xml, MenuItemType::screenShotItem);
+                item = parseGeneralMenuItem(xml, MenuItemType::screenShotItem);
                 if (item != NULL) {
                     list.append(item);
                 }
             } else if (xml.name() == "aboutItem") {
-                item = parseMenuItem(xml, MenuItemType::aboutItem);
+                item = parseGeneralMenuItem(xml, MenuItemType::aboutItem);
                 if (item != NULL) {
                     list.append(item);
                 }
             } else if (xml.name() == "forceCloseItem") {
-                item = parseMenuItem(xml, MenuItemType::forceCloseItem);
+                item = parseGeneralMenuItem(xml, MenuItemType::forceCloseItem);
                 if (item != NULL) {
                     list.append(item);
                 }
             } else if (xml.name() == "closeItem") {
-                item = parseMenuItem(xml, MenuItemType::closeItem);
+                item = parseGeneralMenuItem(xml, MenuItemType::closeItem);
                 if (item != NULL) {
                     list.append(item);
                 }
@@ -370,35 +426,51 @@ int XmlLayoutParser::parseMenuListItems(QXmlStreamReader &xml,
     return list.count();
 }
 
-int XmlLayoutParser::parseAdvancedMenuList(
-    QXmlStreamReader &xml, QList<MenuItem *> &list)
+QString XmlLayoutParser::parseEmulatorUI(QXmlStreamReader &xml)
 {
-    return parseMenuListItems(xml, "advancedList", list);
-}
+    QString layoutVersion = "undefined";
 
-int XmlLayoutParser::parseMenuList(
-    QXmlStreamReader &xml, QList<MenuItem *> &list)
-{
-    return parseMenuListItems(xml, "menuList", list);
+    QXmlStreamReader::TokenType token;
+
+    while (xml.atEnd() == false && xml.hasError() == false) {
+        token = xml.readNext();
+        /* If token is just StartDocument, go to next.*/
+        if (token == QXmlStreamReader::StartDocument) {
+            continue;
+        }
+
+        if (token == QXmlStreamReader::StartElement) {
+            if (xml.name() == "EmulatorUI") {
+                continue;
+            }
+
+            if (xml.name() == LAYOUTVER_KEYWORD) {
+                layoutVersion = xml.readElementText();
+                continue;
+            } else if (xml.name() == "formList") {
+                int cnt = parseMainFormList(xml, uiInfo->mainFormList);
+                qDebug("- formList : %d", cnt);
+            } else if (xml.name() == MENULIST_KEYWORD) {
+                int cnt = parseMenuList(xml, uiInfo->menuList);
+                qDebug("- menuList : %d", cnt);
+            }
+        }
+    }
+
+    return layoutVersion;
 }
 
 /* controller */
 ControllerForm *XmlLayoutParser::parseControllerForm(QXmlStreamReader &xml)
 {
-    QString formName = "";
-
     /* attribute */
-    QXmlStreamAttributes attributes = xml.attributes();
-    if (attributes.hasAttribute("name")) {
-        formName = attributes.value("name").toString();
-    }
-
+    QString formName = xml.attributes().value(NAME_ATTR_KEYWORD).toString();
     ControllerForm *form = new ControllerForm(
         formName.isEmpty() ? xmlPath.section(QDir::separator(), -1) : formName);
 
     QXmlStreamReader::TokenType token = xml.readNext();
 
-    while (xml.atEnd() == false && (xml.name() == "form" &&
+    while (xml.atEnd() == false && (xml.name() == FORM_KEYWORD &&
         token == QXmlStreamReader::EndElement) == false) /* ~ </form> */
     {
         if (token == QXmlStreamReader::StartElement) {
@@ -416,7 +488,7 @@ ControllerForm *XmlLayoutParser::parseControllerForm(QXmlStreamReader &xml)
 
                 form->conImg[ControllerForm::pressed].load(
                     xmlPath + QDir::separator() + pressedImageFileName);
-            } else if (xml.name() == "keyList") {
+            } else if (xml.name() == KEYLIST_KEYWORD) {
                 /* HW keys */
                 int cnt = parseKeyList(xml, form->keyList);
                 qDebug("- keyList : %d", cnt);
@@ -430,3 +502,37 @@ ControllerForm *XmlLayoutParser::parseControllerForm(QXmlStreamReader &xml)
 
     return form;
 }
+
+QString XmlLayoutParser::parseControllerUI(QXmlStreamReader &xml)
+{
+    QString layoutVersion = "undefined";
+
+    ControllerForm *form = NULL;
+    QXmlStreamReader::TokenType token;
+
+    while (xml.atEnd() == false && xml.hasError() == false) {
+        token = xml.readNext();
+        /* If token is just StartDocument, go to next.*/
+        if (token == QXmlStreamReader::StartDocument) {
+            continue;
+        }
+
+        if (token == QXmlStreamReader::StartElement) {
+            if (xml.name() == "ControllerUI") {
+                continue;
+            }
+
+            if (xml.name() == LAYOUTVER_KEYWORD) {
+                layoutVersion = xml.readElementText();
+                continue;
+            } else if (xml.name() == FORM_KEYWORD) {
+                form = parseControllerForm(xml);
+                if (form != NULL) {
+                    uiInfo->conFormList.append(form);
+                }
+            }
+        }
+    }
+
+    return layoutVersion;
+}
index 99a6d4a272abde2f5c74557aa459d52a6cc16f8b..9c38c6293a76473c13665e010c84d2cae44b76c2 100644 (file)
@@ -35,6 +35,8 @@
 #include "uiinformation.h"
 #include "mainform.h"
 #include "menu/menuitem.h"
+#include "menu/advancedmenuitem.h"
+#include "menu/scalemenuitem.h"
 #include "controllerform.h"
 
 class XmlLayoutParser
@@ -42,9 +44,8 @@ class XmlLayoutParser
 public:
     XmlLayoutParser(QString path, UIInformation *uiInfo /* out */);
 
-    int parseMainFormList(QXmlStreamReader &xml, QList<MainForm *> &list);
-    int parseMenuList(QXmlStreamReader &xml, QList<MenuItem *> &list);
-    ControllerForm *parseControllerForm(QXmlStreamReader &xml);
+    QString parseEmulatorUI(QXmlStreamReader &xml);
+    QString parseControllerUI(QXmlStreamReader &xml);
 
 private:
     QRect parseRegion(QXmlStreamReader &xml);
@@ -52,13 +53,16 @@ private:
     HardwareKey *parseKey(QXmlStreamReader &xml);
     int parseKeyList(QXmlStreamReader &xml, QList<HardwareKey *> &list);
     MainForm *parseMainForm(QXmlStreamReader &xml);
+    int parseMainFormList(QXmlStreamReader &xml, QList<MainForm *> &list);
 
-    int parseFactorList(QXmlStreamReader &xml, QList<int> &list);
-    MenuItem *parseMenuItem(QXmlStreamReader &xml, int menuType);
-    int parseMenuListItems(QXmlStreamReader &xml,
-        const QString &keyword, QList<MenuItem *> &list);
-    int parseAdvancedMenuList(
-        QXmlStreamReader &xml, QList<MenuItem *> &list);
+    int parseFactorList(QXmlStreamReader &xml, QMap<int, QString> &map);
+    int parseShortcut(QXmlStreamReader &xml, QMap<QString, QString> &map);
+    AdvancedMenuItem *parseAdvancedMenuItem(QXmlStreamReader &xml);
+    ScaleMenuItem *parseScaleMenuItem(QXmlStreamReader &xml);
+    MenuItem *parseGeneralMenuItem(QXmlStreamReader &xml, int menuType);
+    int parseMenuList(QXmlStreamReader &xml, QList<MenuItem *> &list);
+
+    ControllerForm *parseControllerForm(QXmlStreamReader &xml);
 
     QString xmlPath;
     UIInformation *uiInfo;
index 5ff6d4f28ffbfed413c99a84990cc6aa065b7167..df7c1cbcafdccd2852f503a87df09b6714c60fe9 100644 (file)
@@ -34,7 +34,7 @@
 
 #include "menu/menuitem.h"
 
-class AdvancedMenuItem : MenuItem
+class AdvancedMenuItem : public MenuItem
 {
 public:
     AdvancedMenuItem(QString name);
index 8c3e6e553225dbb0a211c0fb96387ba2e4cae871..a7a5ec94d1dcf6e85bd6d41c0f63fa522b68ba1b 100644 (file)
@@ -143,11 +143,19 @@ void ContextMenu::createItems(QMenu *menu, QList<MenuItem *> &list)
 
 void ContextMenu::createSeparator(QMenu *menu)
 {
+    if (menu == NULL) {
+        return;
+    }
+
     menu->addSeparator();
 }
 
 void ContextMenu::createAdvancedItem(QMenu *menu, MenuItem *item)
 {
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
     QString menuName = item->getName();
     advancedMenu = menu->addMenu(QIcon(QPixmap(":/icons/advanced.png")),
         menuName.isEmpty() ? "Advanced" : menuName);
@@ -157,25 +165,39 @@ void ContextMenu::createAdvancedItem(QMenu *menu, MenuItem *item)
 
 void ContextMenu::createInfoItem(QMenu *menu, MenuItem *item)
 {
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
     QString menuName = item->getName();
-    actionDetailedInfo = addGeneralAction(menu, menuName.isEmpty() ? vmName : menuName,
-        QIcon(QPixmap(":/icons/detailed_info.png")), SLOT(slotDetailedInfo()));
+    actionDetailedInfo = addGeneralAction(menu, QIcon(QPixmap(":/icons/detailed_info.png")),
+        menuName.isEmpty() ? vmName : menuName, SLOT(slotDetailedInfo()));
 }
 
 void ContextMenu::createOnTopItem(QMenu *menu, MenuItem *item)
 {
-    actionTopMost = menu->addAction(item->getName());
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
+    QString menuName = item->getName();
+    actionTopMost = menu->addAction(menuName.isEmpty() ? "Always on Top" : menuName);
     actionTopMost->setCheckable(true);
     connect(actionTopMost, SIGNAL(triggered(bool)), this, SLOT(slotTopMost(bool)));
 }
 
 void ContextMenu::createSwitchItem(QMenu *menu, MenuItem *item)
 {
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
     QList<MainForm *> mainFormList = parent->uiInfo->mainFormList;
 
     if (mainFormList.isEmpty() == false) {
+        QString menuName = item->getName();
         switchMenu = menu->addMenu(
-            QIcon(QPixmap(":/icons/rotate.png")), item->getName());
+            QIcon(QPixmap(":/icons/rotate.png")), menuName.isEmpty() ? "Switch" : menuName);
         QActionGroup *switchGroup = new QActionGroup(this);
         switchMapper = new QSignalMapper(this);
         connect(switchMapper, SIGNAL(mapped(int)), this, SLOT(slotSwitch(int)));
@@ -199,21 +221,33 @@ void ContextMenu::createSwitchItem(QMenu *menu, MenuItem *item)
 
 void ContextMenu::createScaleItem(QMenu *menu, MenuItem *item)
 {
-    QList<int> factorList = ((ScaleMenuItem *)item)->getFactorList();
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
+    QMap<int, QString> factorMap = ((ScaleMenuItem *)item)->getFactorMap();
 
-    if (factorList.isEmpty() == false) {
+    if (factorMap.isEmpty() == false) {
+        QString menuName = item->getName();
         scaleMenu = menu->addMenu(
-            QIcon(QPixmap(":/icons/scale.png")), item->getName());
+            QIcon(QPixmap(":/icons/scale.png")), menuName.isEmpty() ? "Scale" : menuName);
         QActionGroup *scaleGroup = new QActionGroup(this);
         scaleMapper = new QSignalMapper(this);
         connect(scaleMapper, SIGNAL(mapped(int)), this, SLOT(slotScale(int)));
 
         QAction *action = NULL;
-        for (int i = 0; i < factorList.count(); i++) {
-            action = scaleMenu->addAction(QString::number(factorList.at(i)) + "%");
+
+        QMapIterator<int, QString> iter(factorMap);
+        iter.toBack();
+        while(iter.hasPrevious() == true) {
+            iter.previous();
+
+            QString factorName = iter.value();
+            action = scaleMenu->addAction(
+                factorName.isEmpty() ? (QString::number(iter.key()) + '%') : factorName);
             action->setActionGroup(scaleGroup);
             action->setCheckable(true);
-            scaleMapper->setMapping(action, factorList.at(i));
+            scaleMapper->setMapping(action, iter.key());
             connect(action, SIGNAL(triggered()), scaleMapper, SLOT(map()));
         }
 
@@ -229,10 +263,15 @@ void ContextMenu::createScaleItem(QMenu *menu, MenuItem *item)
 
 void ContextMenu::createControllerItem(QMenu *menu, MenuItem *item)
 {
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
     QList<ControllerForm *> conFormList = parent->uiInfo->conFormList;
 
     if (conFormList.isEmpty() == false) {
-        controllerMenu = menu->addMenu(item->getName());
+        QString menuName = item->getName();
+        controllerMenu = menu->addMenu(menuName.isEmpty() ? "Controller" : menuName);
         QActionGroup *controllerGroup = new QActionGroup(this);
         controllerMapper = new QSignalMapper(this);
         connect(controllerMapper, SIGNAL(mapped(int)), this,
@@ -259,8 +298,13 @@ void ContextMenu::createControllerItem(QMenu *menu, MenuItem *item)
 
 void ContextMenu::createHostKeyboardItem(QMenu *menu, MenuItem *item)
 {
-    QMenu *keyboardMenu = menu->addMenu(
-        QIcon(QPixmap(":/icons/host_keyboard.png")), item->getName());
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
+    QString menuName = item->getName();
+    QMenu *keyboardMenu = menu->addMenu(QIcon(QPixmap(":/icons/host_keyboard.png")),
+        menuName.isEmpty() ? "Host keyboard" : menuName);
     QActionGroup *keyboardGroup = new QActionGroup(this);
 
     QAction *action = keyboardMenu->addAction("On");
@@ -276,43 +320,72 @@ void ContextMenu::createHostKeyboardItem(QMenu *menu, MenuItem *item)
 
 void ContextMenu::createShellItem(QMenu *menu, MenuItem *item)
 {
-    actionShell = addGeneralAction(menu, item->getName(),
-        QIcon(QPixmap(":/icons/shell.png")), SLOT(slotShell()));
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
+    QString menuName = item->getName();
+    actionShell = addGeneralAction(menu, QIcon(QPixmap(":/icons/shell.png")),
+        menuName.isEmpty() ? "Shell" : menuName, SLOT(slotShell()));
 }
 
 void ContextMenu::createControlPanelItem(QMenu *menu, MenuItem *item)
 {
-    actionControlPanel = addGeneralAction(menu, item->getName(),
-        QIcon(QPixmap(":/icons/control_panel.png")), SLOT(slotControlPanel()));
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
+    QString menuName = item->getName();
+    actionControlPanel = addGeneralAction(menu, QIcon(QPixmap(":/icons/control_panel.png")),
+        menuName.isEmpty() ? "Control Panel" : menuName, SLOT(slotControlPanel()));
 }
 
 void ContextMenu::createScreenShotItem(QMenu *menu, MenuItem *item)
 {
-    actionScreenShot = addGeneralAction(menu, item->getName(),
-        QIcon(QPixmap(":/icons/screen_shot.png")),
-        SLOT(slotRequestScreenshot()));
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
+    QString menuName = item->getName();
+    actionScreenShot = addGeneralAction(menu, QIcon(QPixmap(":/icons/screen_shot.png")),
+        menuName.isEmpty() ? "Screen Shot" : menuName, SLOT(slotRequestScreenshot()));
 }
 
 void ContextMenu::createAboutItem(QMenu *menu, MenuItem *item)
 {
-    actionAbout = addGeneralAction(menu, item->getName(),
-        QIcon(QPixmap(":/icons/about.png")), SLOT(slotAbout()));
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
+    QString menuName = item->getName();
+    actionAbout = addGeneralAction(menu, QIcon(QPixmap(":/icons/about.png")),
+        menuName.isEmpty() ? "About" : menuName, SLOT(slotAbout()));
 }
 
 void ContextMenu::createForceCloseItem(QMenu *menu, MenuItem *item)
 {
-    actionForceClose = addGeneralAction(menu, item->getName(),
-        QIcon(QPixmap(":/icons/force_close.png")), SLOT(slotForceClose()));
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
+    QString menuName = item->getName();
+    actionForceClose = addGeneralAction(menu, QIcon(QPixmap(":/icons/force_close.png")),
+        menuName.isEmpty() ? "Force Close" : menuName, SLOT(slotForceClose()));
 }
 
 void ContextMenu::createCloseItem(QMenu *menu, MenuItem *item)
 {
-    actionClose = addGeneralAction(menu, item->getName(),
-        QIcon(QPixmap(":/icons/close.png")), SLOT(slotClose()));
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
+    QString menuName = item->getName();
+    actionClose = addGeneralAction(menu, QIcon(QPixmap(":/icons/close.png")),
+        menuName.isEmpty() ? "Close" : menuName, SLOT(slotClose()));
 }
 
 QAction *ContextMenu::addGeneralAction(QMenu *menu,
-    const QString &text, const QIcon &icon, const char *slot)
+    const QIcon &icon, const QString &text, const char *slot)
 {
     QAction *action = menu->addAction(text);
     action->setIcon(icon);
index a6d7cbb85d788a63c8c35054ff71f8907194c1dd..bc6896904ee13d5a76df451e10f6a9ce3a6e171b 100644 (file)
@@ -103,7 +103,7 @@ protected:
 
 private:
     QAction *addGeneralAction(QMenu *menu,
-        const QString &text, const QIcon &icon, const char *slot);
+        const QIcon &icon, const QString &text, const char *slot);
     void showPopup(QString msg);
 
     MainWindow *parent;
index 68fd3a5cfeb397b5b84a46bbbc8048c80f4fe6ff..b8090fa46320d6a445c227d2f67d68b6d622a766 100644 (file)
@@ -45,6 +45,11 @@ QString MenuItem::getName()
     return name;
 }
 
+QMap<QString, QString> &MenuItem::getShortcutMap()
+{
+    return shortcutMap;
+}
+
 MenuItem::~MenuItem()
 {
     /* do nothing */
index a1586d17459bb56f1dc37b5409ffd62ed3329479..f4629b70f79fa41a5dc24287b6934ec8b96c6dec 100644 (file)
@@ -31,6 +31,7 @@
 #define MENUITEM_H
 
 #include <QString>
+#include <QMap>
 
 namespace MenuItemType
 {
@@ -60,10 +61,12 @@ public:
 
     int getType();
     QString getName();
+    QMap<QString, QString> &getShortcutMap();
 
 private:
     int type;
     QString name;
+    QMap<QString, QString> shortcutMap;
 };
 
 #endif // MENUITEM_H
index ecd45cae1b4672393b943e1118b1b7db1eb65791..461d9cb51319a90b59406ab436680532eba0501c 100644 (file)
@@ -35,14 +35,14 @@ ScaleMenuItem::ScaleMenuItem(QString name) :
     /* do nothing */
 }
 
-QList<int> &ScaleMenuItem::getFactorList()
+QMap<int, QString> &ScaleMenuItem::getFactorMap()
 {
-    return factorList;
+    return factorMap;
 }
 
 ScaleMenuItem::~ScaleMenuItem()
 {
     qDebug("destroy a scale menu item");
 
-    factorList.clear();
+    factorMap.clear();
 }
index f413d81c9d82caa5d97a04ff60e6ba0891bda3c6..276bcf26cb6fa0b1c90c169a26d14adbc8d25143 100644 (file)
 #ifndef SCALEMENUITEM_H
 #define SCALEMENUITEM_H
 
-#include <QList>
+#include <QMap>
 
 #include "menu/menuitem.h"
 
-class ScaleMenuItem : MenuItem
+class ScaleMenuItem : public MenuItem
 {
 public:
     ScaleMenuItem(QString name);
     ~ScaleMenuItem();
 
-    QList<int> &getFactorList();
+    QMap<int, QString> &getFactorMap();
 
 private:
-    QList<int> factorList;
+    QMap<int, QString> factorMap;
 };
 
 #endif // SCALEMENUITEM_H
index 50051c786e1aa1fb20e2d62fc877398c9d8563f3..c882b071fc1cb0640e74381bd45a52a03a9b28e0 100644 (file)
             <shortcut>Ctrl+F2</shortcut>
         </onTopItem>
         <switchItem name="Rotate">
-            <shortcut property="up">Ctrl+Num7</shortcut>
-            <shortcut property="down">Ctrl+Num9</shortcut>
+            <shortcut property="prev">Ctrl+Num7</shortcut>
+            <shortcut property="next">Ctrl+Num9</shortcut>
         </switchItem>
         <scaleItem name="Scale">
-            <shortcut property="up">Ctrl+F9</shortcut>
-            <shortcut property="down">Ctrl+F10</shortcut>
+            <shortcut property="prev">Ctrl+F9</shortcut>
+            <shortcut property="next">Ctrl+F10</shortcut>
             <factorList>
-                <factor>100</factor>
-                <factor>75</factor>
-                <factor>50</factor>
-                <factor>25</factor>
+                <factor name="1x">100</factor>
+                <factor name="3/4x">75</factor>
+                <factor name="1/2x">50</factor>
+                <factor name="1/4x">25</factor>
             </factorList>
         </scaleItem>
         <separator/>
-        <advancedList>
-            <screenShotItem name="Screen Shot">
-                <shortcut>Ctrl+F7</shortcut>
-            </screenShotItem>
-            <separator/>
-            <aboutItem name="About"/>
-            <forceCloseItem name="Force Close">
-                <shortcut>Ctrl+F4</shortcut>
-            </forceCloseItem>
-        </advancedList>
+        <advancedItem>
+            <menuList>
+                <screenShotItem name="Screen Shot">
+                    <shortcut>Ctrl+F7</shortcut>
+                </screenShotItem>
+                <hostKeyboardItem name="Host Keyboard">
+                </hostKeyboardItem>
+                <separator/>
+                <aboutItem name="About"/>
+                <forceCloseItem name="Force Close">
+                    <shortcut>Ctrl+F4</shortcut>
+                </forceCloseItem>
+            </menuList>
+        </advancedItem>
         <shellItem name="Shell">
             <shortcut>Ctrl+F5</shortcut>
         </shellItem>
         <controlPanelItem name="Control Panel">
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
+        <separator/>
         <closeItem name="Close">
             <shortcut>F4</shortcut>
         </closeItem>
index d43acca4712b6dcc7c31977ea2613f320ce0b589..e813380658ea9162b136967861a39b962843bda2 100644 (file)
             </keyList>
         </form>
     </formList>
+
+    <menuList>
+        <infoItem>
+            <shortcut>Ctrl+F1</shortcut>
+        </infoItem>
+        <separator/>
+        <onTopItem name="Always on Top">
+            <shortcut>Ctrl+F2</shortcut>
+        </onTopItem>
+        <switchItem name="Rotate">
+            <shortcut property="prev">Ctrl+Num7</shortcut>
+            <shortcut property="next">Ctrl+Num9</shortcut>
+        </switchItem>
+        <separator/>
+        <advancedItem>
+            <menuList>
+                <screenShotItem name="Screen Shot">
+                    <shortcut>Ctrl+F7</shortcut>
+                </screenShotItem>
+                <separator/>
+                <aboutItem name="About"/>
+                <forceCloseItem name="Force Close">
+                    <shortcut>Ctrl+F4</shortcut>
+                </forceCloseItem>
+            </menuList>
+        </advancedItem>
+        <shellItem name="Shell">
+            <shortcut>Ctrl+F5</shortcut>
+        </shellItem>
+        <controlPanelItem name="Control Panel">
+            <shortcut>Ctrl+F6</shortcut>
+        </controlPanelItem>
+        <separator/>
+        <closeItem name="Close">
+            <shortcut>F4</shortcut>
+        </closeItem>
+    </menuList>
+
 </EmulatorUI>