2fb15438e66d44985cc51ad7d489026d988ec721
[moodle.git] / lib / editor / atto / plugins / rtl / yui / src / button / js / button.js
1 // This file is part of Moodle - http://moodle.org/
2 //
3 // Moodle is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // Moodle is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16 /*
17  * @package    atto_rtl
18  * @copyright  2014 Jerome Mouneyrac
19  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
20  */
22 /**
23  * @module moodle-atto_rtl-button
24  */
26 /**
27  * Atto text editor rtl plugin.
28  *
29  * @namespace M.atto_rtl
30  * @class button
31  * @extends M.editor_atto.EditorPlugin
32  */
34 Y.namespace('M.atto_rtl').Button = Y.Base.create('button', Y.M.editor_atto.EditorPlugin, [], {
35     initializer: function() {
36         var direction;
38         direction = 'ltr';
39         this.addButton({
40             icon: 'e/left_to_right',
41             title: direction,
42             buttonName: direction,
43             callback: this._toggleRTL,
44             callbackArgs: direction
45         });
47         direction = 'rtl';
48         this.addButton({
49             icon: 'e/right_to_left',
50             title: direction,
51             buttonName: direction,
52             callback: this._toggleRTL,
53             callbackArgs: direction
54         });
55     },
57     /**
58      * Toggle the RTL/LTR values based on the supplied direction.
59      *
60      * @method _toggleRTL
61      * @param {EventFacade} e
62      * @param {String} direction
63      */
64     _toggleRTL: function(e, direction) {
65         var host = this.get('host'),
66             sourceSelection = rangy.saveSelection(),
67             selection = host.getSelection(),
68             newDirection = {
69                 rtl: 'ltr',
70                 ltr: 'rtl'
71             };
72         if (selection) {
73             // Format the selection to be sure it has a tag parent (not the contenteditable).
74             var parentNode = host.formatSelectionBlock(),
75                 parentDOMNode = parentNode.getDOMNode();
77             var currentDirection = parentDOMNode.getAttribute('dir');
78             if (currentDirection === direction) {
79                 parentDOMNode.setAttribute("dir", newDirection[direction]);
80             } else {
81                 parentDOMNode.setAttribute("dir", direction);
82             }
84             // Change selection from the containing paragraph to the original one.
85             rangy.restoreSelection(sourceSelection);
86             // Mark the text as having been updated.
87             this.markUpdated();
88         }
89     }
90 });