org.deegree.igeo.views.swing.style.component.PresetsPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.deegree.igeo.views.swing.style.component.PresetsPanel.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.component;

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

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Map;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import org.deegree.framework.log.ILogger;
import org.deegree.framework.log.LoggerFactory;
import org.deegree.graphics.sld.Symbolizer;
import org.deegree.igeo.settings.GraphicOptions;
import org.deegree.igeo.style.model.Preset;
import org.deegree.igeo.style.model.Preset.PRESETTYPE;
import org.deegree.igeo.views.swing.style.StyleDialogUtils;
import org.deegree.igeo.views.swing.style.VisualPropertyPanel;
import org.deegree.igeo.views.swing.style.renderer.PresetRenderer;

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

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

    private static final long serialVersionUID = 4824564032207322808L;

    private static final ILogger LOG = LoggerFactory.getLogger(PresetsPanel.class);

    private VisualPropertyPanel assignedVisualPropPanel;

    private PRESETTYPE type;

    private JTextField nameTF;

    private DefaultListModel dlm;

    private JList availableSettingsList;

    private GraphicOptions go;

    private boolean isPopupTriggered = false;

    public PresetsPanel(VisualPropertyPanel assignedVisualPropPanel, PRESETTYPE type) {
        this.assignedVisualPropPanel = assignedVisualPropPanel;
        this.type = type;
        go = assignedVisualPropPanel.getOwner().getSettings().getGraphicOptions();
        init();

    }

    private void init() {
        // init
        nameTF = new JTextField();
        nameTF.setToolTipText(get("$MD10920"));

        JButton saveBt = new JButton(get("$MD10859"));
        saveBt.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (nameTF.getText() != null && nameTF.getText().length() > 0) {
                    Symbolizer symbolizer = assignedVisualPropPanel.getPresetSymbolizer();
                    try {
                        go.addSymbolizerPreset(nameTF.getText(), symbolizer);
                        updatePresetsCB();
                        nameTF.setText("");
                    } catch (Exception e1) {
                        LOG.logError("can not save preset", e1);
                        JOptionPane.showMessageDialog(PresetsPanel.this, get("$MD10840"), get("$DI10017"),
                                JOptionPane.ERROR_MESSAGE);
                    }
                } else {
                    JOptionPane.showMessageDialog(PresetsPanel.this, get("$MD10865"), get("$MD10866"),
                            JOptionPane.INFORMATION_MESSAGE);
                }
            }
        });

        dlm = new DefaultListModel();
        availableSettingsList = new JList();
        availableSettingsList.setModel(dlm);
        availableSettingsList.setToolTipText(get("$MD10860"));
        availableSettingsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        availableSettingsList.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                if (!isPopupTriggered) {
                    applyPreset();
                }
            }
        });

        availableSettingsList.addMouseListener(new PopupListener());
        availableSettingsList.setCellRenderer(new PresetRenderer());
        updatePresetsCB();

        JScrollPane availableSettingsSP = new JScrollPane(availableSettingsList);
        availableSettingsSP.setPreferredSize(new Dimension(100, 300));

        // layout
        FormLayout fl = new FormLayout(
                "left:$rgap, left:pref, left:$rgap, right:[80dlu,pref]:grow(0.4), 5dlu, center:default:grow(0.6)",
                "5dlu, $sepheight, $sepheight, $cpheight, $btheight, pref:grow(1)");
        DefaultFormBuilder builder = new DefaultFormBuilder(fl);
        builder.setBorder(StyleDialogUtils.createStyleAttributeBorder(get("$MD10861")));

        CellConstraints cc = new CellConstraints();
        builder.addSeparator(get("$MD10862"), cc.xyw(1, 3, 4));
        builder.addLabel(get("$MD10863"), cc.xy(2, 4));
        builder.add(nameTF, cc.xy(4, 4, CellConstraints.FILL, CellConstraints.CENTER));
        builder.add(saveBt, cc.xyw(2, 5, 3, CellConstraints.CENTER, CellConstraints.CENTER));

        builder.addLabel(get("$MD10864"), cc.xy(6, 2));
        builder.add(availableSettingsSP, cc.xywh(6, 3, 1, 4));

        add(builder.getPanel());

    }

    // add defined presets to the list
    private void updatePresetsCB() {
        try {
            dlm.removeAllElements();
            Map<String, Preset> symbolizers = go.getSymbolizerPresets();
            for (String presetName : symbolizers.keySet()) {
                Preset preset = symbolizers.get(presetName);
                if (type.equals(preset.getType())) {
                    dlm.addElement(preset);
                }
            }
        } catch (Exception e) {
            LOG.logError("can not get defined presets!", e);
            JOptionPane.showMessageDialog(this, get("$MD10839"), get("$DI10017"), JOptionPane.ERROR_MESSAGE);
        }
    }

    private void applyPreset() {
        try {
            if (availableSettingsList.getSelectedValue() != null) {
                Preset preset = go.getSymbolizerPresets()
                        .get(((Preset) availableSettingsList.getSelectedValue()).getName());
                try {
                    assignedVisualPropPanel.setSymbolizer(preset.getSymbolizer());
                } catch (Exception e1) {
                    LOG.logError("An error occured when trying to set the preset!", e1);
                    JOptionPane.showMessageDialog(PresetsPanel.this, get("$MD10794"), get("$DI10017"),
                            JOptionPane.ERROR_MESSAGE);
                }
            }
        } catch (Exception e2) {
            LOG.logError("can not get defined presets!", e2);
            JOptionPane.showMessageDialog(this, get("$MD10838"), get("$DI10017"), JOptionPane.ERROR_MESSAGE);
        }
    }

    // //////////////////////////////////////////////////////////////////////////////
    // INNER CLASS
    // //////////////////////////////////////////////////////////////////////////////

    private class PopupListener extends MouseAdapter {

        private JPopupMenu popupMenu;

        public void mousePressed(MouseEvent e) {
            maybeShowPopup(e);
        }

        public void mouseReleased(MouseEvent e) {
            maybeShowPopup(e);
        }

        private void maybeShowPopup(MouseEvent e) {
            if (e.isPopupTrigger()) {
                if (popupMenu == null) {
                    popupMenu = new JPopupMenu();
                    JMenuItem applyLabel = new JMenuItem(get("$MD11170"));
                    applyLabel.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            applyPreset();
                        }
                    });
                    popupMenu.add(applyLabel);

                    JMenuItem removeLabel = new JMenuItem(get("$MD11171"));
                    removeLabel.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            if (availableSettingsList.getSelectedValue() != null) {
                                Preset preset = (Preset) availableSettingsList.getSelectedValue();
                                int result = JOptionPane.showOptionDialog(PresetsPanel.this,
                                        get("$MD11173", preset.getName()), get("$MD11172"),
                                        JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null,
                                        null);
                                if (result == JOptionPane.OK_OPTION) {
                                    try {
                                        go.removeSymbolizerPreset(preset.getName());
                                        updatePresetsCB();
                                    } catch (Exception e1) {
                                        LOG.logError("can not remove presets!", e1);
                                        JOptionPane.showMessageDialog(PresetsPanel.this, get("$MD11174"),
                                                get("$DI10017"), JOptionPane.ERROR_MESSAGE);
                                    }
                                }
                            }
                        }
                    });
                    popupMenu.add(removeLabel);
                }

                int selectedIndex = availableSettingsList.locationToIndex(e.getPoint());
                if (selectedIndex > -1) {
                    isPopupTriggered = true;
                    availableSettingsList.setSelectedIndex(selectedIndex);
                    isPopupTriggered = false;
                    popupMenu.show(e.getComponent(), e.getX(), e.getY());
                }
            }
        }

    }
}