All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gov.nasa.worldwind.layers.rpf.wizard.DataChooserPanel Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2012 United States Government as represented by the Administrator of the
 * National Aeronautics and Space Administration.
 * All Rights Reserved.
 */
package gov.nasa.worldwind.layers.rpf.wizard;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.*;
import java.util.Collection;
import java.util.Map;
import java.util.HashMap;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;

/**
 * @author dcollins
 * @version $Id: DataChooserPanel.java 1171 2013-02-11 21:45:02Z dcollins $
 */
public class DataChooserPanel extends JPanel
{
    private JLabel title;
    private JLabel description;
    // Logical data components.
    private Collection fileSetList;
    private PropertyEvents propertyEvents;
    private Map selectButtons;
    // Data UI components.
    private JComponent dataPanel;
    private JButton selectAllButton;
    private JButton deselectAllButton;
    private JScrollPane dataScrollPane;
    private JLabel dataDescription;

    public DataChooserPanel()
    {
        this.propertyEvents = new PropertyEvents();
        makeComponents();
        layoutComponents();
    }

    public String getTitle()
    {
        return this.title.getText();
    }

    public void setTitle(String title)
    {
        this.title.setText(title);
    }

    public String getDescription()
    {
        return this.description.getText();
    }

    public void setDescription(String description)
    {
        this.description.setText(description);
    }

    public String getDataDescription()
    {
        return this.dataDescription.getText();
    }

    public void setDataDescription(String dataDescription)
    {
        this.dataDescription.setText(dataDescription);
    }

    public void setFileSetList(Collection fileSetList)
    {
        removeListeners(this.fileSetList);
        this.fileSetList = fileSetList;
        addListeners(this.fileSetList);

        this.selectButtons = new HashMap();

        if (fileSetList != null && fileSetList.size() > 0)
        {
            Box box = Box.createVerticalBox();
            for (FileSet set : fileSetList)
            {
                JCheckBox checkBox = new JCheckBox();
                checkBox.putClientProperty("fileSet", set);
                checkBox.setSelected(set.isSelected());
                checkBox.setText(makeTitle(set));
                checkBox.setAlignmentX(Component.LEFT_ALIGNMENT);
                checkBox.addItemListener(new ItemListener() {
                    public void itemStateChanged(ItemEvent e) {
                        fileSetClicked(e);
                    }
                });
                box.add(checkBox);

                this.selectButtons.put(set, checkBox);
            }
            this.dataScrollPane.setViewportView(box);
            this.dataPanel.setVisible(true);
        }
        else
        {
            this.dataScrollPane.setViewportView(null);
            this.dataPanel.setVisible(false);
        }
        this.dataPanel.validate();

        fileSetSelectionChanged(null);
    }

    private String makeTitle(FileSet set)
    {
        String title = null;
        if (set != null)
        {
            StringBuilder sb = new StringBuilder();
            sb.append("");
            if (set.getTitle() != null)
                sb.append(set.getTitle());
            else if (set.getIdentifier() != null)
                sb.append(set.getIdentifier());
            else
                sb.append("Various");
            int fileCount = set.getFileCount();
            if (fileCount > 0)
            {
                sb.append("");
                if (sb.length() > 0)
                    sb.append(" - ");
                sb.append(String.format("%,d", fileCount)).append(" file").append(fileCount > 1 ? "s" : "");
                sb.append("");
            }
            sb.append("");
            title = sb.toString();
        }
        return title;
    }

    private void fileSetClicked(ItemEvent e)
    {
        if (e != null)
        {
            FileSet set = null;
            if (e.getItem() != null && e.getItem() instanceof JComponent)
            {
                Object property = ((JComponent) e.getItem()).getClientProperty("fileSet");
                if (property != null && property instanceof FileSet)
                    set = (FileSet) property;
            }

            if (set != null)
            {
                if (e.getStateChange() == ItemEvent.SELECTED)
                    set.setSelected(true);
                else if (e.getStateChange() == ItemEvent.DESELECTED)
                    set.setSelected(false);
            }
        }
    }

    private void setAllSelected(boolean b)
    {
        if (this.fileSetList != null)
        {
            for (FileSet set : this.fileSetList)
            {
                set.setSelected(b);
            }
        }
    }

    private void selectAllPressed()
    {
        setAllSelected(true);
    }

    private void deselectAllPressed()
    {
        setAllSelected(false);
    }

