blob: 61e847aef5c2430bfbc81f9e3ffa481981c725f8 [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 org.eclipse.apogy.addons.sensors.imaging.camera.ImageFilter;
import org.eclipse.apogy.common.images.AbstractEImage;
import org.eclipse.apogy.common.images.ApogyCommonImagesFactory;
import org.eclipse.apogy.common.images.EImagesUtilities;
import org.eclipse.apogy.common.images.URLEImage;
import org.eclipse.apogy.common.images.ui.composites.ImageDisplayComposite;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.util.EContentAdapter;
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.Label;
public class ImageFilterComposite extends Composite {
private ImageFilter imageFilter;
private Adapter imageFilterAdapter;
private final ImageDisplayComposite originalImage;
private final ImageDisplayComposite filteredImage;
private AbstractEImage unfilteredImage = null;
public ImageFilterComposite(Composite parent, int style) {
super(parent, style);
setLayout(new GridLayout(2, false));
Label lblOriginalImage = new Label(this, SWT.NONE);
lblOriginalImage.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
lblOriginalImage.setText("Original Image:");
Label lblFilteredImage = new Label(this, SWT.NONE);
lblFilteredImage.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
lblFilteredImage.setText("Filtered Image:");
this.originalImage = new ImageDisplayComposite(this, SWT.BORDER);
GridData gd_originalImage = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_originalImage.heightHint = 180;
gd_originalImage.minimumHeight = 180;
gd_originalImage.minimumWidth = 320;
gd_originalImage.widthHint = 320;
this.originalImage.setLayoutData(gd_originalImage);
this.filteredImage = new ImageDisplayComposite(this, SWT.BORDER);
GridData gd_filteredImage = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_filteredImage.widthHint = 320;
gd_filteredImage.minimumWidth = 320;
gd_filteredImage.minimumHeight = 180;
gd_filteredImage.heightHint = 180;
this.filteredImage.setLayoutData(gd_filteredImage);
}
public ImageFilter getImageFilter() {
return this.imageFilter;
}
public void setImageFilter(ImageFilter imageFilter) {
if (this.imageFilter != null) {
this.imageFilter.eAdapters().remove(getImageFilterAdapter());
}
this.imageFilter = imageFilter;
if (imageFilter != null) {
updateImage();
// Register listener.
imageFilter.eAdapters().add(getImageFilterAdapter());
}
}
private void updateImage() {
// Updates preview.
if (!isDisposed()) {
getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
try {
// Update image.
AbstractEImage filtered = ImageFilterComposite.this.imageFilter.filter(null,
getUnfilteredImage());
if (filtered != null) {
ImageFilterComposite.this.filteredImage.setImageData(
EImagesUtilities.INSTANCE.convertToImageData(filtered.asBufferedImage()));
ImageFilterComposite.this.filteredImage.fitImage();
}
ImageFilterComposite.this.originalImage.setImageData(
EImagesUtilities.INSTANCE.convertToImageData(getUnfilteredImage().asBufferedImage()));
ImageFilterComposite.this.originalImage.fitImage();
} catch (Exception e) {
// TODO
}
}
});
}
}
private AbstractEImage getUnfilteredImage() {
if (this.unfilteredImage == null) {
URLEImage urlImage = ApogyCommonImagesFactory.eINSTANCE.createURLEImage();
urlImage.setUrl(
"platform:/plugin/org.eclipse.apogy.addons.sensors.imaging.camera/images/unfiltered_image.jpg");
this.unfilteredImage = urlImage;
}
return this.unfilteredImage;
}
private Adapter getImageFilterAdapter() {
if (this.imageFilterAdapter == null) {
this.imageFilterAdapter = new EContentAdapter() {
@Override
public void notifyChanged(Notification notification) {
// Update result image.
updateImage();
super.notifyChanged(notification);
}
};
}
return this.imageFilterAdapter;
}
}