AutorÃa | Ultima modificación | Ver Log |
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Atto editor plugin.
*
* @module moodle-editor_atto-plugin
* @submodule plugin-base
* @package editor_atto
* @copyright 2014 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* A Plugin for the Atto Editor used in Moodle.
*
* This class should not be directly instantiated, and all Editor plugins
* should extend this class.
*
* @namespace M.editor_atto
* @class EditorPlugin
* @main
* @constructor
* @uses M.editor_atto.EditorPluginButtons
* @uses M.editor_atto.EditorPluginDialogue
*/
function EditorPlugin() {
EditorPlugin.superclass.constructor.apply(this, arguments);
}
var GROUPSELECTOR = '.atto_group.',
GROUP = '_group';
Y.extend(EditorPlugin, Y.Base, {
/**
* The name of the current plugin.
*
* @property name
* @type string
*/
name: null,
/**
* A Node reference to the editor.
*
* @property editor
* @type Node
*/
editor: null,
/**
* A Node reference to the editor toolbar.
*
* @property toolbar
* @type Node
*/
toolbar: null,
initializer: function(config) {
// Set the references to configuration parameters.
this.name = config.name;
this.toolbar = config.toolbar;
this.editor = config.editor;
// Set up the prototypal properties.
// These must be set up here becuase prototypal arrays and objects are copied across instances.
this.buttons = {};
this.buttonNames = [];
this.buttonStates = {};
this.menus = {};
this._primaryKeyboardShortcut = [];
this._buttonHandlers = [];
this._menuHideHandlers = [];
this._highlightQueue = {};
},
/**
* Mark the content ediable content as having been changed.
*
* This is a convenience function and passes through to
* {{#crossLink "M.editor_atto.EditorTextArea/updateOriginal"}}updateOriginal{{/crossLink}}.
*
* @method markUpdated
*/
markUpdated: function() {
// Save selection after changes to the DOM. If you don't do this here,
// subsequent calls to restoreSelection() will fail expecting the
// previous DOM state.
this.get('host').saveSelection();
return this.get('host').updateOriginal();
}
}, {
NAME: 'editorPlugin',
ATTRS: {
/**
* The editor instance that this plugin was instantiated by.
*
* @attribute host
* @type M.editor_atto.Editor
* @writeOnce
*/
host: {
writeOnce: true
},
/**
* The toolbar group that this button belongs to.
*
* When setting, the name of the group should be specified.
*
* When retrieving, the Node for the toolbar group is returned. If
* the group doesn't exist yet, then it is created first.
*
* @attribute group
* @type Node
* @writeOnce
*/
group: {
writeOnce: true,
getter: function(groupName) {
var group = this.toolbar.one(GROUPSELECTOR + groupName + GROUP);
if (!group) {
group = Y.Node.create('<div class="atto_group ' +
groupName + GROUP + '"></div>');
this.toolbar.append(group);
}
return group;
}
}
}
});
Y.namespace('M.editor_atto').EditorPlugin = EditorPlugin;