/*
* Copyright (C) 2011-2014 GeoForge Project
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.geoforge.guillc.panel;
import gov.nasa.worldwind.event.SelectListener;
import gov.nasa.worldwind.geom.Angle;
import gov.nasa.worldwind.geom.LatLon;
import gov.nasa.worldwind.geom.Position;
import gov.nasa.worldwind.layers.Layer;
import gov.nasa.worldwind.layers.ViewControlsLayer;
import gov.nasa.worldwind.poi.PointOfInterest;
import gov.nasa.worldwind.render.Renderable;
import gov.nasa.worldwind.view.orbit.BasicOrbitView;
import java.awt.BorderLayout;
import java.awt.event.MouseListener;
import java.util.Iterator;
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Logger;
import javax.swing.JPanel;
import org.geoforge.guillc.wwd.util.OurToolTipControllerAbs;
import org.geoforge.java.util.logging.filehandler.FileHandlerLogger;
import org.geoforge.lang.handler.IGfrHandlerLifeCycleObject;
import org.geoforge.mdldsp.event.action.control.*;
import org.geoforge.worldwind.awt.GfrWorldWindowGLCanvas;
import org.geoforge.worldwind.awt.annotation.GfrCtrAnnCntImgs;
import org.geoforge.worldwind.handler.IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer;
import org.geoforge.worldwind.layer.GfrRlrObjTloAbs;
import org.geoforge.worldwind.layer.OurRlrLayerManagerLayer;
import org.geoforge.worldwind.render.GfrRndSurfacePolylineWisYesMloAbs;
import org.geoforge.worldwind.util.GfrCtrMenContextAbs;
import org.geoforge.worldwind.util.OurHighlightController;
import org.geoforge.worldwind.util.listener.OurViewControlsSelectListener;
/**
*
* @author bantchao
*
* email: bantchao_AT_gmail.com
* ... please remove "_AT_" from the above string to get the right email address
*
*/
abstract public class GfrPnlMainWwdAbs extends JPanel implements
IGfrHandlerLifeCycleObject,
Observer
{
/*
* TODO: check for more precision definition in displayed map layers
*/
final static private double _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_ =
1100d; // minimum definition for Ms Virtual Earth Aerial
// not yet in use, as for info
final static private double _DBL_MINIMUM_ZOOM_4_BRGM_FRANCE_GEOLOGY_ =
2000d;
// ----
// begin: instantiate logger for this class
final private static Logger _LOGGER_ = Logger.getLogger(GfrPnlMainWwdAbs.class.getName());
static
{
GfrPnlMainWwdAbs._LOGGER_.addHandler(FileHandlerLogger.s_getInstance());
}
// end: instantiate logger for this class
// ----
transient protected boolean _blnIsSerializableStateOrbit = false;
static public void s_insertBeforeCompass(
gov.nasa.worldwind.WorldWindow wwd,
gov.nasa.worldwind.layers.Layer layer)
{
// Insert the layer into the layer list just before the compass.
int intPosCompass = 0;
gov.nasa.worldwind.layers.LayerList llt = wwd.getModel().getLayers();
for (gov.nasa.worldwind.layers.Layer lyr: llt)
{
if (lyr instanceof gov.nasa.worldwind.layers.CompassLayer)
intPosCompass = llt.indexOf(lyr);
}
llt.add(intPosCompass, layer);
}
transient protected GfrPnlStatusBarWwd _pnlStatusbar = null;;
transient protected GfrWorldWindowGLCanvas _cnv = null;
transient protected OurToolTipControllerAbs _ctrTooltip = null;
// !!!!!!!!!
transient protected OurViewControlsSelectListener _lstViewControls = null;
transient private OurHighlightController _ctrHighlight_ = null;
transient private OurRlrLayerManagerLayer _lml_ = null;
transient private GfrCtrMenContextAbs _ctrMenContextObject_ = null;
transient private GfrCtrMenContextAbs _ctrMenContextVoid_ = null;
public OurToolTipControllerAbs getToolTipController() { return this._ctrTooltip; }
public void setToolTipController(OurToolTipControllerAbs ttc) { this._ctrTooltip = ttc; }
public OurHighlightController getHighlightController() { return this._ctrHighlight_; }
public void setHighlightController(OurHighlightController ttc) { this._ctrHighlight_ = ttc; }
public void setUtmStatusBar(boolean bln) { this._pnlStatusbar.setUtm(bln); }
protected GfrPnlMainWwdAbs(
GfrCtrMenContextAbs ctrMenContextObject,
GfrCtrMenContextAbs ctrMenContextVoid,
boolean blnIsSerializableStateOrbit) throws Exception
{
super();
this._ctrMenContextObject_ = ctrMenContextObject;
this._ctrMenContextVoid_ = ctrMenContextVoid;
this._blnIsSerializableStateOrbit = blnIsSerializableStateOrbit;
_loadCanvas_();
}
protected void _zoomTo(PointOfInterest poi)
{
Position pos = new Position(poi.getLatlon(), 0);
this._cnv.zoomTo(
pos,
_DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_, //dblZoom,
true // tempo code, alti location should be rewritten according to convex hull
);
}
@Override
public void update(Observable obs, Object objEvt)
{
if (objEvt instanceof GfrEvtMdlDspActCtrZoomToPoi)
{
GfrEvtMdlDspActCtrZoomToPoi evtPoi = (GfrEvtMdlDspActCtrZoomToPoi) objEvt;
PointOfInterest poi = evtPoi.getValue();
_zoomTo(poi);
return;
}
if (objEvt instanceof GfrEvtMdlDspActCtrIdZoomObject)
{
GfrEvtMdlDspActCtrIdZoomAbs actEvent = (GfrEvtMdlDspActCtrIdZoomAbs) objEvt;
String strIdTarget = actEvent.getIdTarget();
_zoomToObject(strIdTarget);
return;
}
if (objEvt instanceof GfrEvtMdlDspActCtrIdZoomLineWiseOpenBeg)
{
GfrEvtMdlDspActCtrIdZoomAbs actEvent = (GfrEvtMdlDspActCtrIdZoomAbs) objEvt;
String strIdTarget = actEvent.getIdTarget();
_zoomToFirstPositionLineWiseOpen(strIdTarget);
return;
}
if (objEvt instanceof GfrEvtMdlDspActCtrIdZoomLineWiseOpenEnd)
{
GfrEvtMdlDspActCtrIdZoomAbs actEvent = (GfrEvtMdlDspActCtrIdZoomAbs) objEvt;
String strIdTarget = actEvent.getIdTarget();
_zoomToLastPositionLineWiseOpen(strIdTarget);
return;
}
if (objEvt instanceof GfrEvtMdlDspActCtrIdZoomLineWiseOpenPrev)
{
GfrEvtMdlDspActCtrIdZoomLineWiseOpenPrev actEvent = (GfrEvtMdlDspActCtrIdZoomLineWiseOpenPrev) objEvt;
String strIdTarget = actEvent.getIdTarget();
Position posSource = actEvent.getPositionSource();
_zoomToPreviousPositionLineWiseOpen(strIdTarget, posSource);
return;
}
if (objEvt instanceof GfrEvtMdlDspActCtrIdZoomLineWiseOpenNext)
{
GfrEvtMdlDspActCtrIdZoomLineWiseOpenNext actEvent = (GfrEvtMdlDspActCtrIdZoomLineWiseOpenNext) objEvt;
String strIdTarget = actEvent.getIdTarget();
Position posSource = actEvent.getPositionSource();
_zoomToNextPositionLineWiseOpen(strIdTarget, posSource);
return;
}
String strSevere = "uncaught, objEvent.getClass().toString()=" + objEvt.getClass().toString();
GfrPnlMainWwdAbs._LOGGER_.severe(strSevere);
}
// for now, no need to return boolean
private boolean _zoomToObjectAnyMlo_(String strIdTarget, gov.nasa.worldwind.layers.LayerList llt)
throws Exception
{
for (Layer lyrCur : llt)
{
if (! (lyrCur instanceof GfrRlrObjTloAbs))
continue;
GfrRlrObjTloAbs lyrGfrCur = (GfrRlrObjTloAbs) lyrCur;
Iterator<Renderable> itrChildren = lyrGfrCur.getRenderables().iterator();
if (!itrChildren.hasNext())
continue;
while (itrChildren.hasNext())
{
Renderable rndCurChild = itrChildren.next();
if (!(rndCurChild instanceof IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer))
continue;
IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer objRndChildCur = (IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer) rndCurChild;
String strIdCurChildCur = objRndChildCur.getIdObjectGeoforgeWwdEarth();
if (strIdCurChildCur.compareTo(strIdTarget) != 0)
continue;
Position posCenter = objRndChildCur.getPositionBarycentricObjectGeoforgeWwdEarth();
double dblZoom = objRndChildCur.getCharacteristicDimensionObjectGeoforgeRenderableLayer();
if (dblZoom < _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_)
dblZoom = _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_;
this._cnv.zoomTo(
posCenter,
dblZoom,
true // tempo code, alti location should be rewritten according to convex hull
);
return true;
}
}
return false;
}
private boolean _zoomToObjectAnyTlo_(String strIdTarget, gov.nasa.worldwind.layers.LayerList llt)
throws Exception
{
for (Layer lyrCur : llt)
{
if (! (lyrCur instanceof GfrRlrObjTloAbs))
continue;
GfrRlrObjTloAbs lyrGfrCur = (GfrRlrObjTloAbs) lyrCur;
String strIdCur = lyrGfrCur.getIdObjectGeoforgeWwdEarth();
if (strIdCur.compareTo(strIdTarget) != 0)
continue;
Position posCenter = lyrGfrCur.getPositionBarycentricObjectGeoforgeWwdEarth();
if (posCenter == null) // ie. empty pointSet, empty mly, no latLon ssm
{
return true;
}
double dblZoom = lyrGfrCur.getCharacteristicDimensionObjectGeoforgeRenderableLayer();
if (dblZoom < _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_)
dblZoom = _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_;
this._cnv.zoomTo(
posCenter,
dblZoom,
true // tempo code, alti location should be rewritten according to convex hull
);
return true;
}
return false;
}
protected void _zoomToNextPositionLineWiseOpen(String strIdTarget, Position posSource)
{
try
{
gov.nasa.worldwind.Model mod = this._cnv.getModel();
gov.nasa.worldwind.layers.LayerList llt = mod.getLayers();
// BEG TODO, no need for now
//if (this._zoomToNextPositionLineWiseOpenAnyTlo_(strIdTarget, llt, posSource))
// return;
// END TODO
if (this._zoomToNextPositionLineWiseOpenAnyMlo_(strIdTarget, llt, posSource))
return;
// candidate for others, like ?Mlo?
}
catch(Exception exc)
{
// don't care
}
}
protected void _zoomToPreviousPositionLineWiseOpen(String strIdTarget, Position posSource)
{
try
{
gov.nasa.worldwind.Model mod = this._cnv.getModel();
gov.nasa.worldwind.layers.LayerList llt = mod.getLayers();
// BEG TODO, no need for now
//if (this._zoomToPreviousPositionLineWiseOpenAnyTlo_(strIdTarget, llt, posSource))
// return;
// END TODO
if (this._zoomToPreviousPositionLineWiseOpenAnyMlo_(strIdTarget, llt, posSource))
return;
// candidate for others, like ?Mlo?
}
catch(Exception exc)
{
// don't care
}
}
protected void _zoomToFirstPositionLineWiseOpen(String strIdTarget)
{
try
{
gov.nasa.worldwind.Model mod = this._cnv.getModel();
gov.nasa.worldwind.layers.LayerList llt = mod.getLayers();
// BEG TODO, no need for now
//if (this._zoomToFirstPositionLineWiseOpenAnyTlo_(strIdTarget, llt))
// return;
// END TODO
if (this._zoomToFirstPositionLineWiseOpenAnyMlo_(strIdTarget, llt))
return;
// candidate for others, like ?Mlo?
}
catch(Exception exc)
{
// don't care
}
}
// for now, just handling MLOs
protected void _zoomToLastPositionLineWiseOpen(String strIdTarget)
{
try
{
gov.nasa.worldwind.Model mod = this._cnv.getModel();
gov.nasa.worldwind.layers.LayerList llt = mod.getLayers();
// BEG TODO, no need for now
//if (this._zoomToLastPositionLineWiseOpenAnyTlo_(strIdTarget, llt))
// return;
// END TODO
if (this._zoomToLastPositionLineWiseOpenAnyMlo_(strIdTarget, llt))
return;
// candidate for others, like ?Mlo?
}
catch(Exception exc)
{
// don't care
}
}
// for now, no need to return boolean
private boolean _zoomToFirstPositionLineWiseOpenAnyMlo_(
String strIdTarget,
gov.nasa.worldwind.layers.LayerList llt)
throws Exception
{
for (Layer lyrCur : llt)
{
if (! (lyrCur instanceof GfrRlrObjTloAbs))
continue;
GfrRlrObjTloAbs lyrGfrCur = (GfrRlrObjTloAbs) lyrCur;
Iterator<Renderable> itrChildren = lyrGfrCur.getRenderables().iterator();
if (!itrChildren.hasNext())
continue;
while (itrChildren.hasNext())
{
Renderable rndCurChild = itrChildren.next();
if (!(rndCurChild instanceof IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer))
continue;
IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer objRndChildCur = (IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer) rndCurChild;
String strIdCurChildCur = objRndChildCur.getIdObjectGeoforgeWwdEarth();
if (strIdCurChildCur.compareTo(strIdTarget) != 0)
continue;
// TODO
// !!! NO NEED
GfrRndSurfacePolylineWisYesMloAbs rnd = (GfrRndSurfacePolylineWisYesMloAbs) objRndChildCur;
Iterator<? extends LatLon> itr = rnd.getLocations().iterator();
LatLon llnCur = itr.next();
if (llnCur == null)
return true;
// ---
double dblZoom = objRndChildCur.getCharacteristicDimensionObjectGeoforgeRenderableLayer(); // TEMPO, should be related to neighbours
dblZoom /= 100d;
if (dblZoom < _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_)
dblZoom = _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_;
Position posCenter = new Position(llnCur, dblZoom);
this._cnv.zoomTo(
posCenter,
dblZoom,
true // tempo code, alti location should be rewritten according to convex hull
);
return true;
}
}
return false;
}
// for now, no need to return boolean
private boolean _zoomToPreviousPositionLineWiseOpenAnyMlo_(
String strIdTarget,
gov.nasa.worldwind.layers.LayerList llt,
Position posSource)
throws Exception
{
for (Layer lyrCur : llt)
{
if (! (lyrCur instanceof GfrRlrObjTloAbs))
continue;
GfrRlrObjTloAbs lyrGfrCur = (GfrRlrObjTloAbs) lyrCur;
Iterator<Renderable> itrChildren = lyrGfrCur.getRenderables().iterator();
if (! itrChildren.hasNext())
continue;
while (itrChildren.hasNext())
{
Renderable rndCurChild = itrChildren.next();
if (!(rndCurChild instanceof IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer))
continue;
IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer objRndChildCur = (IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer) rndCurChild;
String strIdCurChildCur = objRndChildCur.getIdObjectGeoforgeWwdEarth();
if (strIdCurChildCur.compareTo(strIdTarget) != 0)
continue;
GfrRndSurfacePolylineWisYesMloAbs rnd = (GfrRndSurfacePolylineWisYesMloAbs) objRndChildCur;
Iterator<? extends LatLon> itr = rnd.getLocations().iterator();
Angle angLatitudeSource = posSource.getLatitude();
Angle angLongitudeSource = posSource.getLongitude();
// ---
LatLon llnTargetCandidate = itr.next();
boolean blnGotIt = false;
while (itr.hasNext())
{
LatLon llnCur = itr.next();
if (llnCur.getLatitude().compareTo(angLatitudeSource) != 0)
{
llnTargetCandidate = llnCur;
continue;
}
if (llnCur.getLongitude().compareTo(angLongitudeSource) != 0)
{
llnTargetCandidate = llnCur;
continue;
}
blnGotIt = true;
break;
}
if (! blnGotIt)
return true;
if (llnTargetCandidate == null) // !!! should never appear
return true;
// ---
double dblZoom = objRndChildCur.getCharacteristicDimensionObjectGeoforgeRenderableLayer(); // TEMPO, should be related to neighbours
dblZoom /= 100;
if (dblZoom < _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_)
dblZoom = _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_;
Position posCenter = new Position(llnTargetCandidate, dblZoom);
this._cnv.zoomTo(
posCenter,
dblZoom,
true // tempo code, alti location should be rewritten according to convex hull
);
return true;
}
}
return false;
}
// for now, no need to return boolean
private boolean _zoomToNextPositionLineWiseOpenAnyMlo_(
String strIdTarget,
gov.nasa.worldwind.layers.LayerList llt,
Position posSource)
throws Exception
{
for (Layer lyrCur : llt)
{
if (! (lyrCur instanceof GfrRlrObjTloAbs))
continue;
GfrRlrObjTloAbs lyrGfrCur = (GfrRlrObjTloAbs) lyrCur;
Iterator<Renderable> itrChildren = lyrGfrCur.getRenderables().iterator();
if (! itrChildren.hasNext())
continue;
while (itrChildren.hasNext())
{
Renderable rndCurChild = itrChildren.next();
if (!(rndCurChild instanceof IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer))
continue;
IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer objRndChildCur = (IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer) rndCurChild;
String strIdCurChildCur = objRndChildCur.getIdObjectGeoforgeWwdEarth();
if (strIdCurChildCur.compareTo(strIdTarget) != 0)
continue;
GfrRndSurfacePolylineWisYesMloAbs rnd = (GfrRndSurfacePolylineWisYesMloAbs) objRndChildCur;
Iterator<? extends LatLon> itr = rnd.getLocations().iterator();
Angle angLatitudeSource = posSource.getLatitude();
Angle angLongitudeSource = posSource.getLongitude();
// ---
LatLon llnSourceCandidate = null;
while (itr.hasNext())
{
LatLon llnCur = itr.next();
if (llnCur.getLatitude().compareTo(angLatitudeSource) != 0)
continue;
if (llnCur.getLongitude().compareTo(angLongitudeSource) != 0)
continue;
llnSourceCandidate = llnCur;
break;
}
if (llnSourceCandidate == null)
return true;
if (! itr.hasNext())
return true;
LatLon llnTarget = itr.next();
// ---
double dblZoom = objRndChildCur.getCharacteristicDimensionObjectGeoforgeRenderableLayer(); // TEMPO, should be related to neighbours
dblZoom /= 100d;
if (dblZoom < _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_)
dblZoom = _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_;
Position posCenter = new Position(llnTarget, dblZoom);
this._cnv.zoomTo(
posCenter,
dblZoom,
true // tempo code, alti location should be rewritten according to convex hull
);
return true;
}
}
return false;
}
// for now, no need to return boolean
private boolean _zoomToLastPositionLineWiseOpenAnyMlo_(String strIdTarget, gov.nasa.worldwind.layers.LayerList llt)
throws Exception
{
for (Layer lyrCur : llt)
{
if (! (lyrCur instanceof GfrRlrObjTloAbs))
continue;
GfrRlrObjTloAbs lyrGfrCur = (GfrRlrObjTloAbs) lyrCur;
Iterator<Renderable> itrChildren = lyrGfrCur.getRenderables().iterator();
if (!itrChildren.hasNext())
continue;
while (itrChildren.hasNext())
{
Renderable rndCurChild = itrChildren.next();
if (!(rndCurChild instanceof IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer))
continue;
IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer objRndChildCur = (IGfrHandlerWwdEarthObjectGeoforgeRenderableLayer) rndCurChild;
String strIdCurChildCur = objRndChildCur.getIdObjectGeoforgeWwdEarth();
if (strIdCurChildCur.compareTo(strIdTarget) != 0)
continue;
// !!! NO NEED
GfrRndSurfacePolylineWisYesMloAbs rnd = (GfrRndSurfacePolylineWisYesMloAbs) objRndChildCur;
Iterator<? extends LatLon> itr = rnd.getLocations().iterator();
// NOT OPTIMIZED !!!
LatLon llnCur = null;
while (itr.hasNext())
{
llnCur = itr.next();
}
if (llnCur == null)
return true;
// ---
double dblZoom = objRndChildCur.getCharacteristicDimensionObjectGeoforgeRenderableLayer(); // TEMPO, should be related to neighbours
dblZoom /= 100;
if (dblZoom < _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_)
dblZoom = _DBL_MINIMUM_ZOOM_4_MS_VIRTUAL_EARTH_AERIAL_;
Position posCenter = new Position(llnCur, dblZoom);
this._cnv.zoomTo(
posCenter,
dblZoom,
true // tempo code, alti location should be rewritten according to convex hull
);
return true;
}
}
return false;
}
protected void _zoomToObject(String strIdTarget)
{
try
{
gov.nasa.worldwind.Model mod = this._cnv.getModel();
gov.nasa.worldwind.layers.LayerList llt = mod.getLayers();
if (this._zoomToObjectAnyTlo_(strIdTarget, llt))
return;
if (this._zoomToObjectAnyMlo_(strIdTarget, llt))
return;
// candidate for others, like ?Mlo?
}
catch(Exception exc)
{
exc.printStackTrace();
}
}
public void setProjectionFlat(String strKindProjection)
{
((GfrWorldWindowGLCanvas) this._cnv).setProjection(strKindProjection);
}
public void setEnabledFlatGlobe(boolean blnFlat) throws Exception
{
if (this._cnv == null)
{
String str = "this._cnv == null";
throw new Exception(str);
}
((GfrWorldWindowGLCanvas) this._cnv).setEnabledFlatGlobe(blnFlat);
}
public void resetView() throws Exception
{
if (this._cnv == null)
{
String str = "this._cnv == null";
throw new Exception(str);
}
this._cnv.resetWwdViewDefault();
}
public gov.nasa.worldwind.WorldWindow getCanvas() { return _cnv; }
// ----
@Override
public boolean init()
{
if (! this._initCanvas_())
return false;
return true;
}
public void restoreStateOrbitView(String str)
{
if (this._cnv != null)
{
BasicOrbitView view = (BasicOrbitView) this._cnv.getView();
view.restoreState(str);
}
}
public String getRestorableStateOrbitView()
{
if (this._cnv != null)
{
BasicOrbitView view = (BasicOrbitView) this._cnv.getView();
String strRestorableState = view.getRestorableState();
return strRestorableState;
}
return null;
}
@Override
public void destroy()
{
if (this._cnv != null)
{
if (this._ctrMenContextObject_ != null)
{
this._cnv.removeSelectListener((SelectListener) this._ctrMenContextObject_);
}
if (this._ctrMenContextVoid_ != null)
{
this._cnv.removeMouseListener((MouseListener) this._ctrMenContextVoid_);
}
super.remove(this._cnv);
this._cnv.destroy();
this._cnv = null;
}
if (this._pnlStatusbar != null)
{
this._pnlStatusbar.destroy();
this._pnlStatusbar = null;
}
if (this._ctrTooltip != null)
{
this._ctrTooltip.destroy();
this._ctrTooltip = null;
}
if (this._ctrHighlight_ != null)
{
this._ctrHighlight_.destroy();
this._ctrHighlight_ = null;
}
if (this._lml_ != null)
{
this._lml_.destroy();
this._lml_ = null;
}
if (this._ctrMenContextObject_ != null)
{
this._ctrMenContextObject_ = null;
}
if (this._ctrMenContextVoid_ != null)
{
this._ctrMenContextVoid_ = null;
}
}
public void setVisiblePreferences(boolean bln)
{
this._lml_.setVisible(bln);
if (this._cnv != null)
this._cnv.redraw();
}
private void _loadCanvas_() throws Exception
{
try
{
this._cnv = new GfrWorldWindowGLCanvas();
}
catch (Throwable t)
{
String str = t.getMessage();
if (str == null)
str = "uncaught throwable";
System.err.println("t.getMessage()=" + str);
throw new Exception("Error: " + str, t);
//throw new ServletException("Error: " + t.getMessage(), t);
}
// beg
ViewControlsLayer viewControlsC = new ViewControlsLayer();
this._cnv.getModel().getLayers().add(viewControlsC);
this._lstViewControls = new OurViewControlsSelectListener(this._cnv, viewControlsC);
this._cnv.addSelectListener(this._lstViewControls);
viewControlsC.setEnabled(false);
// end
this._lml_ = new OurRlrLayerManagerLayer(this._cnv);
this._cnv.getModel().getLayers().add(this._lml_);
this._pnlStatusbar = new
//GfrStatusBarUTM(this._cnv);
GfrPnlStatusBarWwd(this._cnv);
this._ctrHighlight_ = new OurHighlightController(this._cnv,
gov.nasa.worldwind.event.SelectEvent.ROLLOVER);
// Set up the context menu
if (this._ctrMenContextObject_ != null)
this._cnv.addSelectListener((SelectListener) this._ctrMenContextObject_);
if (this._ctrMenContextVoid_ != null)
this._cnv.addMouseListener((MouseListener) this._ctrMenContextVoid_);
// test
//AnnotationControls acl = new AnnotationControls(this._cnv);
// maybe assigned as transient private field , then modify to allow destroy
GfrCtrAnnCntImgs ctrAnnotationImages = new GfrCtrAnnCntImgs(this._cnv);
}
private boolean _initCanvas_()
{
if (! this._cnv.init())
return false;
if (this._pnlStatusbar != null)
{
if (! this._pnlStatusbar.init())
return false;
}
if (! this._ctrHighlight_.init())
return false;
if (! this._ctrTooltip.init())
return false;
// ----
super.setLayout(new BorderLayout());
super.add(this._cnv, BorderLayout.CENTER);
if (this._pnlStatusbar != null)
this.add(_pnlStatusbar, BorderLayout.PAGE_END);
return true;
}
}