    private void fileSetSelectionChanged(Object source)
    {
        // Make sure the CheckBox selection reflects the FileSet selection state.
        if (source != null && source instanceof FileSet)
        {
            FileSet set = (FileSet) source;
            JToggleButton button = this.selectButtons.get(set);
            if (button != null)
                button.setSelected(set.isSelected());
        }

        // Enable "Select All" and "Select None" only when necessary.
        boolean allSelected = true;
        boolean anySelected = false;
        if (this.fileSetList != null)
        {
            for (FileSet set : this.fileSetList)
            {
                allSelected &= set.isSelected();
                anySelected |= set.isSelected();
            }
        }
        this.selectAllButton.setEnabled(!allSelected);
        this.deselectAllButton.setEnabled(anySelected);
    }

    private void addListeners(Collection fileSetList)
    {
        if (fileSetList != null)
        {
            for (FileSet set : fileSetList)
            {
                set.addPropertyChangeListener(this.propertyEvents);
            }
        }
    }

    private void removeListeners(Collection fileSetList)
    {
        if (fileSetList != null)
        {
            for (FileSet set : fileSetList)
            {
                set.removePropertyChangeListener(this.propertyEvents);
            }
        }
    }

    private class PropertyEvents implements PropertyChangeListener {
        public void propertyChange(PropertyChangeEvent evt) {
            if (evt != null && evt.getPropertyName() != null) {
                String propertyName = evt.getPropertyName();
                if (propertyName.equals(FileSet.SELECTED)) {
                    fileSetSelectionChanged(evt.getSource());
                    firePropertyChange(propertyName, null, evt.getSource());
                }
            }
        }
    }

    private void makeComponents()
    {
        this.title = new JLabel(" ");
        this.title.setBackground(Color.gray);
        this.title.setOpaque(true);
        this.description = new JLabel();

        this.dataPanel = Box.createVerticalBox();
        this.selectAllButton = new JButton("Select All");
        this.deselectAllButton = new JButton("Select None");
        Font font = this.selectAllButton.getFont();
        font = new Font(font.getName(), font.getStyle(), 9);
        Dimension size = new Dimension(35, 20);
        this.selectAllButton.setFont(font);
        this.selectAllButton.setPreferredSize(size);
        this.selectAllButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                selectAllPressed();
            }
        });
        this.deselectAllButton.setFont(font);
        this.deselectAllButton.setPreferredSize(size);
        this.deselectAllButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                deselectAllPressed();
            }
        });
        this.dataScrollPane = new JScrollPane();
        this.dataScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        size = this.dataScrollPane.getPreferredSize();
        this.dataScrollPane.setPreferredSize(new Dimension(size.width, Short.MAX_VALUE));
        this.dataScrollPane.setOpaque(false);
        this.dataScrollPane.getViewport().setOpaque(false);

        this.dataDescription = new JLabel(" ");
    }

    private void layoutComponents()
    {
        setLayout(new BorderLayout());

        JPanel p = new JPanel();
        p.setLayout(new BorderLayout());
        p.setBackground(this.title.getBackground());
        this.title.setBorder(new EmptyBorder(10, 10, 10, 10));
        p.add(this.title, BorderLayout.WEST);
        p.add(new JSeparator(), BorderLayout.SOUTH);
        add(p, BorderLayout.NORTH);

        Box b = Box.createVerticalBox();
        b.setBorder(new EmptyBorder(10, 10, 10, 10));
        this.description.setAlignmentX(Component.LEFT_ALIGNMENT);
        b.add(this.description);
        b.add(Box.createVerticalStrut(10));

        this.dataPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
        Box b2 = Box.createHorizontalBox();
        b2.setAlignmentX(Component.LEFT_ALIGNMENT);
        b2.add(this.selectAllButton);
        b2.add(Box.createHorizontalStrut(2));
        b2.add(new JSeparator(SwingConstants.VERTICAL));
        b2.add(Box.createHorizontalStrut(2));
        b2.add(this.deselectAllButton);
        b2.add(Box.createHorizontalStrut(Short.MAX_VALUE));
        this.dataPanel.add(b2);
        this.dataPanel.add(Box.createVerticalStrut(5));
        this.dataScrollPane.setAlignmentX(Component.LEFT_ALIGNMENT);
        this.dataPanel.add(this.dataScrollPane);
        b.add(this.dataPanel);
        b.add(Box.createVerticalStrut(5));
        this.dataPanel.setVisible(false);

        this.dataDescription.setAlignmentX(Component.LEFT_ALIGNMENT);
        b.add(this.dataDescription);

        add(b, BorderLayout.CENTER);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy