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

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

test fixing Javadoc

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