// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.history;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import org.openstreetmap.josm.gui.util.AdjustmentSynchronizer;
/**
* Base class of {@link TagInfoViewer} and {@link RelationMemberListViewer}.
* @since 6207
*/
public abstract class HistoryViewerPanel extends JPanel {
protected transient HistoryBrowserModel model;
protected VersionInfoPanel referenceInfoPanel;
protected VersionInfoPanel currentInfoPanel;
protected transient AdjustmentSynchronizer adjustmentSynchronizer;
protected transient SelectionSynchronizer selectionSynchronizer;
protected HistoryViewerPanel(HistoryBrowserModel model) {
setModel(model);
build();
}
private JScrollPane embedInScrollPane(JTable table) {
JScrollPane pane = new JScrollPane(table);
adjustmentSynchronizer.participateInSynchronizedScrolling(pane.getVerticalScrollBar());
return pane;
}
/**
* Sets the history browsing model.
* @param model The history browsing model
*/
public final void setModel(HistoryBrowserModel model) {
if (this.model != null) {
unregisterAsChangeListener(model);
}
this.model = model;
if (this.model != null) {
registerAsChangeListener(model);
}
}
protected final void unregisterAsChangeListener(HistoryBrowserModel model) {
if (currentInfoPanel != null) {
model.removeChangeListener(currentInfoPanel);
}
if (referenceInfoPanel != null) {
model.removeChangeListener(referenceInfoPanel);
}
}
protected final void registerAsChangeListener(HistoryBrowserModel model) {
if (currentInfoPanel != null) {
model.addChangeListener(currentInfoPanel);
}
if (referenceInfoPanel != null) {
model.addChangeListener(referenceInfoPanel);
}
}
protected abstract JTable buildReferenceTable();
protected abstract JTable buildCurrentTable();
private void build() {
setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
// ---------------------------
gc.gridx = 0;
gc.gridy = 0;
gc.gridwidth = 1;
gc.gridheight = 1;
gc.weightx = 0.5;
gc.weighty = 0.0;
gc.insets = new Insets(5, 5, 5, 0);
gc.fill = GridBagConstraints.HORIZONTAL;
gc.anchor = GridBagConstraints.FIRST_LINE_START;
referenceInfoPanel = new VersionInfoPanel(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
add(referenceInfoPanel, gc);
gc.gridx = 1;
gc.gridy = 0;
gc.gridwidth = 1;
gc.gridheight = 1;
gc.fill = GridBagConstraints.HORIZONTAL;
gc.weightx = 0.5;
gc.weighty = 0.0;
gc.anchor = GridBagConstraints.FIRST_LINE_START;
currentInfoPanel = new VersionInfoPanel(model, PointInTimeType.CURRENT_POINT_IN_TIME);
add(currentInfoPanel, gc);
adjustmentSynchronizer = new AdjustmentSynchronizer();
selectionSynchronizer = new SelectionSynchronizer();
// ---------------------------
gc.gridx = 0;
gc.gridy = 1;
gc.gridwidth = 1;
gc.gridheight = 1;
gc.weightx = 0.5;
gc.weighty = 1.0;
gc.fill = GridBagConstraints.BOTH;
gc.anchor = GridBagConstraints.NORTHWEST;
add(embedInScrollPane(buildReferenceTable()), gc);
gc.gridx = 1;
gc.gridy = 1;
gc.gridwidth = 1;
gc.gridheight = 1;
gc.weightx = 0.5;
gc.weighty = 1.0;
gc.fill = GridBagConstraints.BOTH;
gc.anchor = GridBagConstraints.NORTHWEST;
add(embedInScrollPane(buildCurrentTable()), gc);
}
}