c9-core/plugins/c9.ide.ui/widgets.list.js

619 wiersze
22 KiB
JavaScript
Czysty Zwykły widok Historia

2015-02-17 02:48:36 +00:00
define(function(require, exports, module) {
2015-02-18 19:16:02 +00:00
main.consumes = ["Plugin", "ui", "util"];
2015-02-17 03:05:32 +00:00
main.provides = ["List"];
2015-02-17 02:48:36 +00:00
return main;
function main(options, imports, register) {
var Plugin = imports.Plugin;
2015-02-17 21:27:47 +00:00
var ui = imports.ui;
2015-02-18 19:16:02 +00:00
var util = imports.util;
2015-02-17 02:48:36 +00:00
var AceTree = require("ace_tree/tree");
var AceTreeEditor = require("ace_tree/edit");
var ListModel = require("ace_tree/list_data");
2015-02-17 18:07:44 +00:00
var TreeModel = require("ace_tree/data_provider");
2015-02-18 19:16:02 +00:00
var search = require("../c9.ide.navigate/search");
2015-02-17 02:48:36 +00:00
ListModel.prototype.getEmptyMessage = function(){
return this.emptyMessage || "";
};
2015-02-17 21:27:47 +00:00
ui.on("load", function(){
ui.insertCss(require("text!./widgets.less"), options.staticPrefix, ui);
2015-02-17 21:27:47 +00:00
});
2015-02-17 02:48:36 +00:00
/***** Constructors *****/
function List(options, forPlugin, baseclass) {
if (!options) throw new Error("options are required");
var plugin = new Plugin("Ajax.org", main.consumes);
2015-02-17 06:23:35 +00:00
var emit = plugin.getEmitter();
2015-02-17 02:48:36 +00:00
if (baseclass) plugin.baseclass();
var acetree;
var model;
var redirectEvents;
var filterRoot;
2015-02-17 02:48:36 +00:00
var meta = {};
2015-02-18 06:07:10 +00:00
var dataType = options.model ? "object" : options.dataType;
2015-02-17 04:11:06 +00:00
var excludedEvents = {
2015-02-17 06:23:35 +00:00
"draw": 1, "load":1, "unload":1,
"addListener":1, "removeListener":1
2015-02-17 04:11:06 +00:00
};
2015-02-18 06:07:10 +00:00
var renameEvents = {
"select": "changeSelection",
"afterRename": "rename",
"scroll": "changeScrollTop"
};
2015-02-17 06:23:35 +00:00
var drawn = false;
function draw(htmlNode) {
if (drawn) return;
drawn = true;
acetree = new AceTree(htmlNode);
2015-02-18 06:07:10 +00:00
model = options.model || (dataType === "object"
2015-02-17 18:07:44 +00:00
? new TreeModel()
: new ListModel());
2015-02-18 19:16:02 +00:00
model.filterCaseInsensitive = true;
2015-03-31 22:17:41 +00:00
model.$sortNodes = false;
2015-02-17 02:48:36 +00:00
2015-02-18 06:07:10 +00:00
if (!options.rowHeight)
options.rowHeight = 23;
2015-02-17 21:27:47 +00:00
// Set Default Theme
if (!options.theme)
2015-02-18 06:07:10 +00:00
options.theme = "custom-tree ace-tree-" + (options.baseName || "list");
2015-02-17 21:27:47 +00:00
2015-02-17 02:48:36 +00:00
// Set model
acetree.setDataProvider(model);
// Set properties
for (var prop in options) {
if (prop == "container") continue;
if (plugin.hasOwnProperty(prop))
2015-02-17 04:11:06 +00:00
plugin[prop] = options[prop];
2015-02-17 02:48:36 +00:00
}
// Configure redirected events
redirectEvents = {
2015-02-17 04:11:06 +00:00
scroll: model,
2015-02-17 02:48:36 +00:00
scrollbarVisibilityChanged: acetree.renderer,
afterRender: acetree.renderer,
2015-02-17 02:48:36 +00:00
resize: acetree.renderer,
2015-08-24 02:12:18 +00:00
afterRender: acetree.renderer,
2015-02-17 04:11:06 +00:00
expand: model,
2015-03-31 22:17:41 +00:00
collapse: model,
check: model,
uncheck: model
2015-02-17 02:48:36 +00:00
};
2015-02-17 06:23:35 +00:00
emit.sticky("draw");
}
2015-02-17 06:23:35 +00:00
plugin.on("load", function(){
if (options.container)
plugin.attachTo(options.container);
2015-02-18 06:07:10 +00:00
forPlugin.once("unload", function(){
plugin.unload();
});
2015-02-17 02:48:36 +00:00
});
plugin.on("unload", function(){
2015-02-17 04:11:06 +00:00
if (acetree) {
2015-02-17 06:23:35 +00:00
var container = acetree.container;
2015-02-17 04:11:06 +00:00
model.setRoot(null);
acetree.destroy();
2015-02-17 06:23:35 +00:00
container.innerHTML = "";
container.parentNode.removeChild(container);
2015-02-17 04:11:06 +00:00
}
2015-02-17 02:48:36 +00:00
meta = {};
});
plugin.on("newListener", function(type, fn){
if (excludedEvents[type]) return;
2015-02-18 06:07:10 +00:00
if (renameEvents[type])
type = renameEvents[type];
2015-02-17 02:48:36 +00:00
if (redirectEvents[type])
2015-02-17 04:11:06 +00:00
redirectEvents[type].on(type, fn);
2015-02-17 02:48:36 +00:00
else
acetree.on(type, fn);
});
plugin.on("removeListener", function(type, fn){
if (excludedEvents[type]) return;
2015-02-18 06:07:10 +00:00
if (renameEvents[type])
type = renameEvents[type];
2015-02-17 02:48:36 +00:00
if (redirectEvents[type])
2015-02-17 04:11:06 +00:00
redirectEvents[type].removeListener(type, fn);
2015-02-17 02:48:36 +00:00
else
acetree.removeListener(type, fn);
});
/**
2015-02-17 04:11:06 +00:00
*
2015-02-17 02:48:36 +00:00
*/
/**
* @constructor
* Creates a new List instance.
* @param {Object} options
* @param {Plugin} plugin The plugin responsible for creating this list.
*/
plugin.freezePublicAPI({
// Getter Properties
2015-02-17 18:07:44 +00:00
/**
* @ignore
* @readonly
*/
get acetree(){ return acetree; },
2015-02-17 02:48:36 +00:00
/**
* A meta data object that allows you to store whatever you want
* in relation to this menu.
* @property {Object} meta
* @readonly
*/
get meta(){ return meta; },
/**
*
*/
get model(){ return model; },
/**
*
*/
get selectedNodes(){
2015-02-18 06:07:10 +00:00
var sel = (acetree.selection.getSelectedNodes() || []);
return dataType == "object"
? sel
: sel.map(function(n){ return n.id; });
2015-02-17 02:48:36 +00:00
},
/**
*
*/
get selectedNode(){
2015-02-18 06:07:10 +00:00
var item = (acetree.selection.getCursor() || null);
return dataType == "object" ? item : item.id;
2015-02-17 02:48:36 +00:00
},
/**
*
*/
2015-02-18 19:16:02 +00:00
get root(){ return model.cachedRoot; },
2015-02-17 02:48:36 +00:00
/**
*
*/
2015-02-17 04:11:06 +00:00
get scrollTop(){ return model.getScrollTop(); },
2015-02-18 06:07:10 +00:00
set scrollTop(value){ return model.setScrollTop(value); },
2015-02-17 02:48:36 +00:00
/**
*
*/
get focussed(){ return acetree.isFocussed(); },
/**
*
*/
get container(){ return acetree.container; },
/**
*
*/
get renderer(){ return acetree.renderer; },
/**
*
*/
get selection(){ return acetree.selection; },
/**
*
*/
get commands(){ return acetree.commands; },
// Getters and Setters for Properties
/**
*
*/
get textInput(){ return acetree.textInput; },
set textInput(value){ return acetree.textInput = value; },
/**
*
*/
get emptyMessage(){ return model.emptyMessage; },
set emptyMessage(value){ model.emptyMessage = value; },
/**
*
*/
get scrollMargin(){ return acetree.renderer.scrollMargin; },
2015-02-17 18:56:11 +00:00
set scrollMargin(value){
acetree.renderer.setScrollMargin(value[0], value[1]);
},
2015-02-17 02:48:36 +00:00
/**
*
*/
get rowHeight(){ return model.rowHeight; },
set rowHeight(value){ model.rowHeight = value; },
/**
*
*/
get rowHeightInner(){ return model.rowHeightInner; },
set rowHeightInner(value){ model.rowHeightInner = value; },
/**
*
*/
get theme(){ return acetree.renderer.theme.cssClass; },
set theme(value){ acetree.renderer.setTheme({cssClass: value}); },
/**
*
*/
get animatedScroll(){ return acetree.getOption("animatedScroll"); },
set animatedScroll(value){ acetree.setOption("animatedScroll", value); },
/**
*
*/
get enableDragdrop(){ return acetree.getOption("enableDragDrop"); },
set enableDragdrop(value){ acetree.setOption("enableDragDrop", value); },
/**
*
*/
get enableRename(){ return acetree.edit ? true : false; },
set enableRename(value){
acetree.edit = value
? new AceTreeEditor(acetree)
: null;
},
2015-03-31 16:34:26 +00:00
/**
*
*/
get enableCheckboxes(){ return model.getCheckboxHTML ? true : false; },
2015-04-01 20:43:42 +00:00
set enableCheckboxes(value){
2015-03-31 16:34:26 +00:00
model.getCheckboxHTML = value
? function(node){
return "<span class='checkbox "
2015-03-31 22:17:41 +00:00
+ (node.isChecked == -1
? "half-checked "
: (node.isChecked ? "checked " : ""))
+ "'></span>";
2015-03-31 16:34:26 +00:00
}
: null;
if (value) {
acetree.commands.bindKey("Space", function(e) {
var nodes = acetree.selection.getSelectedNodes();
var node = acetree.selection.getCursor();
node.isChecked = !node.isChecked;
nodes.forEach(function(n){ n.isChecked = node.isChecked });
model._signal(node.isChecked ? "check" : "uncheck", nodes);
model._signal("change");
});
}
else {
2015-04-01 20:43:42 +00:00
acetree.commands.bindKey("Space", null);
}
2015-03-31 16:34:26 +00:00
},
2015-02-18 19:16:02 +00:00
/**
*
*/
get filterKeyword(){ return model.keyword; },
set filterKeyword(value){
model.keyword = value;
if (!model.keyword) {
filterRoot = null;
2015-02-18 19:16:02 +00:00
model.reKeyword = null;
model.setRoot(model.cachedRoot);
}
else {
model.reKeyword = new RegExp("("
+ util.escapeRegExp(model.keyword) + ")", 'i');
filterRoot = search.treeSearch(
model.cachedRoot.items || model.cachedRoot,
2015-02-18 19:16:02 +00:00
model.keyword, model.filterCaseInsensitive,
null, null, model.indexProperty);
model.setRoot(filterRoot);
2015-02-18 19:16:02 +00:00
}
},
/**
*
*/
get filterCaseInsensitive(){ return model.filterCaseInsensitive; },
set filterCaseInsensitive(value){ model.filterCaseInsensitive = value; },
/**
*
*/
get filterProperty(){ return model.filterProperty; },
set filterProperty(value){ model.filterProperty = value; },
2015-02-17 02:48:36 +00:00
/**
*
*/
get maxLines(){ return acetree.getOption("maxLines"); },
set maxLines(value){ acetree.setOption("maxLines", value); },
/**
*
*/
get minLines(){ return acetree.getOption("minLines"); },
set minLines(value){ acetree.setOption("minLines", value); },
/**
*
*/
get scrollSpeed(){ return acetree.getOption("scrollSpeed"); },
set scrollSpeed(value){ acetree.setOption("scrollSpeed", value); },
/**
*
*/
get wrapAround(){ return acetree.selection.$wrapAround; },
set wrapAround(value){ acetree.selection.$wrapAround = value; },
// Getters and Setters for Functions
/**
*
*/
get isLoading(){ return model.isLoading; },
set isLoading(fn){ model.isLoading = fn; },
/**
*
*/
get getEmptyMessage(){ return model.getEmptyMessage; },
set getEmptyMessage(fn){ model.getEmptyMessage = fn; },
/**
*
*/
get renderRow(){ return model.renderRow; },
2015-02-17 18:56:11 +00:00
set renderRow(fn){
model.renderRow = fn;
acetree.setDataProvider(model);
},
/**
*
*/
get getContentHTML(){ return model.getContentHTML; },
set getContentHTML(fn){ model.getContentHTML = fn; },
/**
*
*/
get getCaptionHTML(){ return model.getCaptionHTML; },
set getCaptionHTML(fn){ model.getCaptionHTML = fn; },
/**
*
*/
get getIconHTML(){ return model.getIconHTML; },
set getIconHTML(fn){ model.getIconHTML = fn; },
2015-03-31 16:34:26 +00:00
/**
*
*/
get getCheckboxHTML(){ return model.getCheckboxHTML; },
set getCheckboxHTML(fn){ model.getCheckboxHTML = fn; },
2015-02-17 02:48:36 +00:00
/**
*
*/
get sort(){ return model.sort; },
2015-08-17 00:28:36 +00:00
set sort(fn){
2015-02-18 19:16:02 +00:00
model.$sortNodes = fn ? true : false;
model.$sorted = fn ? true : false;
model.sort = fn;
},
2015-02-17 02:48:36 +00:00
/**
*
*/
get getClassName(){ return model.getClassName; },
set getClassName(fn){ model.getClassName = fn; },
/**
*
*/
get getIndex(){ return model.getIndex; },
set getIndex(fn){ model.getIndex = fn; },
// Events
_events: [
2015-02-17 06:23:35 +00:00
/**
* @event draw Fires
*/
"draw",
2015-02-17 02:48:36 +00:00
/**
* @event click Fires
*/
"click",
/**
* @event drop Fires
*/
"drop",
/**
* @event dragIn Fires
*/
"dragIn",
/**
* @event dragOut Fires
*/
"dragOut",
/**
* @event dragMoveOutside Fires
*/
"dragMoveOutside",
/**
* @event folderDragLeave Fires
*/
"folderDragLeave",
/**
* @event folderDragEnter Fires
*/
"folderDragEnter",
/**
* @event dropOutside Fires
*/
"dropOutside",
/**
* @event userSelect Fires
*/
"userSelect",
/**
* @event afterChoose Fires
*/
"afterChoose",
/**
* @event delete Fires
*/
"delete",
/**
* @event beforeRename Fires
*/
"beforeRename",
/**
* @event afterRename Fires
*/
"afterRename",
/**
* @event afterRender Fires
*/
"afterRender",
/**
* @event check Fires
*/
"check",
/**
* @event uncheck Fires
*/
"uncheck",
2015-02-17 02:48:36 +00:00
/**
* @event select Fires
*/
"select",
/**
* @event scroll Fires
*/
"scroll",
/**
* @event scrollbarVisibilityChanged Fires
*/
"scrollbarVisibilityChanged",
/**
* @event resize Fires
*/
"resize"
],
// Models
/**
*
*/
setRoot: function(root){
2015-02-18 19:16:02 +00:00
model.cachedRoot = root;
return model.setRoot(root);
2015-02-17 02:48:36 +00:00
},
/**
*
*/
resize: function(force){
return acetree.resize(force);
},
/**
*
*/
select: function(node){
if (node instanceof Array)
return acetree.selection.setSelection(node);
else
return acetree.selection.selectNode(node);
},
/**
*
*/
focus: function(){
return acetree.focus();
},
2015-04-15 23:46:32 +00:00
/**
*
*/
blur: function(){
return acetree.blur();
},
2015-02-17 02:48:36 +00:00
/**
*
*/
2015-02-18 06:07:10 +00:00
startRename: function(node, column){
return acetree.edit.startRename(node, column);
2015-02-17 02:48:36 +00:00
},
/**
*
*/
execCommand: function(cmd){
return acetree.execCommand(cmd);
},
/**
*
*/
scrollIntoView: function(anchor, lead, offset){
return acetree.renderer.scrollCaretIntoView(anchor, lead, offset);
2015-02-17 02:48:36 +00:00
},
/**
*
*/
enable: function(){
return acetree.enable();
},
/**
*
*/
disable: function(){
return acetree.enable();
},
/**
*
*/
check: function(node, half){
node.isChecked = half ? -1 : true;
model._signal("check", node);
model._signal("change");
},
/**
*
*/
uncheck: function(node){
node.isChecked = false;
model._signal("uncheck", node);
model._signal("change");
},
2015-02-17 02:48:36 +00:00
/**
*
*/
getNodeAtIndex: function(idx){
return model.getNodeAtIndex(idx);
},
/**
*
*/
getIndexForNode: function(node){
return model.getIndexForNode(node);
2015-02-17 04:11:06 +00:00
},
/**
*
*/
refresh: function(){
model.setRoot(filterRoot || plugin.root);
2015-02-17 06:23:35 +00:00
},
/**
*
*/
attachTo: function(htmlNode, beforeNode){
var container;
if (drawn)
container = acetree.container;
else {
container = document.createElement("div");
container.style.height = "100%";
}
htmlNode.insertBefore(container, beforeNode);
if (!drawn)
draw(container);
2015-02-17 02:48:36 +00:00
}
});
if (!baseclass)
plugin.load(null, options.baseName || "list");
2015-02-17 02:48:36 +00:00
return plugin;
}
register(null, {
2015-02-17 03:05:32 +00:00
List: List
2015-02-17 02:48:36 +00:00
});
}
});