source: josm/trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java@ 5832

Last change on this file since 5832 was 5832, checked in by stoecker, 11 years ago

i18n update and javadoc fixes

  • Property svn:eol-style set to native
File size: 5.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.history;
3
4import java.awt.GridBagConstraints;
5import java.awt.GridBagLayout;
6import java.awt.Insets;
7import java.awt.Rectangle;
8
9import javax.swing.JPanel;
10import javax.swing.JScrollPane;
11import javax.swing.JTable;
12import javax.swing.ListSelectionModel;
13import javax.swing.event.TableModelEvent;
14import javax.swing.event.TableModelListener;
15
16import org.openstreetmap.josm.data.osm.history.History;
17/**
18 * RelationMemberListViewer is a UI component which displays the list of relation members of two
19 * version of a {@link org.openstreetmap.josm.data.osm.Relation} in a {@link org.openstreetmap.josm.data.osm.history.History}.
20 *
21 * <ul>
22 * <li>on the left, it displays the list of relation members for the version at {@link PointInTimeType#REFERENCE_POINT_IN_TIME}</li>
23 * <li>on the right, it displays the list of relation members for the version at {@link PointInTimeType#CURRENT_POINT_IN_TIME}</li>
24 * </ul>
25 *
26 */
27
28public class RelationMemberListViewer extends JPanel{
29
30 private HistoryBrowserModel model;
31 private VersionInfoPanel referenceInfoPanel;
32 private VersionInfoPanel currentInfoPanel;
33 private AdjustmentSynchronizer adjustmentSynchronizer;
34 private SelectionSynchronizer selectionSynchronizer;
35
36 protected JScrollPane embeddInScrollPane(JTable table) {
37 JScrollPane pane = new JScrollPane(table);
38 pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
39 pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
40 adjustmentSynchronizer.participateInSynchronizedScrolling(pane.getVerticalScrollBar());
41 return pane;
42 }
43
44 protected class MemberModelChanged implements TableModelListener {
45 private final JTable table;
46
47 protected MemberModelChanged(JTable table) {
48 this.table = table;
49 }
50
51 @Override
52 public void tableChanged(TableModelEvent e) {
53 Rectangle rect = table.getCellRect(((DiffTableModel)e.getSource()).getFirstChange(), 0, true);
54 table.scrollRectToVisible(rect);
55 }
56 }
57
58 protected JTable buildReferenceMemberListTable() {
59 JTable table = new JTable(
60 model.getRelationMemberTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME),
61 new RelationMemberTableColumnModel()
62 );
63 table.setName("table.referencememberlisttable");
64 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
65 selectionSynchronizer.participateInSynchronizedSelection(table.getSelectionModel());
66 table.getModel().addTableModelListener(new MemberModelChanged(table));
67 return table;
68 }
69
70 protected JTable buildCurrentMemberListTable() {
71 JTable table = new JTable(
72 model.getRelationMemberTableModel(PointInTimeType.CURRENT_POINT_IN_TIME),
73 new RelationMemberTableColumnModel()
74 );
75 table.setName("table.currentmemberlisttable");
76 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
77 selectionSynchronizer.participateInSynchronizedSelection(table.getSelectionModel());
78 table.getModel().addTableModelListener(new MemberModelChanged(table));
79 return table;
80 }
81
82 protected void build() {
83 setLayout(new GridBagLayout());
84 GridBagConstraints gc = new GridBagConstraints();
85
86 // ---------------------------
87 gc.gridx = 0;
88 gc.gridy = 0;
89 gc.gridwidth = 1;
90 gc.gridheight = 1;
91 gc.weightx = 0.5;
92 gc.weighty = 0.0;
93 gc.insets = new Insets(5,5,5,0);
94 gc.fill = GridBagConstraints.HORIZONTAL;
95 gc.anchor = GridBagConstraints.FIRST_LINE_START;
96 referenceInfoPanel = new VersionInfoPanel(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
97 add(referenceInfoPanel,gc);
98
99 gc.gridx = 1;
100 gc.gridy = 0;
101 gc.gridwidth = 1;
102 gc.gridheight = 1;
103 gc.fill = GridBagConstraints.HORIZONTAL;
104 gc.weightx = 0.5;
105 gc.weighty = 0.0;
106 gc.anchor = GridBagConstraints.FIRST_LINE_START;
107 currentInfoPanel = new VersionInfoPanel(model, PointInTimeType.CURRENT_POINT_IN_TIME);
108 add(currentInfoPanel,gc);
109
110 adjustmentSynchronizer = new AdjustmentSynchronizer();
111 selectionSynchronizer = new SelectionSynchronizer();
112
113 // ---------------------------
114 gc.gridx = 0;
115 gc.gridy = 1;
116 gc.gridwidth = 1;
117 gc.gridheight = 1;
118 gc.weightx = 0.5;
119 gc.weighty = 1.0;
120 gc.fill = GridBagConstraints.BOTH;
121 gc.anchor = GridBagConstraints.NORTHWEST;
122 add(embeddInScrollPane(buildReferenceMemberListTable()),gc);
123
124 gc.gridx = 1;
125 gc.gridy = 1;
126 gc.gridwidth = 1;
127 gc.gridheight = 1;
128 gc.weightx = 0.5;
129 gc.weighty = 1.0;
130 gc.fill = GridBagConstraints.BOTH;
131 gc.anchor = GridBagConstraints.NORTHWEST;
132 add(embeddInScrollPane(buildCurrentMemberListTable()),gc);
133 }
134
135 public RelationMemberListViewer(HistoryBrowserModel model) {
136 setModel(model);
137 build();
138 }
139
140 protected void unregisterAsObserver(HistoryBrowserModel model) {
141 if (currentInfoPanel != null) {
142 model.deleteObserver(currentInfoPanel);
143 }
144 if (referenceInfoPanel != null) {
145 model.deleteObserver(referenceInfoPanel);
146 }
147 }
148 protected void registerAsObserver(HistoryBrowserModel model) {
149 if (currentInfoPanel != null) {
150 model.addObserver(currentInfoPanel);
151 }
152 if (referenceInfoPanel != null) {
153 model.addObserver(referenceInfoPanel);
154 }
155 }
156
157 public void setModel(HistoryBrowserModel model) {
158 if (this.model != null) {
159 unregisterAsObserver(model);
160 }
161 this.model = model;
162 if (this.model != null) {
163 registerAsObserver(model);
164 }
165 }
166}
Note: See TracBrowser for help on using the repository browser.