blob: bac594c116b60069e05c9520dd0a9a2adcd0cc9a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pierre Allard,
* Regent L'Archeveque - initial API and implementation
*
* SPDX-License-Identifier: EPL-1.0
*
*******************************************************************************/
package org.eclipse.apogy.core.environment.orbit.earth.ui.composites;
import java.text.DecimalFormat;
import org.eclipse.apogy.core.environment.orbit.earth.ApogyCoreEnvironmentOrbitEarthPackage;
import org.eclipse.apogy.core.environment.orbit.earth.ConstantElevationMask;
import org.eclipse.apogy.core.environment.ui.databindings.DegreeStringToRadiansConverter;
import org.eclipse.apogy.core.environment.ui.databindings.RadiansToDegreesStringConverter;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.databinding.edit.EMFEditProperties;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
public class ConstantElevationMaskComposite extends Composite {
public static final String DEGREE_STRING = "\u00b0";
protected ConstantElevationMask constantElevationMask;
protected DecimalFormat decimalFormat;
private DataBindingContext m_bindingContext;
private final Text elevationAngleText;
private final EditingDomain editingDomain;
private boolean enableEditing = true;
public ConstantElevationMaskComposite(Composite parent, int style) {
this(parent, style, null);
}
public ConstantElevationMaskComposite(Composite parent, int style, EditingDomain editingDomain) {
super(parent, style);
this.editingDomain = editingDomain;
setLayout(new GridLayout(3, true));
Label elevationLabel = new Label(this, SWT.NONE);
elevationLabel.setText("Elevation Angle (deg)");
elevationLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
this.elevationAngleText = new Text(this, SWT.BORDER | SWT.SINGLE);
this.elevationAngleText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
// Dispose
addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (ConstantElevationMaskComposite.this.m_bindingContext != null)
ConstantElevationMaskComposite.this.m_bindingContext.dispose();
}
});
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
public boolean isEnableEditing() {
return this.enableEditing;
}
public void setEnableEditing(final boolean enableEditing) {
this.enableEditing = enableEditing;
if (this.m_bindingContext != null) {
this.m_bindingContext.dispose();
this.m_bindingContext = null;
}
// Sets the Editing propert of the text fields.
getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
if (enableEditing) {
ConstantElevationMaskComposite.this.elevationAngleText.setEditable(true);
} else {
ConstantElevationMaskComposite.this.elevationAngleText.setEditable(false);
}
}
});
if (this.constantElevationMask != null) {
if (this.enableEditing) {
this.m_bindingContext = custom_initDataBindings();
} else {
this.m_bindingContext = initDataBindingsNoEditing();
}
}
}
public ConstantElevationMask getConstantElevationMask() {
return this.constantElevationMask;
}
public void setConstantElevationMask(ConstantElevationMask newGeographicCoordinates) {
setConstantElevationMask(newGeographicCoordinates, true);
}
public void setConstantElevationMask(ConstantElevationMask newGeographicCoordinates, boolean update) {
this.constantElevationMask = newGeographicCoordinates;
if (update) {
if (this.m_bindingContext != null) {
this.m_bindingContext.dispose();
this.m_bindingContext = null;
}
if (this.constantElevationMask != null) {
if (this.enableEditing) {
this.m_bindingContext = custom_initDataBindings();
} else {
this.m_bindingContext = initDataBindingsNoEditing();
}
}
}
}
protected DecimalFormat getDecimalFormat() {
if (this.decimalFormat == null) {
this.decimalFormat = new DecimalFormat("0.0000000");
}
return this.decimalFormat;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
protected DataBindingContext custom_initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
IObservableValue longitudeObserveWidget = WidgetProperties.text(SWT.FocusOut).observe(this.elevationAngleText);
IObservableValue xObserveValue = (this.editingDomain == null
? EMFProperties.value(
ApogyCoreEnvironmentOrbitEarthPackage.Literals.CONSTANT_ELEVATION_MASK__CONSTANT_ELEVATION)
.observe(this.constantElevationMask)
: EMFEditProperties.value(this.editingDomain,
ApogyCoreEnvironmentOrbitEarthPackage.Literals.CONSTANT_ELEVATION_MASK__CONSTANT_ELEVATION)
.observe(this.constantElevationMask));
UpdateValueStrategy strategy = new UpdateValueStrategy();
strategy.setConverter(new DegreeStringToRadiansConverter());
UpdateValueStrategy strategy_1 = new UpdateValueStrategy();
strategy_1.setConverter(new RadiansToDegreesStringConverter(getDecimalFormat()));
bindingContext.bindValue(longitudeObserveWidget, xObserveValue, strategy, strategy_1);
//
return bindingContext;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
protected DataBindingContext initDataBindingsNoEditing() {
DataBindingContext bindingContext = new DataBindingContext();
//
IObservableValue xObserveWidget = WidgetProperties.text(SWT.FocusOut).observe(this.elevationAngleText);
IObservableValue xObserveValue = (this.editingDomain == null
? EMFProperties.value(
ApogyCoreEnvironmentOrbitEarthPackage.Literals.CONSTANT_ELEVATION_MASK__CONSTANT_ELEVATION)
.observe(this.constantElevationMask)
: EMFEditProperties.value(this.editingDomain,
ApogyCoreEnvironmentOrbitEarthPackage.Literals.CONSTANT_ELEVATION_MASK__CONSTANT_ELEVATION)
.observe(this.constantElevationMask));
UpdateValueStrategy strategy_1 = new UpdateValueStrategy();
strategy_1.setConverter(new RadiansToDegreesStringConverter(getDecimalFormat()));
bindingContext.bindValue(xObserveWidget, xObserveValue,
new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER), strategy_1);
return bindingContext;
}
}