001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.layer.gpx;
003
004import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
005import static org.openstreetmap.josm.tools.I18n.tr;
006
007import java.awt.Component;
008import java.awt.Dimension;
009import java.awt.Toolkit;
010import java.awt.event.ActionEvent;
011import java.util.LinkedList;
012import java.util.List;
013
014import javax.swing.AbstractAction;
015import javax.swing.Action;
016import javax.swing.BorderFactory;
017import javax.swing.JMenuItem;
018import javax.swing.JOptionPane;
019import javax.swing.JScrollPane;
020
021import org.openstreetmap.josm.Main;
022import org.openstreetmap.josm.gui.layer.GpxLayer;
023import org.openstreetmap.josm.gui.layer.Layer;
024import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
025import org.openstreetmap.josm.gui.layer.Layer.MultiLayerAction;
026import org.openstreetmap.josm.gui.preferences.display.GPXSettingsPanel;
027import org.openstreetmap.josm.tools.ImageProvider;
028
029public class CustomizeDrawingAction extends AbstractAction implements LayerAction, MultiLayerAction {
030    List<Layer> layers;
031
032    public CustomizeDrawingAction(List<Layer> l) {
033        this();
034        layers = l;
035    }
036
037    public CustomizeDrawingAction(Layer l) {
038        this();
039        layers = new LinkedList<Layer>();
040        layers.add(l);
041    }
042
043    private CustomizeDrawingAction() {
044        super(tr("Customize track drawing"), ImageProvider.get("mapmode/addsegment"));
045        putValue("help", ht("/Action/GPXLayerCustomizeLineDrawing"));
046    }
047
048    @Override
049    public boolean supportLayers(List<Layer> layers) {
050        for (Layer layer : layers) {
051            if (!(layer instanceof GpxLayer)) {
052                return false;
053            }
054        }
055        return true;
056    }
057
058    @Override
059    public Component createMenuComponent() {
060        return new JMenuItem(this);
061    }
062
063    @Override
064    public Action getMultiLayerAction(List<Layer> layers) {
065        return new CustomizeDrawingAction(layers);
066    }
067
068    @Override
069    public void actionPerformed(ActionEvent e) {
070        boolean hasLocal = false;
071        boolean hasNonlocal = false;
072        for (Layer layer : layers) {
073            if (layer instanceof GpxLayer) {
074                if (((GpxLayer) layer).isLocalFile()) {
075                    hasLocal = true;
076                } else {
077                    hasNonlocal = true;
078                }
079            }
080        }
081        GPXSettingsPanel panel = new GPXSettingsPanel(layers.get(0).getName(), hasLocal, hasNonlocal);
082        JScrollPane scrollpane = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
083        scrollpane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
084        int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
085        if (screenHeight < 700) {
086            // to fit on screen 800x600
087            scrollpane.setPreferredSize(new Dimension(panel.getPreferredSize().width, Math.min(panel.getPreferredSize().height, 450)));
088        }
089        int answer = JOptionPane.showConfirmDialog(Main.parent, scrollpane, tr("Customize track drawing"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
090        if (answer == JOptionPane.CANCEL_OPTION || answer == JOptionPane.CLOSED_OPTION) {
091            return;
092        }
093        for (Layer layer : layers) {
094            // save preferences for all layers
095            boolean f = false;
096            if (layer instanceof GpxLayer) {
097                f = ((GpxLayer) layer).isLocalFile();
098            }
099            panel.savePreferences(layer.getName(), f);
100        }
101        Main.map.repaint();
102    }
103
104}