
eu.agrosense.client.grid.impl.GridImageElement Maven / Gradle / Ivy
The newest version!
/*
* Copyright (C) 2008-2012 AgroSense Foundation.
*
* AgroSense is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* There are special exceptions to the terms and conditions of the GPLv3 as it is applied to
* this software, see the FLOSS License Exception
* .
*
* AgroSense is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AgroSense. If not, see .
*
* Contributors:
* Timon Veenstra - initial API and implementation and/or initial documentation
*/
package eu.agrosense.client.grid.impl;
import eu.agrosense.client.grid.CalculationGrid;
import eu.agrosense.client.grid.Grid;
import eu.agrosense.client.grid.operations.NineAvgInterpolationOperator;
import java.awt.BorderLayout;
import java.awt.image.RenderedImage;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.embed.swing.JFXPanel;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ToolBar;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import nl.cloudfarming.client.geoviewer.Palette;
import nl.cloudfarming.client.geoviewer.RangedLegendPalette;
import nl.cloudfarming.client.util.UOM;
import org.netbeans.core.spi.multiview.CloseOperationState;
import org.netbeans.core.spi.multiview.MultiViewElement;
import org.netbeans.core.spi.multiview.MultiViewElementCallback;
import org.openide.awt.UndoRedo;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.openide.windows.TopComponent;
/**
*
* @author Timon Veenstra
*/
@MultiViewElement.Registration(
displayName = "#LBL_Grid_IMAGE",
iconBase = "eu/agrosense/client/grid/impl/grid.png",
mimeType = "application/x-agrosense-grid",
persistenceType = TopComponent.PERSISTENCE_NEVER,
preferredID = "GridImage",
position = 4000)
@NbBundle.Messages("LBL_Grid_IMAGE=Image")
public class GridImageElement extends JPanel implements MultiViewElement {
protected GridDataObject gridDataObject;
private JToolBar toolbar = new JToolBar();
private transient MultiViewElementCallback callback;
private JFXPanel fxPanel;
private GridPropertiesController controller;
private int[] serializedRaster;
private final Grid grid;
private final Palette palette = new RangedLegendPalette(0, 1000, UOM.MM);
public GridImageElement(Lookup lkp) {
gridDataObject = lkp.lookup(GridDataObject.class);
assert gridDataObject != null;
setLayout(new BorderLayout());
grid = gridDataObject.getLookup().lookup(Grid.class);
RenderedImage ri = grid.getRenderedImage();
serializedRaster = ri.getData().getSamples(ri.getMinX(), ri.getMinY(), ri.getWidth(), ri.getHeight(), Grid.BAND, (int[]) null);
initComponents();
}
@Override
public String getName() {
return "GridPropertiesElement";
}
private void initComponents() {
setLayout(new BorderLayout());
fxPanel = new JFXPanel();
// calendarDropTarget = new CalendarDropTarget();
Platform.setImplicitExit(false);
// create JavaFX scene
Platform.runLater(new Runnable() {
public void run() {
// Group root = new Group();
BorderPane borderpane = new BorderPane();
Scene scene = new Scene(borderpane);
fxPanel.setScene(scene);
RenderedImage ri = grid.getRenderedImage();
final WritableImage img = new WritableImage(ri.getWidth(), ri.getHeight());
renderImage(img);
final ImageView view = new ImageView(img);
view.setPreserveRatio(true);
view.setFitWidth(scene.getWidth());
scene.widthProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue extends Number> ov, Number t, Number t1) {
view.setFitWidth(t1.doubleValue());
}
});
borderpane.setCenter(view);
// root.getChildren().add(view);
ToolBar toolbar = new ToolBar();
Button interpolateButton = new Button();
interpolateButton.setText("Interpolate");
interpolateButton.setOnAction(new EventHandler() {
@Override
public void handle(ActionEvent t) {
interpolate(img);
}
});
Button cancelButton = new Button();
cancelButton.setText("Cancel");
cancelButton.setOnAction(new EventHandler() {
@Override
public void handle(ActionEvent t) {
RenderedImage ri = grid.getRenderedImage();
serializedRaster = ri.getData().getSamples(ri.getMinX(), ri.getMinY(), ri.getWidth(), ri.getHeight(), Grid.BAND, (int[]) null);
renderImage(img);
}
});
Button applyButton = new Button();
applyButton.setText("Apply");
applyButton.setOnAction(new EventHandler() {
@Override
public void handle(ActionEvent t) {
grid.setValues(serializedRaster);
}
});
toolbar.getItems().add(interpolateButton);
toolbar.getItems().add(cancelButton);
toolbar.getItems().add(applyButton);
borderpane.setBottom(toolbar);
}
});
// fxPanel.setDropTarget(calendarDropTarget);
add(fxPanel, BorderLayout.CENTER);
}
private void renderImage(WritableImage img) {
PixelWriter pw = img.getPixelWriter();
double w = img.getWidth();
double h = img.getHeight();
for (int ih = 0; ih < h; ih++) {
for (int iw = 0; iw < w; iw++) {
int value = (serializedRaster == null) ? Integer.MIN_VALUE : serializedRaster[ih * (int) w + iw];
// hue = Math.sin(yRatio*(gridSize*Math.PI))*Math.sin(xRatio*(gridSize*Math.PI))*Math.tan(hueFactor/20.0)*360.0 + hueOffset;
// Color c = Color.hsb(hue, 1.0, 1.0);
// Color black = Color.BLACK;
// Color red = Color.RED;
// Color c = (value == Integer.MIN_VALUE) ? red : black;
java.awt.Color awtc = palette.getColorForValue(value);
Color c = Color.rgb(awtc.getRed(), awtc.getGreen(), awtc.getBlue());
pw.setColor(iw, ih, c);
}
}
}
private void interpolate(WritableImage img) {
CalculationGrid calculationGrid = new CalculationGrid((int) img.getWidth(), (int) img.getHeight(), serializedRaster);
NineAvgInterpolationOperator operator = new NineAvgInterpolationOperator();
operator.execute(calculationGrid);
serializedRaster = calculationGrid.getValues();
renderImage(img);
}
@Override
public JComponent getVisualRepresentation() {
return this;
}
@Override
public JComponent getToolbarRepresentation() {
return toolbar;
}
@Override
public Action[] getActions() {
return new Action[0];
}
@Override
public Lookup getLookup() {
return gridDataObject.getLookup();
}
@Override
public void componentOpened() {
}
@Override
public void componentClosed() {
}
@Override
public void componentShowing() {
if (callback != null) {
updateName();
}
}
@Override
public void componentHidden() {
}
@Override
public void componentActivated() {
}
@Override
public void componentDeactivated() {
}
@Override
public UndoRedo getUndoRedo() {
return UndoRedo.NONE;
}
@Override
public void setMultiViewCallback(MultiViewElementCallback callback) {
this.callback = callback;
}
@Override
public CloseOperationState canCloseElement() {
return CloseOperationState.STATE_OK;
}
private void updateName() {
if (callback != null) {
Grid grid = gridDataObject.getLookup().lookup(Grid.class);
TopComponent tc = callback.getTopComponent();
tc.setHtmlDisplayName(grid.getName());
tc.setDisplayName(grid.getName());
tc.setName(getName());
tc.setToolTipText(getToolTipText());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy