/*
* 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 2
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.geoforge.guillc.dialog;
import gov.nasa.worldwind.geom.LatLon;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
import javax.swing.JFrame;
import org.geoforge.guillc.event.GfrEvtPanelChange;
import org.geoforge.guillc.event.GfrEvtValidityChanged;
import org.geoforge.guillc.handler.IGfrHandlerDisplayableObjectsSet;
import org.geoforge.guillc.handler.IGfrHandlerListenerPanelDialog;
import org.geoforge.guillc.panel.GfrPnlGrpSngLbls;
import org.geoforge.guillc.panel.GfrPnlGrpTfdLbl;
import org.geoforge.guillc.panel.GfrPnlGrpSngTxfsFxdEditable;
import org.geoforge.lang.util.GfrResBundleLang;
import org.geoforge.lang.util.geography.GfrUtilDmsOperation;
import org.geoforge.lang.util.number.GfrDouble;
/**
*
* @author Amadeus.Sowerby
*
* email: Amadeus.Sowerby_AT_gmail.com ... please remove "_AT_" from the above
* string to get the right email address
*/
abstract public class GfrDlgNewSettingsTloSegWiseYesAbs extends GfrDlgNewSettingsTloNamAbsAbs
{
// should be located elsewhere, ie. DB, wrapper
final static public double DBL_MINIMUM_LENGTH_IN_METERS = 1d;
final protected static int _INT_WIDTH_LEFT = 135;
final protected static int _INT_WIDTH_MIDDLE = 240;
final protected static int _INT_WIDTH_RIGHT = 10;
final static protected int _INT_WIDTH_UNIT = 120;
abstract protected double _getMaxLengthAllowed();
// quick fix - todo : split in two classes
private boolean _blnFilledValues_ = false;
protected GfrPnlGrpSngLbls _pnlLabelsLatLon;
protected GfrPnlGrpSngTxfsFxdEditable _pnlCoordinatesPointBegin;
protected GfrPnlGrpSngTxfsFxdEditable _pnlCoordinatesPointEnd;
protected GfrPnlGrpTfdLbl _pnlLengthComputedFromCoordinates;
public GfrDlgNewSettingsTloSegWiseYesAbs(
JFrame frmOwner,
IGfrHandlerDisplayableObjectsSet enuValueTlo,
String[] strsExistingItems,
LatLon llnBeg,
LatLon llnEnd)
{
this(
frmOwner,
enuValueTlo,
strsExistingItems);
this._blnFilledValues_ = true;
DecimalFormatSymbols decimalSymbol = new DecimalFormatSymbols(Locale.getDefault());
decimalSymbol.setDecimalSeparator('.');
final DecimalFormat df = new DecimalFormat("#.########");
df.setDecimalFormatSymbols(decimalSymbol);
String strLatBeg = df.format(llnBeg.getLatitude().degrees);
String strLonBeg = df.format(llnBeg.getLongitude().degrees);
String strLatEnd = df.format(llnEnd.getLatitude().degrees);
String strLonEnd = df.format(llnEnd.getLongitude().degrees);
this._pnlCoordinatesPointBegin.setContentLeft(strLatBeg);
this._pnlCoordinatesPointBegin.setContentRight(strLonBeg);
this._pnlCoordinatesPointEnd.setContentLeft(strLatEnd);
this._pnlCoordinatesPointEnd.setContentRight(strLonEnd);
}
public GfrDlgNewSettingsTloSegWiseYesAbs(
JFrame frmOwner,
IGfrHandlerDisplayableObjectsSet enuValueTlo,
String[] strsExistingItems)
{
super(
frmOwner,
enuValueTlo,
strsExistingItems);
this._pnlLabelsLatLon = new GfrPnlGrpSngLbls("", "Latitude", "Longitude");
this._pnlCoordinatesPointBegin = new GfrPnlGrpSngTxfsFxdEditable("Starting point:");
this._pnlCoordinatesPointEnd = new GfrPnlGrpSngTxfsFxdEditable("Ending point:");
this._pnlLengthComputedFromCoordinates = new GfrPnlGrpTfdLbl(
GfrResBundleLang.s_getInstance().getValue("word.length"),
"",
"m",
GfrDlgNewSettingsTloSegWiseYesAbs._INT_WIDTH_UNIT);
super.addToListResizable(this._pnlLabelsLatLon);
super.addToListResizable(this._pnlCoordinatesPointBegin);
super.addToListResizable(this._pnlCoordinatesPointEnd);
super.addToListResizable(this._pnlLengthComputedFromCoordinates);
this._pnlLabelsLatLon.addPanelListener((IGfrHandlerListenerPanelDialog) this);
this._pnlCoordinatesPointBegin.addPanelListener((IGfrHandlerListenerPanelDialog) this);
this._pnlCoordinatesPointEnd.addPanelListener((IGfrHandlerListenerPanelDialog) this);
}
@Override
public boolean init()
{
if (!super.init())
return false;
if (!this._pnlLabelsLatLon.init())
return false;
if (!this._pnlCoordinatesPointBegin.init())
return false;
if (!this._pnlCoordinatesPointEnd.init())
return false;
if (!this._pnlLengthComputedFromCoordinates.init())
return false;
this._pnlCoordinatesPointBegin.setEditable(!this._blnFilledValues_);
this._pnlCoordinatesPointEnd.setEditable(!this._blnFilledValues_);
this._pnlLabelsLatLon.setMandatoryIcon(false);
this._pnlLengthComputedFromCoordinates.setMandatoryIcon(false);
this._pnlLengthComputedFromCoordinates.setEditable(false);
return true;
}
@Override
public void destroy()
{
super.destroy();
if (this._pnlLabelsLatLon != null)
{
this._pnlLabelsLatLon.destroy();
this._pnlLabelsLatLon = null;
}
if (this._pnlCoordinatesPointBegin != null)
{
this._pnlCoordinatesPointBegin.destroy();
this._pnlCoordinatesPointBegin = null;
}
if (this._pnlCoordinatesPointEnd != null)
{
this._pnlCoordinatesPointEnd.destroy();
this._pnlCoordinatesPointEnd = null;
}
if (this._pnlLengthComputedFromCoordinates != null)
{
this._pnlLengthComputedFromCoordinates.destroy();
this._pnlLengthComputedFromCoordinates = null;
}
}
private boolean _coordinatesPointBeginHasNoError_()
{
String strLatitude = this._pnlCoordinatesPointBegin.getContentLeft();
String strLongitude = this._pnlCoordinatesPointBegin.getContentRight();
if ((strLatitude == null || strLatitude.length() < 1)
&& (strLongitude == null || strLongitude.length() < 1))
return true;
return _coordinatesPointBeginEnablesOk_();
}
private boolean _coordinatesPointEndHasNoError_()
{
String strLatitude = this._pnlCoordinatesPointEnd.getContentLeft();
String strLongitude = this._pnlCoordinatesPointEnd.getContentRight();
if ((strLatitude == null || strLatitude.length() < 1)
&& (strLongitude == null || strLongitude.length() < 1))
return true;
return _coordinatesPointEndEnablesOk_();
}
private boolean _coordinatesPointBeginEnablesOk_()
{
String strLatitude = this._pnlCoordinatesPointBegin.getContentLeft();
String strLongitude = this._pnlCoordinatesPointBegin.getContentRight();
if (strLatitude == null || strLatitude.length() < 1)
return false;
if (strLongitude == null || strLongitude.length() < 1)
return false;
Double dblLatitude = GfrDouble.valueOf(strLatitude);
Double dblLongitude = GfrDouble.valueOf(strLongitude);
if (dblLatitude == null)
{
validityChanged(new GfrEvtValidityChanged(false, "Enter valid starting point latitude."));
return false;
}
if (dblLatitude > 90d || dblLatitude < -90d)
{
validityChanged(new GfrEvtValidityChanged(false, "Starting point latitude should be in between 90º and -90º."));
return false;
}
if (dblLongitude == null)
{
validityChanged(new GfrEvtValidityChanged(false, "Enter valid starting point longitude."));
return false;
}
if (dblLongitude > 180d || dblLongitude < -180d)
{
validityChanged(new GfrEvtValidityChanged(false, "Starting point longitude should be in between 180º and -180º."));
return false;
}
return true;
}
private boolean _coordinatesPointEndEnablesOk_()
{
String strLatitude = this._pnlCoordinatesPointEnd.getContentLeft();
String strLongitude = this._pnlCoordinatesPointEnd.getContentRight();
if (strLatitude == null || strLatitude.length() < 1)
return false;
if (strLongitude == null || strLongitude.length() < 1)
return false;
Double dblLatitude = GfrDouble.valueOf(strLatitude);
Double dblLongitude = GfrDouble.valueOf(strLongitude);
if (dblLatitude == null)
{
validityChanged(new GfrEvtValidityChanged(false, "Enter valid ending point latitude."));
return false;
}
if (dblLatitude > 90d || dblLatitude < -90d)
{
validityChanged(new GfrEvtValidityChanged(false, "Ending point latitude should be in between 90º and -90º"));
return false;
}
if (dblLongitude == null)
{
validityChanged(new GfrEvtValidityChanged(false, "Enter valid ending point longitude."));
return false;
}
if (dblLongitude > 180d || dblLongitude < -180d)
{
validityChanged(new GfrEvtValidityChanged(false, "Ending point longitude should be in between 180º and -180º"));
return false;
}
return true;
}
@Override
public void somethingHasHappened(GfrEvtPanelChange e)
{
Object obj = e.getSource();
//-- !!! update length, but no return, coz call to super must be performed
if (obj.equals(this._pnlCoordinatesPointBegin))
{
_updateLengthValue_();
}
//-- !!! update length, but no return, coz call to super must be performed
if (obj.equals(this._pnlCoordinatesPointEnd))
{
_updateLengthValue_();
}
super.somethingHasHappened(e);
}
private void _updateLengthValue_()
{
String str = null;
if (!_coordinatesPointEndEnablesOk_() || !_coordinatesPointBeginEnablesOk_())
{
str = "";
}
else
{
double dbl = GfrUtilDmsOperation.s_getDistanceFromDeg(
Double.valueOf(this._pnlCoordinatesPointBegin.getContentLeft()),
Double.valueOf(this._pnlCoordinatesPointBegin.getContentRight()),
Double.valueOf(this._pnlCoordinatesPointEnd.getContentLeft()),
Double.valueOf(this._pnlCoordinatesPointEnd.getContentRight()));
dbl = GfrDouble.truncateTwoDecimal(dbl);
str = String.valueOf(dbl);
}
this._pnlLengthComputedFromCoordinates.setValue(str);
}
@Override
protected void _updateModifiedFieldStatus(GfrEvtPanelChange e)
{
Object objSource = e.getSource();
if (objSource.equals(_pnlCoordinatesPointEnd))
{
boolean bln = false;
bln = _coordinatesPointEndEnablesOk_();
this._pnlCoordinatesPointEnd.setValueIsOk(bln);
}
if (objSource.equals(_pnlCoordinatesPointBegin))
{
boolean bln = false;
bln = _coordinatesPointBeginEnablesOk_();
this._pnlCoordinatesPointBegin.setValueIsOk(bln);
}
super._updateModifiedFieldStatus(e);
}
private boolean _computedLengthHasNoError_()
{
if (!_coordinatesPointEndEnablesOk_() || !_coordinatesPointBeginEnablesOk_())
{
return true;//coordinates are not Ok => has no mean to try to compute a length
}
return _computedLengthEnablesOk_();
}
private boolean _computedLengthEnablesOk_()
{
if (!_coordinatesPointEndEnablesOk_() || !_coordinatesPointBeginEnablesOk_())
{
return false;
}
double dblVakue = GfrUtilDmsOperation.s_getDistanceFromDeg(
Double.valueOf(this._pnlCoordinatesPointBegin.getContentLeft()),
Double.valueOf(this._pnlCoordinatesPointBegin.getContentRight()),
Double.valueOf(this._pnlCoordinatesPointEnd.getContentLeft()),
Double.valueOf(this._pnlCoordinatesPointEnd.getContentRight()));
if (dblVakue - GfrDouble.DBL_EPSILON_THREE_DIGITS > this._getMaxLengthAllowed())
{
validityChanged(new GfrEvtValidityChanged(false, "Length is bigger than " + this._getMaxLengthAllowed() + " m. Please modify coordinates."));
return false;
}
if (dblVakue + GfrDouble.DBL_EPSILON_THREE_DIGITS < GfrDlgNewSettingsTloSegWiseYesAbs.DBL_MINIMUM_LENGTH_IN_METERS)
{
validityChanged(new GfrEvtValidityChanged(false, "Length is lower to " + GfrDlgNewSettingsTloSegWiseYesAbs.DBL_MINIMUM_LENGTH_IN_METERS + " m. Please modify coordinates."));
return false;
}
return true;
}
@Override
protected boolean _okEnableable()
{
return super._okEnableable()
&& _coordinatesPointEndEnablesOk_()
&& _coordinatesPointBeginEnablesOk_()
&& _computedLengthEnablesOk_();
}
@Override
protected boolean _noErrorToDisplay()
{
return super._noErrorToDisplay()
&& _coordinatesPointEndHasNoError_()
&& _coordinatesPointBeginHasNoError_()
&& _computedLengthHasNoError_();
}
}