/**
* 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();
}
}