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

src.gov.nasa.worldwindx.examples.GraticuleAttributesPanel Maven / Gradle / Ivy

Go to download

World Wind is a collection of components that interactively display 3D geographic information within Java applications or applets.

There is a newer version: 2.0.0-986
Show 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.worldwindx.examples;

import gov.nasa.worldwind.layers.Earth.MGRSGraticuleLayer;
import gov.nasa.worldwind.util.Logging;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.border.MatteBorder;
import javax.swing.border.CompoundBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

/**
 * @author dcollins
 * @version $Id: GraticuleAttributesPanel.java 1171 2013-02-11 21:45:02Z dcollins $
 */
@SuppressWarnings("unchecked")
public class GraticuleAttributesPanel extends JPanel
{
    // Line attribute components.
    private JPanel linePanel;
    private ColorPanel lineColorPanel;
    private JSlider lineWidthSlider;
    private JSpinner lineWidthSpinner;
    private SpinnerNumberModel lineWidthSpinnerModel;
    private JComboBox lineStyle;
    // Label attribute components.
    private JPanel labelPanel;
    private ColorPanel labelColorPanel;
    private JCheckBox labelEnabled;
    private JComboBox labelFontName;
    private JComboBox labelFontStyle;
    private JComboBox labelFontSize;

    private static final int MIN_LINE_WIDTH = 1;
    private static final int MAX_LINE_WIDTH = 8;
    private static final int LINE_WIDTH_SCALE = 16;

    public static final String LINE_COLOR_PROPERTY = "LineColor";
    public static final String LINE_WIDTH_PROPERTY = "LineWidth";
    public static final String LINE_STYLE_PROPERTY = "LineStyle";
    public static final String LABEL_ENABLED_PROPERTY = "LabelEnabled";
    public static final String LABEL_COLOR_PROPERTY = "LabelColor";    
    public static final String LABEL_FONT_PROPERTY = "LabelFont";

    public GraticuleAttributesPanel()
    {
        makeComponents();
        layoutComponents();
    }

    public Color getSelectedLineColor()
    {
        return this.lineColorPanel.getColor();
    }

