package cgeo.geocaching.maps.mapsforge.v6.caches;
import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.maps.mapsforge.v6.TapHandler;
import org.mapsforge.core.graphics.Bitmap;
import org.mapsforge.core.model.LatLong;
import org.mapsforge.core.model.Point;
import org.mapsforge.core.model.Rectangle;
import org.mapsforge.map.layer.overlay.Marker;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.WindowManager;
public class GeoitemLayer extends Marker {
private static final double tapSpanInches = 0.12; // 3mm as inches
private static final double tapSpanRadius;
static {
final DisplayMetrics metrics = new DisplayMetrics();
final WindowManager windowManager = (WindowManager) CgeoApplication.getInstance().getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(metrics);
tapSpanRadius = metrics.densityDpi * tapSpanInches / 2.0;
}
private final GeoitemRef item;
private final TapHandler tapHandler;
private final double halfXSpan;
private final double halfYSpan;
public GeoitemLayer(final GeoitemRef item, final TapHandler tapHandler, final LatLong latLong, final Bitmap bitmap, final int horizontalOffset, final int verticalOffset) {
super(latLong, bitmap, horizontalOffset, verticalOffset);
this.item = item;
this.tapHandler = tapHandler;
this.halfXSpan = getBitmap().getWidth() / 2.0;
this.halfYSpan = getBitmap().getHeight() / 2.0;
}
public GeoitemRef getItem() {
return item;
}
public String getItemCode() {
return item.getItemCode();
}
@Override
public boolean onTap(final LatLong tapLatLong, final Point layerXY, final Point tapXY) {
if (isHit(layerXY, tapXY)) {
tapHandler.setHit(item);
}
return super.onTap(tapLatLong, layerXY, tapXY);
}
private boolean isHit(final Point layerXY, final Point tapXY) {
final Rectangle rect = new Rectangle(layerXY.x + getHorizontalOffset() - halfXSpan, layerXY.y + getVerticalOffset() - halfYSpan, layerXY.x + getHorizontalOffset() + halfXSpan, layerXY.y + getVerticalOffset() + halfYSpan);
return rect.intersectsCircle(tapXY.x, tapXY.y, tapSpanRadius);
}
}