// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.history; import static org.openstreetmap.josm.gui.help.HelpUtil.ht; import static org.openstreetmap.josm.tools.I18n.marktr; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.AbstractAction; import javax.swing.JDialog; import javax.swing.JOptionPane; import javax.swing.JPanel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.PrimitiveId; import org.openstreetmap.josm.data.osm.history.History; import org.openstreetmap.josm.data.osm.history.HistoryDataSet; import org.openstreetmap.josm.data.osm.history.HistoryDataSetListener; import org.openstreetmap.josm.gui.SideButton; import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction; import org.openstreetmap.josm.gui.help.HelpUtil; import org.openstreetmap.josm.tools.ImageProvider; /** * This is non-modal dialog, always showing on top, which displays history information * about a given {@see OsmPrimitive}. * */ public class HistoryBrowserDialog extends JDialog implements HistoryDataSetListener{ /** the embedded browser */ private HistoryBrowser browser; private CloseAction closeAction; /** * displays the title for this dialog * * @param h the current history */ protected void renderTitle(History h) { String title = ""; switch(h.getEarliest().getType()) { case NODE: title = marktr("History for node {0}"); break; case WAY: title = marktr("History for way {0}"); break; case RELATION: title = marktr("History for relation {0}"); break; } setTitle(tr( title, Long.toString(h.getId()) )); } /** * builds the GUI * */ protected void build() { setLayout(new BorderLayout()); browser = new HistoryBrowser(); add(browser, BorderLayout.CENTER); JPanel pnl = new JPanel(); pnl.setLayout(new FlowLayout(FlowLayout.CENTER)); SideButton btn = new SideButton(new ReloadAction()); btn.setName("btn.reload"); pnl.add(btn); btn = new SideButton(closeAction = new CloseAction()); btn.setName("btn.close"); pnl.add(btn); btn = new SideButton(new ContextSensitiveHelpAction(ht("/Dialog/History"))); btn.setName("btn.help"); pnl.add(btn); add(pnl, BorderLayout.SOUTH); HelpUtil.setHelpContext(getRootPane(), ht("/Dialog/History")); setSize(800, 500); } /** * constructor * * @param history the history to be displayed */ public HistoryBrowserDialog(History history) { super(JOptionPane.getFrameForComponent(Main.parent), false); build(); setHistory(history); renderTitle(history); HistoryDataSet.getInstance().addHistoryDataSetListener(this); addWindowListener(new WindowClosingAdapter()); } /** * sets the current history * @param history */ protected void setHistory(History history) { browser.populate(history); } public void unlinkAsListener() { getHistoryBrowser().getModel().unlinkAsListener(); } /* ---------------------------------------------------------------------------------- */ /* interface HistoryDataSetListener */ /* ---------------------------------------------------------------------------------- */ public void historyUpdated(HistoryDataSet source, PrimitiveId primitiveId) { if (primitiveId == null || primitiveId.equals(browser.getHistory().getPrimitmiveId())) { browser.populate(source.getHistory(browser.getHistory().getPrimitmiveId())); } } public void historyDataSetCleared(HistoryDataSet source) { closeAction.run(); } class CloseAction extends AbstractAction { public CloseAction() { putValue(NAME, tr("Close")); putValue(SHORT_DESCRIPTION, tr("Close the dialog")); putValue(SMALL_ICON, ImageProvider.get("ok")); } public void run() { getHistoryBrowser().getModel().unlinkAsListener(); HistoryDataSet.getInstance().removeHistoryDataSetListener(HistoryBrowserDialog.this); HistoryBrowserDialogManager.getInstance().hide(HistoryBrowserDialog.this); } public void actionPerformed(ActionEvent e) { run(); } } class ReloadAction extends AbstractAction { public ReloadAction() { putValue(NAME, tr("Reload")); putValue(SHORT_DESCRIPTION, tr("Reload the history from the server")); putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh")); } public void actionPerformed(ActionEvent e) { HistoryLoadTask task = new HistoryLoadTask(); task.add(browser.getHistory()); Main.worker.submit(task); } } class WindowClosingAdapter extends WindowAdapter { @Override public void windowClosing(WindowEvent e) { closeAction.run(); } } public HistoryBrowser getHistoryBrowser() { return browser; } }