diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextHighlighting.java b/src/org/geometerplus/zlibrary/text/view/ZLTextHighlighting.java index 82445b719..d14924351 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextHighlighting.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextHighlighting.java @@ -19,9 +19,11 @@ package org.geometerplus.zlibrary.text.view; +import java.util.Comparator; + import org.geometerplus.zlibrary.core.util.ZLColor; -public abstract class ZLTextHighlighting implements Comparable { +public abstract class ZLTextHighlighting { public abstract boolean isEmpty(); public abstract ZLTextPosition getStartPosition(); @@ -31,8 +33,19 @@ public abstract class ZLTextHighlighting implements Comparable ByStartComparator = + new Comparator() { + public int compare(ZLTextHighlighting h0, ZLTextHighlighting h1) { + final int cmp = h0.getStartPosition().compareTo(h1.getStartPosition()); + return cmp != 0 ? cmp : h0.getEndPosition().compareTo(h1.getEndPosition()); + } + }; + + public static final Comparator ByEndComparator = + new Comparator() { + public int compare(ZLTextHighlighting h0, ZLTextHighlighting h1) { + final int cmp = h0.getEndPosition().compareTo(h1.getEndPosition()); + return cmp != 0 ? cmp : h0.getStartPosition().compareTo(h1.getStartPosition()); + } + }; } diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextManualHighlighting.java b/src/org/geometerplus/zlibrary/text/view/ZLTextManualHighlighting.java index 211d5c414..987426df1 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextManualHighlighting.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextManualHighlighting.java @@ -23,30 +23,18 @@ import org.geometerplus.zlibrary.core.util.ZLColor; class ZLTextManualHighlighting extends ZLTextHighlighting { private final ZLTextView myView; - private ZLTextPosition myStartPosition; - private ZLTextPosition myEndPosition; + private final ZLTextPosition myStartPosition; + private final ZLTextPosition myEndPosition; - ZLTextManualHighlighting(ZLTextView view) { + ZLTextManualHighlighting(ZLTextView view, ZLTextPosition start, ZLTextPosition end) { myView = view; - } - - void setup(ZLTextPosition start, ZLTextPosition end) { myStartPosition = new ZLTextFixedPosition(start); myEndPosition = new ZLTextFixedPosition(end); } - public boolean clear() { - if (isEmpty()) { - return false; - } - myStartPosition = null; - myEndPosition = null; - return true; - } - @Override public boolean isEmpty() { - return myStartPosition == null; + return false; } @Override diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java index b0923b91b..94be0a892 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java @@ -61,7 +61,10 @@ public abstract class ZLTextView extends ZLTextViewBase { private boolean myHighlightSelectedRegion = true; private final ZLTextSelection mySelection = new ZLTextSelection(this); - private final ZLTextManualHighlighting myHighlighting = new ZLTextManualHighlighting(this); + private final SortedSet myHighlightingsByStart = + new TreeSet(ZLTextHighlighting.ByStartComparator); + private final SortedSet myHighlightingsByEnd = + new TreeSet(ZLTextHighlighting.ByEndComparator); public ZLTextView(ZLApplication application) { super(application); @@ -251,14 +254,30 @@ public abstract class ZLTextView extends ZLTextViewBase { } } + private boolean removeManualHighlightings() { + boolean result = false; + for (Iterator it = myHighlightingsByStart.iterator(); it.hasNext(); ) { + final ZLTextHighlighting h = it.next(); + if (h instanceof ZLTextManualHighlighting) { + it.remove(); + myHighlightingsByEnd.remove(h); + result = true; + } + } + return result; + } + public void highlight(ZLTextPosition start, ZLTextPosition end) { - myHighlighting.setup(start, end); + removeManualHighlightings(); + final ZLTextHighlighting h = new ZLTextManualHighlighting(this, start, end); + myHighlightingsByStart.add(h); + myHighlightingsByEnd.add(h); Application.getViewWidget().reset(); Application.getViewWidget().repaint(); } public void clearHighlighting() { - if (myHighlighting.clear()) { + if (removeManualHighlightings()) { Application.getViewWidget().reset(); Application.getViewWidget().repaint(); } @@ -775,7 +794,9 @@ public abstract class ZLTextView extends ZLTextViewBase { private static final char[] SPACE = new char[] { ' ' }; private void drawTextLine(ZLTextPage page, ZLTextLineInfo info, int from, int to, int x, int y) { drawBackgroung(mySelection, page, info, from, to, x, y); - drawBackgroung(myHighlighting, page, info, from, to, x, y); + for (ZLTextHighlighting h : myHighlightingsByStart) { + drawBackgroung(h, page, info, from, to, x, y); + } final ZLPaintContext context = getContext(); final ZLTextParagraphCursor paragraph = info.ParagraphCursor;