// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.history; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Observable; import java.util.Observer; import javax.swing.DefaultListSelectionModel; import javax.swing.JPopupMenu; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.openstreetmap.josm.actions.AbstractInfoAction; import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive; import org.openstreetmap.josm.tools.ImageProvider; /** * VersionTable shows a list of version in a {@see History} of an {@see OsmPrimitive}. * * */ public class VersionTable extends JTable implements Observer{ //private static Logger logger = Logger.getLogger(VersionTable.class.getName()); private VersionTablePopupMenu popupMenu; protected void build() { setSelectionMode(ListSelectionModel.SINGLE_SELECTION); addMouseListener(new MouseHandler()); getSelectionModel().addListSelectionListener(new SelectionHandler()); popupMenu = new VersionTablePopupMenu(); addMouseListener(new PopupMenuTrigger()); } public VersionTable(HistoryBrowserModel model) { super(model.getVersionTableModel(), new VersionTableColumnModel()); model.addObserver(this); build(); } protected void handleSelectReferencePointInTime(int row) { getVersionTableModel().setReferencePointInTime(row); } protected void handleSelectCurrentPointInTime(int row) { getVersionTableModel().setCurrentPointInTime(row); } protected HistoryBrowserModel.VersionTableModel getVersionTableModel() { return (HistoryBrowserModel.VersionTableModel) getModel(); } class MouseHandler extends MouseAdapter { protected void handleDoubleClick(MouseEvent e) { int row = rowAtPoint(e.getPoint()); handleSelectReferencePointInTime(row); } @Override public void mouseClicked(MouseEvent e) { switch(e.getClickCount()) { case 2: handleDoubleClick(e); break; } } } class SelectionHandler implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { DefaultListSelectionModel model = (DefaultListSelectionModel)e.getSource(); if (model.getMinSelectionIndex() >= 0) { handleSelectCurrentPointInTime(model.getMinSelectionIndex()); } } } public void update(Observable o, Object arg) { repaint(); } protected void showPopupMenu(MouseEvent evt) { HistoryBrowserModel.VersionTableModel model = getVersionTableModel(); int row = getSelectedRow(); if (row == -1) { row = rowAtPoint(evt.getPoint()); } if (!model.isLatest(row)) { HistoryOsmPrimitive primitive = model.getPrimitive(row); popupMenu.prepare(primitive); popupMenu.show(evt.getComponent(), evt.getX(), evt.getY()); } } class PopupMenuTrigger extends MouseAdapter { @Override public void mousePressed(MouseEvent e) { showPopup(e); } @Override public void mouseReleased(MouseEvent e) { showPopup(e); } private void showPopup(MouseEvent e) { if (e.isPopupTrigger()) { showPopupMenu(e); } } } static class ChangesetInfoAction extends AbstractInfoAction { private HistoryOsmPrimitive primitive; public ChangesetInfoAction() { putValue(NAME, tr("Changeset info")); putValue(SHORT_DESCRIPTION, tr("Launch browser with information about the changeset")); putValue(SMALL_ICON, ImageProvider.get("about")); } @Override protected String createInfoUrl(Object infoObject) { HistoryOsmPrimitive primitive = (HistoryOsmPrimitive) infoObject; return getBaseBrowseUrl() + "/changeset/" + primitive.getChangesetId(); } @Override public void actionPerformed(ActionEvent e) { if (!isEnabled()) return; String url = createInfoUrl(primitive); launchBrowser(url); } public void prepare(HistoryOsmPrimitive primitive) { putValue(NAME, tr("Show changeset {0}", primitive.getChangesetId())); this.primitive = primitive; } } static class VersionTablePopupMenu extends JPopupMenu { private ChangesetInfoAction changesetInfoAction; protected void build() { changesetInfoAction = new ChangesetInfoAction(); add(changesetInfoAction); } public VersionTablePopupMenu() { super(); build(); } public void prepare(HistoryOsmPrimitive primitive) { changesetInfoAction.prepare(primitive); invalidate(); } } }