org.deegree.igeo.views.swing.style.FillGraphicPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.deegree.igeo.views.swing.style.FillGraphicPanel.java

Source

/*----------------    FILE HEADER  ------------------------------------------
 This file is part of deegree.
 Copyright (C) 2001-2007 by:
 Department of Geography, University of Bonn
 http://www.giub.uni-bonn.de/deegree/
 lat/lon GmbH
 http://www.lat-lon.de
    
 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.
 This library 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
 Lesser General Public License for more details.
 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 Contact:
    
 Andreas Poth
 lat/lon GmbH
 Aennchenstr. 19
 53177 Bonn
 Germany
 E-Mail: poth@lat-lon.de
    
 Prof. Dr. Klaus Greve
 Department of Geography
 University of Bonn
 Meckenheimer Allee 166
 53115 Bonn
 Germany
 E-Mail: greve@giub.uni-bonn.de
 ---------------------------------------------------------------------------*/

package org.deegree.igeo.views.swing.style;

import static org.deegree.igeo.i18n.Messages.get;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.prefs.Preferences;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;

import org.deegree.igeo.ChangeListener;
import org.deegree.igeo.ValueChangedEvent;
import org.deegree.igeo.settings.GraphicOptions;
import org.deegree.igeo.style.model.FillPattern;
import org.deegree.igeo.style.model.GraphicSymbol;
import org.deegree.igeo.style.model.SldValues;
import org.deegree.igeo.views.swing.style.renderer.SymbolRenderer;
import org.deegree.igeo.views.swing.util.GenericFileChooser;
import org.deegree.igeo.views.swing.util.IGeoFileFilter;
import org.deegree.igeo.views.swing.util.GenericFileChooser.FILECHOOSERTYPE;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

/**
 * <code>FillGraphicPanel</code>
 * 
 * @author <a href="mailto:buesching@lat-lon.de">Lyn Buesching</a>
 * @author last edited by: $Author$
 * 
 * @version $Revision$, $Date$
 * 
 */
public class FillGraphicPanel extends JPanel implements ActionListener {

    private static final long serialVersionUID = -4817010814590110063L;

    private JComboBox fixedGraphicFillCB;

    private JTextField fixedGraphicFillUrlTF;

    private JTextField fixedGraphicFillNameTF;

    private JButton addNewGraphicBt;

    private JButton selectGraphicBt;

    private JButton removeGraphicBt;

    private JComboBox graphicToRemoveCB;

    private GraphicOptions graphicOptions;

    private ChangeListener changelistener;

    private JSpinner sizeSpinner;

    private JRadioButton defaultSizeRB;

    private JRadioButton setSizeRB;

    /**
     * @param graphicOptions
     *            the graphic options
     */
    public FillGraphicPanel(GraphicOptions graphicOptions) {
        this(null, graphicOptions);
    }

    /**
     * @param changelistener
     *            the change listener to inform, when selected fill graphic has changed
     * @param graphicOptions
     *            the graphic options
     */
    public FillGraphicPanel(ChangeListener changelistener, GraphicOptions graphicOptions) {
        this.changelistener = changelistener;
        this.graphicOptions = graphicOptions;
        setLayout(new BorderLayout());
        init();
        updateGraphicComboBoxes();
    }

