diff options
Diffstat (limited to 'tools/addon-sdk-1.12/python-lib/cuddlefish/options_xul.py')
-rw-r--r-- | tools/addon-sdk-1.12/python-lib/cuddlefish/options_xul.py | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/tools/addon-sdk-1.12/python-lib/cuddlefish/options_xul.py b/tools/addon-sdk-1.12/python-lib/cuddlefish/options_xul.py new file mode 100644 index 0000000..99fa1a4 --- /dev/null +++ b/tools/addon-sdk-1.12/python-lib/cuddlefish/options_xul.py @@ -0,0 +1,98 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from xml.dom.minidom import Document + +VALID_PREF_TYPES = ['bool', 'boolint', 'integer', 'string', 'color', 'file', + 'directory', 'control', 'menulist', 'radio'] + +class Error(Exception): + pass + +class BadPrefTypeError(Error): + pass + +class MissingPrefAttr(Error): + pass + +def validate_prefs(options): + for pref in options: + # Make sure there is a 'title' + if ("title" not in pref): + raise MissingPrefAttr("The '%s' pref requires a 'title'" % (pref["name"])) + + # Make sure that the pref type is a valid inline pref type + if (pref["type"] not in VALID_PREF_TYPES): + raise BadPrefTypeError('%s is not a valid inline pref type' % (pref["type"])) + + # Make sure the 'control' type has a 'label' + if (pref["type"] == "control"): + if ("label" not in pref): + raise MissingPrefAttr("The 'control' inline pref type requires a 'label'") + + # Make sure the 'menulist' type has a 'menulist' + if (pref["type"] == "menulist" or pref["type"] == "radio"): + if ("options" not in pref): + raise MissingPrefAttr("The 'menulist' and the 'radio' inline pref types requires a 'options'") + + # Make sure each option has a 'value' and a 'label' + for item in pref["options"]: + if ("value" not in item): + raise MissingPrefAttr("'options' requires a 'value'") + if ("label" not in item): + raise MissingPrefAttr("'options' requires a 'label'") + + # TODO: Check that pref["type"] matches default value type + +def parse_options(options, jetpack_id): + doc = Document() + root = doc.createElement("vbox") + root.setAttribute("xmlns", "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul") + doc.appendChild(root) + + for pref in options: + setting = doc.createElement("setting") + setting.setAttribute("pref-name", pref["name"]) + setting.setAttribute("data-jetpack-id", jetpack_id) + setting.setAttribute("pref", "extensions." + jetpack_id + "." + pref["name"]) + setting.setAttribute("type", pref["type"]) + setting.setAttribute("title", pref["title"]) + + if ("description" in pref): + setting.appendChild(doc.createTextNode(pref["description"])) + + if (pref["type"] == "control"): + button = doc.createElement("button") + button.setAttribute("pref-name", pref["name"]) + button.setAttribute("data-jetpack-id", jetpack_id) + button.setAttribute("label", pref["label"]) + button.setAttribute("oncommand", "Services.obs.notifyObservers(null, '" + + jetpack_id + "-cmdPressed', '" + + pref["name"] + "');"); + setting.appendChild(button) + elif (pref["type"] == "boolint"): + setting.setAttribute("on", pref["on"]) + setting.setAttribute("off", pref["off"]) + elif (pref["type"] == "menulist"): + menulist = doc.createElement("menulist") + menupopup = doc.createElement("menupopup") + for item in pref["options"]: + menuitem = doc.createElement("menuitem") + menuitem.setAttribute("value", item["value"]) + menuitem.setAttribute("label", item["label"]) + menupopup.appendChild(menuitem) + menulist.appendChild(menupopup) + setting.appendChild(menulist) + elif (pref["type"] == "radio"): + radiogroup = doc.createElement("radiogroup") + for item in pref["options"]: + radio = doc.createElement("radio") + radio.setAttribute("value", item["value"]) + radio.setAttribute("label", item["label"]) + radiogroup.appendChild(radio) + setting.appendChild(radiogroup) + + root.appendChild(setting) + + return doc.toprettyxml(indent=" ") |