blob: 3d19ae609210f3d3352e501c0503a169bf5a01a3 [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 - initial API and implementation
* Regent L'Archeveque
*
* SPDX-License-Identifier: EPL-1.0
*******************************************************************************/
package org.eclipse.apogy.addons.sensors.imaging.camera.composites;
import java.awt.GraphicsEnvironment;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.apogy.addons.sensors.imaging.camera.AbstractTextOverlay;
import org.eclipse.apogy.addons.sensors.imaging.camera.ApogyAddonsSensorsImagingCameraPackage;
import org.eclipse.apogy.addons.sensors.imaging.camera.OverlayAlignment;
import org.eclipse.apogy.common.emf.transaction.ApogyCommonTransactionFacade;
import org.eclipse.apogy.common.ui.composites.Color3fComposite;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.databinding.FeaturePath;
import org.eclipse.emf.databinding.edit.EMFEditProperties;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Spinner;
public class AbstractTextOverlayComposite extends Composite {
public static final String PREVIEW_TEXT = "Test 1.234";
public static final int PREVIEW_IMG_WIDTH = 1200;
public static final int PREVIEW_IMG_HEIGHT = 400;
private final AdapterFactory adapterFactory = new ComposedAdapterFactory(
ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
private AbstractTextOverlay abstractTextOverlay;
private final ComboViewer fontComboViewer;
private final Combo fontCombo;
private final Spinner fontSizeSpinner;
private final Color3fComposite fontColorComposite;
private final ComboViewer overlayAlignmentComboViewer;
private final Combo overlayAlignmentCombo;
private final Spinner horizontalOffsetSpinner;
private final Spinner verticalOffsetSpinner;
private DataBindingContext m_bindingContext;
public AbstractTextOverlayComposite(Composite parent, int style) {
super(parent, style);
setLayout(new GridLayout(2, false));
// Alignment
Group grpPositionOffsets = new Group(this, SWT.NONE);
grpPositionOffsets.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
grpPositionOffsets.setText("Position");
grpPositionOffsets.setLayout(new GridLayout(4, false));
Label lblAlignment = new Label(grpPositionOffsets, SWT.NONE);
lblAlignment.setText("Overlay Alignment :");
this.overlayAlignmentComboViewer = new ComboViewer(grpPositionOffsets, SWT.NONE);
this.overlayAlignmentCombo = this.overlayAlignmentComboViewer.getCombo();
GridData gd_overlayAlignmentCombo = new GridData(SWT.LEFT, SWT.CENTER, true, false, 3, 1);
gd_overlayAlignmentCombo.widthHint = 250;
gd_overlayAlignmentCombo.minimumWidth = 250;
this.overlayAlignmentCombo.setLayoutData(gd_overlayAlignmentCombo);
this.overlayAlignmentComboViewer.setContentProvider(new ArrayContentProvider());
this.overlayAlignmentComboViewer.setLabelProvider(new AdapterFactoryLabelProvider(this.adapterFactory));
this.overlayAlignmentComboViewer.setInput(OverlayAlignment.values());
Label lblHorizontalOffset = new Label(grpPositionOffsets, SWT.NONE);
lblHorizontalOffset.setText("Horizontal Offset:");
this.horizontalOffsetSpinner = new Spinner(grpPositionOffsets, SWT.BORDER);
GridData gd_horizontalOffsetSpinner = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_horizontalOffsetSpinner.widthHint = 50;
gd_horizontalOffsetSpinner.minimumWidth = 50;
this.horizontalOffsetSpinner.setLayoutData(gd_horizontalOffsetSpinner);
Label lblVerticalOffset = new Label(grpPositionOffsets, SWT.NONE);
lblVerticalOffset.setText("Vertical Offset:");
this.verticalOffsetSpinner = new Spinner(grpPositionOffsets, SWT.BORDER);
GridData gd_verticalOffsetSpinner = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_verticalOffsetSpinner.minimumWidth = 50;
gd_verticalOffsetSpinner.widthHint = 50;
this.verticalOffsetSpinner.setLayoutData(gd_verticalOffsetSpinner);
// Font
Group grpFontSettings = new Group(this, SWT.NONE);
grpFontSettings.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
grpFontSettings.setText("Font Settings");
grpFontSettings.setLayout(new GridLayout(4, false));
Label lblFont = new Label(grpFontSettings, SWT.NONE);
lblFont.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblFont.setText("Font:");
this.fontComboViewer = new ComboViewer(grpFontSettings, SWT.NONE);
this.fontCombo = this.fontComboViewer.getCombo();
GridData gd_fontCombo = new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1);
gd_fontCombo.widthHint = 250;
gd_fontCombo.minimumWidth = 250;
this.fontCombo.setLayoutData(gd_fontCombo);
this.fontComboViewer.setContentProvider(ArrayContentProvider.getInstance());
this.fontComboViewer.setInput(getAvailableFonts());
this.fontComboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
if (event.getSelection().isEmpty()) {
} else if (event.getSelection() instanceof IStructuredSelection) {
IStructuredSelection iStructuredSelection = (IStructuredSelection) event.getSelection();
if (iStructuredSelection.getFirstElement() instanceof String) {
String fontName = (String) iStructuredSelection.getFirstElement();
if (AbstractTextOverlayComposite.this.abstractTextOverlay != null) {
if (ApogyCommonTransactionFacade.INSTANCE
.getTransactionalEditingDomain(getAbstractTextOverlay()) == null) {
ApogyCommonTransactionFacade.INSTANCE
.addInTempTransactionalEditingDomain(getAbstractTextOverlay());
}
ApogyCommonTransactionFacade.INSTANCE.basicSet(getAbstractTextOverlay(),
ApogyAddonsSensorsImagingCameraPackage.Literals.ABSTRACT_TEXT_OVERLAY__FONT_NAME,
fontName);
}
} else {
}
}
newSelection(event.getSelection());
}
});
Label lblFontSize = new Label(grpFontSettings, SWT.NONE);
lblFontSize.setText("Font Size:");
this.fontSizeSpinner = new Spinner(grpFontSettings, SWT.BORDER);
GridData gd_fontSizeSpinner = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_fontSizeSpinner.minimumWidth = 50;
gd_fontSizeSpinner.widthHint = 50;
this.fontSizeSpinner.setLayoutData(gd_fontSizeSpinner);
Label lblTextColor = new Label(grpFontSettings, SWT.NONE);
lblTextColor.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblTextColor.setText("Text Color:");
this.fontColorComposite = new Color3fComposite(grpFontSettings, SWT.NONE);
this.fontColorComposite
.setFeature(ApogyAddonsSensorsImagingCameraPackage.Literals.ABSTRACT_TEXT_OVERLAY__TEXT_COLOR);
// Dispose
addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (AbstractTextOverlayComposite.this.m_bindingContext != null)
AbstractTextOverlayComposite.this.m_bindingContext.dispose();
}
});
}
public AbstractTextOverlay getAbstractTextOverlay() {
return this.abstractTextOverlay;
}
public void setAbstractTextOverlay(AbstractTextOverlay abstractTextOverlay) {
if (this.m_bindingContext != null) {
this.m_bindingContext.dispose();
}
this.abstractTextOverlay = abstractTextOverlay;
if (abstractTextOverlay != null) {
this.m_bindingContext = customInitDataBindings();
}
}
protected void newSelection(ISelection selection) {
}
@SuppressWarnings("unchecked")
protected DataBindingContext customInitDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
// Initialize font color.
this.fontColorComposite.setOwner(getAbstractTextOverlay());
// Initialize font name
IObservableValue<Double> observeFontName = EMFEditProperties
.value(ApogyCommonTransactionFacade.INSTANCE.getTransactionalEditingDomain(this.abstractTextOverlay),
FeaturePath.fromList(
ApogyAddonsSensorsImagingCameraPackage.Literals.ABSTRACT_TEXT_OVERLAY__FONT_NAME))
.observe(this.abstractTextOverlay);
IObservableValue<?> observeFontComboViewer = WidgetProperties.selection()
.observe(this.fontComboViewer.getCombo());
bindingContext.bindValue(observeFontComboViewer, observeFontName, new UpdateValueStrategy(),
new UpdateValueStrategy());
/* Font size Value. */
IObservableValue<Double> observeFontSize = EMFEditProperties
.value(ApogyCommonTransactionFacade.INSTANCE.getTransactionalEditingDomain(this.abstractTextOverlay),
FeaturePath.fromList(
ApogyAddonsSensorsImagingCameraPackage.Literals.ABSTRACT_TEXT_OVERLAY__FONT_SIZE))
.observe(this.abstractTextOverlay);
IObservableValue<String> observeFontSizeSpinner = WidgetProperties.selection().observe(this.fontSizeSpinner);
bindingContext.bindValue(observeFontSizeSpinner, observeFontSize, new UpdateValueStrategy(),
new UpdateValueStrategy());
/* Alignment. */
IObservableValue<Double> observeAlignment = EMFEditProperties
.value(ApogyCommonTransactionFacade.INSTANCE.getTransactionalEditingDomain(this.abstractTextOverlay),
FeaturePath.fromList(
ApogyAddonsSensorsImagingCameraPackage.Literals.CAMERA_OVERLAY__OVERLAY_ALIGNMENT))
.observe(this.abstractTextOverlay);
IObservableValue<?> observeAlignmentCombViewer = ViewerProperties.singleSelection()
.observe(this.overlayAlignmentComboViewer);
bindingContext.bindValue(observeAlignmentCombViewer, observeAlignment, new UpdateValueStrategy(),
new UpdateValueStrategy());
/* Horizontal Offset Value. */
IObservableValue<Double> observeHorizontalOffset = EMFEditProperties.value(
ApogyCommonTransactionFacade.INSTANCE.getTransactionalEditingDomain(this.abstractTextOverlay),
FeaturePath.fromList(
ApogyAddonsSensorsImagingCameraPackage.Literals.ABSTRACT_TEXT_OVERLAY__HORIZONTAL_OFFSET))
.observe(this.abstractTextOverlay);
IObservableValue<String> observeHorizontalOffsetSpinner = WidgetProperties.selection()
.observe(this.horizontalOffsetSpinner);
bindingContext.bindValue(observeHorizontalOffsetSpinner, observeHorizontalOffset, new UpdateValueStrategy(),
new UpdateValueStrategy());
/* Vertical Offset Value. */
IObservableValue<Double> observeVerticalOffset = EMFEditProperties
.value(ApogyCommonTransactionFacade.INSTANCE.getTransactionalEditingDomain(this.abstractTextOverlay),
FeaturePath.fromList(
ApogyAddonsSensorsImagingCameraPackage.Literals.ABSTRACT_TEXT_OVERLAY__VERTICAL_OFFSET))
.observe(this.abstractTextOverlay);
IObservableValue<String> observeVerticalOffsetSpinner = WidgetProperties.selection()
.observe(this.verticalOffsetSpinner);
bindingContext.bindValue(observeVerticalOffsetSpinner, observeVerticalOffset, new UpdateValueStrategy(),
new UpdateValueStrategy());
return bindingContext;
}
protected List<String> getAvailableFonts() {
List<String> fonts = new ArrayList<String>();
String[] fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
for (int i = 0; i < fontNames.length; i++) {
fonts.add(fontNames[i]);
}
return fonts;
}
}