summaryrefslogtreecommitdiff
path: root/gstudio/static/gstudio/js/Gnowmacs/src/js/.svn/text-base/ymacs-marker.js.svn-base
blob: ca9c1c0edf6919b719bb205b91f14a2092d1331c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//> This file is part of Ymacs, an Emacs-like editor for the Web
//> http://www.ymacs.org/
//>
//> Copyright (c) 2009-2010, Mihai Bazon, Dynarch.com.  All rights reserved.
//>
//> Redistribution and use in source and binary forms, with or without
//> modification, are permitted provided that the following conditions are
//> met:
//>
//>     * Redistributions of source code must retain the above copyright
//>       notice, this list of conditions and the following disclaimer.
//>
//>     * Redistributions in binary form must reproduce the above copyright
//>       notice, this list of conditions and the following disclaimer in
//>       the documentation and/or other materials provided with the
//>       distribution.
//>
//>     * Neither the name of Dynarch.com nor the names of its contributors
//>       may be used to endorse or promote products derived from this
//>       software without specific prior written permission.
//>
//> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
//> EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
//> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
//> PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE
//> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
//> CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
//> SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
//> INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
//> CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
//> ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
//> THE POSSIBILITY OF SUCH DAMAGE.

// @require ymacs-buffer.js

/* -----[ markers are objects that hold a position which is
   automatically maintained as text is inserted or
   removed ]----- */

DEFINE_CLASS("Ymacs_Marker", null, function(D, P){

        D.DEFAULT_ARGS = {
                position : [ "pos"    , null ],
                editor   : [ "editor" , null ],
                before   : [ "before" , false ],
                name     : [ "name"   , null ]
        };

        D.CONSTRUCT = function() {
                this.editor.markers.push(this);
                this.rowcol = null;
                this.onChange = [];
        };

        P.destroy = function() {
                this.editor.markers.remove(this);
                this.editor = null;
        };

        P.editorChange = function(pos, diff, min) {
                var p = this.position;
                if (this.before)
                        --p;
                if (diff != 0 && pos <= p) {
                        this.rowcol = null;
                        this.position += diff;
                        if (this.position < min)
                                this.position = min;
                        this.callHooks(this.onChange, this.position);
                }
        };

        P.callHooks = function(a, arg) {
                for (var i = a.length; --i >= 0;)
                        a[i].call(this.editor, arg);
        };

        P.getPosition = function() {
                return this.position;
        };

        P.setPosition = function(pos, noHooks, force) {
                if (force || this.position != pos) {
                        this.rowcol = null;
                        this.position = pos;
                        if (!noHooks)
                                this.callHooks(this.onChange, this.position);
                }
        };

        P.getRowCol = function() {
                return this.rowcol || (this.rowcol = this.editor._positionToRowCol(this.position));
        };

        P.updateMarkers = function(delta) {
                this.editor._updateMarkers(this.getPosition(), delta);
        };

        P.swap = function(other, noHooks, force) {
                var tmp = this.getPosition();
                this.setPosition(other.getPosition(), noHooks, force);
                other.setPosition(tmp, noHooks, force);
        };

});