From: Michael Jumper Date: Thu, 19 Jan 2012 18:39:39 +0000 (-0800) Subject: Refactor XML parse, use getElement() instead of overriding DOM. X-Git-Url: http://git.alex.org.uk Refactor XML parse, use getElement() instead of overriding DOM. --- diff --git a/src/main/resources/oskeyboard.js b/src/main/resources/oskeyboard.js index 573b01b..84f930c 100644 --- a/src/main/resources/oskeyboard.js +++ b/src/main/resources/oskeyboard.js @@ -48,458 +48,145 @@ var Guacamole = Guacamole || {}; */ Guacamole.OnScreenKeyboard = function(url) { - var allKeys = new Array(); - var modifierState = new function() {}; + // For each child of element, call handler defined in next + function parseChildren(element, next) { - function getKeySize(size) { - return (5*size) + "ex"; - } - - function getCapSize(size) { - return (5*size - 0.5) + "ex"; - } + var children = root.childNodes; + for (var i=0; i 0) - return true; - - return false; - } - - function toggleModifierPressed(modifier) { - if (isModifierActive(modifier)) - setModifierReleased(modifier); - else - setModifierPressed(modifier); - } - - function refreshAllKeysState() { - for (var k=0; k= 0x0000 && charCode <= 0x00FF) - keysym = charCode; + // Create keyboard + var keyboard = document.createElement("div"); + keyboard.className = "keyboard"; - else if (charCode >= 0x0100 && charCode <= 0x10FFFF) - keysym = 0x01000000 | charCode; - } + // Retrieve keyboard XML + var xmlhttprequest = new XMLHttpRequest(); + xmlhttprequest.open("GET", url, false); + xmlhttprequest.send(null); - // Required modifiers for this keycap - var reqMod = null; - if (cap.attributes["if"]) - reqMod = cap.attributes["if"].value.split(","); + var xml = xmlhttprequest.responseXML; + if (xml) { - // Modifier represented by this keycap - var modifier = null; - if (cap.attributes["modifier"]) - modifier = cap.attributes["modifier"].value; + function parse_row(e) { + var row = document.createElement("div"); + row.className = "row"; + + parseChildren(e, { + + "column": function(e) { + row.appendChild(parse_column(e)); + }, + + "gap": function parse_gap(e) { + + // Get attributes + var gap_size = e.attributes["size"]; + + // Create element + var gap = document.createElement("div"); + gap.className = "gap"; + gap.textContent = " "; + + if (gap_size) + gap.style.width = gap.style.height = + parseFloat(gap_size.value) + "em"; + + }, + + "key": function parse_key(e) { + + // Get attributes + var key_size = e.attributes["size"]; + + parseChildren(e, { + "cap": function cap(e) { + + // Get attributes + var required = e.attributes["if"]; + var modifier = e.attributes["modifier"]; + var keysym = e.attributes["keysym"]; + var sticky = e.attributes["sticky"]; + - // Whether this key is sticky (toggles) - // Currently only valid for modifiers. - var sticky = false; - if (cap.attributes["sticky"] && cap.attributes["sticky"].value == "true") - sticky = true; - - this.getDisplayText = function() { - return displayText; - }; - - this.getKeySym = function() { - return keysym; - }; - - this.getRequiredModifiers = function() { - return reqMod; - }; - - this.getModifier = function() { - return modifier; - }; - - this.isSticky = function() { - return sticky; - }; - - } - - var size = null; - if (key.attributes["size"]) - size = parseFloat(key.attributes["size"].value); - - var caps = key.getElementsByTagName("cap"); - var keycaps = new Array(); - for (var i=0; i can contain or - if (child.tagName == "key") { - var key = new Key(child); - keyboardRow.appendChild(key); - allKeys.push(key); - } - else if (child.tagName == "gap") { - var gap = new Gap(child); - keyboardRow.appendChild(gap); - } - else if (child.tagName == "column") { - var col = new Column(child); - keyboardRow.appendChild(col); - } - - } - - return keyboardRow; - - } - - function Column(col) { - - var keyboardCol = document.createElement("div"); - keyboardCol.className = "col"; - - var align = null; - if (col.attributes["align"]) - align = col.attributes["align"].value; - - var children = col.childNodes; - for (var j=0; j can only contain - if (child.tagName == "row") { - var row = new Row(child); - keyboardCol.appendChild(row); - } + return col; } - if (align) - keyboardCol.style.textAlign = align; - - return keyboardCol; - - } - - - - // Create keyboard - var keyboard = document.createElement("div"); - keyboard.className = "keyboard"; - - - // Retrieve keyboard XML - var xmlhttprequest = new XMLHttpRequest(); - xmlhttprequest.open("GET", url, false); - xmlhttprequest.send(null); - - var xml = xmlhttprequest.responseXML; - - if (xml) { // Parse document - var root = xml.documentElement; - if (root) { - - var children = root.childNodes; - for (var i=0; i can contain or - if (child.tagName == "row") { - keyboard.appendChild(new Row(child)); - } - else if (child.tagName == "column") { - keyboard.appendChild(new Column(child)); - } - - } + parseChildren(xml.documentElement, { + + "keyboard": function parse_keyboard(e) { + + // Get attributes + var keyboard_size = e.attributes["size"]; + + parseChildren(e, { + + "row": function(e) { + keyboard.appendChild(parse_row(e)); + }, + + "column": function(e) { + keyboard.appendChild(parse_column(e)); + } + + }); - } + } // end keyboard + + }); } - var keyPressedHandler = null; - var keyReleasedHandler = null; - - keyboard.setKeyPressedHandler = function(kh) { keyPressedHandler = kh; }; - keyboard.setKeyReleasedHandler = function(kh) { keyReleasedHandler = kh; }; - // Do not allow selection or mouse movement to propagate/register. keyboard.onselectstart = keyboard.onmousemove = @@ -510,7 +197,53 @@ Guacamole.OnScreenKeyboard = function(url) { return false; }; - return keyboard; + + this.onkeypressed = null; + this.onkeyreleased = null; + + this.getElement = function() { + return keyboard; + }; }; +Guacamole.OnScreenKeyboard.Key = function() { + + /** + * Width of the key, relative to the size of the keyboard. + */ + this.size = 1; + + /** + * Whether this key is currently pressed. + */ + this.pressed = false; + + /** + * An associative map of all caps by modifier. + */ + this.caps = {}; + +} + +Guacamole.OnScreenKeyboard.Cap = function(text, keycode, modifier) { + + /** + * Modifier represented by this keycap + */ + this.modifier = 0; + + /** + * The text to be displayed within this keycap + */ + this.text = text; + + /** + * The keycode this cap sends when its associated key is pressed/released + */ + this.keycode = keycode; + + // Set modifier if provided + if (modifier) this.modifier = modifier; + +}