source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java@ 4958

Last change on this file since 4958 was 4958, checked in by stoecker, 12 years ago

fix remaining shortcut deprecations

  • Property svn:eol-style set to native
File size: 11.6 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.gui.dialogs;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Component;
7import java.awt.event.ActionEvent;
8import java.awt.event.KeyEvent;
9import java.awt.event.MouseAdapter;
10import java.awt.event.MouseEvent;
11import java.util.ArrayList;
12import java.util.Arrays;
13import java.util.Collection;
14import java.util.Collections;
15import java.util.List;
16
17import javax.swing.AbstractAction;
18import javax.swing.Action;
19import javax.swing.DefaultListSelectionModel;
20import javax.swing.JComponent;
21import javax.swing.JLabel;
22import javax.swing.JTable;
23import javax.swing.ListSelectionModel;
24import javax.swing.event.ListSelectionEvent;
25import javax.swing.event.ListSelectionListener;
26import javax.swing.table.DefaultTableCellRenderer;
27import javax.swing.table.DefaultTableColumnModel;
28import javax.swing.table.DefaultTableModel;
29import javax.swing.table.TableCellRenderer;
30import javax.swing.table.TableColumn;
31
32import org.openstreetmap.josm.Main;
33import org.openstreetmap.josm.data.SelectionChangedListener;
34import org.openstreetmap.josm.data.osm.DataSet;
35import org.openstreetmap.josm.data.osm.OsmPrimitive;
36import org.openstreetmap.josm.data.osm.PrimitiveId;
37import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
38import org.openstreetmap.josm.data.osm.history.HistoryDataSetListener;
39import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
40import org.openstreetmap.josm.gui.SideButton;
41import org.openstreetmap.josm.gui.help.HelpUtil;
42import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
43import org.openstreetmap.josm.gui.history.HistoryLoadTask;
44import org.openstreetmap.josm.tools.ImageProvider;
45import org.openstreetmap.josm.tools.Shortcut;
46
47/**
48 * HistoryDialog displays a list of the currently selected primitives and provides
49 * two actions for (1) (re)loading the history of the selected primitives and (2)
50 * for launching a history browser for each selected primitive.
51 *
52 */
53public class HistoryDialog extends ToggleDialog implements HistoryDataSetListener {
54
55 /** the table model */
56 protected HistoryItemTableModel model;
57 /** the table with the history items */
58 protected JTable historyTable;
59
60 protected ShowHistoryAction showHistoryAction;
61 protected ReloadAction reloadAction;
62
63 public HistoryDialog() {
64 super(tr("History"), "history", tr("Display the history of all selected items."),
65 Shortcut.registerShortcut("subwindow:history", tr("Toggle: {0}", tr("History")), KeyEvent.VK_H,
66 Shortcut.GROUP_LAYER+Shortcut.GROUPS_ALT1), 150);
67 build();
68 HelpUtil.setHelpContext(this, HelpUtil.ht("/Dialog/History"));
69 }
70
71 /**
72 * builds the GUI
73 */
74 protected void build() {
75 DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
76 historyTable = new JTable(
77 model = new HistoryItemTableModel(selectionModel),
78 new HistoryTableColumnModel(),
79 selectionModel
80 );
81 historyTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
82 final TableCellRenderer oldRenderer = historyTable.getTableHeader().getDefaultRenderer();
83 historyTable.getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer(){
84 @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
85 JComponent c = (JComponent)oldRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
86 if (!"".equals(value))
87 return c;
88 JLabel l = new JLabel(ImageProvider.get("misc","showhide"));
89 l.setForeground(c.getForeground());
90 l.setBackground(c.getBackground());
91 l.setFont(c.getFont());
92 l.setBorder(c.getBorder());
93 l.setOpaque(true);
94 return l;
95 }
96 });
97 historyTable.addMouseListener(new ShowHistoryMouseAdapter());
98 historyTable.setTableHeader(null);
99
100 createLayout(historyTable, true, Arrays.asList(new SideButton[] {
101 new SideButton(reloadAction = new ReloadAction()),
102 new SideButton(showHistoryAction = new ShowHistoryAction())
103 }));
104
105 // wire actions
106 //
107 historyTable.getSelectionModel().addListSelectionListener(showHistoryAction);
108 historyTable.getSelectionModel().addListSelectionListener(reloadAction);
109 }
110
111 @Override
112 public void showNotify() {
113 HistoryDataSet.getInstance().addHistoryDataSetListener(this);
114 DataSet.addSelectionListener(model);
115 if (Main.main.getCurrentDataSet() == null) {
116 model.selectionChanged(null);
117 } else {
118 model.selectionChanged(Main.main.getCurrentDataSet().getSelected());
119 }
120 }
121
122 @Override
123 public void hideNotify() {
124 HistoryDataSet.getInstance().removeHistoryDataSetListener(this);
125 DataSet.removeSelectionListener(model);
126 }
127
128 /* ----------------------------------------------------------------------------- */
129 /* interface HistoryDataSetListener */
130 /* ----------------------------------------------------------------------------- */
131 public void historyUpdated(HistoryDataSet source, PrimitiveId primitiveId) {
132 model.refresh();
133 }
134
135 public void historyDataSetCleared(HistoryDataSet source) {
136 model.refresh();
137 }
138
139 /**
140 * The table model with the history items
141 *
142 */
143 static class HistoryItemTableModel extends DefaultTableModel implements SelectionChangedListener{
144 private ArrayList<OsmPrimitive> data;
145 private DefaultListSelectionModel selectionModel;
146
147 public HistoryItemTableModel(DefaultListSelectionModel selectionModel) {
148 data = new ArrayList<OsmPrimitive>();
149 this.selectionModel = selectionModel;
150 }
151
152 @Override
153 public int getRowCount() {
154 if (data == null)
155 return 0;
156 return data.size();
157 }
158
159 @Override
160 public Object getValueAt(int row, int column) {
161 return data.get(row);
162 }
163
164 @Override
165 public boolean isCellEditable(int row, int column) {
166 return false;
167 }
168
169 protected List<OsmPrimitive> getSelectedPrimitives() {
170 ArrayList<OsmPrimitive> ret = new ArrayList<OsmPrimitive>();
171 for (int i=0; i< data.size(); i++) {
172 if (selectionModel.isSelectedIndex(i)) {
173 ret.add(data.get(i));
174 }
175 }
176 return ret;
177 }
178
179 protected void selectPrimitives(Collection<OsmPrimitive> primitives) {
180 for (OsmPrimitive p: primitives) {
181 int idx = data.indexOf(p);
182 if (idx < 0) {
183 continue;
184 }
185 selectionModel.addSelectionInterval(idx, idx);
186 }
187 }
188
189 public void refresh() {
190 List<OsmPrimitive> selectedPrimitives = getSelectedPrimitives();
191 data.clear();
192 if (Main.main.getCurrentDataSet() == null)
193 return;
194 for (OsmPrimitive primitive: Main.main.getCurrentDataSet().getSelected()) {
195 if (primitive.isNew()) {
196 continue;
197 }
198 data.add(primitive);
199 }
200 fireTableDataChanged();
201 selectPrimitives(selectedPrimitives);
202 }
203
204 public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
205 data.clear();
206 selectionModel.clearSelection();
207 if (newSelection != null && !newSelection.isEmpty()) {
208 for (OsmPrimitive primitive: newSelection) {
209 if (primitive.isNew()) {
210 continue;
211 }
212 data.add(primitive);
213 }
214 }
215 fireTableDataChanged();
216 selectionModel.addSelectionInterval(0, data.size()-1);
217 }
218
219 public List<OsmPrimitive> getPrimitives(int [] rows) {
220 if (rows == null || rows.length == 0) return Collections.emptyList();
221 ArrayList<OsmPrimitive> ret = new ArrayList<OsmPrimitive>(rows.length);
222 for (int row: rows) {
223 ret.add(data.get(row));
224 }
225 return ret;
226 }
227
228 public OsmPrimitive getPrimitive(int row) {
229 return data.get(row);
230 }
231 }
232
233 /**
234 * The column model
235 */
236 static class HistoryTableColumnModel extends DefaultTableColumnModel {
237 protected void createColumns() {
238 TableColumn col = null;
239 OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
240 // column 0 - History item
241 col = new TableColumn(0);
242 col.setHeaderValue(tr("Object with history"));
243 col.setCellRenderer(renderer);
244 addColumn(col);
245 }
246
247 public HistoryTableColumnModel() {
248 createColumns();
249 }
250 }
251
252 /**
253 * The action for reloading history information of the currently selected primitives.
254 *
255 */
256 class ReloadAction extends AbstractAction implements ListSelectionListener {
257
258 public ReloadAction() {
259 putValue(Action.SMALL_ICON, ImageProvider.get("dialogs","refresh"));
260 putValue(Action.NAME, tr("Reload"));
261 putValue(Action.SHORT_DESCRIPTION, tr("Reload all currently selected objects and refresh the list."));
262 updateEnabledState();
263 }
264
265 public void actionPerformed(ActionEvent e) {
266 int [] rows = historyTable.getSelectedRows();
267 if (rows == null || rows.length == 0) return;
268
269 List<OsmPrimitive> selectedItems = model.getPrimitives(rows);
270 HistoryLoadTask task = new HistoryLoadTask();
271 task.add(selectedItems);
272 Main.worker.execute(task);
273 }
274
275 protected void updateEnabledState() {
276 setEnabled(historyTable.getSelectedRowCount() > 0);
277 }
278
279 public void valueChanged(ListSelectionEvent e) {
280 updateEnabledState();
281 }
282 }
283
284 class ShowHistoryMouseAdapter extends MouseAdapter {
285 @Override
286 public void mouseClicked(MouseEvent e) {
287 if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
288 int row = historyTable.rowAtPoint(e.getPoint());
289 HistoryBrowserDialogManager.getInstance().showHistory(Collections.singletonList(model.getPrimitive(row)));
290 }
291 }
292 }
293
294 /**
295 * The action for showing history information of the current history item.
296 */
297 class ShowHistoryAction extends AbstractAction implements ListSelectionListener {
298 public ShowHistoryAction() {
299 putValue(Action.SMALL_ICON, ImageProvider.get("dialogs","history"));
300 putValue(Action.NAME, tr("Show"));
301 putValue(Action.SHORT_DESCRIPTION, tr("Display the history of the selected objects."));
302 updateEnabledState();
303 }
304
305 public void actionPerformed(ActionEvent e) {
306 int [] rows = historyTable.getSelectedRows();
307 if (rows == null || rows.length == 0) return;
308 HistoryBrowserDialogManager.getInstance().showHistory(model.getPrimitives(rows));
309 }
310
311 protected void updateEnabledState() {
312 setEnabled(historyTable.getSelectedRowCount() > 0);
313 }
314
315 public void valueChanged(ListSelectionEvent e) {
316 updateEnabledState();
317 }
318 }
319}
Note: See TracBrowser for help on using the repository browser.