package org.codemap.layers; import org.codemap.Location; import org.codemap.MapSelection; import org.codemap.resources.MapValues; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Transform; public class YouAreHereOverlay extends SelectionOverlay { private static final int GAP = 4; private static final int ARROW_WIDTH = 8; private static final int ARROW_HEIGHT = 10; private static final int PADDING_X = 6; private static final int PADDING_Y = 1; @Override public void paintBefore(MapValues map, GC gc) { Device device = gc.getDevice(); gc.setLineWidth(1); gc.setAlpha(255); gc.setForeground(device.getSystemColor(SWT.COLOR_INFO_FOREGROUND)); gc.setBackground(device.getSystemColor(SWT.COLOR_INFO_BACKGROUND)); } @Override public void paintChild(MapValues map, GC gc, Location location) { Device device = gc.getDevice(); gc.setFont(device.getSystemFont()); String name = location.getName(); Point e = gc.stringExtent(name); e.x += PADDING_X * 2; e.y += PADDING_Y * 2; int[] polygon = new int[] { 0, 0, e.x, 0, e.x, e.y, (e.x + ARROW_WIDTH) / 2, e.y, e.x / 2, e.y + ARROW_HEIGHT, (e.x - ARROW_WIDTH) / 2, e.y, 0, e.y }; Transform save = new Transform(device); gc.getTransform(save); Transform t = new Transform(device); gc.getTransform(t); t.translate(location.px - e.x/2, location.py - e.y - ARROW_HEIGHT - GAP); gc.setTransform(t); gc.fillPolygon(polygon); gc.drawPolygon(polygon); gc.drawText(name, PADDING_X, PADDING_Y); gc.setTransform(save); t.dispose(); save.dispose(); // TODO learn from class RenameInformationPopup how to open a custom popup, dream on... } @Override public MapSelection getSelection(MapValues map) { return map.youAreHereSelection; } }