/*******************************************************************************
* 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.bookmark.ui.editor;
import gov.nasa.worldwind.geom.Position;
import gov.nasa.worldwind.geom.Vec4;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import au.gov.ga.earthsci.application.widgets.PositionEditor;
import au.gov.ga.earthsci.application.widgets.PositionEditor.PositionChangedEvent;
import au.gov.ga.earthsci.application.widgets.PositionEditor.PositionEditorListener;
import au.gov.ga.earthsci.application.widgets.Vec4Editor;
import au.gov.ga.earthsci.application.widgets.Vec4Editor.Vec4ChangedEvent;
import au.gov.ga.earthsci.application.widgets.Vec4Editor.Vec4EditorListener;
import au.gov.ga.earthsci.bookmark.BookmarkPropertyFactory;
import au.gov.ga.earthsci.bookmark.model.IBookmark;
import au.gov.ga.earthsci.bookmark.model.IBookmarkProperty;
import au.gov.ga.earthsci.bookmark.properties.camera.CameraProperty;
import au.gov.ga.earthsci.bookmark.ui.editor.IBookmarkEditorMessage.Level;
/**
* An {@link IBookmarkPropertyEditor} used for viewing/editing a
* {@link CameraProperty} associated with a {@link IBookmark}.
*
* @author James Navin (james.navin@ga.gov.au)
*/
public class CameraPropertyEditor extends AbstractBookmarkPropertyEditor
{
private static final String EYE_POSITION_FIELD = "camera.eye"; //$NON-NLS-1$
private static final String LOOKAT_POSITION_FIELD = "camera.lookat"; //$NON-NLS-1$
private static final String UP_VECTOR_FIELD = "camera.up"; //$NON-NLS-1$
private static final String INVALID_POSITION_ERROR = "camera.position.invalid"; //$NON-NLS-1$
protected static final String INVALID_VEC4_ERROR = "camera.up.invalid"; //$NON-NLS-1$
private Composite container;
private PositionEditor eyePositionEditor;
private PositionEditor lookatPositionEditor;
private Vec4Editor upVectorEditor;
@Override
public void okPressed()
{
CameraProperty property = (CameraProperty) getProperty();
if (property == null || container == null)
{
return;
}
property.setEyePosition(eyePositionEditor.getPositionValue());
property.setLookatPosition(lookatPositionEditor.getPositionValue());
property.setUpVector(upVectorEditor.getVec4Value());
}
@Override
protected IBookmarkProperty createPropertyFromCurrent()
{
return BookmarkPropertyFactory.createProperty(CameraProperty.TYPE);
}
@Override
protected void fillFieldsFromProperty(IBookmarkProperty property)
{
if (property != null)
{
eyePositionEditor.setPositionValue(((CameraProperty) property).getEyePosition());
lookatPositionEditor.setPositionValue(((CameraProperty) property).getLookatPosition());
upVectorEditor.setVec4Value(((CameraProperty) property).getUpVector());
}
else
{
eyePositionEditor.setPositionValue(null);
lookatPositionEditor.setPositionValue(null);
upVectorEditor.setVec4Value(null);
}
}
@Override
public Control createControl(Composite parent)
{
container = new Composite(parent, SWT.NONE);
container.setLayoutData(new GridData(GridData.FILL_BOTH));
container.setLayout(new GridLayout(2, false));
CameraProperty camera = (CameraProperty) getProperty();
eyePositionEditor =
addPositionEditor(camera == null ? null : camera.getEyePosition(), EYE_POSITION_FIELD,
Messages.CameraPropertyEditor_EyePositionLabel,
Messages.CameraPropertyEditor_InvalidEyePositionMessage);
lookatPositionEditor =
addPositionEditor(camera == null ? null : camera.getLookatPosition(), LOOKAT_POSITION_FIELD,
Messages.CameraPropertyEditor_LookatPositionLabel,
Messages.CameraPropertyEditor_InvalidLookatPositionMessage);
upVectorEditor =
addVec4Editor(camera == null ? null : camera.getUpVector(), UP_VECTOR_FIELD,
Messages.CameraPropertyEditor_UpVectorLabel,
Messages.CameraPropertyEditor_InvalidUpVectorMessage);
return container;
}
private PositionEditor addPositionEditor(final Position pos, final String fieldId, final String labelText,
final String invalidMessage)
{
Label label = new Label(container, SWT.NONE);
label.setText(labelText);
label.setFont(JFaceResources.getBannerFont());
PositionEditor editor = new PositionEditor(container, SWT.NONE);
if (pos != null)
{
editor.setPositionValue(pos);
}
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.grabExcessHorizontalSpace = true;
gd.horizontalSpan = 2;
editor.setLayoutData(gd);
editor.addPositionEditorListener(new PositionEditorListener()
{
@Override
public void positionChanged(PositionChangedEvent e)
{
validate(fieldId, e.isValid(), new BookmarkEditorMessage(Level.ERROR, INVALID_POSITION_ERROR,
invalidMessage));
}
});
return editor;
}
private Vec4Editor addVec4Editor(final Vec4 vec, final String fieldId, final String labelText,
final String invalidMessage)
{
Label label = new Label(container, SWT.NONE);
label.setText(labelText);
label.setFont(JFaceResources.getBannerFont());
Vec4Editor editor = new Vec4Editor(container, SWT.NONE);
if (vec != null)
{
editor.setVec4Value(vec);
}
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.grabExcessHorizontalSpace = true;
gd.horizontalSpan = 2;
editor.setLayoutData(gd);
editor.addVec4EditorListener(new Vec4EditorListener()
{
@Override
public void vec4Changed(Vec4ChangedEvent e)
{
validate(fieldId, e.isValid(), new BookmarkEditorMessage(Level.ERROR, INVALID_VEC4_ERROR,
invalidMessage));
}
});
return editor;
}
@Override
public Control getControl()
{
return container;
}
@Override
public String getName()
{
return Messages.CameraPropertyEditor_EditorTitle;
}
@Override
public String getDescription()
{
return Messages.CameraPropertyEditor_EditorDescription;
}
}