graphonline/lib/ckeditor4/plugins/lite/js/icePluginManager.js
2017-04-15 01:34:36 +03:00

337 lines
7.4 KiB
JavaScript
Executable File

(function() {
var exports = this;
var IcePluginManager = function(ice_instance) {
this.plugins = {},
this.pluginConstructors = {},
this.keyPressListeners = {},
this.activePlugin = null,
this.pluginSets = {},
this.activePluginSet = null,
this._ice = ice_instance;
};
IcePluginManager.prototype = {
getPluginNames: function() {
var plugins = [];
for (var name in this.plugins) {
plugins.push(name);
}
return plugins;
},
addPluginObject: function(pluginName, pluginObj) {
this.plugins[pluginName] = pluginObj;
},
addPlugin: function(name, pluginConstructor) {
if (typeof pluginConstructor !== 'function') {
throw Error('IcePluginException: plugin must be a constructor function');
}
if (ice.dom.isset(this.pluginConstructors[name]) === false) {
this.pluginConstructors[name] = pluginConstructor;
}
},
loadPlugins: function(plugins, callback) {
if (plugins.length === 0) {
callback.call(this);
} else {
var plugin = plugins.shift();
if (typeof plugin === 'object') {
plugin = plugin.name;
}
if (ice.dom.isset(ice._plugin[plugin]) === true) {
this.addPlugin(plugin, ice._plugin[plugin]);
this.loadPlugins(plugins, callback);
} else {
throw new Error('plugin was not included in the page: ' + plugin);
}
}
},
_enableSet: function(name) {
this.activePluginSet = name;
var pSetLen = this.pluginSets[name].length;
for (var i = 0; i < pSetLen; i++) {
var plugin = this.pluginSets[name][i];
var pluginName = '';
if (typeof plugin === 'object') {
pluginName = plugin.name;
} else {
pluginName = plugin;
}
var pluginConstructor = this.pluginConstructors[pluginName];
if (pluginConstructor) {
var pluginObj = new pluginConstructor(this._ice);
this.plugins[pluginName] = pluginObj;
if (ice.dom.isset(plugin.settings) === true) {
pluginObj.setSettings(plugin.settings);
}
pluginObj.start();
}
}
},
setActivePlugin: function(name) {
this.activePlugin = name;
},
getActivePlugin: function() {
return this.activePlugin;
},
_getPluginName: function(pluginConstructor) {
var fn = pluginConstructor.toString();
var start = 'function '.length;
var name = fn.substr(start, (fn.indexOf('(') - start));
return name;
},
/**
* Removes specified plugin.
*/
removePlugin: function(plugin) {
if (this.plugins[plugin]) {
// Call the remove fn of the plugin incase it needs to do cleanup.
this.plugins[plugin].remove();
}
},
/**
* Returns the plugin object for specified plugin name.
*/
getPlugin: function(name) {
return this.plugins[name];
},
/**
* Add a new set of plugins.
*/
usePlugins: function(name, plugins, callback) {
var self = this;
if (ice.dom.isset(plugins) === true) {
this.pluginSets[name] = plugins;
} else {
this.pluginSets[name] = [];
}
var clone = this.pluginSets[name].concat([]);
this.loadPlugins(clone, function() {
self._enableSet(name);
if(callback) callback.call(this);
});
},
disablePlugin: function(name) {
this.plugins[name].disable();
},
isPluginElement: function(element) {
for (var i in this.plugins) {
if (this.plugins[i].isPluginElement) {
if (this.plugins[i].isPluginElement(element) === true) {
return true;
}
}
}
return false;
},
fireKeyPressed: function(e) {
if (this._fireKeyPressFns(e, 'all_keys') === false) {
return false;
}
var eKeys = [];
if (e.ctrlKey === true || e.metaKey === true) {
eKeys.push('ctrl');
}
if (e.shiftKey === true) {
eKeys.push('shift');
}
if (e.altKey === true) {
eKeys.push('alt');
}
switch (e.keyCode) {
case 13:
eKeys.push('enter');
break;
case ice.dom.DOM_VK_LEFT:
eKeys.push('left');
break;
case ice.dom.DOM_VK_RIGHT:
eKeys.push('right');
break;
case ice.dom.DOM_VK_UP:
eKeys.push('up');
break;
case ice.dom.DOM_VK_DOWN:
eKeys.push('down');
break;
case 9:
eKeys.push('tab');
break;
case ice.dom.DOM_VK_DELETE:
eKeys.push('delete');
break;
default:
var code;
if (e.keyCode) {
code = e.keyCode;
} else if (e.which) {
code = e.which;
}
// Other characters (a-z0-9..).
if (code) {
eKeys.push(String.fromCharCode(code).toLowerCase());
}
break;
}//end switch
var eKeysStr = eKeys.sort().join('+');
return this._fireKeyPressFns(e, eKeysStr);
},
_fireKeyPressFns: function(e, eKeysStr) {
if (this.keyPressListeners[eKeysStr]) {
var ln = this.keyPressListeners[eKeysStr].length;
for (var i = 0; i < ln; i++) {
var listener = this.keyPressListeners[eKeysStr][i];
var eventFn = listener.fn;
var plugin = listener.plugin;
var data = listener.data;
if (eventFn) {
if (ice.dom.isFn(eventFn) === true) {
if (eventFn.call(plugin, e, data) === true) {
ice.dom.preventDefault(e);
return false;
}
} else if (plugin[eventFn] && plugin[eventFn].call(plugin, e, data) === true) {
ice.dom.preventDefault(e);
return false;
}
}
}
}
return true;
},
fireSelectionChanged: function(range) {
for (var i in this.plugins) {
this.plugins[i].selectionChanged(range);
}
},
fireNodeInserted: function(node, range) {
for (var i in this.plugins) {
if (this.plugins[i].nodeInserted(node, range) === false) {
return false;
}
}
},
fireNodeCreated: function(node, option) {
for (var i in this.plugins) {
if (this.plugins[i].nodeCreated(node, option) === false) {
return false;
}
}
},
fireCaretPositioned: function() {
for (var i in this.plugins) {
this.plugins[i].caretPositioned()
}
},
fireClicked: function(e) {
var val = true;
for (var i in this.plugins) {
if (this.plugins[i].clicked(e) === false) {
val = false;
}
}
return val;
},
fireMouseDown: function(e) {
var val = true;
for (var i in this.plugins) {
if (this.plugins[i].mouseDown(e) === false) {
val = false;
}
}
return val;
},
fireKeyDown: function(e) {
var val = true;
for (var i in this.plugins) {
if (this.plugins[i].keyDown(e) === false) {
val = false;
}
}
return val;
},
fireKeyPress: function(e) {
var val = true;
for (var i in this.plugins) {
if (this.plugins[i].keyPress(e) === false) {
val = false;
}
}
return val;
},
fireEnabled: function(enabled) {
for (var i in this.plugins) {
this.plugins[i].setEnabled(enabled);
}
},
fireDisabled: function(disabled) {
for (var i in this.plugins) {
this.plugins[i].setDisabled(disabled);
}
},
fireCaretUpdated: function() {
for (var i in this.plugins) {
if (this.plugins[i].caretUpdated) {
this.plugins[i].caretUpdated();
}
}
}
};
exports._plugin = {};
exports.IcePluginManager = IcePluginManager;
}).call(this.ice);