cloudcmd/lib/client/edit.js
2015-02-17 10:35:41 -05:00

244 lines
7.5 KiB
JavaScript

var CloudCmd, Util, DOM, CloudFunc, MenuIO, Format, edward;
(function(CloudCmd, Util, DOM) {
'use strict';
CloudCmd.Edit = EditProto;
function EditProto(callback) {
var Name = 'Edit',
Loading = true,
Info = DOM.CurrentInfo,
exec = Util.exec,
Edit = this,
Menu,
Images = DOM.Images,
MSG_CHANGED,
Element,
ConfigView = {
beforeClose: function() {
isChanged();
exec.ifExist(Menu, 'hide');
},
afterShow: function() {
edward
.clearSelection()
.moveCursorTo(0, 0)
.focus();
}
};
function init(callback) {
var element = createElement();
element.addEventListener('contextmenu', setMenu);
exec.series([
CloudCmd.View,
function(callback) {
loadFiles(element, callback);
},
function(callback) {
Edit.create(element)
.show(callback);
}, callback]);
}
function createElement() {
var element = DOM.load({
name : 'div',
style :
'width : 100%;' +
'height : 100%;' +
'font : 16px "Droid Sans Mono";' +
'position : absolute;',
notAppend : true
});
return element;
}
this.show = function(callback) {
var isDir = Info.isDir,
name = Info.name,
path = Info.path;
Images.show.load();
setMsgChanged(name);
if (callback)
ConfigView.beforeShow = callback;
if (isDir)
edward.setMode('json');
else
edward.setModeForPath(name);
Info.getData(function(error, data) {
if (error) {
alert(error);
} else {
edward.setValueFirst(path, data);
CloudCmd.View.show(Element, ConfigView);
}
});
return this;
};
this.hide = function() {
CloudCmd.View.hide();
};
this.create = function(element) {
Element = element;
edward.on('save', function(value) {
var size = Format.size(value);
DOM.setCurrentSize(size);
});
edward.addCommand({
name : 'hide',
bindKey : { win: 'Esc', mac: 'Esc' },
exec : function () {
Edit.hide();
}
});
edward.addCommand({
name : 'goToLine',
bindKey : { win: 'Ctrl-G', mac: 'Command-G' },
exec : function () {
edward.goToLine();
}
});
edward.addCommand({
name : 'save',
bindKey : { win: 'Ctrl-S', mac: 'Command-S' },
exec : function() {
edward.save();
}
});
edward.addCommand({
name : 'saveMC',
bindKey : { win: 'F2', mac: 'F2' },
exec : function() {
edward.save();
}
});
edward.addCommand({
name : 'beautify',
bindKey : { win: 'Ctrl-B', mac: 'Command-B' },
exec : function() {
edward.beautify();
}
});
edward.addCommand({
name : 'minify',
bindKey : { win: 'Ctrl-M', mac: 'Command-M' },
exec : function() {
edward.minify();
}
});
return this;
};
function loadFiles(element, callback) {
var url = '/edward/edward.js';
Util.time(Name + ' load');
DOM.load.js(url, function() {
var options = {
maxSize : CloudFunc.MAX_FILE_SIZE
};
Loading = false;
edward(element, options, function() {
Util.timeEnd(Name + ' load');
exec(callback);
});
});
}
function setMenu() {
if (!Menu) {
DOM.loadRemote('menu', function(error) {
var position = CloudCmd.MousePosition,
options = {
beforeShow: function(params) {
params.x -= 18;
params.y -= 27;
},
afterClick: function() {
edward.focus();
}
},
menuData = {
'Save Ctrl+S' : function() {
edward.save();
},
'Go To Line Ctrl+G' : function() {
edward.goToLine();
},
'Select All Ctrl+A' : function() {
edward.selectAll();
},
'Delete Del' : function() {
edward.remove('right');
},
'Beautify Ctrl+B' : function() {
edward.beautify();
},
'Minify Ctrl+M' : function() {
edward.minify();
},
'Close Esc' : function() {
Edit.hide();
}
};
if (error) {
alert(error);
} else if (!Menu) {
Menu = new MenuIO(Element, options, menuData);
Menu.show(position.x, position.y);
Element.removeEventListener('contextmenu', setMenu);
}
});
}
}
function setMsgChanged(name) {
var msg = 'Do you want to save changes to ' + name + '?';
MSG_CHANGED = msg;
}
function isChanged() {
var is = edward.isChanged();
if (is) {
is = confirm(MSG_CHANGED);
if (is)
edward.save();
}
}
init(callback);
}
})(CloudCmd, Util, DOM, CloudFunc);