/*
* 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.insar.gpf.ui;
import org.esa.s1tbx.insar.gpf.PCAOp;
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.ui.AppContext;
import org.esa.snap.ui.GridBagUtils;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Map;
/**
* UI for PCA operator
*/
public class PCAOpUI extends BaseOperatorUI {
private final JList bandList = new JList();
private final JComboBox selectEigenvaluesBy = new JComboBox(new String[]{PCAOp.EIGENVALUE_THRESHOLD,
PCAOp.NUMBER_EIGENVALUES});
private final JTextField eigenvalueThreshold = new JTextField("");
private final JTextField numberOfEigenvalues = new JTextField("");
private final JCheckBox showEigenvalues = new JCheckBox("Show Eigenvalues");
private final JCheckBox subtractMeanImage = new JCheckBox("Subtract Mean Image");
private final JLabel eigenvalueThresholdLabel = new JLabel("Eigenvalue Threshold (%):");
private final JLabel numberOfEigenvaluesLabel = new JLabel("Number Of Eigenvalues:");
private final JLabel selectEigenvaluesByLabel = new JLabel("Select Eigenvalues By: ");
private boolean showEigenvaluesFlag = false;
private boolean subtractMeanImageFlag = false;
public JComponent CreateOpTab(String operatorName, Map<String, Object> parameterMap, AppContext appContext) {
initializeOperatorUI(operatorName, parameterMap);
final JComponent panel = createPanel();
bandList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(final ListSelectionEvent e) {
setNumberOfEigenvalues();
}
});
showEigenvalues.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
showEigenvaluesFlag = (e.getStateChange() == ItemEvent.SELECTED);
}
});
subtractMeanImage.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
subtractMeanImageFlag = (e.getStateChange() == ItemEvent.SELECTED);
}
});
initParameters();
return panel;
}
public void initParameters() {
OperatorUIUtils.initParamList(bandList, getBandNames());
selectEigenvaluesBy.setSelectedItem(paramMap.get("selectEigenvaluesBy"));
eigenvalueThreshold.setText(String.valueOf(paramMap.get("eigenvalueThreshold")));
setNumberOfEigenvalues();
}
private void setNumberOfEigenvalues() {
if (sourceProducts != null && sourceProducts.length > 0) {
if (bandList.getSelectedValues().length > 0) {
numberOfEigenvalues.setText(String.valueOf(bandList.getSelectedValues().length));
} else {
numberOfEigenvalues.setText(String.valueOf(getBandNames().length));
}
} else {
numberOfEigenvalues.setText(String.valueOf(paramMap.get("numPCA")));
}
}
public UIValidation validateParameters() {
return new UIValidation(UIValidation.State.OK, "");
}
public void updateParameters() {
if (sourceProducts == null) {
OperatorUIUtils.updateParamList(bandList, paramMap, OperatorUIUtils.SOURCE_BAND_NAMES);
} else {
if (bandList.getSelectedValues().length > 0) {
OperatorUIUtils.updateParamList(bandList, paramMap, OperatorUIUtils.SOURCE_BAND_NAMES);
} else {
paramMap.put("sourceBandNames", sourceProducts[0].getBandNames());
}
}
paramMap.put("selectEigenvaluesBy", selectEigenvaluesBy.getSelectedItem());
paramMap.put("eigenvalueThreshold", Double.parseDouble(eigenvalueThreshold.getText()));
paramMap.put("numPCA", Integer.parseInt(numberOfEigenvalues.getText()));
paramMap.put("showEigenvalues", showEigenvaluesFlag);
paramMap.put("subtractMeanImage", subtractMeanImageFlag);
}
private JComponent createPanel() {
final JPanel contentPane = new JPanel();
contentPane.setLayout(new GridBagLayout());
GridBagConstraints _gbc = GridBagUtils.createDefaultConstraints();
_gbc.fill = GridBagConstraints.HORIZONTAL;
_gbc.anchor = GridBagConstraints.NORTHWEST;
_gbc.insets.top = 2;
_gbc.insets.bottom = 2;
_gbc.gridx = 0;
_gbc.gridy = 0;
contentPane.add(new JLabel("Source Bands:"), _gbc);
_gbc.fill = GridBagConstraints.BOTH;
_gbc.gridx = 1;
contentPane.add(new JScrollPane(bandList), _gbc);
_gbc.fill = GridBagConstraints.HORIZONTAL;
_gbc.gridy++;
_gbc.gridx = 0;
contentPane.add(selectEigenvaluesByLabel, _gbc);
_gbc.gridx = 1;
contentPane.add(selectEigenvaluesBy, _gbc);
selectEigenvaluesBy.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent event) {
updateSelectEigenvaluesBy(true);
}
});
int savedY = ++_gbc.gridy;
DialogUtils.addComponent(contentPane, _gbc, eigenvalueThresholdLabel, eigenvalueThreshold);
_gbc.gridy = savedY;
DialogUtils.addComponent(contentPane, _gbc, numberOfEigenvaluesLabel, numberOfEigenvalues);
_gbc.gridy++;
_gbc.gridx = 0;
contentPane.add(showEigenvalues, _gbc);
_gbc.gridy++;
contentPane.add(subtractMeanImage, _gbc);
updateSelectEigenvaluesBy(true);
return contentPane;
}
private void enableEigenvalueThreshold(boolean flag) {
DialogUtils.enableComponents(eigenvalueThresholdLabel, eigenvalueThreshold, flag);
}
private void enableNumberOfEigenvalues(boolean flag) {
if (flag) {
setNumberOfEigenvalues();
}
DialogUtils.enableComponents(numberOfEigenvaluesLabel, numberOfEigenvalues, flag);
}
private void updateSelectEigenvaluesBy(boolean show) {
if (show) {
selectEigenvaluesBy.setVisible(true);
selectEigenvaluesByLabel.setVisible(true);
String item = (String) selectEigenvaluesBy.getSelectedItem();
if (item.equals(PCAOp.EIGENVALUE_THRESHOLD)) {
enableEigenvalueThreshold(true);
enableNumberOfEigenvalues(false);
} else {
enableEigenvalueThreshold(false);
enableNumberOfEigenvalues(true);
}
} else {
selectEigenvaluesBy.setVisible(false);
selectEigenvaluesByLabel.setVisible(false);
enableEigenvalueThreshold(false);
enableNumberOfEigenvalues(false);
}
}
}