/*******************************************************************************
* Copyright 2012 Geoscience Australia
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package au.gov.ga.earthsci.application.parts.globe.handlers;
import gov.nasa.worldwind.WorldWind;
import gov.nasa.worldwind.WorldWindow;
import gov.nasa.worldwind.geom.LatLon;
import gov.nasa.worldwind.geom.Position;
import gov.nasa.worldwind.globes.Globe;
import gov.nasa.worldwind.view.orbit.OrbitView;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import au.gov.ga.earthsci.application.parts.globe.Messages;
import au.gov.ga.earthsci.worldwind.common.util.Util;
import au.gov.ga.earthsci.worldwind.common.view.orbit.FlyToOrbitViewAnimator;
/**
* Dialog which allows a user to input coordinates they wish to fly to.
*
* @author Michael de Hoog (michael.dehoog@ga.gov.au)
*/
public class GotoCoordinateDialog extends Dialog
{
private final WorldWindow wwd;
private LatLon latlon = null;
private Button okButton = null;
public GotoCoordinateDialog(Shell parentShell, WorldWindow wwd)
{
super(parentShell);
this.wwd = wwd;
}
@Override
protected void configureShell(Shell shell)
{
super.configureShell(shell);
shell.setText(Messages.GotoCoordinateDialog_GotoCoordinates);
}
@Override
protected Control createDialogArea(Composite parent)
{
Composite composite = (Composite) super.createDialogArea(parent);
composite.setLayout(new GridLayout());
Label label = new Label(composite, SWT.NONE);
String prefix = " "; //$NON-NLS-1$
String supported = Messages.GotoCoordinateDialog_Supports + ":\n"; //$NON-NLS-1$
supported += prefix + "-27.0 133.5\n"; //$NON-NLS-1$
supported += prefix + "27.0S 133.5E\n"; //$NON-NLS-1$
supported += prefix + "-27\u00B00'0\" 133\u00B030'0\"\n"; //$NON-NLS-1$
supported += prefix + "27d0'0\"S 133d30'0\"E\n"; //$NON-NLS-1$
supported += prefix + "53J 351167E 7012680N\n"; //$NON-NLS-1$
supported += prefix + "53JLL 51167 12680\n "; //$NON-NLS-1$
label.setText(supported);
label = new Label(composite, SWT.NONE);
label.setText(Messages.GotoCoordinateDialog_EnterCoordinates + ':');
final Text text = new Text(composite, SWT.BORDER);
text.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
text.setToolTipText(Messages.GotoCoordinateDialog_TypeCoordinates);
final Label resultLabel = new Label(composite, SWT.NONE);
resultLabel.setText(" "); //$NON-NLS-1$
text.addModifyListener(new ModifyListener()
{
@Override
public void modifyText(ModifyEvent e)
{
boolean valid = false;
if (text.getText().length() == 0)
{
latlon = null;
resultLabel.setText(" "); //$NON-NLS-1$
}
else
{
latlon = stringToLatLon(text.getText());
if (latlon == null)
{
resultLabel.setText(Messages.GotoCoordinateDialog_InvalidCoordinates);
}
else
{
resultLabel.setText(String.format(
"Lat %7.4f\u00B0 Lon %7.4f\u00B0", latlon.getLatitude().degrees, //$NON-NLS-1$
latlon.getLongitude().degrees));
valid = true;
}
}
resultLabel.pack();
if (okButton != null)
{
okButton.setEnabled(valid);
}
}
});
return composite;
}
@Override
protected Button createButton(Composite parent, int id, String label, boolean defaultButton)
{
Button button = super.createButton(parent, id, label, defaultButton);
if (id == IDialogConstants.OK_ID)
{
okButton = button;
button.setEnabled(false);
}
return button;
}
@Override
protected void okPressed()
{
if (latlon != null && wwd.getView() instanceof OrbitView)
{
OrbitView view = (OrbitView) wwd.getView();
Position beginCenter = view.getCenterPosition();
Position center = new Position(latlon, 0);
long lengthMillis = Util.getScaledLengthMillis(1, beginCenter, center);
view.addAnimator(FlyToOrbitViewAnimator.createFlyToOrbitViewAnimator(view, beginCenter, center,
view.getHeading(), view.getHeading(), view.getPitch(), view.getPitch(), view.getZoom(),
view.getZoom(), lengthMillis, WorldWind.ABSOLUTE));
wwd.redraw();
}
super.okPressed();
}
private LatLon stringToLatLon(String s)
{
Globe globe = wwd.getModel().getGlobe();
LatLon ll = Util.computeLatLonFromString(s, globe);
if (ll == null)
{
ll = Util.computeLatLonFromUTMString(s, globe, false);
}
return ll;
}
}