1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.g2d.utils;
\r
14 import java.io.Serializable;
\r
17 * @author Tuukka Lehtonen
\r
19 public class TextSegment implements Serializable {
\r
21 private static final long serialVersionUID = 1428883453597424952L;
\r
23 public static transient final TextSegment EMPTY = new TextSegment(0, 0);
\r
25 private final int start;
\r
26 private final int length;
\r
28 public static TextSegment whole(String s) {
\r
29 return new TextSegment(0, s.length());
\r
32 public static TextSegment single(int pos) {
\r
33 return new TextSegment(pos, 1);
\r
36 public static TextSegment before(int pos) {
\r
37 return new TextSegment(0, pos);
\r
40 public TextSegment(int start, int length) {
\r
42 this.length = length;
\r
45 public int start() {
\r
50 return start + length;
\r
53 public int length() {
\r
57 public boolean isEmpty() {
\r
61 public boolean isWhole(String s) {
\r
64 return start == 0 && length == s.length();
\r
67 public boolean atStart(int pos) {
\r
68 return start == pos;
\r
71 public boolean atEnd(int pos) {
\r
72 return end() == pos;
\r
75 public boolean existsIn(String s) {
\r
76 int l = s != null ? s.length() : 0;
\r
79 int end = start + length;
\r
85 public String removeFrom(String s) {
\r
87 throw new IllegalArgumentException("segment " + this + " is out of bounds in string '" + s + "'");
\r
91 return s.substring(length);
\r
92 return s.substring(0, start) + s.substring(start + length);
\r
95 public String before(String s) {
\r
98 return s.substring(0, start);
\r
101 public String after(String s) {
\r
102 if (end() == s.length())
\r
104 return s.substring(start, start + length);
\r
107 public String of(String s) {
\r
108 return s.substring(start, start + length);
\r
111 public TextSegment beforeStart() {
\r
114 return new TextSegment(0, start);
\r
117 public TextSegment afterEnd(String s) {
\r
118 int l = s.length();
\r
121 throw new IllegalArgumentException("end " + end + " is beyond string '" + s + "'");
\r
124 return new TextSegment(end, l - end);
\r
127 public TextSegment prepend(int count) {
\r
130 int newStart = start - count;
\r
132 throw new IllegalArgumentException("prepending " + this + " by " + count + " procudes invalid segment start " + newStart);
\r
133 int newLength = length + count;
\r
135 throw new IllegalArgumentException("prepending " + this + " by " + count + " produces negative length: " + newLength);
\r
136 return new TextSegment(start - count, newLength);
\r
139 public TextSegment append(int count) {
\r
142 int newLength = length + count;
\r
144 throw new IllegalArgumentException("appending by " + count + " produces negative length: " + newLength);
\r
145 return new TextSegment(start, newLength);
\r
148 public TextSegment extendToEnd(String s) {
\r
149 int l = s.length();
\r
152 throw new IllegalArgumentException("end " + end + " is beyond string '" + s + "'");
\r
155 return new TextSegment(start, l - start);
\r
159 public int hashCode() {
\r
160 final int prime = 31;
\r
162 result = prime * result + length;
\r
163 result = prime * result + start;
\r
168 public boolean equals(Object obj) {
\r
173 if (getClass() != obj.getClass())
\r
175 TextSegment other = (TextSegment) obj;
\r
176 if (length != other.length)
\r
178 if (start != other.start)
\r
184 public String toString() {
\r
185 return "[" + start + "," + (start + length) + "]";
\r