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

Last change on this file since 6223 was 6084, checked in by bastiK, 11 years ago

see #8902 - add missing @Override annotations (patch by shinigami)

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