/*
Copyright (C) 2001, 2007 United States Government
as represented by the Administrator of the
National Aeronautics and Space Administration.
All Rights Reserved.
*/
package gov.nasa.worldwind.applications.sar;
import gov.nasa.worldwind.WorldWindow;
import gov.nasa.worldwind.layers.*;
import gov.nasa.worldwind.render.*;
import java.beans.*;
import java.util.HashMap;
/**
* @author tag
* @version $Id: TrackController.java 4926 2008-04-04 21:04:54Z dcollins $
*/
public class TrackController
{
public static final String TRACK_ADD = "TrackController.TrackAdded";
public static final String TRACK_REMOVE = "TrackController.TrackRemoved";
public static final String TRACK_MODIFY = "TrackController.TrackModified";
public static final String TRACK_DISABLE = "TrackController.TrackDisabled";
public static final String TRACK_ENABLE = "TrackController.TrackEnabled";
public static final String TRACK_CURRENT = "TrackController.TrackCurrent";
public static final String TRACK_NAME = "TrackController.TrackName";
public static final String TRACK_DIRTY_BIT = "TrackController.TrackDirtyBit";
public static final String BEGIN_TRACK_POINT_ENTRY = "TrackController.BeginTrackPointEntry";
public static final String END_TRACK_POINT_ENTRY = "TrackController.EndTrackPointEntry";
private WorldWindow wwd;
private TracksPanel tracksPanel;
private AnalysisPanel analysisPanel;
private HashMap<SARTrack, Layer> trackLayers = new HashMap<SARTrack, Layer>();
private SARTrackBuilder trackBuilder;
public TrackController()
{
this.trackBuilder = new SARTrackBuilder();
}
public WorldWindow getWwd()
{
return wwd;
}
public void setWwd(WorldWindow wwd)
{
if (wwd == this.wwd)
return;
this.wwd = wwd;
this.trackBuilder.setWwd(this.wwd);
}
public TracksPanel getTracksPanel()
{
return tracksPanel;
}
public void setTracksPanel(TracksPanel tracksPanel)
{
this.tracksPanel = tracksPanel;
}
public AnalysisPanel getAnalysisPanel()
{
return analysisPanel;
}
public void setAnalysisPanel(AnalysisPanel analysisPanel)
{
this.analysisPanel = analysisPanel;
}
public void addTrack(SARTrack track)
{
if (track == null)
return;
this.createPolylineTrackRepresentation(track);
track.addPropertyChangeListener(new PropertyChangeListener()
{
@SuppressWarnings({"StringEquality"})
public void propertyChange(PropertyChangeEvent propertyChangeEvent)
{
if (propertyChangeEvent.getPropertyName() == TrackController.TRACK_REMOVE)
removeTrack((SARTrack) propertyChangeEvent.getSource());
else if (propertyChangeEvent.getPropertyName() == TrackController.TRACK_MODIFY)
updateTrack((SARTrack) propertyChangeEvent.getSource());
else if (propertyChangeEvent.getPropertyName() == TrackController.TRACK_ENABLE)
enableTrack((SARTrack) propertyChangeEvent.getSource());
else if (propertyChangeEvent.getPropertyName() == TrackController.TRACK_DISABLE)
disableTrack((SARTrack) propertyChangeEvent.getSource());
else if (propertyChangeEvent.getPropertyName() == TrackController.TRACK_CURRENT)
trackCurrent((SARTrack) propertyChangeEvent.getSource());
else if (propertyChangeEvent.getPropertyName() == TrackController.TRACK_NAME)
trackName((SARTrack) propertyChangeEvent.getSource());
else if (propertyChangeEvent.getPropertyName() == TrackController.TRACK_DIRTY_BIT)
trackDirtyBit((SARTrack) propertyChangeEvent.getSource());
else if (propertyChangeEvent.getPropertyName() == TrackController.BEGIN_TRACK_POINT_ENTRY)
beginTrackPointEntry((SARTrack) propertyChangeEvent.getSource());
else if (propertyChangeEvent.getPropertyName() == TrackController.END_TRACK_POINT_ENTRY)
endTrackPointEntry((SARTrack) propertyChangeEvent.getSource());
}
});
this.tracksPanel.addTrack(track);
}
public SARTrack getCurrentTrack()
{
return this.tracksPanel.getCurrentTrack();
}
public void refreshCurrentTrack()
{
trackCurrent(getCurrentTrack());
}
private void createPolylineTrackRepresentation(SARTrack track)
{
Polyline airPath = new Polyline(track);
airPath.setOffset(track.getOffset());
airPath.setPathType(Polyline.RHUMB_LINE);
airPath.setColor(track.getColor());
Polyline groundPath = new Polyline(track);
groundPath.setFollowTerrain(true);
groundPath.setPathType(Polyline.RHUMB_LINE);
groundPath.setColor(track.getColor());
groundPath.setStippleFactor(5);
groundPath.setStipplePattern((short) 0xAAAA);
RenderableLayer layer = new RenderableLayer();
layer.addRenderable(airPath);
layer.addRenderable(groundPath);
this.wwd.getModel().getLayers().add(layer);
if (this.wwd != null)
this.wwd.redraw();
this.trackLayers.put(track, layer);
}
private void removeTrack(SARTrack track)
{
Layer layer = this.trackLayers.get(track);
if (layer == null)
return;
this.trackLayers.remove(track);
this.wwd.getModel().getLayers().remove(layer);
if (this.wwd != null)
this.wwd.redraw();
}
private void enableTrack(SARTrack track)
{
RenderableLayer layer = (RenderableLayer) this.trackLayers.get(track);
if (layer == null)
return;
layer.setEnabled(true);
if (this.wwd != null)
this.wwd.redraw();
}
private void disableTrack(SARTrack track)
{
RenderableLayer layer = (RenderableLayer) this.trackLayers.get(track);
if (layer == null)
return;
layer.setEnabled(false);
if (this.wwd != null)
this.wwd.redraw();
}
private void updateTrack(SARTrack track)
{
RenderableLayer layer = (RenderableLayer) this.trackLayers.get(track);
if (layer == null)
return;
for (Renderable r : layer.getRenderables())
{
Polyline line = (Polyline) r;
line.setPositions(track);
if (!line.isFollowTerrain())
line.setOffset(track.getOffset());
}
if (this.wwd != null)
this.wwd.redraw();
}
private void trackCurrent(SARTrack track)
{
this.analysisPanel.setCurrentTrack(track);
this.trackBuilder.setArmed(false);
}
@SuppressWarnings({"UnusedDeclaration"})
private void trackName(SARTrack track)
{
// Intentionally left blank, as a placeholder for future functionality.
}
@SuppressWarnings({"UnusedDeclaration"})
private void trackDirtyBit(SARTrack track)
{
// Intentionally left blank, as a placeholder for future functionality.
}
private void beginTrackPointEntry(SARTrack track)
{
this.trackBuilder.setArmed(false);
this.trackBuilder.setTrack(track);
this.trackBuilder.setArmed(true);
}
@SuppressWarnings({"UnusedDeclaration"})
private void endTrackPointEntry(SARTrack track)
{
this.trackBuilder.setArmed(false);
}
}