- /*
- * to avoid redrawing the whole visible region, we instead
- * calculate the minimal redraw to remove previous highlights
- * and add new ones;
- * first make a temporary SearchResults that includes
- * both the new and any existing search results
- */
- SearchResultsI combined = results;
- SearchResultsI previous = av.getSearchResults();
- if (previous != null)
+ try
+ {
+ /*
+ * to avoid redrawing the whole visible region, we instead
+ * redraw just the minimal regions to remove previous highlights
+ * and add new ones
+ */
+ SearchResultsI previous = av.getSearchResults();
+ av.setSearchResults(results);
+ boolean redrawn = drawMappedPositions(previous);
+ redrawn |= drawMappedPositions(results);
+ if (redrawn)
+ {
+ repaint();
+ }
+ } finally
+ {
+ fastpainting = false;
+ }
+ }
+
+ /**
+ * Redraws the minimal rectangle in the visible region (if any) that includes
+ * mapped positions of the given search results. Whether or not positions are
+ * highlighted depends on the SearchResults set on the Viewport. This allows
+ * this method to be called to either clear or set highlighting. Answers true
+ * if any positions were drawn (in which case a repaint is still required),
+ * else false.
+ *
+ * @param results
+ * @return
+ */
+ protected boolean drawMappedPositions(SearchResultsI results)
+ {
+ if (results == null)