sclass ImageSurface_HighlightRegion > ImageSurfaceMouseHandler is G2Drawable { FastRegions_BWImage regions; int iHighlightedRegion; Pt lastPt; RegionPainter regionPainter = new RegionBoundingBoxPainter; *(ImageSurface is) { if (containsInstance(is.tools, getClass())) ret; register(is); is.overlays.add(this); } public void close :: after { is.overlays.remove(this); } public void mouseMoved aka mouseEntered(MouseEvent e) { lastPt = getPt(e); update(); } public void mouseExited(MouseEvent e) { lastPt = null; update(); } // TODO: enter, exit int newRegion() { if (lastPt == null || regions == null) ret 0; ret regions.regionAt(lastPt.x, lastPt.y); } void update { int r = newRegion(); if (iHighlightedRegion != r) { iHighlightedRegion = r; is.repaint(); } } void setRegions(FastRegions_BWImage regions) { this.regions = regions; iHighlightedRegion = -abs(iHighlightedRegion); update(); } public void drawOn(Graphics2D g) { if (iHighlightedRegion == 0 || regionPainter == null) ret; regionPainter.zoomX(is.getZoomX()); regionPainter.zoomY(is.getZoomY()); regionPainter.g(g); afterwards regionPainter.g(null); regionPainter.regions(regions).iRegion(iHighlightedRegion); regionPainter.drawRegion(); } swappable void highlightRegion(int iRegion) { Rect r = regions.regionBounds(iRegion); g.setColor(withOpacity(.75, Color.red)); temp tempSetStroke(g, new BasicStroke(lineWidth)); drawRect(g, growRectTopAndLeft(scaleRect_floor(growRectRightAndBottom(r), is.getZoomX(), is.getZoomY()))); } }