/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.geoforge.worldwind.layer;
import gov.nasa.worldwind.geom.LatLon;
import gov.nasa.worldwind.geom.Position;
import gov.nasa.worldwind.render.PointPlacemark;
import gov.nasa.worldwind.render.Renderable;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.logging.Logger;
import org.geoforge.lang.handler.IGfrHandlerLifeCycleObject;
import org.geoforge.lang.util.geography.GfrUtilDmsOperation;
import org.geoforge.java.util.logging.filehandler.FileHandlerLogger;
import org.geoforge.mdl.event.GfrEvtMdlIdAbs;
import org.geoforge.mdldat.event.GfrEvtMdlIdDatChangedGeometry;
import org.geoforge.worldwind.handler.IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer;
import org.geoforge.worldwind.render.GfrShouldRedrawRnd;
/**
*
* @author robert
*/
abstract public class GfrRlrObjTloRndMltPntCircleAbs extends GfrRlrObjTloRndMltAbs
{
// ----
// begin: instantiate logger for this class
final private static Logger _LOGGER_ = Logger.getLogger(GfrRlrObjTloRndMltPntCircleAbs.class.getName());
static
{
GfrRlrObjTloRndMltPntCircleAbs._LOGGER_.addHandler(FileHandlerLogger.s_getInstance());
}
// end: instantiate logger for this class
// ----
abstract protected void _fillIn(List<Position> lstPos) throws Exception;
protected GfrRlrObjTloRndMltPntCircleAbs(PropertyChangeListener lstShouldRedraw, String strId) throws Exception
{
super(lstShouldRedraw, strId);
if (lstShouldRedraw != null)
super.addPropertyChangeListener(lstShouldRedraw);
}
@Override
public void destroy()
{
super.removePropertyChangeListener(super._lstShouldRedraw);
super.destroy();
}
public ArrayList<Position> getPositionsRenderableObjects()
{
ArrayList<Position> lstPositions = new ArrayList<Position>();
if (super._lstObject==null || super._lstObject.isEmpty())
return lstPositions;
for (int i=0; i<super._lstObject.size(); i++)
{
IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer objCur = (IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer) super._lstObject.get(i);
PointPlacemark pntCur = (PointPlacemark) objCur;
lstPositions.add(pntCur.getPosition());
}
return lstPositions;
}
@Override
public Position getPositionBarycentricObjectGeoforgeWwdEarth() throws Exception
{
if (super._lstObject==null || super._lstObject.isEmpty())
return null;
double dblMinLat = 500;
double dblMaxLat = -500;
double dblMinLon = 500;
double dblMaxLon = -500;
for (int i=0; i<super._lstObject.size(); i++)
{
IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer objCur = (IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer) super._lstObject.get(i);
PointPlacemark pntCur = (PointPlacemark) objCur;
LatLon llnCur = pntCur.getPosition();
//
double[] dbls = llnCur.asDegreesArray();
if (dbls[0] < dblMinLat)//=a
{
dblMinLat = dbls[0];
}
if (dbls[1] < dblMinLon)//=c
{
dblMinLon = dbls[1];
}
if (dbls[0] > dblMaxLat)//=b
{
dblMaxLat = dbls[0];
}
if (dbls[1] > dblMaxLon)//=d
{
dblMaxLon = dbls[1];
}
}
double dblLat = dblMinLat;
dblLat += dblMaxLat;
dblLat /= 2;
double dblLon = dblMinLon;
dblLon += dblMaxLon;
dblLon /= 2;
return Position.fromDegrees(dblLat, dblLon);
}
@Override
public double getCharacteristicDimensionObjectGeoforgeRenderableLayer() throws Exception
{
double dblMinLat = 500;
double dblMaxLat = -500;
double dblMinLon = 500;
double dblMaxLon = -500;
for (int i = 0; i < super._lstObject.size(); i++)
{
IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer objCur = (IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer) super._lstObject.get(i);
PointPlacemark pntCur = (PointPlacemark) objCur;
LatLon llnCur = pntCur.getPosition();
double[] dbls = llnCur.asDegreesArray();
if (dbls[0] < dblMinLat)//=a
{
dblMinLat = dbls[0];
}
if (dbls[1] < dblMinLon)//=c
{
dblMinLon = dbls[1];
}
if (dbls[0] > dblMaxLat)//=b
{
dblMaxLat = dbls[0];
}
if (dbls[1] > dblMaxLon)//=d
{
dblMaxLon = dbls[1];
}
}
double dist = GfrUtilDmsOperation.s_getDistanceFromDeg(dblMinLat, dblMinLon, dblMaxLat, dblMaxLon);
dist *= 2;
return dist;
}
@Override
public void update(Observable obs, Object objEvt)
{
if (objEvt instanceof GfrEvtMdlIdDatChangedGeometry)
{
GfrEvtMdlIdAbs evtId = (GfrEvtMdlIdAbs) objEvt;
String strId = evtId.getId();
if (strId.compareTo(super._strId) != 0)
return;
GfrEvtMdlIdDatChangedGeometry evtChange = (GfrEvtMdlIdDatChangedGeometry) evtId;
List<Position> lstPos = (List<Position>) evtChange.getGeometry();
_clear_();
if (lstPos!=null && !lstPos.isEmpty())
{
try
{
_fillIn(lstPos);
}
catch(Exception exc)
{
exc.printStackTrace();
GfrRlrObjTloRndMltPntCircleAbs._LOGGER_.severe(exc.getMessage());
// TODO: error dialog
return;
}
}
this.firePropertyChange(GfrShouldRedrawRnd.STR, null, null);
return;
}
super.update(obs, objEvt);
}
private void _clear_()
{
if (super._lstObject!=null && !super._lstObject.isEmpty())
{
for (Renderable rndCur: super._lstObject)
{
super.removeRenderable(rndCur);
((IGfrHandlerLifeCycleObject) rndCur).destroy();
}
}
super._lstObject.clear();
}
}