source: josm/trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java@ 5899

Last change on this file since 5899 was 5622, checked in by jttt, 11 years ago

Compare selected version with previous after click on date on user in history dialog

  • Property svn:eol-style set to native
File size: 8.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.history;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Component;
7import java.awt.Dimension;
8import java.awt.Rectangle;
9import java.awt.event.ActionEvent;
10import java.awt.event.ItemEvent;
11import java.awt.event.ItemListener;
12import java.awt.event.MouseAdapter;
13import java.awt.event.MouseEvent;
14import java.util.Observable;
15import java.util.Observer;
16
17import javax.swing.DefaultCellEditor;
18import javax.swing.JCheckBox;
19import javax.swing.JLabel;
20import javax.swing.JPopupMenu;
21import javax.swing.JRadioButton;
22import javax.swing.JTable;
23import javax.swing.SwingConstants;
24import javax.swing.UIManager;
25import javax.swing.event.TableModelEvent;
26import javax.swing.event.TableModelListener;
27import javax.swing.table.TableCellRenderer;
28
29import org.openstreetmap.josm.Main;
30import org.openstreetmap.josm.actions.AbstractInfoAction;
31import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
32import org.openstreetmap.josm.tools.ImageProvider;
33
34/**
35 * VersionTable shows a list of version in a {@link org.openstreetmap.josm.data.osm.history.History}
36 * of an {@link org.openstreetmap.josm.data.osm.OsmPrimitive}.
37 *
38 */
39public class VersionTable extends JTable implements Observer{
40 private VersionTablePopupMenu popupMenu;
41 private final HistoryBrowserModel model;
42
43 protected void build() {
44 getTableHeader().setFont(getTableHeader().getFont().deriveFont(9f));
45 setRowSelectionAllowed(false);
46 setShowGrid(false);
47 setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
48 setBackground(UIManager.getColor("Button.background"));
49 setIntercellSpacing(new Dimension(6, 0));
50 putClientProperty("terminateEditOnFocusLost", true);
51 popupMenu = new VersionTablePopupMenu();
52 addMouseListener(new MouseListener());
53 getModel().addTableModelListener(new TableModelListener() {
54 @Override
55 public void tableChanged(TableModelEvent e) {
56 adjustColumnWidth(VersionTable.this, 0, 0);
57 adjustColumnWidth(VersionTable.this, 1, -8);
58 adjustColumnWidth(VersionTable.this, 2, -8);
59 adjustColumnWidth(VersionTable.this, 3, 0);
60 adjustColumnWidth(VersionTable.this, 4, 0);
61 }
62 });
63 }
64
65 public VersionTable(HistoryBrowserModel model) {
66 super(model.getVersionTableModel(), new VersionTableColumnModel());
67 model.addObserver(this);
68 build();
69 this.model = model;
70 }
71
72 // some kind of hack to prevent the table from scrolling to the
73 // right when clicking on the cells
74 @Override
75 public void scrollRectToVisible(Rectangle aRect) {
76 super.scrollRectToVisible(new Rectangle(0, aRect.y, aRect.width, aRect.height));
77 }
78
79 protected HistoryBrowserModel.VersionTableModel getVersionTableModel() {
80 return (HistoryBrowserModel.VersionTableModel) getModel();
81 }
82
83 public void update(Observable o, Object arg) {
84 repaint();
85 }
86
87 protected void showPopupMenu(MouseEvent evt) {
88 HistoryBrowserModel.VersionTableModel model = getVersionTableModel();
89 int row = rowAtPoint(evt.getPoint());
90 if (row > -1 && !model.isLatest(row)) {
91 HistoryOsmPrimitive primitive = model.getPrimitive(row);
92 popupMenu.prepare(primitive);
93 popupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
94 }
95 }
96
97 class MouseListener extends MouseAdapter {
98 @Override
99 public void mousePressed(MouseEvent e) {
100 if (!showPopup(e) && e.getButton() == MouseEvent.BUTTON1) {
101 int row = rowAtPoint(e.getPoint());
102 int col = columnAtPoint(e.getPoint());
103 if (row > 0 && (col == VersionTableColumnModel.COL_DATE || col == VersionTableColumnModel.COL_USER)) {
104 model.getVersionTableModel().setCurrentPointInTime(row);
105 model.getVersionTableModel().setReferencePointInTime(row - 1);
106 }
107 }
108 }
109 @Override
110 public void mouseReleased(MouseEvent e) {
111 showPopup(e);
112 }
113 private boolean showPopup(MouseEvent e) {
114 if (e.isPopupTrigger()) {
115 showPopupMenu(e);
116 return true;
117 }
118 return false;
119 }
120 }
121
122 static class ChangesetInfoAction extends AbstractInfoAction {
123 private HistoryOsmPrimitive primitive;
124
125 public ChangesetInfoAction() {
126 super(true);
127 putValue(NAME, tr("Changeset info"));
128 putValue(SHORT_DESCRIPTION, tr("Launch browser with information about the changeset"));
129 putValue(SMALL_ICON, ImageProvider.get("about"));
130 }
131
132 @Override
133 protected String createInfoUrl(Object infoObject) {
134 HistoryOsmPrimitive primitive = (HistoryOsmPrimitive) infoObject;
135 return getBaseBrowseUrl() + "/changeset/" + primitive.getChangesetId();
136 }
137
138 @Override
139 public void actionPerformed(ActionEvent e) {
140 if (!isEnabled())
141 return;
142 String url = createInfoUrl(primitive);
143 launchBrowser(url);
144 }
145
146 public void prepare(HistoryOsmPrimitive primitive) {
147 putValue(NAME, tr("Show changeset {0}", primitive.getChangesetId()));
148 this.primitive = primitive;
149 }
150 }
151
152 static class VersionTablePopupMenu extends JPopupMenu {
153
154 private ChangesetInfoAction changesetInfoAction;
155
156 protected void build() {
157 changesetInfoAction = new ChangesetInfoAction();
158 add(changesetInfoAction);
159 }
160 public VersionTablePopupMenu() {
161 super();
162 build();
163 }
164
165 public void prepare(HistoryOsmPrimitive primitive) {
166 changesetInfoAction.prepare(primitive);
167 invalidate();
168 }
169 }
170
171 public static class RadioButtonRenderer extends JRadioButton implements TableCellRenderer {
172
173 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
174 setSelected(value != null && (Boolean)value);
175 setHorizontalAlignment(SwingConstants.CENTER);
176 return this;
177 }
178 }
179
180 public static class RadioButtonEditor extends DefaultCellEditor implements ItemListener {
181
182 private JRadioButton btn;
183
184 public RadioButtonEditor() {
185 super(new JCheckBox());
186 btn = new JRadioButton();
187 btn.setHorizontalAlignment(SwingConstants.CENTER);
188 }
189
190 @Override
191 public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
192 if (value == null) return null;
193 boolean val = (Boolean) value;
194 btn.setSelected(val);
195 btn.addItemListener(this);
196 return btn;
197 }
198
199 @Override
200 public Object getCellEditorValue() {
201 btn.removeItemListener(this);
202 return btn.isSelected();
203 }
204
205 public void itemStateChanged(ItemEvent e) {
206 fireEditingStopped();
207 }
208 }
209
210 public static class AlignedRenderer extends JLabel implements TableCellRenderer {
211 public AlignedRenderer(int hAlignment) {
212 setHorizontalAlignment(hAlignment);
213 }
214 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
215 String v = value.toString();
216 setText(v);
217 return this;
218 }
219 }
220
221 private static void adjustColumnWidth(JTable tbl, int col, int cellInset) {
222 int maxwidth = 0;
223
224 for (int row=0; row<tbl.getRowCount(); row++) {
225 TableCellRenderer tcr = tbl.getCellRenderer(row, col);
226 Object val = tbl.getValueAt(row, col);
227 Component comp = tcr.getTableCellRendererComponent(tbl, val, false, false, row, col);
228 maxwidth = Math.max(comp.getPreferredSize().width + cellInset, maxwidth);
229 }
230 TableCellRenderer tcr = tbl.getTableHeader().getDefaultRenderer();
231 Object val = tbl.getColumnModel().getColumn(col).getHeaderValue();
232 Component comp = tcr.getTableCellRendererComponent(tbl, val, false, false, -1, col);
233 maxwidth = Math.max(comp.getPreferredSize().width + Main.pref.getInteger("table.header-inset", 0), maxwidth);
234
235 int spacing = tbl.getIntercellSpacing().width;
236 tbl.getColumnModel().getColumn(col).setPreferredWidth(maxwidth + spacing);
237 }
238
239}
Note: See TracBrowser for help on using the repository browser.