| /******************************************************************************* |
| * 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; |
| } |
| |
| } |