/* * 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.ui.product; import com.bc.ceres.swing.TableLayout; import com.jidesoft.swing.CheckBoxList; import org.esa.snap.core.datamodel.Product; import org.esa.snap.ui.ModalDialog; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.Component; import java.awt.FlowLayout; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; /** * @author Thomas Storm */ class ProductChooser extends ModalDialog { private final CheckBoxList productsList; private final JCheckBox selectAll; private final JCheckBox selectNone; ProductChooser(Window parent, String title, int buttonMask, String helpID, Product[] products) { super(parent, title, buttonMask, helpID); TableLayout layout = new TableLayout(1); layout.setTableFill(TableLayout.Fill.BOTH); layout.setRowWeightY(0, 1.0); layout.setRowWeightY(1, 0.0); layout.setTableWeightX(1.0); JPanel panel = new JPanel(layout); ProductListModel listModel = new ProductListModel(); selectAll = new JCheckBox("Select all"); selectNone = new JCheckBox("Select none", true); selectNone.setEnabled(false); productsList = new CheckBoxList(listModel); productsList.setCellRenderer(new ProductListCellRenderer()); productsList.getCheckBoxListSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { final int length = productsList.getCheckBoxListSelectedIndices().length; if (length == 0) { selectNone.setSelected(true); selectAll.setSelected(false); } else if (length == productsList.getModel().getSize()) { selectAll.setSelected(true); selectNone.setSelected(false); } else { selectAll.setSelected(false); selectNone.setSelected(false); } selectAll.setEnabled(!selectAll.isSelected()); selectNone.setEnabled(!selectNone.isSelected()); } }); for (Product product : products) { listModel.addElement(product); } panel.add(new JScrollPane(productsList)); panel.add(createButtonsPanel()); setContent(panel); } List<Product> getSelectedProducts() { List<Product> selectedProducts = new ArrayList<>(); for (int i = 0; i < productsList.getModel().getSize(); i++) { if (productsList.getCheckBoxListSelectionModel().isSelectedIndex(i)) { selectedProducts.add((Product) productsList.getModel().getElementAt(i)); } } return selectedProducts; } private JPanel createButtonsPanel() { JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); selectAll.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { selectNone.setSelected(false); selectAll.setEnabled(false); selectNone.setEnabled(true); productsList.getCheckBoxListSelectionModel().setSelectionInterval(0, productsList.getModel().getSize() - 1); } }); selectNone.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { selectAll.setSelected(false); selectAll.setEnabled(true); selectNone.setEnabled(false); productsList.getCheckBoxListSelectionModel().clearSelection(); } }); selectAll.setMnemonic('a'); selectNone.setMnemonic('n'); buttonsPanel.add(selectAll); buttonsPanel.add(selectNone); return buttonsPanel; } private static class ProductListCellRenderer implements ListCellRenderer<Product> { private DefaultListCellRenderer delegate = new DefaultListCellRenderer(); @Override public Component getListCellRendererComponent(JList list, Product value, int index, boolean isSelected, boolean cellHasFocus) { JLabel label = (JLabel) delegate.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); label.setText(value.getDisplayName()); return label; } } private static class ProductListModel extends DefaultListModel<Product> { @Override public void addElement(Product product) { boolean alreadyContained = false; for (int i = 0; i < getSize(); i++) { String currentProductName = get(i).getName(); String newProductName = product.getName(); alreadyContained |= currentProductName.equals(newProductName); } if (!alreadyContained) { super.addElement(product); } } } }