diff --git a/web/gui/src/main/webapp/app/fw/lib/fn.js b/web/gui/src/main/webapp/app/fw/lib/fn.js new file mode 100644 index 0000000000..15a88438c5 --- /dev/null +++ b/web/gui/src/main/webapp/app/fw/lib/fn.js @@ -0,0 +1,42 @@ +/* + * Copyright 2014 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + ONOS GUI -- General Purpose Functions + + @author Simon Hunt + */ +(function (onos) { + 'use strict'; + + onos.factory('FnService', [function () { + return { + isF: function (f) { + return $.isFunction(f) ? f : null; + }, + isA: function (a) { + return $.isArray(a) ? a : null; + }, + isS: function (s) { + return typeof s === 'string' ? s : null; + }, + isO: function (o) { + return $.isPlainObject(o) ? o : null; + } + }; + }]); + +}(ONOS)); diff --git a/web/gui/src/main/webapp/app/fw/lib/keys.js b/web/gui/src/main/webapp/app/fw/lib/keys.js new file mode 100644 index 0000000000..3c0a26a0e3 --- /dev/null +++ b/web/gui/src/main/webapp/app/fw/lib/keys.js @@ -0,0 +1,158 @@ +/* + * Copyright 2014 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + ONOS GUI -- Key Handler Service + + @author Simon Hunt + */ +(function (onos) { + 'use strict'; + + // references to injected services + var f; + + // internal state + var keyHandler = { + globalKeys: {}, + maskedKeys: {}, + viewKeys: {}, + viewFn: null, + viewGestures: [] + }, + theme = 'light'; + + // TODO: we need to have the concept of view token here.. + function getViewToken() { + return 'NotYetAViewToken'; + } + + function whatKey(code) { + switch (code) { + case 13: return 'enter'; + case 16: return 'shift'; + case 17: return 'ctrl'; + case 18: return 'alt'; + case 27: return 'esc'; + case 32: return 'space'; + case 37: return 'leftArrow'; + case 38: return 'upArrow'; + case 39: return 'rightArrow'; + case 40: return 'downArrow'; + case 91: return 'cmdLeft'; + case 93: return 'cmdRight'; + case 187: return 'equals'; + case 189: return 'dash'; + case 191: return 'slash'; + case 192: return 'backQuote'; + case 220: return 'backSlash'; + default: + if ((code >= 48 && code <= 57) || + (code >= 65 && code <= 90)) { + return String.fromCharCode(code); + } else if (code >= 112 && code <= 123) { + return 'F' + (code - 111); + } + return '.'; + } + } + + function keyIn() { + var event = d3.event, + keyCode = event.keyCode, + key = whatKey(keyCode), + kh = keyHandler, + gk = kh.globalKeys[key], + gcb = f.isF(gk) || (f.isA(gk) && f.isF(gk[0])), + vk = kh.viewKeys[key], + vcb = f.isF(vk) || (f.isA(vk) && f.isF(vk[0])) || f.isF(kh.viewFn), + token = getViewToken(); + + // global callback? + if (gcb && gcb(token, key, keyCode, event)) { + // if the event was 'handled', we are done + return; + } + // otherwise, let the view callback have a shot + if (vcb) { + vcb(token, key, keyCode, event); + } + } + + function setupGlobalKeys() { + $.extend(keyHandler, { + globalKeys: { + backSlash: [quickHelp, 'Show / hide Quick Help'], + slash: [quickHelp, 'Show / hide Quick Help'], + esc: [escapeKey, 'Dismiss dialog or cancel selections'], + T: [toggleTheme, "Toggle theme"] + }, + globalFormat: ['backSlash', 'slash', 'esc', 'T'], + + // Masked keys are global key handlers that always return true. + // That is, the view will never see the event for that key. + maskedKeys: { + slash: true, + backSlash: true, + T: true + } + }); + } + + function quickHelp(view, key, code, ev) { + // TODO: show quick help + //libApi.quickHelp.show(keyHandler); + console.log('QUICK-HELP'); + return true; + } + + function escapeKey(view, key, code, ev) { + // TODO: plumb in handling of alerts and quick help dismissal +/* + if (alerts.open) { + closeAlerts(); + return true; + } + if (libApi.quickHelp.hide()) { + return true; + } +*/ + console.log('ESCAPE'); + return false; + } + + function toggleTheme(view, key, code, ev) { + var body = d3.select('body'); + theme = (theme === 'light') ? 'dark' : 'light'; + body.classed('light dark', false); + body.classed(theme, true); + // TODO: emit theme-change event to current view... + //theme(view); + return true; + } + + onos.factory('KeyService', ['FnService', function (fs) { + f = fs; + return { + init: function () { + console.log('initializing keydown handler....'); + d3.select('body').on('keydown', keyIn); + setupGlobalKeys(); + } + }; + }]); + +}(ONOS)); diff --git a/web/gui/src/main/webapp/app/index.html b/web/gui/src/main/webapp/app/index.html index d820b96867..608485436e 100644 --- a/web/gui/src/main/webapp/app/index.html +++ b/web/gui/src/main/webapp/app/index.html @@ -27,13 +27,13 @@ - - - + + + @@ -50,16 +50,18 @@ -
+
+
-
+
-
-
-
-
-
+
+
+
+
+
+
diff --git a/web/gui/src/main/webapp/app/onos.js b/web/gui/src/main/webapp/app/onos.js index ea2925649c..631464bbef 100644 --- a/web/gui/src/main/webapp/app/onos.js +++ b/web/gui/src/main/webapp/app/onos.js @@ -19,13 +19,17 @@ @author Simon Hunt */ + +// our one global variable +var ONOS; + (function () { 'use strict'; - angular.module('onosApp', ['onosMast']) - .controller('OnosCtrl', [function () { - // controller logic here + ONOS = angular.module('onosApp', ['onosMast']) + .controller('OnosCtrl', ['KeyService', function (ks) { console.log('OnosCtrl has been created'); + ks.init(); }]); }());