| /* |
| * 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(); |
| } |
| } |