source: josm/trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialog.java @ 5241

Revision 5171, 5.8 KB checked in by Don-vip, 7 weeks ago (diff)

history/osmChange handling: fix an issue when downloading osmChange that could lead to the creation of empty ways (0 node) + fix spelling of a getter

  • Property svn:eol-style set to native
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.history;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.marktr;
6import static org.openstreetmap.josm.tools.I18n.tr;
7
8import java.awt.BorderLayout;
9import java.awt.FlowLayout;
10import java.awt.event.ActionEvent;
11import java.awt.event.KeyEvent;
12import java.awt.event.WindowAdapter;
13import java.awt.event.WindowEvent;
14
15import javax.swing.AbstractAction;
16import javax.swing.JComponent;
17import javax.swing.JDialog;
18import javax.swing.JOptionPane;
19import javax.swing.JPanel;
20import javax.swing.KeyStroke;
21
22import org.openstreetmap.josm.Main;
23import org.openstreetmap.josm.data.osm.PrimitiveId;
24import org.openstreetmap.josm.data.osm.history.History;
25import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
26import org.openstreetmap.josm.data.osm.history.HistoryDataSetListener;
27import org.openstreetmap.josm.gui.SideButton;
28import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
29import org.openstreetmap.josm.gui.help.HelpUtil;
30import org.openstreetmap.josm.tools.ImageProvider;
31
32/**
33 * This is non-modal dialog, always showing on top, which displays history information
34 * about a given {@see OsmPrimitive}.
35 *
36 */
37public class HistoryBrowserDialog extends JDialog implements HistoryDataSetListener{
38
39    /** the embedded browser */
40    private HistoryBrowser browser;
41    private CloseAction closeAction;
42
43    /**
44     * displays the title for this dialog
45     *
46     * @param h the current history
47     */
48    protected void renderTitle(History h) {
49        String title = "";
50        switch(h.getEarliest().getType()) {
51        case NODE:  title = marktr("History for node {0}"); break;
52        case WAY: title = marktr("History for way {0}"); break;
53        case RELATION:  title = marktr("History for relation {0}"); break;
54        }
55        setTitle(tr(
56                title,
57                Long.toString(h.getId())
58        ));
59    }
60
61    /**
62     * builds the GUI
63     *
64     */
65    protected void build() {
66        setLayout(new BorderLayout());
67        browser = new HistoryBrowser();
68        add(browser, BorderLayout.CENTER);
69
70        JPanel pnl = new JPanel();
71        pnl.setLayout(new FlowLayout(FlowLayout.CENTER));
72
73        SideButton btn = new SideButton(new ReloadAction());
74        btn.setName("btn.reload");
75        pnl.add(btn);
76
77        btn = new SideButton(closeAction = new CloseAction());
78        final String closeHistoryBrowserDialogKey = "CloseHistoryBrowserDialog";
79        KeyStroke escapeKey = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false);
80        getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(escapeKey, closeHistoryBrowserDialogKey);
81        getRootPane().getActionMap().put(closeHistoryBrowserDialogKey, closeAction);
82        btn.setName("btn.close");
83        pnl.add(btn);
84
85        btn = new SideButton(new ContextSensitiveHelpAction(ht("/Dialog/HistoryBrowser")));
86        btn.setName("btn.help");
87        pnl.add(btn);
88        add(pnl, BorderLayout.SOUTH);
89
90        HelpUtil.setHelpContext(getRootPane(), ht("/Dialog/HistoryBrowser"));
91
92        setSize(800, 500);
93    }
94
95    /**
96     * constructor
97     *
98     * @param history  the history to be displayed
99     */
100    public HistoryBrowserDialog(History history) {
101        super(JOptionPane.getFrameForComponent(Main.parent), false);
102        build();
103        setHistory(history);
104        renderTitle(history);
105        HistoryDataSet.getInstance().addHistoryDataSetListener(this);
106        addWindowListener(new WindowClosingAdapter());
107    }
108
109    /**
110     * sets the current history
111     * @param history
112     */
113    protected void setHistory(History history) {
114        browser.populate(history);
115    }
116
117    public void unlinkAsListener() {
118        getHistoryBrowser().getModel().unlinkAsListener();
119    }
120
121    /* ---------------------------------------------------------------------------------- */
122    /* interface HistoryDataSetListener                                                   */
123    /* ---------------------------------------------------------------------------------- */
124    public void historyUpdated(HistoryDataSet source, PrimitiveId primitiveId) {
125        if (primitiveId == null || primitiveId.equals(browser.getHistory().getPrimitiveId())) {
126            browser.populate(source.getHistory(browser.getHistory().getPrimitiveId()));
127        }
128    }
129
130    public void historyDataSetCleared(HistoryDataSet source) {
131        closeAction.run();
132    }
133
134
135    class CloseAction extends AbstractAction {
136        public CloseAction() {
137            putValue(NAME, tr("Close"));
138            putValue(SHORT_DESCRIPTION, tr("Close the dialog"));
139            putValue(SMALL_ICON, ImageProvider.get("ok"));
140        }
141
142        public void run() {
143            getHistoryBrowser().getModel().unlinkAsListener();
144            HistoryDataSet.getInstance().removeHistoryDataSetListener(HistoryBrowserDialog.this);
145            HistoryBrowserDialogManager.getInstance().hide(HistoryBrowserDialog.this);
146        }
147
148        public void actionPerformed(ActionEvent e) {
149            run();
150        }
151    }
152
153    class ReloadAction extends AbstractAction {
154        public ReloadAction() {
155            putValue(NAME, tr("Reload"));
156            putValue(SHORT_DESCRIPTION, tr("Reload the history from the server"));
157            putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
158        }
159
160        public void actionPerformed(ActionEvent e) {
161            HistoryLoadTask task = new HistoryLoadTask();
162            task.add(browser.getHistory());
163            Main.worker.submit(task);
164        }
165    }
166
167    class WindowClosingAdapter extends WindowAdapter {
168        @Override
169        public void windowClosing(WindowEvent e) {
170            closeAction.run();
171        }
172    }
173
174    public HistoryBrowser getHistoryBrowser() {
175        return browser;
176    }
177}
Note: See TracBrowser for help on using the repository browser.