kopia lustrzana https://github.com/c9/core
220 wiersze
7.4 KiB
JavaScript
220 wiersze
7.4 KiB
JavaScript
define(function(require, exports, module) {
|
|
main.consumes = [
|
|
"Plugin", "ui", "tabManager"
|
|
];
|
|
main.provides = ["terminal.monitor.message_view"];
|
|
return main;
|
|
|
|
function main(options, imports, register) {
|
|
var ui = imports.ui;
|
|
var Plugin = imports.Plugin;
|
|
var tabManager = imports.tabManager;
|
|
|
|
/***** Initialization *****/
|
|
|
|
var plugin = new Plugin("Ajax.org", main.consumes);
|
|
var handleEmit = plugin.getEmitter();
|
|
var css = require("text!./message_view.css");
|
|
var html = require("text!./message_view.html");
|
|
|
|
var messageStack = [];
|
|
|
|
var loaded = false;
|
|
function load() {
|
|
if (loaded) return false;
|
|
loaded = true;
|
|
|
|
// Load CSS
|
|
ui.insertCss(css, null, plugin);
|
|
|
|
tabManager.on("tabAfterActivateSync", function() {
|
|
toggleMessages();
|
|
});
|
|
tabManager.on("tabAfterClose", function(e) {
|
|
messageStack = messageStack.filter(function(msg) {
|
|
if (e.tab !== msg.tab)
|
|
return true;
|
|
hide(msg, true);
|
|
return false;
|
|
});
|
|
});
|
|
}
|
|
|
|
function handleClick(e) {
|
|
switch (e.target.getAttribute("data-type")) {
|
|
case "preview":
|
|
handlePreview(e);
|
|
default:
|
|
messageStack.some(function(msg) {
|
|
if (msg.domNode.contains(e.target)) hide(msg);
|
|
});
|
|
}
|
|
}
|
|
|
|
function handlePreview(e) {
|
|
e.preventDefault();
|
|
tabManager.open({
|
|
editorType: "preview",
|
|
active: true,
|
|
document: {
|
|
preview: {
|
|
path: e.target.innerText
|
|
}
|
|
}
|
|
}, function(err, tab) {});
|
|
}
|
|
|
|
function isAlreadyShowingMessage(messages, text) {
|
|
return messages.some(function(message) {
|
|
return message.text == text;
|
|
});
|
|
}
|
|
|
|
function toggleMessages() {
|
|
messageStack.forEach(function(message) {
|
|
if (message.tab.active) {
|
|
message.domNode.style.display = 'table';
|
|
} else {
|
|
message.domNode.style.display = 'none';
|
|
}
|
|
});
|
|
}
|
|
|
|
function showMessage(message) {
|
|
var messageNode = message.domNode;
|
|
var referenceNode = message.tab.editor.container;
|
|
var messageContainer = createMessageContainer(referenceNode);
|
|
messageContainer.insertBefore(messageNode, messageContainer.firstChild);
|
|
message.timeStamp = Date.now();
|
|
|
|
messageNode.style.display = message.tab.active ? 'table' : 'none';
|
|
setTimeout(function() {
|
|
messageNode.style.opacity = 1;
|
|
});
|
|
}
|
|
|
|
function createMessageContainer(referenceNode) {
|
|
var messageContainer = referenceNode.querySelector('.ace_editor>.terminal_monitor_messageContainer');
|
|
if (messageContainer)
|
|
return messageContainer;
|
|
|
|
messageContainer = document.createElement('div');
|
|
messageContainer.className = 'terminal_monitor_messageContainer';
|
|
var aceContainer = referenceNode.querySelector('.ace_editor');
|
|
aceContainer.addEventListener('keydown', function onKeydown(e) {
|
|
var lastMessage;
|
|
for (var i = messageStack.length; i--;) {
|
|
var message = messageStack[i];
|
|
if (message.domNode.parentNode == messageContainer && message.tab.active) {
|
|
lastMessage = message;
|
|
break;
|
|
}
|
|
}
|
|
if (!lastMessage)
|
|
return;
|
|
if (e.keyCode == 27 || e.timeStamp - lastMessage.timeStamp > 30000) {
|
|
hide(lastMessage);
|
|
messageStack = messageStack.filter(function(msg) {
|
|
return msg.domNode.parentNode;
|
|
});
|
|
}
|
|
if (!messageContainer.children.length) {
|
|
aceContainer.removeEventListener('keydown', onKeydown, true);
|
|
messageContainer.parentNode.removeChild(messageContainer);
|
|
}
|
|
}, true);
|
|
aceContainer.appendChild(messageContainer);
|
|
return messageContainer;
|
|
}
|
|
|
|
function createMessageNode(text) {
|
|
var messageNode = ui.insertHtml(null, html, plugin)[0];
|
|
var contentNode = messageNode.querySelector(".message");
|
|
contentNode.innerHTML = text;
|
|
contentNode.onclick = handleClick;
|
|
return messageNode;
|
|
}
|
|
|
|
function setupMessageAction(message, action) {
|
|
if (!action)
|
|
return;
|
|
|
|
var actionNode = message.domNode.querySelector(".cmd");
|
|
var caption = message.domNode.querySelector(".caption");
|
|
caption.innerHTML = action.label;
|
|
actionNode.style.display = 'table';
|
|
actionNode.onclick = function() {
|
|
caption.innerHTML = "Please wait...";
|
|
handleEmit('action', action.cmd, message);
|
|
};
|
|
}
|
|
|
|
function setupCloseHandler(message) {
|
|
var closeNode = message.domNode.querySelector('.close');
|
|
closeNode.onclick = function() {
|
|
hide(message);
|
|
};
|
|
}
|
|
|
|
function repositionMessages(tab) {
|
|
var messages = messageStack.filter(function(message) {
|
|
return message.tab == tab;
|
|
});
|
|
|
|
messages.forEach(function(message) {
|
|
showMessage(message);
|
|
});
|
|
}
|
|
|
|
function show(text, action, tab) {
|
|
if (!tab)
|
|
return;
|
|
|
|
var messages = messageStack.filter(function(message) {
|
|
return message.tab == tab;
|
|
});
|
|
|
|
if (isAlreadyShowingMessage(messages, text))
|
|
return;
|
|
|
|
var message = {
|
|
tab: tab,
|
|
domNode: createMessageNode(text),
|
|
action: action,
|
|
text: text
|
|
};
|
|
|
|
setupMessageAction(message, action);
|
|
setupCloseHandler(message);
|
|
showMessage(message);
|
|
|
|
messageStack.push(message);
|
|
}
|
|
|
|
function hide(message, batch) {
|
|
var domNode = message.domNode;
|
|
if (domNode.parentNode)
|
|
domNode.parentNode.removeChild(domNode);
|
|
|
|
if (batch) return;
|
|
messageStack = messageStack.filter(function(msg) {
|
|
return msg.domNode != message.domNode;
|
|
});
|
|
}
|
|
|
|
plugin.on("load", function() {
|
|
load();
|
|
});
|
|
|
|
plugin.freezePublicAPI({
|
|
show: show,
|
|
hide: hide,
|
|
repositionMessages: repositionMessages
|
|
});
|
|
|
|
register(null, {
|
|
"terminal.monitor.message_view": plugin
|
|
});
|
|
}
|
|
});
|