/*
* 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.snap.raster.gpf.ui;
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.raster.gpf.FilterOperator;
import org.esa.snap.rcp.util.Dialogs;
import org.esa.snap.ui.AppContext;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Enumeration;
import java.util.Map;
/**
* Created by IntelliJ IDEA.
* User: lveci
* Date: Feb 12, 2008
* Time: 1:52:49 PM
* To change this template use File | Settings | File Templates.
*/
public class FilterOpUI extends BaseOperatorUI {
private final JList bandList = new JList();
private JTree tree = null;
private DefaultMutableTreeNode root = null;
private final JLabel filterLabel = new JLabel("Filters:");
private final JLabel kernelFileLabel = new JLabel("User Defined Kernel File:");
private final JTextField kernelFile = new JTextField("");
private final JButton kernelFileBrowseButton = new JButton("...");
public JComponent CreateOpTab(String operatorName, Map<String, Object> parameterMap, AppContext appContext) {
initializeOperatorUI(operatorName, parameterMap);
JComponent panel = createPanel();
initParameters();
kernelFile.setColumns(30);
kernelFileBrowseButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final File file = Dialogs.requestFileForOpen("User Defined Kernel File", false, null, "snap.filterDir");
kernelFile.setText(file.getAbsolutePath());
}
});
return panel;
}
public void initParameters() {
OperatorUIUtils.initParamList(bandList, getBandNames());
final String filterName = (String) paramMap.get("selectedFilterName");
if (filterName != null) {
setSelectedFilter(filterName);
}
final File kFile = (File) paramMap.get("userDefinedKernelFile");
if (kFile != null) {
kernelFile.setText(kFile.getAbsolutePath());
}
}
public UIValidation validateParameters() {
if (sourceProducts != null) {
if (getSelectedFilter(tree) == null && kernelFile.getText().equals(""))
return new UIValidation(UIValidation.State.ERROR, "Filter not selected");
}
return new UIValidation(UIValidation.State.OK, "");
}
public void updateParameters() {
OperatorUIUtils.updateParamList(bandList, paramMap, OperatorUIUtils.SOURCE_BAND_NAMES);
final FilterOperator.Filter filter = getSelectedFilter(tree);
if (filter != null) {
paramMap.put("selectedFilterName", filter.toString());
}
final String kernelFileStr = kernelFile.getText();
if (!kernelFileStr.isEmpty()) {
paramMap.put("userDefinedKernelFile", new File(kernelFileStr));
}
}
private static DefaultMutableTreeNode findItem(DefaultMutableTreeNode parentItem, String filterName) {
if (!parentItem.isLeaf()) {
final Enumeration enumeration = parentItem.children();
while (enumeration.hasMoreElements()) {
final DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) enumeration.nextElement();
final DefaultMutableTreeNode found = findItem(treeNode, filterName);
if (found != null)
return found;
}
}
if (parentItem.toString().equals(filterName))
return parentItem;
return null;
}
private JComponent createPanel() {
tree = createTree();
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
final JScrollPane treeView = new JScrollPane(tree);
final JPanel contentPane = new JPanel(new BorderLayout(4, 4));
contentPane.setLayout(new GridBagLayout());
final GridBagConstraints gbc = DialogUtils.createGridBagConstraints();
contentPane.add(new JLabel("Source Bands:"), gbc);
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 1;
gbc.weighty = 2;
contentPane.add(new JScrollPane(bandList), gbc);
gbc.weighty = 4;
gbc.gridy++;
DialogUtils.addComponent(contentPane, gbc, filterLabel, treeView);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weighty = 1;
gbc.gridy++;
DialogUtils.addComponent(contentPane, gbc, kernelFileLabel, kernelFile);
DialogUtils.enableComponents(kernelFileLabel, kernelFile, true);
gbc.gridx = 2;
contentPane.add(kernelFileBrowseButton, gbc);
DialogUtils.fillPanel(contentPane, gbc);
return contentPane;
}
private JTree createTree() {
root = new DefaultMutableTreeNode("@root");
root.add(createNodes("Detect Lines", FilterOperator.LINE_DETECTION_FILTERS));
root.add(createNodes("Detect Gradients (Emboss)", FilterOperator.GRADIENT_DETECTION_FILTERS));
root.add(createNodes("Smooth and Blurr", FilterOperator.SMOOTHING_FILTERS));
root.add(createNodes("Sharpen", FilterOperator.SHARPENING_FILTERS));
root.add(createNodes("Enhance Discontinuities", FilterOperator.LAPLACIAN_FILTERS));
//root.add(createNodes("Non-Linear Filters", FilterOperator.NON_LINEAR_FILTERS));
final JTree tree = new JTree(root);
tree.setRootVisible(false);
tree.setShowsRootHandles(true);
tree.setCellRenderer(new MyDefaultTreeCellRenderer());
tree.putClientProperty("JTree.lineStyle", "Angled");
expandAll(tree);
return tree;
}
public JTree getTree() {
return tree;
}
public void setSelectedFilter(String filterName) {
final DefaultMutableTreeNode item = findItem(root, filterName);
if (item != null) {
tree.setSelectionPath(new TreePath(item.getPath()));
}
}
public static FilterOperator.Filter getSelectedFilter(final JTree tree) {
final TreePath selectionPath = tree.getSelectionPath();
if (selectionPath == null) {
return null;
}
final Object[] path = selectionPath.getPath();
if (path != null && path.length > 0) {
final DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) path[path.length - 1];
if (treeNode.getUserObject() instanceof FilterOperator.Filter) {
return (FilterOperator.Filter) treeNode.getUserObject();
}
}
return null;
}
private static DefaultMutableTreeNode createNodes(String categoryName, FilterOperator.Filter[] filters) {
final DefaultMutableTreeNode category = new DefaultMutableTreeNode(categoryName);
for (FilterOperator.Filter filter : filters) {
final DefaultMutableTreeNode item = new DefaultMutableTreeNode(filter);
category.add(item);
}
return category;
}
private static void expandAll(JTree tree) {
DefaultMutableTreeNode actNode = (DefaultMutableTreeNode) tree.getModel().getRoot();
while (actNode != null) {
if (!actNode.isLeaf()) {
final TreePath actPath = new TreePath(actNode.getPath());
tree.expandRow(tree.getRowForPath(actPath));
}
actNode = actNode.getNextNode();
}
}
private static class MyDefaultTreeCellRenderer extends DefaultTreeCellRenderer {
private Font _plainFont;
private Font _boldFont;
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
final JLabel c = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row,
hasFocus);
if (_plainFont == null) {
_plainFont = c.getFont().deriveFont(Font.PLAIN);
_boldFont = c.getFont().deriveFont(Font.BOLD);
}
c.setFont(leaf ? _plainFont : _boldFont);
c.setIcon(null);
return c;
}
}
}