1 package org.incava.text; 2 3 import java.awt.Point ; 4 import java.io.*; 5 import java.util.*; 6 7 8 12 public class LineMapping extends ArrayList 13 { 14 public class PositionToLocation 15 { 16 public int position; 17 18 public int line; 19 20 public int column; 21 22 public PositionToLocation(int position, int line, int column) 23 { 24 this.position = position; 25 this.line = line; 26 this.column = column; 27 } 28 29 public String toString() 30 { 31 return "{ position: " + position + " => { line: " + line + ", column: " + column + " } }"; 32 } 33 } 34 35 public LineMapping(String text, int startLine, int startColumn) 36 { 37 add(new PositionToLocation(0, startLine, startColumn)); 39 40 int len = text.length(); 41 42 for (int pos = 0, line = startLine; pos < len; ++pos) { 44 if (text.charAt(pos) == '\r') { 46 if (pos + 1 < len && text.charAt(pos + 1) == '\n') { 48 ++pos; 49 } 50 } 52 else if (text.charAt(pos) == '\n') { 53 } 55 else { 56 continue; 58 } 59 60 ++line; 61 62 add(new PositionToLocation(pos + 1, line, 1)); 64 } 65 66 } 68 69 72 public Location[] getLocations(Point pos) 73 { 74 return getLocations(pos.x, pos.y); 75 } 76 77 80 public Location[] getLocations(int startPos, int endPos) 81 { 82 Location start = null; 84 Location end = null; 85 86 88 ListIterator lit = listIterator(size()); 90 while ((start == null || end == null) && lit.hasPrevious()) { 91 PositionToLocation pl = (PositionToLocation)lit.previous(); 92 if (end == null && endPos >= pl.position) { 94 end = new Location(pl.line, pl.column + endPos - pl.position); 96 } 97 if (start == null && startPos >= pl.position) { 98 start = new Location(pl.line, pl.column + startPos - pl.position); 100 } 101 } 102 103 return new Location[] { start, end }; 105 } 106 107 110 public Location getLocation(int pos) 111 { 112 Location location = null; 113 114 116 ListIterator lit = listIterator(size()); 118 while (location == null && lit.hasPrevious()) { 119 PositionToLocation pl = (PositionToLocation)lit.previous(); 120 if (location == null && pos >= pl.position) { 122 return new Location(pl.line, pl.column + pos - pl.position); 124 } 125 } 126 127 return null; 128 } 129 130 } 131 | Popular Tags |