/**
* Copyright 2013 IBM Corp.
*
* 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.
**/
RED.keyboard = (function() {
var handlers = {};
function resolveKeyEvent(evt) {
var slot = handlers;
if (evt.ctrlKey || evt.metaKey) {
slot = slot.ctrl;
}
if (slot && evt.shiftKey) {
slot = slot.shift;
}
if (slot && evt.altKey) {
slot = slot.alt;
}
if (slot && slot[evt.keyCode]) {
var handler = slot[evt.keyCode];
if (handler.scope && handler.scope !== "*") {
var target = evt.target;
while (target.nodeName !== 'BODY' && target.id !== handler.scope) {
target = target.parentElement;
}
if (target.nodeName === 'BODY') {
handler = null;
}
}
return handler;
}
}
d3.select(window).on("keydown",function() {
var handler = resolveKeyEvent(d3.event);
if (handler && handler.ondown) {
handler.ondown();
}
});
d3.select(window).on("keyup",function() {
var handler = resolveKeyEvent(d3.event);
if (handler && handler.onup) {
handler.onup();
}
});
function addHandler(scope,key,modifiers,ondown,onup) {
var mod = modifiers;
var cbdown = ondown;
var cbup = onup;
if (typeof modifiers == "function") {
mod = {};
cbdown = modifiers;
cbup = ondown;
}
var slot = handlers;
if (mod.ctrl) {
slot.ctrl = slot.ctrl||{};
slot = slot.ctrl;
}
if (mod.shift) {
slot.shift = slot.shift||{};
slot = slot.shift;
}
if (mod.alt) {
slot.alt = slot.alt||{};
slot = slot.alt;
}
slot[key] = {scope: scope, ondown:cbdown, onup:cbup};
}
function removeHandler(key,modifiers) {
var mod = modifiers || {};
var slot = handlers;
if (mod.ctrl) {
slot = slot.ctrl;
}
if (slot && mod.shift) {
slot = slot.shift;
}
if (slot && mod.alt) {
slot = slot.alt;
}
if (slot) {
delete slot[key];
}
}
var dialog = null;
function showKeyboardHelp() {
if (!RED.settings.theme("menu.menu-item-keyboard-shortcuts",true)) {
return;
}
if (!dialog) {
dialog = $('
'+
'
'+
'
'+
'Ctrl/⌘ + a | '+RED._("keyboard.selectAll")+' |
'+
'Shift + Click | '+RED._("keyboard.selectAllConnected")+' |
'+
'Ctrl/⌘ + Click | '+RED._("keyboard.addRemoveNode")+' |
'+
' | |
'+
'Enter | '+RED._("keyboard.editSelected")+' |
'+
'Delete / Backspace | '+RED._("keyboard.deleteSelected")+' |
'+
' | |
'+
'Ctrl/⌘ + i | '+RED._("keyboard.importNode")+' |
'+
'Ctrl/⌘ + e | '+RED._("keyboard.exportNode")+' |
'+
'
'+
'
'+
'
'+
'
'+
'Ctrl/⌘ + Space | '+RED._("keyboard.toggleSidebar")+' |
'+
'Ctrl/⌘ + . | '+RED._("keyboard.searchBox")+' |
'+
'Ctrl/⌘ + Shift + p | '+RED._("keyboard.managePalette")+' |
'+
' | |
'+
'← ↑ → ↓ | '+RED._("keyboard.nudgeNode")+' |
'+
'Shift + ← ↑ → ↓ | '+RED._("keyboard.moveNode")+' |
'+
' | |
'+
'Ctrl/⌘ + c | '+RED._("keyboard.copyNode")+' |
'+
'Ctrl/⌘ + x | '+RED._("keyboard.cutNode")+' |
'+
'Ctrl/⌘ + v | '+RED._("keyboard.pasteNode")+' |
'+
'Ctrl/⌘ + z | '+RED._("keyboard.undoChange")+' |
'+
'
'+
'
'+
'
')
.appendTo("body")
.dialog({
modal: true,
autoOpen: false,
width: "800",
title:"Keyboard shortcuts",
resizable: false
});
}
dialog.dialog("open");
}
return {
add: addHandler,
remove: removeHandler,
showHelp: showKeyboardHelp
}
})();