// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.turnrestrictions.editor; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.BorderLayout; import java.awt.datatransfer.DataFlavor; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import javax.swing.TransferHandler; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.osm.event.DatasetEventManager; import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode; import org.openstreetmap.josm.data.osm.event.SelectionEventManager; import org.openstreetmap.josm.gui.OsmPrimitivRenderer; import org.openstreetmap.josm.gui.layer.OsmDataLayer; import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher; import org.openstreetmap.josm.plugins.turnrestrictions.dnd.PrimitiveIdListProvider; import org.openstreetmap.josm.plugins.turnrestrictions.dnd.PrimitiveIdListTransferHandler; import org.openstreetmap.josm.tools.CheckParameterUtil; import org.openstreetmap.josm.tools.ImageProvider; import org.openstreetmap.josm.tools.Shortcut; /** * This panels displays the objects currently selected in the current * JOSM edit layer. * */ public class JosmSelectionPanel extends JPanel { /** the list view */ private JList<OsmPrimitive> lstSelection; /** the model managing the selection */ private JosmSelectionListModel model; private CopyAction actCopy; private TransferHandler transferHandler; /** * builds the UI for the panel */ protected void build(OsmDataLayer layer) { setLayout(new BorderLayout()); lstSelection = new JList<>(model); lstSelection.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); lstSelection.setSelectionModel(model.getListSelectionModel()); lstSelection.setCellRenderer(new OsmPrimitivRenderer()); lstSelection.setTransferHandler(transferHandler = new JosmSelectionTransferHandler(model)); lstSelection.setDragEnabled(true); add(new JScrollPane(lstSelection), BorderLayout.CENTER); add(new JLabel(tr("Selection")), BorderLayout.NORTH); setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); actCopy = new CopyAction(); lstSelection.addMouseListener(new PopupLauncher()); } /** * Creates the JOSM selection panel for the selection in an OSM data layer * * @param layer the data layer. Must not be null. * @exception IllegalArgumentException thrown if {@code layer} is null */ public JosmSelectionPanel(OsmDataLayer layer, JosmSelectionListModel model) throws IllegalArgumentException { CheckParameterUtil.ensureParameterNotNull(layer, "layer"); this.model = model; build(layer); } /** * wires the UI as listener to global event sources */ public void wireListeners() { Main.getLayerManager().addActiveLayerChangeListener(model); DatasetEventManager.getInstance().addDatasetListener(model, FireMode.IN_EDT); SelectionEventManager.getInstance().addSelectionListener(model, FireMode.IN_EDT_CONSOLIDATED); } /** * removes the UI as listener to global event sources */ public void unwireListeners() { Main.getLayerManager().removeActiveLayerChangeListener(model); DatasetEventManager.getInstance().removeDatasetListener(model); SelectionEventManager.getInstance().removeSelectionListener(model); } class PopupLauncher extends PopupMenuLauncher { @Override public void launch(MouseEvent evt) { new PopupMenu().show(lstSelection, evt.getX(), evt.getY()); } } class PopupMenu extends JPopupMenu { PopupMenu() { JMenuItem item = add(actCopy); item.setTransferHandler(transferHandler); actCopy.setEnabled(!model.getSelected().isEmpty()); } } class CopyAction extends AbstractAction { private Action delegate; CopyAction() { putValue(NAME, tr("Copy")); putValue(SHORT_DESCRIPTION, tr("Copy to the clipboard")); new ImageProvider("copy").getResource().attachImageIcon(this); putValue(ACCELERATOR_KEY, Shortcut.getCopyKeyStroke()); delegate = lstSelection.getActionMap().get("copy"); } @Override public void actionPerformed(ActionEvent e) { delegate.actionPerformed(e); } } private static class JosmSelectionTransferHandler extends PrimitiveIdListTransferHandler { JosmSelectionTransferHandler(PrimitiveIdListProvider provider) { super(provider); } @Override public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { // the JOSM selection list is read-only. Don't allow to drop or paste data on it return false; } } }