package org.mixare;
import static android.view.KeyEvent.KEYCODE_CAMERA;
import static android.view.KeyEvent.KEYCODE_DPAD_DOWN;
import static android.view.KeyEvent.KEYCODE_DPAD_LEFT;
import static android.view.KeyEvent.KEYCODE_DPAD_RIGHT;
import static android.view.KeyEvent.KEYCODE_DPAD_UP;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Locale;
import org.mixare.data.Json;
import org.mixare.gui.PaintScreen;
import org.mixare.gui.RadarPoints;
import org.mixare.gui.ScreenLine;
import org.mixare.render.Camera;
import org.mixare.render.Matrix;
import org.mixare.render.MixVector;
import org.tesis.Estado;
import android.graphics.Color;
import android.location.Location;
public class DataView
{
MixContext ctx;
boolean isInit = false;
int width, height;
Camera cam;
public MixState state = new MixState();
boolean frozen = false;
int retry = 0;
//Servicio Web (Tesis)
String HOME_URL = "http://ejemplos.net78.net/areae/servicio.php";
ArrayList<UIEvent> uiEvents = new ArrayList<UIEvent>();
RadarPoints radarPoints = new RadarPoints();
Matrix rInv = new Matrix();
MixVector looking = new MixVector();
ScreenLine lrl = new ScreenLine();
ScreenLine rrl = new ScreenLine();
float rx = 10;
float ry = 20;
public float addX = 0;
public float addY = 0;
//-------------------------------------------
public DataView(MixContext ctx)
{
this.ctx = ctx;
}
//-------------------------------------------
public void doStart()
{
state.nextLStatus = MixState.NOT_STARTED;
}
//-------------------------------------------
public boolean isInited()
{
return isInit;
}
//-------------------------------------------
public void init(int widthInit, int heightInit)
{
try
{
width = widthInit;
height = heightInit;
cam = new Camera(width, height, true);
cam.setViewAngle(Camera.DEFAULT_VIEW_ANGLE);
lrl.set(0, -RadarPoints.RADIUS);
lrl.rotate(Camera.DEFAULT_VIEW_ANGLE / 2);
lrl.add(rx + RadarPoints.RADIUS, ry + RadarPoints.RADIUS);
rrl.set(0, -RadarPoints.RADIUS);
rrl.rotate(-Camera.DEFAULT_VIEW_ANGLE / 2);
rrl.add(rx + RadarPoints.RADIUS, ry + RadarPoints.RADIUS);
}
catch (Exception ex)
{
ex.printStackTrace();
}
frozen = false;
isInit = true;
}
//-------------------------------------------
public void draw(PaintScreen dw)
{
ctx.getRM(cam.transform);
state.curFix = ctx.getCurrentLocation();
state.calcPitchBearing(cam.transform);
state.screenWidth = width;
state.screenHeight = height;
//--------------------------------------------
// No se han descargado los puntos
// Load Layer
//--------------------------------------------
if (state.nextLStatus == MixState.NOT_STARTED )
{
DownloadRequest request = new DownloadRequest();
if (!ctx.getStartUrl().equals(""))
{
request.url = ctx.getStartUrl();
}
else
{
request.url = HOME_URL + "?lat="+state.curFix.getLatitude()+"&lon=" + state.curFix.getLongitude() + "&rad="+ state.radius +"&maxRows=50&lang=" + Locale.getDefault().getLanguage();
}
state.startUrl = ctx.getStartUrl();
state.downloadId = ctx.getDownloader().submitJob(request);
state.nextLStatus = MixState.PROCESSING;
}
//--------------------------------------------
//Si esta en fase de descarga de datos
//--------------------------------------------
else if (state.nextLStatus == MixState.PROCESSING)
{
//Si se completo la descarga
if (ctx.getDownloader().isReqComplete(state.downloadId))
{
state.dRes = ctx.getDownloader().getReqResult(state.downloadId);
if (state.dRes.error && retry < 3)
{
retry++;
state.nextLStatus = MixState.NOT_STARTED;
}
else
{
retry = 0;
state.nextLStatus = MixState.DONE;
state.jLayer = (Json) state.dRes.obj;
// Sort markers by cMarker.z
Collections.sort(state.jLayer.markers, new MarkersOrder());
//Ya es posible realizar eventos del raton sobre el
ctx.objEstado.estActual = Estado.EST_NAVEGANDO;
}
}
}
//--------------------------------------------
//Actualizar marcadores
//--------------------------------------------
for (int i = 0; i < state.jLayer.markers.size(); i++)
{
Marker ma = state.jLayer.markers.get(i);
float[] dist = new float[1];
dist[0] = 0;
Location.distanceBetween(ma.mGeoLoc.getLatitude(), ma.mGeoLoc.getLongitude(), ctx.getCurrentLocation().getLatitude(), ctx.getCurrentLocation().getLongitude(), dist);
ma.distance = (dist[0]/1000);
if (dist[0] / 1000f < Float.parseFloat(state.radius))
{
if (!frozen)
{
ma.update(state.curFix, System.currentTimeMillis());
}
ma.calcPaint(cam, addX, addY);
ma.draw(dw);
}
}
if ((Estado.radio360 == true) && (ctx.mixView.objEstado.estActual != Estado.EST_TOMANDO_FOTOS))
{
// Draw Radar
String dirTxt = "";
int bearing = (int) state.getCurBearing();
int range = (int) (state.getCurBearing() / (360f / 16f));
if (range == 15 || range == 0 ) dirTxt = "N";
else if (range == 1 || range == 2 ) dirTxt = "NE";
else if (range == 3 || range == 4 ) dirTxt = "E";
else if (range == 5 || range == 6 ) dirTxt = "SE";
else if (range == 7 || range == 8 ) dirTxt = "S";
else if (range == 9 || range == 10) dirTxt = "SW";
else if (range == 11 || range == 12) dirTxt = "W";
else if (range == 13 || range == 14) dirTxt = "NW";
radarPoints.view = this;
dw.paintObj(radarPoints, rx, ry, -state.getCurBearing(), 1);
dw.setFill(false);
dw.setColor(Color.argb(150,0,0,220));
dw.paintLine( lrl.x, lrl.y, rx+RadarPoints.RADIUS, ry+RadarPoints.RADIUS);
dw.paintLine( rrl.x, rrl.y, rx+RadarPoints.RADIUS, ry+RadarPoints.RADIUS);
dw.setColor(Color.rgb(255,255,255));
dw.setFontSize(12);
radarText(dw, MixUtils.formatDist(Float.parseFloat(state.radius) * 1000), rx + RadarPoints.RADIUS, ry + RadarPoints.RADIUS*2 -10, false);
radarText(dw, "" + bearing + ((char) 176) + " " + dirTxt, rx + RadarPoints.RADIUS, ry - 5, true);
}
// Get next event
UIEvent evt = null;
synchronized (uiEvents)
{
if (uiEvents.size() > 0)
{
evt = uiEvents.get(0);
uiEvents.remove(0);
}
}
if (evt != null && evt.type == UIEvent.KEY)
{
handleKeyEvent((KeyEvent) evt);
evt = null;
}
if (evt != null && evt.type == UIEvent.CLICK)
{
handleClickEvent((ClickEvent) evt);
}
}
//-------------------------------------------
private void handleKeyEvent(KeyEvent evt)
{
/** Adjust marker position with keypad */
final float CONST = 10f;
if (evt.keyCode == KEYCODE_DPAD_LEFT)
{
addX -= CONST;
}
else if (evt.keyCode == KEYCODE_DPAD_RIGHT)
{
addX += CONST;
}
else if (evt.keyCode == KEYCODE_DPAD_DOWN)
{
addY += CONST;
}
else if (evt.keyCode == KEYCODE_DPAD_UP)
{
addY -= CONST;
}
/** freeze the overlay with the camera button */
if (evt.keyCode == KEYCODE_CAMERA)
{
frozen = !frozen;
}
}
//-------------------------------------------
boolean handleClickEvent(ClickEvent evt)
{
boolean evtHandled = false;
//Si se han descargado todos los POIs
// Handle event
if (state.nextLStatus == MixState.DONE)
{
for (int i = state.jLayer.markers.size() - 1; i >= 0 && !evtHandled; i--)
{
Marker pm = state.jLayer.markers.get(i);
//Se comprueba cada uno de los marcadores a ver si concide
//con las coordenadas del click sobre la pantallas
//evtHandled = pm.fClick(evt.x, evt.y, ctx, state);
evtHandled = pm.fClick(evt.x, evt.y, ctx, state);
}
}
return evtHandled;
}
//-------------------------------------------
void radarText(PaintScreen dw, String txt, float x, float y, boolean bg)
{
float padw = 4, padh = 2;
float w = dw.getTextWidth(txt) + padw * 2;
float h = dw.getTextAsc() + dw.getTextDesc() + padh * 2;
if (bg)
{
dw.setColor(Color.rgb(0, 0, 0));
dw.setFill(true);
dw.paintRect(x - w / 2, y - h / 2, w, h);
dw.setColor(Color.rgb(255, 255, 255));
dw.setFill(false);
dw.paintRect(x - w / 2, y - h / 2, w, h);
}
dw.paintText(padw + x - w / 2, padh + dw.getTextAsc() + y - h / 2, txt);
}
//-------------------------------------------
public void clickEvent(float x, float y)
{
synchronized (uiEvents)
{
uiEvents.add(new ClickEvent(x, y));
}
}
//-------------------------------------------
public void keyEvent(int keyCode)
{
synchronized (uiEvents)
{
uiEvents.add(new KeyEvent(keyCode));
}
}
//-------------------------------------------
public void clearEvents()
{
synchronized (uiEvents)
{
uiEvents.clear();
}
}
}
//-------------------------------------------
class UIEvent
{
public static int CLICK = 0, KEY = 1;
public int type;
}
//-------------------------------------------
class ClickEvent extends UIEvent
{
public float x, y;
public ClickEvent(float x, float y)
{
this.type = CLICK;
this.x = x;
this.y = y;
}
//-------------------------------------------
@Override
public String toString()
{
return "(" + x + "," + y + ")";
}
}
//-------------------------------------------
class KeyEvent extends UIEvent
{
public int keyCode;
//-------------------------------------------
public KeyEvent(int keyCode)
{
this.type = KEY;
this.keyCode = keyCode;
}
//-------------------------------------------
@Override
public String toString()
{
return "(" + keyCode + ")";
}
}
|