    public void setSelectedLineColor(Color value)
    {
        if (value == null)
        {
            String message = Logging.getMessage("nullValue.ColorIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        this.lineColorPanel.setColor(value);
    }

    public double getSelectedLineWidth()
    {
        return this.lineWidthSpinnerModel.getNumber().doubleValue();
    }

    public void setSelectedLineWidth(double value)
    {
        setLineWidthControls(value);
    }

    public String getSelectedLineStyle()
    {
        return this.lineStyle.getSelectedItem().toString();
    }

    public void setSelectedLineStyle(String value)
    {
        if (value == null)
        {
            String message = Logging.getMessage("nullValue.StringIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        this.lineStyle.setSelectedItem(value);
    }

    public boolean isLabelEnableSelected()
    {
        return this.labelEnabled.isSelected();
    }

    public void setLabelEnableSelected(boolean b)
    {
        this.labelEnabled.setSelected(b);
    }

    public Color getSelectedLabelColor()
    {
        return this.labelColorPanel.getColor();
    }

    public void setSelectedLabelColor(Color value)
    {
        if (value == null)
        {
            String message = Logging.getMessage("nullValue.ColorIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        this.labelColorPanel.setColor(value);
    }

    public Font getSelectedLabelFont()
    {
        return makeFontFromControls();
    }

    public void setSelectedLabelFont(Font value)
    {
        if (value == null)
        {
            String message = Logging.getMessage("nullValue.FontIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        setFontControls(value);
    }

    private void onLineColorChanged(PropertyChangeEvent event)
    {
        if (event != null)
        {
            firePropertyChange(LINE_COLOR_PROPERTY, null, event.getNewValue());
        }
    }

    private void onLineWidthSliderChanged(ChangeEvent event)
    {
        if (event != null)
        {
            double width = this.lineWidthSlider.getValue() / (double) LINE_WIDTH_SCALE;
            this.lineWidthSpinner.setValue(width);
            firePropertyChange(LINE_WIDTH_PROPERTY, null, width);
        }
    }

    private void onLineWidthSpinnerChanged(ChangeEvent event)
    {
        if (event != null)
        {
            double width = this.lineWidthSpinnerModel.getNumber().doubleValue();
            this.lineWidthSlider.setValue((int) (width * LINE_WIDTH_SCALE));
            firePropertyChange(LINE_WIDTH_PROPERTY, null, width);
        }
    }

    private void onLineStyleChanged(ActionEvent event)
    {
        if (event != null)
        {
            String style = this.lineStyle.getSelectedItem().toString();
            firePropertyChange(LINE_STYLE_PROPERTY, null, style);
        }
    }

    private void onLabelEnableChanged(ItemEvent event)
    {
        if (event != null)
        {
            firePropertyChange(LABEL_ENABLED_PROPERTY, null, event.getStateChange() == ItemEvent.SELECTED);
        }
    }

    private void onLabelColorChanged(PropertyChangeEvent event)
    {
        if (event != null)
        {
            firePropertyChange(LABEL_COLOR_PROPERTY, null, event.getNewValue());
        }
    }

    private void onLabelFontChanged(ActionEvent event)
    {
        if (event != null)
        {
            Font font = makeFontFromControls();
            firePropertyChange(LABEL_FONT_PROPERTY, null, font);
        }
    }

    private void setLineWidthControls(double width)
    {
        this.lineWidthSlider.setValue((int) (width * LINE_WIDTH_SCALE));
        this.lineWidthSpinner.setValue(width);
    }

    private Font makeFontFromControls()
    {
        StringBuilder sb = new StringBuilder();
        sb.append(this.labelFontName.getSelectedItem());
        sb.append("-");
        sb.append(this.labelFontStyle.getSelectedItem());
        sb.append("-");
        sb.append(this.labelFontSize.getSelectedItem());
        return Font.decode(sb.toString());
    }

    private void setFontControls(Font font)
    {
        if (font == null)
        {
            String message = Logging.getMessage("nullValue.FontIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        // Apply the font name.
        this.labelFontName.setSelectedItem(font.getName());
        // Apply the font style.
        if ((font.getStyle() & Font.BOLD) != 0)
            this.labelFontStyle.setSelectedItem("Bold");
        else if ((font.getStyle() & Font.ITALIC) != 0)
            this.labelFontStyle.setSelectedItem("Italic");
        else if ((font.getStyle() & (Font.BOLD|Font.ITALIC)) != 0)
            this.labelFontStyle.setSelectedItem("BoldItalic");
        else
            this.labelFontStyle.setSelectedItem("Plain");
        // Apply the font size.
        this.labelFontSize.setSelectedItem(String.format("%d", font.getSize()));
    }

    private void makeComponents()
    {
        //---------- Line Properties ----------//
        {
            String[] lineStyles = new String[] {
                MGRSGraticuleLayer.LINE_STYLE_SOLID,
                MGRSGraticuleLayer.LINE_STYLE_DASHED,
                MGRSGraticuleLayer.LINE_STYLE_DOTTED
            };

            this.linePanel = new JPanel();
            //this.lineEnabled = new JCheckBox("Show Graticule");
            this.lineColorPanel = new ColorPanel();
            //noinspection PointlessArithmeticExpression
            this.lineWidthSlider = new JSlider(
                MIN_LINE_WIDTH * LINE_WIDTH_SCALE,  // min
                MAX_LINE_WIDTH * LINE_WIDTH_SCALE); // max
            this.lineWidthSlider.setMajorTickSpacing(LINE_WIDTH_SCALE);
            this.lineWidthSlider.setMinorTickSpacing(LINE_WIDTH_SCALE / 4);
            this.lineWidthSlider.setPaintTicks(true);
            this.lineWidthSlider.setSnapToTicks(true);
            this.lineWidthSpinnerModel = new SpinnerNumberModel(
                (double) MIN_LINE_WIDTH, // value
                (double) MIN_LINE_WIDTH, // min
                (double) MAX_LINE_WIDTH, // max
                4.0 / (double) LINE_WIDTH_SCALE); // stepsize
            this.lineWidthSpinner = new JSpinner(this.lineWidthSpinnerModel);
            this.lineStyle = new JComboBox(lineStyles);
            ListCellRenderer originalRenderer = this.lineStyle.getRenderer();
            this.lineStyle.setRenderer(new LineStyleRenderer(originalRenderer));

            //this.lineEnabled.addItemListener(new ItemListener() {
            //    public void itemStateChanged(ItemEvent event) {
            //        onLineEnableChanged(event);
            //    }
            //});
            this.lineColorPanel.addColorChangeListener(new PropertyChangeListener() {
                public void propertyChange(PropertyChangeEvent event) {
                    onLineColorChanged(event);
                }
            });
            this.lineWidthSlider.addChangeListener(new ChangeListener() {
                public void stateChanged(ChangeEvent event) {
                    onLineWidthSliderChanged(event);
                }
            });
            this.lineWidthSpinner.addChangeListener(new ChangeListener() {
                public void stateChanged(ChangeEvent event) {
                    onLineWidthSpinnerChanged(event);
                }
            });
            this.lineStyle.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    onLineStyleChanged(event);
                }
            });
        }

        //---------- Label Properties ----------//
        {
            this.labelPanel = new JPanel();
            this.labelEnabled = new JCheckBox("Show Labels");
            this.labelColorPanel = new ColorPanel();
            this.labelFontName = new JComboBox(new String[] {"Arial", "SansSerif", "Serif", "Courier", "Times", "Helvetica", "Trebuchet", "Tahoma"});
            this.labelFontStyle = new JComboBox(new String[] {"Plain", "Bold", "Italic", "BoldItalic"});
            this.labelFontSize = new JComboBox(new String[] {"8", "10", "12", "14", "16", "18", "20", "24", "28", "34", "48", "64"});

            this.labelEnabled.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent event) {
                    onLabelEnableChanged(event);
                }
            });
            this.labelColorPanel.addColorChangeListener(new PropertyChangeListener() {
                public void propertyChange(PropertyChangeEvent event) {
                    onLabelColorChanged(event);
                }
            });
            this.labelFontName.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    onLabelFontChanged(event);
                }
            });
            this.labelFontStyle.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    onLabelFontChanged(event);
                }
            });
            this.labelFontSize.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    onLabelFontChanged(event);
                }
            });
        }
    }

    private void layoutComponents()
    {
        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));

        //---------- Line Properties ----------//
        {
            this.linePanel.setLayout(new BoxLayout(this.linePanel, BoxLayout.PAGE_AXIS));
            this.linePanel.setBorder(new CompoundBorder(new TitledBorder("Graticule"), new EmptyBorder(10, 10, 10, 10)));

            //this.lineEnabled.setAlignmentX(Component.LEFT_ALIGNMENT);
            //this.linePanel.add(this.lineEnabled);
            //this.linePanel.add(Box.createVerticalStrut(10));

            this.lineColorPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
            this.linePanel.add(this.lineColorPanel);
            this.linePanel.add(Box.createVerticalStrut(10));

            Box hbox = Box.createHorizontalBox();
            hbox.setAlignmentX(Component.LEFT_ALIGNMENT);
            hbox.add(this.lineWidthSlider);
            hbox.add(this.lineWidthSpinner);
            hbox.add(Box.createHorizontalGlue());
            this.linePanel.add(hbox);
            this.linePanel.add(Box.createVerticalStrut(10));

            this.lineStyle.setAlignmentX(Component.LEFT_ALIGNMENT);
            this.linePanel.add(this.lineStyle);
        }
        this.linePanel.setAlignmentX(Component.LEFT_ALIGNMENT);
        add(this.linePanel);
        add(Box.createVerticalStrut(20));

        //---------- Label Properties ----------//
        {
            this.labelPanel.setLayout(new BoxLayout(this.labelPanel, BoxLayout.PAGE_AXIS));
            this.labelPanel.setBorder(new CompoundBorder(new TitledBorder("Labels"), new EmptyBorder(10, 10, 10, 10)));

            this.labelEnabled.setAlignmentX(Component.LEFT_ALIGNMENT);
            this.labelPanel.add(this.labelEnabled);
            this.labelPanel.add(Box.createVerticalStrut(10));

            this.labelColorPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
            this.labelPanel.add(this.labelColorPanel);
            this.labelPanel.add(Box.createVerticalStrut(10));

            Box hbox = Box.createHorizontalBox();
            hbox.setAlignmentX(Component.LEFT_ALIGNMENT);
            hbox.add(this.labelFontName);
            hbox.add(this.labelFontStyle);
            hbox.add(this.labelFontSize);
            this.labelPanel.add(hbox);
        }
        this.labelPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
        add(this.labelPanel);

        add(Box.createVerticalGlue());
    }

    private static String getLineStyleLabel(String lineStyle)
    {
        String labelText = null;
        if (MGRSGraticuleLayer.LINE_STYLE_SOLID.equals(lineStyle))
            labelText = "Solid";
        else if (MGRSGraticuleLayer.LINE_STYLE_DASHED.equals(lineStyle))
            labelText = "Dashed";
        else if (MGRSGraticuleLayer.LINE_STYLE_DOTTED.equals(lineStyle))
            labelText = "Dotted";
        return labelText;
    }

    private static class LineStyleRenderer implements ListCellRenderer
    {
        private ListCellRenderer delegate;

        public LineStyleRenderer(ListCellRenderer delegate)
        {
            this.delegate = delegate;
        }

        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            Component c = this.delegate.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (c != null && c instanceof JLabel)
            {
                JLabel label = (JLabel) c;
                if (value != null && value instanceof String)
                {
                    String lineStyle = (String) value;
                    String labelText = getLineStyleLabel(lineStyle);
                    label.setText(labelText);
                }
            }
            return c;
        }
    }

    private static class ColorPanel extends JPanel
    {
        private JLabel colorLabel;
        private JButton colorButton;
        private JColorChooser colorChooser;
        private JDialog colorChooserDialog;
        private JSlider opacitySlider;
        private Color lastSelectedColor = null;
        private final PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);

        public ColorPanel()
        {
            makeComponents();
            layoutComponents();
        }

        public void addColorChangeListener(PropertyChangeListener propertyChangeListener)
        {
            this.changeSupport.addPropertyChangeListener(propertyChangeListener);
        }

        public void removeColorChangeListener(PropertyChangeListener propertyChangeListener)
        {
            this.changeSupport.removePropertyChangeListener(propertyChangeListener);
        }

        public void fireColorChanged()
        {
            this.changeSupport.firePropertyChange("color", null, makeColorFromControls());
        }

        public Color getColor()
        {
            return makeColorFromControls();
        }

        public void setColor(Color color)
        {
            if (color == null)
            {
                String message = Logging.getMessage("nullValue.ColorIsNull");
                Logging.logger().severe(message);
                throw new IllegalArgumentException(message);
            }

            setColorControls(color);
        }

        private Color makeColorFromControls()
        {
            Color rgb = this.colorChooser.getColor();
            int a = this.opacitySlider.getValue();
            return new Color(rgb.getRed(), rgb.getGreen(), rgb.getBlue(), a);
        }

        private void setColorControls(Color color)
        {
            if (color == null)
            {
                String message = Logging.getMessage("nullValue.ColorIsNull");
                Logging.logger().severe(message);
                throw new IllegalArgumentException(message);
            }

            this.colorChooser.setColor(color);
            this.opacitySlider.setValue(color.getAlpha());
            setColorLabel(color);
        }

        private void onColorPressed()
        {
            this.lastSelectedColor = makeColorFromControls();
            this.colorChooserDialog.setVisible(true);
        }

        private void onColorChooserOk(ActionEvent event)
        {
            if (event != null)
            {
                this.lastSelectedColor = null;
                Color color = makeColorFromControls();
                setColorLabel(color);
                if (color != null)
                {
                    fireColorChanged();
                }
            }
        }

        private void onColorChooserCancel(ActionEvent event)
        {
            if (event != null)
            {
                Color color = this.lastSelectedColor;
                if (color != null)
                {
                    setColorControls(color);
                    fireColorChanged();
                }
            }
        }

        private void onColorChooserChanged(ChangeEvent event)
        {
            if (event != null)
            {
                Color color = makeColorFromControls();
                setColorLabel(color);
                if (color != null)
                {
                    fireColorChanged();
                }
            }
        }

        private void onOpacityChanged(ChangeEvent event)
        {
            if (event != null)
            {
                Color color = makeColorFromControls();
                setColorLabel(color);
                if (color != null)
                {
                    fireColorChanged();
                }
            }
        }

        private void makeComponents()
        {
            this.colorLabel = new JLabel(makeImageIcon(60, 16));
            this.colorButton = new JButton("Choose...");
            this.colorChooser = new JColorChooser();
            // Replace the color "preview panel" with an empty panel.
            // We will be previewing color changes in the WorldWindow.
            this.colorChooser.setPreviewPanel(new JPanel());
            this.opacitySlider = new JSlider(
                1,    // min
                255); // max
            this.colorChooserDialog = JColorChooser.createDialog(this, "Choose Graticule Color", true, this.colorChooser,
                new ActionListener() {
                    public void actionPerformed(ActionEvent event) {
                        onColorChooserOk(event);
                    }
                },
                new ActionListener() {
                    public void actionPerformed(ActionEvent event) {
                        onColorChooserCancel(event);
                    }
                });

            this.colorLabel.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent event) {
                    onColorPressed();
                }
            });
            this.colorButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    onColorPressed();
                }
            });
            this.colorChooser.getSelectionModel().addChangeListener(new ChangeListener() {
                public void stateChanged(ChangeEvent event) {
                    onColorChooserChanged(event);
                }
            });
            this.opacitySlider.addChangeListener(new ChangeListener() {
                public void stateChanged(ChangeEvent event) {
                    onOpacityChanged(event);
                }
            });
        }

        private void setColorLabel(Color color)
        {
            if (color != null
                && this.colorLabel != null
                && this.colorLabel.getIcon() != null
                && this.colorLabel.getIcon() instanceof ImageIcon)
            {
                ImageIcon icon = (ImageIcon) this.colorLabel.getIcon();
                if (icon.getImage() != null)
                {
                    // We only want to represent the RGB color components
                    // on this label.
                    Color rgb = new Color(color.getRGB());
                    fillImage(icon.getImage(), rgb);
                    this.colorLabel.repaint();
                }
            }
        }

        private void layoutComponents()
        {
            setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));

            Box hbox = Box.createHorizontalBox();
            hbox.setAlignmentX(Component.LEFT_ALIGNMENT);
            this.colorLabel.setBorder(new MatteBorder(1, 1, 1, 1, Color.BLACK));
            hbox.add(this.colorLabel);
            hbox.add(Box.createHorizontalStrut(5));
            hbox.add(this.colorButton);
            add(hbox);
            add(Box.createVerticalStrut(10));

            this.opacitySlider.setAlignmentX(Component.LEFT_ALIGNMENT);
            add(this.opacitySlider);
        }
    }

    private static ImageIcon makeImageIcon(int width, int height)
    {
        ImageIcon icon = null;
        try
        {
            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            icon = new ImageIcon(bi);
        }
        catch (Exception e)
        {
            String message = "Exception while creating icon";
            Logging.logger().log(java.util.logging.Level.SEVERE, message, e);
        }
        return icon;
    }

    private static void fillImage(Image image, Color color)
    {
        try
        {
            Graphics g = image.getGraphics();
            g.setColor(color);
            g.fillRect(0, 0, image.getWidth(null), image.getHeight(null));
        }
        catch (Exception e)
        {
            String message = "Exception while drawing to image";
            Logging.logger().log(java.util.logging.Level.SEVERE, message, e);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy