// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.widgets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JPopupMenu; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.table.TableColumnModel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.ZoomToAction; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.gui.layer.OsmDataLayer; /** * Table displaying OSM primitives. * @since 5297 */ public abstract class OsmPrimitivesTable extends JosmTable { /** * the data layer in whose context primitives are edited in this table */ private transient OsmDataLayer layer; /** the popup menu */ private JPopupMenu popupMenu; private ZoomToAction zoomToAction; /** * Constructs a new {@code OsmPrimitivesTable}. * @param dm table model * @param cm column model * @param sm selection model */ public OsmPrimitivesTable(OsmPrimitivesTableModel dm, TableColumnModel cm, ListSelectionModel sm) { super(dm, cm, sm); addMouseListener(new PopupMenuLauncher(getPopUpMenu())); addMouseListener(new DblClickHandler()); } /** * Returns the table model. * @return the table model */ public OsmPrimitivesTableModel getOsmPrimitivesTableModel() { return (OsmPrimitivesTableModel) getModel(); } /** * Returns the data layer. * @return the data layer */ public final OsmDataLayer getLayer() { return layer; } /** * Sets the data layer. * @param layer the data layer */ public final void setLayer(OsmDataLayer layer) { this.layer = layer; } /** * Replies the popup menu for this table * * @return the popup menu */ protected final JPopupMenu getPopUpMenu() { if (popupMenu == null) { popupMenu = buildPopupMenu(); } return popupMenu; } protected abstract ZoomToAction buildZoomToAction(); protected JPopupMenu buildPopupMenu() { JPopupMenu menu = new JPopupMenu(); zoomToAction = buildZoomToAction(); getSelectionModel().addListSelectionListener(zoomToAction); menu.add(zoomToAction); return menu; } /** * Adds all registered listeners by this table * @see #unregisterListeners() * @since 10454 */ public void registerListeners() { Main.getLayerManager().addLayerChangeListener(zoomToAction); Main.getLayerManager().addActiveLayerChangeListener(zoomToAction); } /** * Removes all registered listeners by this table * @since 10454 */ public void unregisterListeners() { Main.getLayerManager().removeLayerChangeListener(zoomToAction); Main.getLayerManager().removeActiveLayerChangeListener(zoomToAction); } /** * Returns primitive at the specified row. * @param row table row * @param layer unused in this implementation, can be useful for subclasses * @return primitive at the specified row */ public OsmPrimitive getPrimitiveInLayer(int row, OsmDataLayer layer) { return getOsmPrimitivesTableModel().getReferredPrimitive(row); } protected class DblClickHandler extends MouseAdapter { protected void setSelection(MouseEvent e) { int row = rowAtPoint(e.getPoint()); if (row < 0) return; OsmPrimitive primitive = getPrimitiveInLayer(row, layer); if (layer != null && primitive != null) { layer.data.setSelected(primitive.getPrimitiveId()); } } protected void addSelection(MouseEvent e) { int row = rowAtPoint(e.getPoint()); if (row < 0) return; OsmPrimitive primitive = getPrimitiveInLayer(row, layer); getSelectionModel().addSelectionInterval(row, row); if (layer != null && primitive != null) { layer.data.addSelected(primitive.getPrimitiveId()); } } @Override public void mouseClicked(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() > 1) { if (e.isControlDown()) { addSelection(e); } else { setSelection(e); } } } } }