Package org.geoforge.guillc.panel

Source Code of org.geoforge.guillc.panel.GfrPnlMainWwdAbs

/*
*  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;
    }
}
TOP

Related Classes of org.geoforge.guillc.panel.GfrPnlMainWwdAbs

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.