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

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

see #7219 - CT-Column-Title in history window only displays ...

  • Property svn:eol-style set to native
File size: 8.1 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.Main;
34import org.openstreetmap.josm.actions.AbstractInfoAction;
35import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
36import org.openstreetmap.josm.tools.ImageProvider;
37
38/**
39 * VersionTable shows a list of version in a {@see History} of an {@see OsmPrimitive}.
40 *
41 */
42public class VersionTable extends JTable implements Observer{
43 private VersionTablePopupMenu popupMenu;
44
45 protected void build() {
46 getTableHeader().setFont(getTableHeader().getFont().deriveFont(9f));
47 setRowSelectionAllowed(false);
48 setShowGrid(false);
49 setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
50 setBackground(UIManager.getColor("Button.background"));
51 setIntercellSpacing(new Dimension(6, 0));
52 putClientProperty("terminateEditOnFocusLost", true);
53 popupMenu = new VersionTablePopupMenu();
54 addMouseListener(new PopupMenuTrigger());
55 getModel().addTableModelListener(new TableModelListener() {
56 @Override
57 public void tableChanged(TableModelEvent e) {
58 adjustColumnWidth(VersionTable.this, 0);
59 adjustColumnWidth(VersionTable.this, 4);
60 adjustColumnWidth(VersionTable.this, 5);
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 (!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) {
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, 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", 2), 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.