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
;
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
) {
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());
66 ContainerUtil
.quickSort(mySegmentHighlighters
, MY_RANGE_COMPARATOR
);
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();
86 myHighlightersSet
.add(segmentHighlighter
);
89 void removeSegmentHighlighter(RangeHighlighter segmentHighlighter
) {
90 assertDispatchThread();
92 myHighlightersSet
.remove(segmentHighlighter
);