/*
* Copyright (C) 2014 by Array Systems Computing Inc. http://www.array.ca
*
* 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.s1tbx.sentinel1.gpf.ui;
import org.esa.snap.core.dataop.dem.ElevationModelDescriptor;
import org.esa.snap.core.dataop.dem.ElevationModelRegistry;
import org.esa.snap.core.dataop.resamp.ResamplingFactory;
import org.esa.snap.dem.dataio.DEMFactory;
import org.esa.snap.graphbuilder.gpf.ui.BaseOperatorUI;
import org.esa.snap.graphbuilder.gpf.ui.OperatorUIUtils;
import org.esa.snap.graphbuilder.gpf.ui.UIValidation;
import org.esa.snap.graphbuilder.rcp.utils.DialogUtils;
import org.esa.snap.rcp.util.Dialogs;
import org.esa.snap.ui.AppContext;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.Map;
/**
* User interface for BackGeocodingOp
*/
public class BackGeocodingOpUI extends BaseOperatorUI {
private final JComboBox<String> demName = new JComboBox<>(DEMFactory.getDEMNameList());
private final JComboBox demResamplingMethod = new JComboBox<>(ResamplingFactory.resamplingNames);
private final JComboBox resamplingType = new JComboBox(ResamplingFactory.resamplingNames);
final JCheckBox maskOutAreaWithoutElevationCheckBox = new JCheckBox("Mask out areas with no elevation");
final JCheckBox outputRangeAzimuthOffsetCheckBox = new JCheckBox("Output Range and Azimuth Offset");
final JCheckBox outputDerampDemodPhaseCheckBox = new JCheckBox("Output Deramp and Demod Phase");
private final JTextField externalDEMFile = new JTextField("");
private final JTextField externalDEMNoDataValue = new JTextField("");
private final JButton externalDEMBrowseButton = new JButton("...");
private final JLabel externalDEMFileLabel = new JLabel("External DEM:");
private final JLabel externalDEMNoDataValueLabel = new JLabel("DEM No Data Value:");
private static final String externalDEMStr = "External DEM";
private Double extNoDataValue = 0.0;
private Boolean maskOutAreaWithoutElevation = false;
private Boolean outputRangeAzimuthOffset = false;
private Boolean outputDerampDemodPhase = false;
private final boolean includeOutputRangeAzimuthOffset = false;
private final DialogUtils.TextAreaKeyListener textAreaKeyListener = new DialogUtils.TextAreaKeyListener();
@Override
public JComponent CreateOpTab(String operatorName, Map<String, Object> parameterMap, AppContext appContext) {
demName.addItem(externalDEMStr);
initializeOperatorUI(operatorName, parameterMap);
final JComponent panel = createPanel();
initParameters();
demName.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent event) {
if (((String) demName.getSelectedItem()).startsWith(externalDEMStr)) {
enableExternalDEM(true);
} else {
externalDEMFile.setText("");
enableExternalDEM(false);
}
}
});
externalDEMFile.setColumns(30);
enableExternalDEM(((String) demName.getSelectedItem()).startsWith(externalDEMStr));
externalDEMBrowseButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final File file = Dialogs.requestFileForOpen("External DEM File", false, null, DEMFactory.LAST_EXTERNAL_DEM_DIR_KEY);
externalDEMFile.setText(file.getAbsolutePath());
extNoDataValue = OperatorUIUtils.getNoDataValue(file);
externalDEMNoDataValue.setText(String.valueOf(extNoDataValue));
}
});
externalDEMNoDataValue.addKeyListener(textAreaKeyListener);
maskOutAreaWithoutElevationCheckBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
maskOutAreaWithoutElevation = (e.getStateChange() == ItemEvent.SELECTED);
}
});
outputRangeAzimuthOffsetCheckBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
outputRangeAzimuthOffset = (e.getStateChange() == ItemEvent.SELECTED);
}
});
outputDerampDemodPhaseCheckBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
outputDerampDemodPhase = (e.getStateChange() == ItemEvent.SELECTED);
}
});
return new JScrollPane(panel);
}
@Override
public void initParameters() {
final String demNameParam = (String) paramMap.get("demName");
if (demNameParam != null) {
ElevationModelDescriptor descriptor = ElevationModelRegistry.getInstance().getDescriptor(demNameParam);
if(descriptor != null) {
demName.setSelectedItem(DEMFactory.getDEMDisplayName(descriptor));
} else {
demName.setSelectedItem(demNameParam);
}
}
demResamplingMethod.setSelectedItem(paramMap.get("demResamplingMethod"));
final File extFile = (File) paramMap.get("externalDEMFile");
if (extFile != null) {
externalDEMFile.setText(extFile.getAbsolutePath());
extNoDataValue = (Double) paramMap.get("externalDEMNoDataValue");
if (extNoDataValue != null && !textAreaKeyListener.isChangedByUser()) {
externalDEMNoDataValue.setText(String.valueOf(extNoDataValue));
}
}
resamplingType.setSelectedItem(paramMap.get("resamplingType"));
maskOutAreaWithoutElevation = (Boolean)paramMap.get("maskOutAreaWithoutElevation");
outputRangeAzimuthOffset = (Boolean)paramMap.get("outputRangeAzimuthOffset");
outputDerampDemodPhase = (Boolean)paramMap.get("outputDerampDemodPhase");
if(maskOutAreaWithoutElevation != null) {
maskOutAreaWithoutElevationCheckBox.setSelected(maskOutAreaWithoutElevation);
}
if(outputRangeAzimuthOffset != null) {
outputRangeAzimuthOffsetCheckBox.setSelected(outputRangeAzimuthOffset);
}
if(outputDerampDemodPhase != null) {
outputDerampDemodPhaseCheckBox.setSelected(outputDerampDemodPhase);
}
}
@Override
public UIValidation validateParameters() {
return new UIValidation(UIValidation.State.OK, "");
}
@Override
public void updateParameters() {
paramMap.put("demName", DEMFactory.getProperDEMName((String) demName.getSelectedItem()));
paramMap.put("demResamplingMethod", demResamplingMethod.getSelectedItem());
final String extFileStr = externalDEMFile.getText();
if (!extFileStr.isEmpty()) {
paramMap.put("externalDEMFile", new File(extFileStr));
paramMap.put("externalDEMNoDataValue", Double.parseDouble(externalDEMNoDataValue.getText()));
}
paramMap.put("resamplingType", resamplingType.getSelectedItem());
paramMap.put("maskOutAreaWithoutElevation", maskOutAreaWithoutElevation);
paramMap.put("outputRangeAzimuthOffset", outputRangeAzimuthOffset);
paramMap.put("outputDerampDemodPhase", outputDerampDemodPhase);
}
private JComponent createPanel() {
final JPanel contentPane = new JPanel();
contentPane.setLayout(new GridBagLayout());
final GridBagConstraints gbc = DialogUtils.createGridBagConstraints();
gbc.gridx = 0;
gbc.gridy++;
DialogUtils.addComponent(contentPane, gbc, "Digital Elevation Model:", demName);
gbc.gridy++;
DialogUtils.addComponent(contentPane, gbc, externalDEMFileLabel, externalDEMFile);
gbc.gridx = 2;
contentPane.add(externalDEMBrowseButton, gbc);
gbc.gridy++;
DialogUtils.addComponent(contentPane, gbc, externalDEMNoDataValueLabel, externalDEMNoDataValue);
gbc.gridy++;
DialogUtils.addComponent(contentPane, gbc, "DEM Resampling Method:", demResamplingMethod);
gbc.gridy++;
DialogUtils.addComponent(contentPane, gbc, "Resampling Type:", resamplingType);
gbc.gridy++;
contentPane.add(maskOutAreaWithoutElevationCheckBox, gbc);
if(includeOutputRangeAzimuthOffset) {
gbc.gridy++;
contentPane.add(outputRangeAzimuthOffsetCheckBox, gbc);
}
gbc.gridy++;
contentPane.add(outputDerampDemodPhaseCheckBox, gbc);
gbc.gridy++;
DialogUtils.fillPanel(contentPane, gbc);
return contentPane;
}
private void enableExternalDEM(boolean flag) {
DialogUtils.enableComponents(externalDEMFileLabel, externalDEMFile, flag);
DialogUtils.enableComponents(externalDEMNoDataValueLabel, externalDEMNoDataValue, flag);
externalDEMBrowseButton.setVisible(flag);
}
}