blob: 0225350d2504872e784f99894b701bc4bb7be3e8 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeInsight.template.impl;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.RangeMarker;
import java.util.ArrayList;
public class TemplateSegments {
private final ArrayList<RangeMarker> mySegments = new ArrayList<RangeMarker>();
private final Editor myEditor;
public TemplateSegments(Editor editor) {
myEditor = editor;
}
public int getSegmentStart(int i) {
RangeMarker rangeMarker = mySegments.get(i);
return rangeMarker.getStartOffset();
}
public int getSegmentEnd(int i) {
RangeMarker rangeMarker = mySegments.get(i);
return rangeMarker.getEndOffset();
}
public boolean isValid(int i) {
return mySegments.get(i).isValid();
}
public void removeAll() {
for (RangeMarker segment : mySegments) {
segment.dispose();
}
mySegments.clear();
}
public void addSegment(int start, int end) {
RangeMarker rangeMarker = myEditor.getDocument().createRangeMarker(start, end);
mySegments.add(rangeMarker);
}
public void setSegmentsGreedy(boolean greedy) {
for (final RangeMarker segment : mySegments) {
segment.setGreedyToRight(greedy);
segment.setGreedyToLeft(greedy);
}
}
public boolean isInvalid() {
for (RangeMarker marker : mySegments) {
if (!marker.isValid()) {
return true;
}
}
return false;
}
public void replaceSegmentAt(int index, int start, int end) {
replaceSegmentAt(index, start, end, false);
}
public void replaceSegmentAt(int index, int start, int end, boolean preserveGreediness) {
RangeMarker rangeMarker = mySegments.get(index);
boolean greedyToLeft = rangeMarker.isGreedyToLeft();
boolean greedyToRight = rangeMarker.isGreedyToRight();
rangeMarker.dispose();
Document doc = myEditor.getDocument();
rangeMarker = doc.createRangeMarker(start, end);
rangeMarker.setGreedyToLeft(greedyToLeft || !preserveGreediness);
rangeMarker.setGreedyToRight(greedyToRight || !preserveGreediness);
mySegments.set(index, rangeMarker);
}
public void setNeighboursGreedy(final int segmentNumber, final boolean greedy) {
if (segmentNumber > 0) {
final RangeMarker left = mySegments.get(segmentNumber - 1);
left.setGreedyToLeft(greedy);
left.setGreedyToRight(greedy);
}
if (segmentNumber + 1 < mySegments.size()) {
final RangeMarker right = mySegments.get(segmentNumber + 1);
right.setGreedyToLeft(greedy);
right.setGreedyToRight(greedy);
}
}
/**
* IDEADEV-13618
*
* prevent two different segments to grow simultaneously if they both starts at the same offset.
*/
public void lockSegmentAtTheSameOffsetIfAny(final int number) {
if (number == -1) {
return;
}
final RangeMarker current = mySegments.get(number);
int offset = current.getStartOffset();
for (int i = 0; i < mySegments.size(); i++) {
if (i != number) {
final RangeMarker segment = mySegments.get(i);
final int startOffset2 = segment.getStartOffset();
if (offset == startOffset2) {
segment.setGreedyToLeft(false);
}
}
}
}
public int getSegmentsCount() {
return mySegments.size();
}
}