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