    /**
     * selects the entry with the same url if available, otherwise the URL will be added as fillGraphic to the settings
     * 
     * @param onlineResource
     *            the url of the graphic
     * @param size
     *            the size of the graphic
     */
    public void setValue(URL onlineResource, double size) {
        if (Double.isNaN(size) || size < 0) {
            defaultSizeRB.setSelected(true);
        } else {
            sizeSpinner.setValue(size);
            setSizeRB.setSelected(true);
        }
        if (onlineResource != null) {
            boolean isInList = false;
            for (int i = 0; i < fixedGraphicFillCB.getItemCount(); i++) {
                Object item = fixedGraphicFillCB.getItemAt(i);
                if (item instanceof GraphicSymbol && ((GraphicSymbol) item).getUrl().toExternalForm()
                        .equals(onlineResource.toExternalForm())) {
                    fixedGraphicFillCB.setSelectedIndex(i);
                    isInList = true;
                    break;
                }
            }
            if (!isInList) {
                try {
                    graphicOptions.addFillGraphicDefinition(onlineResource.getFile(),
                            onlineResource.toExternalForm());
                    updateGraphicComboBoxes();
                    fixedGraphicFillCB.setSelectedItem(
                            graphicOptions.getFillGraphicDefinitions().get(onlineResource.getFile()));
                } catch (MalformedURLException e) {
                    JOptionPane.showMessageDialog(this, get("$MD10832"), get("$DI10017"),
                            JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    }

    /**
     * set the color and transparancy of fill patterns
     * 
     * @param color
     *            the color indicating the color value
     * @param transColor
     *            the color indication the transparency
     * 
     */
    public void createAndUpdateColor(Color color, Color transColor) {
        Color newColor = new Color(color.getRed(), color.getGreen(), color.getBlue(), transColor.getAlpha());
        for (int i = 0; i < fixedGraphicFillCB.getItemCount(); i++) {
            Object item = fixedGraphicFillCB.getItemAt(i);
            if (item instanceof FillPattern) {
                ((FillPattern) item).setColor(newColor);
            }
        }
        fireFillGraphicChangedEvent();
    }

    /**
     * @return the selected graphic symbol, or null, if no graphic symbol is selected
     */
    public GraphicSymbol getValue() {
        Object selectedItem = fixedGraphicFillCB.getSelectedItem();
        if (selectedItem != null && selectedItem instanceof GraphicSymbol) {
            if (defaultSizeRB.isSelected()) {
                ((GraphicSymbol) selectedItem).setSize(Double.NaN);
            } else {
                ((GraphicSymbol) selectedItem).setSize((Double) sizeSpinner.getValue());
            }
            return (GraphicSymbol) selectedItem;
        }
        return null;
    }

    private void init() {
        // init

        // well known
        fixedGraphicFillCB = new JComboBox();
        fixedGraphicFillCB.setRenderer(new SymbolRenderer());
        fixedGraphicFillCB.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                fireFillGraphicChangedEvent();
            }
        });

        // size

        defaultSizeRB = new JRadioButton(get("$MD11113"));
        defaultSizeRB.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                fireFillGraphicChangedEvent();
            }
        });

        setSizeRB = new JRadioButton();
        setSizeRB.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                fireFillGraphicChangedEvent();
            }
        });

        ButtonGroup bg = new ButtonGroup();
        bg.add(defaultSizeRB);
        bg.add(setSizeRB);

        defaultSizeRB.setSelected(true);

        SpinnerModel model = new SpinnerNumberModel(6.0, 1.0, Integer.MAX_VALUE, 1.0);
        sizeSpinner = new JSpinner(model);
        sizeSpinner.setMaximumSize(new Dimension(StyleDialogUtils.PREF_COMPONENT_WIDTH,
                StyleDialogUtils.PREF_ONELINE_COMPONENT_HEIGHT));
        sizeSpinner.setMinimumSize(new Dimension(StyleDialogUtils.PREF_COMPONENT_WIDTH,
                StyleDialogUtils.PREF_ONELINE_COMPONENT_HEIGHT));
        sizeSpinner.setPreferredSize(new Dimension(StyleDialogUtils.PREF_COMPONENT_WIDTH,
                StyleDialogUtils.PREF_ONELINE_COMPONENT_HEIGHT));
        sizeSpinner.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                setSizeRB.setSelected(true);
                fireFillGraphicChangedEvent();
            }
        });

        // add own
        selectGraphicBt = new JButton(get("$MD10753"));
        selectGraphicBt.addActionListener(this);
        fixedGraphicFillUrlTF = new JTextField();
        addNewGraphicBt = new JButton(get("$MD10754"));
        addNewGraphicBt.addActionListener(this);
        fixedGraphicFillNameTF = new JTextField();

        // remove own
        graphicToRemoveCB = new JComboBox();
        graphicToRemoveCB.setRenderer(new SymbolRenderer());
        removeGraphicBt = new JButton(get("$MD11161"));
        removeGraphicBt.addActionListener(this);

        // layout
        FormLayout fl = new FormLayout("left:$rgap, left:min, left:min, fill:default:grow(1), min",
                "$sepheight, $cpheight, " + "$sepheight, $cpheight, $cpheight, "
                        + "$sepheight, $cpheight, $btheight, $cpheight, $btheight, "
                        + "$sepheight, $cpheight, $btheight");

        DefaultFormBuilder builder = new DefaultFormBuilder(fl);
        CellConstraints cc = new CellConstraints();

        builder.addSeparator(get("$MD10756"), cc.xyw(1, 1, 5));
        builder.add(fixedGraphicFillCB, cc.xyw(2, 2, 4));

        builder.addSeparator(get("$MD11112"), cc.xyw(1, 3, 4));
        builder.add(defaultSizeRB, cc.xyw(2, 4, 3));
        builder.add(setSizeRB, cc.xy(2, 5));
        builder.add(sizeSpinner, cc.xy(3, 5));

        builder.addSeparator(get("$MD10757"), cc.xyw(1, 6, 5));
        builder.addLabel(get("$MD10758"), cc.xyw(2, 7, 2));
        builder.add(fixedGraphicFillNameTF, cc.xyw(4, 7, 2));

        builder.addLabel(get("$MD10759"), cc.xyw(2, 8, 2));
        builder.add(selectGraphicBt, cc.xyw(4, 8, 2, CellConstraints.RIGHT, CellConstraints.CENTER));
        builder.add(fixedGraphicFillUrlTF, cc.xyw(2, 9, 4));
        builder.add(addNewGraphicBt, cc.xyw(2, 10, 4, CellConstraints.CENTER, CellConstraints.CENTER));

        builder.addSeparator(get("$MD11160"), cc.xyw(1, 11, 5));
        builder.add(graphicToRemoveCB, cc.xyw(2, 12, 4));
        builder.add(removeGraphicBt, cc.xyw(2, 13, 4, CellConstraints.CENTER, CellConstraints.CENTER));

        add(builder.getPanel(), BorderLayout.CENTER);
    }

    private void fireFillGraphicChangedEvent() {
        if (changelistener != null) {
            if (fixedGraphicFillCB.getSelectedItem() instanceof GraphicSymbol) {
                GraphicSymbol value = (GraphicSymbol) fixedGraphicFillCB.getSelectedItem();
                if (defaultSizeRB.isSelected()) {
                    value.setSize(Double.NaN);
                } else {
                    value.setSize((Double) sizeSpinner.getValue());
                }
                changelistener.valueChanged(new FillGraphicChangedEvent(value));
            } else {
                changelistener.valueChanged(new FillGraphicChangedEvent(null));
            }
        }
    }

    private void updateGraphicComboBoxes() {
        fixedGraphicFillCB.removeAllItems();
        fixedGraphicFillCB.addItem(get("$MD10752"));

        graphicToRemoveCB.removeAllItems();

        for (FillPattern fillPattern : SldValues.getFillPatterns()) {
            fixedGraphicFillCB.addItem(fillPattern);
        }

        try {
            Map<String, GraphicSymbol> fillGraphics = graphicOptions.getFillGraphicDefinitions();
            List<GraphicSymbol> values = new ArrayList<GraphicSymbol>();
            values.addAll(fillGraphics.values());
            Collections.sort((List<GraphicSymbol>) values);
            for (GraphicSymbol fillGraphicName : values) {
                fixedGraphicFillCB.addItem(fillGraphicName);
                graphicToRemoveCB.addItem(fillGraphicName);
            }
        } catch (MalformedURLException e1) {
            JOptionPane.showMessageDialog(this, get("$MD10831"), get("$MD10781"), JOptionPane.INFORMATION_MESSAGE);
        }
        if (graphicToRemoveCB.getItemCount() > 0) {
            removeGraphicBt.setEnabled(true);
        } else {
            removeGraphicBt.setEnabled(false);
        }
    }

    // //////////////////////////////////////////////////////////////////////////////
    // ACTIONLISTENER
    // //////////////////////////////////////////////////////////////////////////////

    /*
     * (non-Javadoc)
     * 
     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
     */
    public void actionPerformed(ActionEvent event) {
        if (event.getSource() == selectGraphicBt) {
            Preferences preferences = Preferences.userNodeForPackage(FillGraphicPanel.class);
            File file = GenericFileChooser.showOpenDialog(FILECHOOSERTYPE.image, null, this, preferences,
                    "lastSelectGraphic", IGeoFileFilter.IMAGES);
            if (file != null) {
                try {
                    fixedGraphicFillUrlTF.setText(file.toURI().toURL().toExternalForm());
                } catch (MalformedURLException e) {
                    // should never happen
                    e.printStackTrace();
                }
            }
        } else if (event.getSource() == addNewGraphicBt) {
            addGraphic();
        } else if (event.getSource() == removeGraphicBt) {
            removeGraphic();
        }

    }

    private void addGraphic() {
        String url = fixedGraphicFillUrlTF.getText();
        String name = fixedGraphicFillNameTF.getText();
        boolean invalidURL = false;
        if (url != null && url.length() > 0) {
            try {
                URL u = new URL(url);
                GraphicSymbol newSymbol = new GraphicSymbol(name, u);
                if (newSymbol.getFormat() != null) {
                    graphicOptions.addFillGraphicDefinition(name, u.toExternalForm());
                    updateGraphicComboBoxes();
                    fixedGraphicFillCB.setSelectedItem(graphicOptions.getFillGraphicDefinitions().get(name));

                    fixedGraphicFillUrlTF.setText("");
                    fixedGraphicFillNameTF.setText("");
                } else {
                    JOptionPane.showMessageDialog(this, get("$MD10762"), get("$MD10763"),
                            JOptionPane.INFORMATION_MESSAGE);
                }
            } catch (MalformedURLException e) {
                invalidURL = true;
            }
        } else {
            invalidURL = true;
        }
        if (invalidURL) {
            JOptionPane.showMessageDialog(this, get("$MD10764"), get("$MD10765"), JOptionPane.INFORMATION_MESSAGE);
        }

    }

    private void removeGraphic() {
        if (graphicToRemoveCB.getSelectedItem() != null
                && !(graphicToRemoveCB.getSelectedItem() instanceof FillPattern)) {
            GraphicSymbol gs = (GraphicSymbol) graphicToRemoveCB.getSelectedItem();
            int result = JOptionPane.showOptionDialog(this, get("$MD11163", gs.getName()), get("$MD11162"),
                    JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
            if (result == JOptionPane.OK_OPTION) {
                try {
                    graphicOptions.removeFillGraphicDefinition(gs.getName());
                    graphicToRemoveCB.removeItem(gs);
                    if (fixedGraphicFillCB.getSelectedItem() == gs) {
                        fixedGraphicFillCB.setSelectedIndex(0);
                    }
                    fixedGraphicFillCB.removeItem(gs);
                } catch (MalformedURLException e) {
                    JOptionPane.showMessageDialog(this, get("$MD11164"), get("$DI10017"),
                            JOptionPane.INFORMATION_MESSAGE);
                }

                if (graphicToRemoveCB.getItemCount() > 0) {
                    removeGraphicBt.setEnabled(true);
                } else {
                    removeGraphicBt.setEnabled(false);
                }
            }
        }

    }

    public class FillGraphicChangedEvent extends ValueChangedEvent {

        private Object value;

        public FillGraphicChangedEvent(Object value) {
            this.value = value;
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.deegree.igeo.ValueChangedEvent#getValue()
         */
        @Override
        public Object getValue() {
            return value;
        }

    }

}