1 /*
2  * Range.java
3  *
4  * Copyright (C) 2021 by RStudio, PBC
5  *
6  * Unless you have received this program directly from RStudio pursuant
7  * to the terms of a commercial license agreement with RStudio, then
8  * this program is licensed to you under the terms of version 3 of the
9  * GNU Affero General Public License. This program is distributed WITHOUT
10  * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
11  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
12  * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
13  *
14  */
15 package org.rstudio.studio.client.workbench.views.source.editors.text.ace;
16 
17 import com.google.gwt.core.client.JavaScriptObject;
18 
19 public class Range extends JavaScriptObject
20 {
Range()21    protected Range() {}
22 
create(int startRow, int startColumn, int endRow, int endColumn)23    public static final native Range create(int startRow,
24                                            int startColumn,
25                                            int endRow,
26                                            int endColumn)
27    /*-{
28       var Range = $wnd.require('ace/range').Range;
29       return new Range(startRow, startColumn, endRow, endColumn);
30    }-*/;
31 
fromPoints(Position start, Position end)32    public static native Range fromPoints(Position start, Position end) /*-{
33       var Range = $wnd.require('ace/range').Range;
34       return Range.fromPoints(start, end);
35    }-*/;
36 
toOrientedRange(Range range)37    public static native Range toOrientedRange(Range range) /*-{
38       var Range = $wnd.require('ace/range').Range;
39 
40       // swap begin, end if Range is not 'forward'
41       if (range.start.row > range.end.row || (
42             range.start.row == range.end.row &&
43             range.start.column > range.end.column))
44       {
45          return Range.fromPoints(range.end, range.start);
46       }
47 
48       // return new range if already forward range
49       return Range.fromPoints(range.start, range.end);
50    }-*/;
51 
getStart()52    public final native Position getStart() /*-{
53       return this.start;
54    }-*/;
55 
getEnd()56    public final native Position getEnd() /*-{
57       return this.end;
58    }-*/;
59 
setStart(Position start)60    public final native Position setStart(Position start) /*-{
61       this.start = start;
62    }-*/;
63 
setEnd(Position end)64    public final native Position setEnd(Position end) /*-{
65       this.end = end;
66    }-*/;
67 
isEmpty()68    public final native boolean isEmpty() /*-{
69       return this.isEmpty();
70    }-*/;
71 
isEqualTo(Range range)72    public final boolean isEqualTo(Range range)
73    {
74       return
75             getStart().isEqualTo(range.getStart()) &&
76             getEnd().isEqualTo(range.getEnd());
77    }
78 
extend(int row, int column)79    public final native Range extend(int row, int column) /*-{
80       return this.extend(row, column);
81    }-*/;
82 
toScreenRange(EditSession session)83    public final native Range toScreenRange(EditSession session) /*-{
84       return this.toScreenRange(session);
85    }-*/;
86 
contains(int row, int column)87    public final native boolean contains(int row, int column) /*-{
88       return this.contains(row, column);
89    }-*/;
90 
contains(Position position)91    public final native boolean contains(Position position) /*-{
92       return this.contains(position.row, position.column);
93    }-*/;
94 
contains(Range range)95    public final native boolean contains(Range range) /*-{
96       return this.containsRange(range);
97    }-*/;
98 
intersects(Range range)99    public final native boolean intersects(Range range) /*-{
100       return this.intersects(range);
101    }-*/;
102 
isMultiLine()103    public final native boolean isMultiLine() /*-{
104       return this.isMultiLine();
105    }-*/;
106 
containsRightExclusive(Position position)107    public final native boolean containsRightExclusive(Position position)
108    /*-{
109 
110       var row = position.row;
111       var column = position.column;
112 
113       var startRow = this.start.row;
114       var endRow = this.end.row;
115 
116       var startColumn = this.start.column;
117       var endColumn = this.end.column;
118 
119       if (endRow < row) return false;
120       if (startRow > row) return false;
121 
122       if (startRow === row && endRow === row)
123       {
124          return column >= startColumn &&
125                 column <  endColumn;
126       }
127 
128       if (startRow === row) return column >= startColumn;
129       if (endRow === row)   return column <  endColumn;
130 
131       // shouldn't get here
132       return false;
133    }-*/;
134 
135 }
136