All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 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