package net.osmand.plus.views;
import java.util.List;
import net.osmand.FavouritePoint;
import net.osmand.osm.LatLon;
import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.R;
import android.content.Context;
import android.content.DialogInterface.OnClickListener;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
import android.graphics.RectF;
import android.graphics.Paint.Style;
import android.util.DisplayMetrics;
import android.util.FloatMath;
import android.view.WindowManager;
import android.widget.Toast;
public class FavoritesLayer implements OsmandMapLayer, ContextMenuLayer.IContextMenuProvider {
private static final int startZoom = 6;
private static final int radius = 15;
private OsmandMapTileView view;
private Path path;
private Path pathDst;
private Paint paint;
private Matrix matrix;
private Paint paintBlack;
private DisplayMetrics dm;
private FavouritesDbHelper favorites;
public FavoritesLayer(){
}
@Override
public void initLayer(OsmandMapTileView view) {
this.view = view;
dm = new DisplayMetrics();
WindowManager wmgr = (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE);
wmgr.getDefaultDisplay().getMetrics(dm);
path = new Path();
pathDst = new Path();
int coef1 = (int) (radius * dm.density);
int coef2 = (int) (radius * dm.density/2);
float a = (float) (Math.PI/ 5);
path.moveTo(FloatMath.sin(0)*coef1, -FloatMath.cos(0)*coef1);
for (int j = 1; j < 10; j++) {
if (j % 2 == 1) {
path.lineTo(FloatMath.sin(j * a) * coef2, -FloatMath.cos(j * a) * coef2);
} else {
path.lineTo(FloatMath.sin(j * a) * coef1, -FloatMath.cos(j * a) * coef1);
}
}
matrix = new Matrix();
path.close();
paint = new Paint();
paint.setStyle(Style.FILL);
paint.setARGB(200, 255, 150, 0);
paintBlack = new Paint();
paintBlack.setStyle(Style.STROKE);
paintBlack.setARGB(255, 0, 0, 0);
paintBlack.setAntiAlias(true);
paintBlack.setStrokeWidth(2);
favorites = view.getApplication().getFavorites();
}
@Override
public void destroyLayer() {
}
@Override
public boolean drawInScreenPixels() {
return false;
}
@Override
public void onDraw(Canvas canvas, RectF latLonBounds, boolean nightMode) {
if (view.getZoom() >= startZoom) {
// request to load
for (FavouritePoint o : favorites.getFavouritePoints()) {
if (o.getLatitude() >= latLonBounds.bottom && o.getLatitude() <= latLonBounds.top && o.getLongitude() >= latLonBounds.left
&& o.getLongitude() <= latLonBounds.right ) {
int x = view.getMapXForPoint(o.getLongitude());
int y = view.getMapYForPoint(o.getLatitude());
matrix.setTranslate(x, y);
path.transform(matrix, pathDst);
canvas.drawPath(pathDst, paint);
canvas.drawPath(pathDst, paintBlack);
}
}
if(favorites.getFavoritePointsFromGPXFile() != null){
for (FavouritePoint o : favorites.getFavoritePointsFromGPXFile()) {
if (o.getLatitude() >= latLonBounds.bottom && o.getLatitude() <= latLonBounds.top && o.getLongitude() >= latLonBounds.left
&& o.getLongitude() <= latLonBounds.right ) {
int x = view.getMapXForPoint(o.getLongitude());
int y = view.getMapYForPoint(o.getLatitude());
matrix.setTranslate(x, y);
path.transform(matrix, pathDst);
canvas.drawPath(pathDst, paint);
canvas.drawPath(pathDst, paintBlack);
}
}
}
}
}
@Override
public boolean onLongPressEvent(PointF point) {
return false;
}
public FavouritePoint getFavoriteFromPoint(PointF point) {
FavouritePoint result = null;
float r = radius * dm.density;
int ex = (int) point.x;
int ey = (int) point.y;
for (FavouritePoint n : favorites.getFavouritePoints()) {
int x = view.getRotatedMapXForPoint(n.getLatitude(), n.getLongitude());
int y = view.getRotatedMapYForPoint(n.getLatitude(), n.getLongitude());
if (Math.abs(x - ex) <= r && Math.abs(y - ey) <= r) {
r = Math.max(Math.abs(x - ex), Math.abs(y - ey));
result = n;
}
}
if (favorites.getFavoritePointsFromGPXFile() != null) {
for (int i = 0; i < favorites.getFavoritePointsFromGPXFile().size(); i++) {
FavouritePoint n = favorites.getFavoritePointsFromGPXFile().get(i);
int x = view.getRotatedMapXForPoint(n.getLatitude(), n.getLongitude());
int y = view.getRotatedMapYForPoint(n.getLatitude(), n.getLongitude());
if (Math.abs(x - ex) <= r && Math.abs(y - ey) <= r) {
r = Math.max(Math.abs(x - ex), Math.abs(y - ey));
result = n;
}
}
}
return result;
}
@Override
public boolean onTouchEvent(PointF point) {
FavouritePoint fav = getFavoriteFromPoint(point);
if(fav != null){
String format = view.getContext().getString(R.string.favorite) + " : " + fav.getName(); //$NON-NLS-1$
Toast.makeText(view.getContext(), format, Toast.LENGTH_LONG).show();
return true;
}
return false;
}
@Override
public OnClickListener getActionListener(List<String> actionsList, Object o) {
return null;
}
@Override
public String getObjectDescription(Object o) {
if(o instanceof FavouritePoint){
return view.getContext().getString(R.string.favorite) + " : " + ((FavouritePoint)o).getName(); //$NON-NLS-1$
}
return null;
}
@Override
public Object getPointObject(PointF point) {
return getFavoriteFromPoint(point);
}
@Override
public LatLon getObjectLocation(Object o) {
if(o instanceof FavouritePoint){
return new LatLon(((FavouritePoint)o).getLatitude(), ((FavouritePoint)o).getLongitude());
}
return null;
}
}