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

Last change on this file since 4601 was 4601, checked in by bastiK, 12 years ago

history panel: new column indicating CT status of the user

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