/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.framework;
import com.intellij.openapi.editor.Editor;
import gw.plugin.ij.framework.core.CodeInsightTestCase;
import junit.framework.Assert;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
public class FileMarkers extends Assert {
private final List<CaretMarker> carets = new ArrayList<>();
private final List<CaretMarker> postCarets = new ArrayList<>();
private final List<SmartTextRange> ranges = new ArrayList<>();
private final List<SmartTextRange> deltas = new ArrayList<>();
private String textWithDeltas;
private String text;
public void addRange(int rangeStartIndex, int rangeEndIndex, String text) {
ranges.add(new SmartTextRange(rangeStartIndex, rangeEndIndex, text, this));
}
public void addDelta(int deltaStartIndex, int deltaEndIndex, String text) {
deltas.add(new SmartTextRange(deltaStartIndex, deltaEndIndex, text, this));
}
public int getCaretOffset() {
assertEquals("No caret marker found.", 1, carets.size());
CaretMarker caretMarker = carets.get(0);
assertEquals(MarkerType.CARET1, caretMarker.type);
return caretMarker.offset;
}
public int getCaretOffset(MarkerType type) {
CaretMarker caretMarker = null;
for (CaretMarker caret : carets) {
if (caret.type.equals(type)) {
caretMarker = caret;
}
}
assertNotNull("No caret found " + type, caretMarker);
return caretMarker.offset;
}
@NotNull
public CaretMarker getCaret(MarkerType type) {
CaretMarker caretMarker = null;
for (CaretMarker caret : carets) {
if (caret.type.equals(type)) {
caretMarker = caret;
}
}
assertNotNull("No caret found " + type, caretMarker);
return caretMarker;
}
@NotNull
public CaretMarker getPostCaret(MarkerType type) {
CaretMarker caretMarker = maybeGetPostCaret(type);
assertNotNull("No caret found " + type, caretMarker);
return caretMarker;
}
@Nullable
public CaretMarker maybeGetPostCaret(MarkerType type) {
CaretMarker caretMarker = null;
for (CaretMarker caret : postCarets) {
if (caret.type.equals(type)) {
caretMarker = caret;
}
}
return caretMarker;
}
@NotNull
public List<SmartTextRange> getRanges() {
return ranges;
}
public void add(@NotNull FileMarkers that) {
this.carets.addAll(that.carets);
this.postCarets.addAll(that.postCarets);
this.ranges.addAll(that.ranges);
this.deltas.addAll(that.deltas);
}
public void setEditor(Editor editor) {
for (CaretMarker caret : carets) {
caret.setEditor(editor);
}
for (CaretMarker postCaret : postCarets) {
postCaret.setEditor(editor);
}
for (SmartTextRange range : ranges) {
range.setEditor(editor);
}
}
@NotNull
public List<SmartTextRange> getDeltas() {
return deltas;
}
public void setTextWithDeltas(String textWithDeltas) {
CodeInsightTestCase.CodeTokenizer codeTokenizer = new CodeInsightTestCase.CodeTokenizer(textWithDeltas);
while (codeTokenizer.next()) {
if (codeTokenizer.markerType == MarkerType.CARET1 ||
codeTokenizer.markerType == MarkerType.CARET2 ||
codeTokenizer.markerType == MarkerType.CARET3 ||
codeTokenizer.markerType == MarkerType.CARET4) {
postCarets.add(new CaretMarker(codeTokenizer.markerIndex, codeTokenizer.markerType, this));
}
}
for (MarkerType value : MarkerType.values()) {
textWithDeltas = textWithDeltas.replace(value.markerText, "");
}
this.textWithDeltas = textWithDeltas;
}
public void setText(String text) {
this.text = text;
}
public void addCaret(int markerIndex, MarkerType markerType) {
carets.add(new CaretMarker(markerIndex, markerType, this));
}
public String getTextWithDeltas() {
return textWithDeltas;
}
}