/** * License: GPL. Copyright 2008. Martin Garbe (leo at running-sheep dot com) * * other source from mesurement plugin written by Raphael Mack * */ package org.openstreetmap.josm.plugins.editgpx; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Component; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Box; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.layer.GpxLayer; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.plugins.editgpx.data.EditGpxData; import org.openstreetmap.josm.tools.ImageProvider; /** * Import GPX data from available layers. * */ class GPXLayerImportAction extends AbstractAction { private EditGpxData data; public Object importing = new Object(); //used for synchronization public GPXLayerImportAction(EditGpxData data) { //TODO what is icon at the end? super(tr("Import path from GPX layer"), ImageProvider.get("dialogs", "edit")); this.data = data; } /** * shows a list of GPX layers. if user selects one the data from this layer is imported. */ public void activateImport() { Box panel = Box.createVerticalBox(); DefaultListModel<GpxLayer> dModel = new DefaultListModel<>(); final JList<GpxLayer> layerList = new JList<>(dModel); int layerCnt = 0; for (Layer l : Main.map.mapView.getLayerManager().getLayers()){ if (l instanceof GpxLayer){ dModel.addElement((GpxLayer) l); layerCnt++; } } if(layerCnt > 0){ layerList.setSelectionInterval(0, layerCnt-1); layerList.setCellRenderer(new DefaultListCellRenderer(){ @Override public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Layer layer = (Layer)value; JLabel label = (JLabel)super.getListCellRendererComponent(list, layer.getName(), index, isSelected, cellHasFocus); Icon icon = layer.getIcon(); label.setIcon(icon); label.setToolTipText(layer.getToolTipText()); return label; } }); JCheckBox dropFirst = new JCheckBox(tr("Drop existing path")); dropFirst.setEnabled(!this.data.getTracks().isEmpty()); panel.add(layerList); panel.add(dropFirst); final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION){ @Override public void selectInitialValue() { layerList.requestFocusInWindow(); } }; final JDialog dlg = optionPane.createDialog(Main.parent, tr("Import path from GPX layer")); dlg.setVisible(true); Object answer = optionPane.getValue(); if (answer == null || answer == JOptionPane.UNINITIALIZED_VALUE || (answer instanceof Integer && (Integer)answer != JOptionPane.OK_OPTION)) { return; } if (dropFirst.isSelected()) { this.data.getTracks().clear(); } synchronized(importing) { for (GpxLayer gpx : layerList.getSelectedValuesList()) { this.data.load(gpx.data); } } Main.map.mapView.repaint(); } else { // no gps layer JOptionPane.showMessageDialog(Main.parent,tr("No GPX data layer found.")); } } /** * called when pressing "Import.." from context menu of EditGpx layer */ @Override public void actionPerformed(ActionEvent arg0) { activateImport(); } }