Projekt

Obecné

Profil

Stáhnout (4.44 KB) Statistiky
| Větev: | Tag: | Revize:
1
ace.define("ace/ext/rtl",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) {
2
"use strict";
3

    
4
var commands = [{
5
    name: "leftToRight",
6
    bindKey: { win: "Ctrl-Alt-Shift-L", mac: "Command-Alt-Shift-L" },
7
    exec: function(editor) {
8
        editor.session.$bidiHandler.setRtlDirection(editor, false);
9
    },
10
    readOnly: true
11
}, {
12
    name: "rightToLeft",
13
    bindKey: { win: "Ctrl-Alt-Shift-R",  mac: "Command-Alt-Shift-R" },
14
    exec: function(editor) {
15
        editor.session.$bidiHandler.setRtlDirection(editor, true);
16
    },
17
    readOnly: true
18
}];
19

    
20
var Editor = require("../editor").Editor;
21
require("../config").defineOptions(Editor.prototype, "editor", {
22
    rtlText: {
23
        set: function(val) {
24
            if (val) {
25
                this.on("change", onChange);
26
                this.on("changeSelection", onChangeSelection);
27
                this.renderer.on("afterRender", updateLineDirection);
28
                this.commands.on("exec", onCommandEmitted);
29
                this.commands.addCommands(commands);
30
            } else {
31
                this.off("change", onChange);
32
                this.off("changeSelection", onChangeSelection);
33
                this.renderer.off("afterRender", updateLineDirection);
34
                this.commands.off("exec", onCommandEmitted);
35
                this.commands.removeCommands(commands);
36
                clearTextLayer(this.renderer);
37
            }
38
            this.renderer.updateFull();
39
        }
40
    },
41
    rtl: {
42
        set: function(val) {
43
            this.session.$bidiHandler.$isRtl = val;
44
            if (val) {
45
                this.setOption("rtlText", false);
46
                this.renderer.on("afterRender", updateLineDirection);
47
                this.session.$bidiHandler.seenBidi = true;
48
            } else {
49
                this.renderer.off("afterRender", updateLineDirection);
50
                clearTextLayer(this.renderer);
51
            }
52
            this.renderer.updateFull();
53
        }
54
    }
55
});
56
function onChangeSelection(e, editor) {
57
    var lead = editor.getSelection().lead;
58
    if (editor.session.$bidiHandler.isRtlLine(lead.row)) {
59
        if (lead.column === 0) {
60
            if (editor.session.$bidiHandler.isMoveLeftOperation && lead.row > 0) {
61
                editor.getSelection().moveCursorTo(lead.row - 1, editor.session.getLine(lead.row - 1).length);
62
            } else {
63
                if (editor.getSelection().isEmpty())
64
                    lead.column += 1;
65
                else
66
                    lead.setPosition(lead.row, lead.column + 1);
67
            }
68
        }
69
    }
70
}
71

    
72
function onCommandEmitted(commadEvent) {
73
    commadEvent.editor.session.$bidiHandler.isMoveLeftOperation = /gotoleft|selectleft|backspace|removewordleft/.test(commadEvent.command.name);
74
}
75
function onChange(delta, editor) {
76
    var session = editor.session;
77
    session.$bidiHandler.currentRow = null;
78
    if (session.$bidiHandler.isRtlLine(delta.start.row) && delta.action === 'insert' && delta.lines.length > 1) {
79
        for (var row = delta.start.row; row < delta.end.row; row++) {
80
            if (session.getLine(row + 1).charAt(0) !== session.$bidiHandler.RLE)
81
                session.doc.$lines[row + 1] = session.$bidiHandler.RLE + session.getLine(row + 1);
82
        }
83
    }
84
}
85

    
86
function updateLineDirection(e, renderer) {
87
    var session = renderer.session;
88
    var $bidiHandler = session.$bidiHandler;
89
    var cells = renderer.$textLayer.$lines.cells;
90
    var width = renderer.layerConfig.width - renderer.layerConfig.padding + "px";
91
    cells.forEach(function(cell) {
92
        var style = cell.element.style;
93
        if ($bidiHandler && $bidiHandler.isRtlLine(cell.row)) {
94
            style.direction = "rtl";
95
            style.textAlign = "right";
96
            style.width = width;
97
        } else {
98
            style.direction = "";
99
            style.textAlign = "";
100
            style.width = "";
101
        }
102
    });
103
}
104

    
105
function clearTextLayer(renderer) {
106
    var lines = renderer.$textLayer.$lines;
107
    lines.cells.forEach(clear);
108
    lines.cellCache.forEach(clear);
109
    function clear(cell) {
110
        var style = cell.element.style;
111
        style.direction = style.textAlign = style.width = "";
112
    }
113
}
114

    
115
});                (function() {
116
                    ace.require(["ace/ext/rtl"], function(m) {
117
                        if (typeof module == "object" && typeof exports == "object" && module) {
118
                            module.exports = m;
119
                        }
120
                    });
121
                })();
122
            
(13-13/244)