/** * Copyright JS Foundation and other contributors, http://js.foundation * * 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.commandPrompt = (function() { var disabled = false; var dialog = null; var searchInput; var searchResults; var selected = -1; var visible = false; var results = []; var scopes = {}; function search(val) { scopes = {}; results = []; selected = -1; val = val ||""; searchResults.editableList('empty'); var actions = RED.actions.list(); actions.sort(function(A,B) { return A.id.localeCompare(B.id); }); val = val.trim().toLowerCase(); actions.forEach(function(action) { action.label = action.id.replace(/:/,": ").replace(/-/g," ").replace(/(^| )./g,function() { return arguments[0].toUpperCase()}); if (val !== "" && action.label.toLowerCase().indexOf(val) === -1) { return; } results.push(action); searchResults.editableList('addItem',action) }) } function ensureSelectedIsVisible() { var selectedEntry = searchResults.find("li.selected"); if (selectedEntry.length === 1) { var scrollWindow = searchResults.parent(); var scrollHeight = scrollWindow.height(); var scrollOffset = scrollWindow.scrollTop(); var y = selectedEntry.position().top; var h = selectedEntry.height(); if (y+h > scrollHeight) { scrollWindow.animate({scrollTop: '-='+(scrollHeight-(y+h)-10)},50); } else if (y<0) { scrollWindow.animate({scrollTop: '+='+(y-10)},50); } } } function createDialog() { dialog = $("
",{id:"red-ui-commandPrompt",class:"red-ui-search"}).appendTo("#red-ui-main-container"); var searchDiv = $("
",{class:"red-ui-search-container"}).appendTo(dialog); searchInput = $('').appendTo(searchDiv).searchBox({ delay: 200, change: function() { search($(this).val()); } }); searchInput.on('keydown',function(evt) { var children; if (results.length > 0) { if (evt.keyCode === 40) { // Down children = searchResults.children(); if (selected < children.length-1) { if (selected > -1) { $(children[selected]).removeClass('selected'); } selected++; } $(children[selected]).addClass('selected'); ensureSelectedIsVisible(); evt.preventDefault(); } else if (evt.keyCode === 38) { // Up children = searchResults.children(); if (selected > 0) { if (selected < children.length) { $(children[selected]).removeClass('selected'); } selected--; } $(children[selected]).addClass('selected'); ensureSelectedIsVisible(); evt.preventDefault(); } else if (evt.keyCode === 13) { // Enter if (results.length > 0) { selectCommand(results[Math.max(0,selected)]); } } } }); searchInput.i18n(); var searchResultsDiv = $("
",{class:"red-ui-search-results-container"}).appendTo(dialog); searchResults = $('
    ',{style:"position: absolute;top: 5px;bottom: 5px;left: 5px;right: 5px;"}).appendTo(searchResultsDiv).editableList({ addButton: false, addItem: function(container,i,action) { if (action.id === undefined) { $('
    ',{class:"red-ui-search-empty"}).text(RED._('search.empty')).appendTo(container); } else { var div = $('',{href:'#',class:"red-ui-search-result"}).appendTo(container); var contentDiv = $('
    ',{class:"red-ui-search-result-action"}).appendTo(div); $('
    ').text(action.label).appendTo(contentDiv); // $('
    ',{class:"red-ui-search-result-node-type"}).text(node.type).appendTo(contentDiv); // $('
    ',{class:"red-ui-search-result-node-id"}).text(node.id).appendTo(contentDiv); if (action.key) { $('
    ',{class:"red-ui-search-result-action-key"}).html(RED.keyboard.formatKey(action.key)).appendTo(contentDiv); } div.on("click", function(evt) { evt.preventDefault(); selectCommand(action); }); } }, scrollOnAdd: false }); } function selectCommand(command) { hide(); RED.actions.invoke(command.id); } function show(v) { if (disabled) { return; } if (!visible) { RED.keyboard.add("*","escape",function(){hide()}); $("#red-ui-header-shade").show(); $("#red-ui-editor-shade").show(); $("#red-ui-palette-shade").show(); $("#red-ui-sidebar-shade").show(); $("#red-ui-sidebar-separator").hide(); if (dialog === null) { createDialog(); } dialog.slideDown(300); searchInput.searchBox('value',v) search(v); RED.events.emit("commandPrompt:open"); visible = true; } searchInput.trigger("focus"); } function hide() { if (visible) { RED.keyboard.remove("escape"); visible = false; $("#red-ui-header-shade").hide(); $("#red-ui-editor-shade").hide(); $("#red-ui-palette-shade").hide(); $("#red-ui-sidebar-shade").hide(); $("#red-ui-sidebar-separator").show(); if (dialog !== null) { dialog.slideUp(200,function() { searchInput.searchBox('value',''); }); } RED.events.emit("commandPrompt:close"); } } function init() { RED.actions.add("core:show-command-prompt",show); RED.events.on("editor:open",function() { disabled = true; }); RED.events.on("editor:close",function() { disabled = false; }); RED.events.on("search:open",function() { disabled = true; }); RED.events.on("search:close",function() { disabled = false; }); RED.events.on("type-search:open",function() { disabled = true; }); RED.events.on("type-search:close",function() { disabled = false; }); $("#red-ui-header-shade").on('mousedown',hide); $("#red-ui-editor-shade").on('mousedown',hide); $("#red-ui-palette-shade").on('mousedown',hide); $("#red-ui-sidebar-shade").on('mousedown',hide); } return { init: init, show: show, hide: hide }; })();