/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program 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.
* This program 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 this program; if not, see http://www.gnu.org/licenses/
*/
package org.esa.snap.rcp.layermanager.layersrc.image;
import org.esa.snap.ui.layer.AbstractLayerSourceAssistantPage;
import org.esa.snap.ui.layer.LayerSourcePageContext;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.geom.AffineTransform;
class ImageFileAssistantPage2 extends AbstractLayerSourceAssistantPage {
private JTextField[] numberFields;
ImageFileAssistantPage2() {
super("Edit Affine Transformation");
}
@Override
public Component createPageComponent() {
GridBagConstraints gbc = new GridBagConstraints();
final JPanel panel = new JPanel(new GridBagLayout());
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridy = 0;
gbc.gridx = 0;
gbc.weighty = 0.0;
gbc.weightx = 1.0;
gbc.insets = new Insets(4, 0, 4, 2);
double[] flatmatrix = new double[6];
numberFields = new JTextField[flatmatrix.length];
AffineTransform transform = (AffineTransform) getContext().getPropertyValue(
ImageFileLayerSource.PROPERTY_NAME_WORLD_TRANSFORM);
transform.getMatrix(flatmatrix);
// see http://support.esri.com/index.cfm?fa=knowledgebase.techarticles.articleShow&d=17489
String[] labels = new String[]{
"X-dimension of a pixel in map units: ",
"Rotation parameter for row: ",
"Rotation parameter for column: ",
"Negative of Y-dimension of a pixel in map units: ",
"X-coordinate of center of upper left pixel: ",
"Y-coordinate of centre of upper left pixel: "
};
numberFields[0] = addRow(panel, labels[0], gbc);
numberFields[0].setText(String.valueOf(flatmatrix[0]));
numberFields[1] = addRow(panel, labels[1], gbc);
numberFields[1].setText(String.valueOf(flatmatrix[1]));
numberFields[2] = addRow(panel, labels[2], gbc);
numberFields[2].setText(String.valueOf(flatmatrix[2]));
numberFields[3] = addRow(panel, labels[3], gbc);
numberFields[3].setText(String.valueOf(flatmatrix[3]));
numberFields[4] = addRow(panel, labels[4], gbc);
numberFields[4].setText(String.valueOf(flatmatrix[4]));
numberFields[5] = addRow(panel, labels[5], gbc);
numberFields[5].setText(String.valueOf(flatmatrix[5]));
return panel;
}
@Override
public boolean validatePage() {
try {
return createTransform().getDeterminant() != 0.0;
} catch (Exception ignore) {
return false;
}
}
@Override
public boolean performFinish() {
AffineTransform transform = createTransform();
final LayerSourcePageContext context = getContext();
context.setPropertyValue(ImageFileLayerSource.PROPERTY_NAME_WORLD_TRANSFORM, transform);
return ImageFileLayerSource.insertImageLayer(context);
}
private JTextField addRow(JPanel panel, String label, GridBagConstraints gbc) {
gbc.gridy++;
gbc.weightx = 0.2;
gbc.gridx = 0;
panel.add(new JLabel(label), gbc);
gbc.weightx = 0.8;
gbc.gridx = 1;
final JTextField fileField = new JTextField(12);
fileField.setHorizontalAlignment(JTextField.RIGHT);
panel.add(fileField, gbc);
fileField.getDocument().addDocumentListener(new MyDocumentListener());
return fileField;
}
private AffineTransform createTransform() {
double[] flatmatrix = new double[numberFields.length];
for (int i = 0; i < flatmatrix.length; i++) {
flatmatrix[i] = Double.parseDouble(getText(numberFields[i]));
}
return new AffineTransform(flatmatrix);
}
private String getText(JTextComponent textComponent) {
String s = textComponent.getText();
return s != null ? s.trim() : "";
}
private class MyDocumentListener implements DocumentListener {
@Override
public void insertUpdate(DocumentEvent e) {
getContext().updateState();
}
@Override
public void removeUpdate(DocumentEvent e) {
getContext().updateState();
}
@Override
public void changedUpdate(DocumentEvent e) {
getContext().updateState();
}
}
}