optimization: replace all occurrence is dramatically faster
[fedora-idea.git] / platform-impl / src / com / intellij / openapi / editor / impl / HighlighterList.java
blobec48552418264c6a2b05dac47366463a5c8a5bdb
1 package com.intellij.openapi.editor.impl;
3 import com.intellij.openapi.editor.Document;
4 import com.intellij.openapi.editor.event.DocumentAdapter;
5 import com.intellij.openapi.editor.event.DocumentEvent;
6 import com.intellij.openapi.editor.markup.RangeHighlighter;
7 import com.intellij.util.containers.ContainerUtil;
8 import gnu.trove.THashSet;
10 import java.util.*;
12 public abstract class HighlighterList {
13 private final List<RangeHighlighterImpl> mySegmentHighlighters = new ArrayList<RangeHighlighterImpl>();
14 private final Set<RangeHighlighter> myHighlightersSet = new THashSet<RangeHighlighter>();
15 private boolean myIsDirtied = false;
16 private final DocumentAdapter myDocumentListener;
17 private final Document myDoc;
18 private int myLongestHighlighterLength = 0;
19 private static final Comparator<RangeHighlighterImpl> MY_RANGE_COMPARATOR = new Comparator<RangeHighlighterImpl>() {
20 public int compare(RangeHighlighterImpl r1, RangeHighlighterImpl r2) {
21 if (r1.getAffectedAreaStartOffset() != r2.getAffectedAreaStartOffset()) {
22 return r1.getAffectedAreaStartOffset() - r2.getAffectedAreaStartOffset();
25 if (r1.getLayer() != r2.getLayer()) {
26 return r2.getLayer() - r1.getLayer();
29 return (int) (r2.getId() - r1.getId());
33 public HighlighterList(Document doc) {
34 myDocumentListener = new DocumentAdapter() {
35 public void documentChanged(DocumentEvent e) {
36 myIsDirtied = true;
39 myDoc = doc;
40 myDoc.addDocumentListener(myDocumentListener);
43 public void dispose() {
44 myDoc.removeDocumentListener(myDocumentListener);
47 public int getLongestHighlighterLength() {
48 return myLongestHighlighterLength;
51 private void sortMarkers() {
52 assertDispatchThread();
53 myLongestHighlighterLength = 0;
54 mySegmentHighlighters.clear();
55 Iterator<RangeHighlighter> iterator = myHighlightersSet.iterator();
56 while (iterator.hasNext()) {
57 RangeHighlighter rangeHighlighter = iterator.next();
58 if (rangeHighlighter.isValid()) {
59 mySegmentHighlighters.add((RangeHighlighterImpl)rangeHighlighter);
60 myLongestHighlighterLength = Math.max(myLongestHighlighterLength, rangeHighlighter.getEndOffset() - rangeHighlighter.getStartOffset());
62 else {
63 iterator.remove();
66 ContainerUtil.quickSort(mySegmentHighlighters, MY_RANGE_COMPARATOR);
68 myIsDirtied = false;
71 protected abstract void assertDispatchThread();
73 Iterator<RangeHighlighterImpl> getHighlighterIterator() {
74 if (myIsDirtied) sortMarkers();
75 return mySegmentHighlighters.iterator();
78 List<RangeHighlighterImpl> getSortedHighlighters() {
79 if (myIsDirtied) sortMarkers();
80 return mySegmentHighlighters;
83 void addSegmentHighlighter(RangeHighlighter segmentHighlighter) {
84 assertDispatchThread();
85 myIsDirtied = true;
86 myHighlightersSet.add(segmentHighlighter);
89 void removeSegmentHighlighter(RangeHighlighter segmentHighlighter) {
90 assertDispatchThread();
91 myIsDirtied = true;
92 myHighlightersSet.remove(segmentHighlighter);