001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.history;
003
004import java.awt.GridBagConstraints;
005import java.awt.GridBagLayout;
006import java.awt.Insets;
007
008import javax.swing.JPanel;
009import javax.swing.JScrollPane;
010import javax.swing.JTable;
011
012import org.openstreetmap.josm.gui.util.AdjustmentSynchronizer;
013
014/**
015 * Base class of {@link TagInfoViewer} and {@link RelationMemberListViewer}.
016 * @since 6207
017 */
018public abstract class HistoryViewerPanel extends JPanel {
019    
020    protected HistoryBrowserModel model;
021    protected VersionInfoPanel referenceInfoPanel;
022    protected VersionInfoPanel currentInfoPanel;
023    protected AdjustmentSynchronizer adjustmentSynchronizer;
024    protected SelectionSynchronizer selectionSynchronizer;
025
026    protected HistoryViewerPanel(HistoryBrowserModel model) {
027        setModel(model);
028        build();
029    }
030    
031    private JScrollPane embedInScrollPane(JTable table) {
032        JScrollPane pane = new JScrollPane(table);
033        pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
034        pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
035        adjustmentSynchronizer.participateInSynchronizedScrolling(pane.getVerticalScrollBar());
036        return pane;
037    }
038    
039    /**
040     * Sets the history browsing model.
041     * @param model The history browsing model
042     */
043    public final void setModel(HistoryBrowserModel model) {
044        if (this.model != null) {
045            unregisterAsObserver(model);
046        }
047        this.model = model;
048        if (this.model != null) {
049            registerAsObserver(model);
050        }
051    }
052    
053    protected final void unregisterAsObserver(HistoryBrowserModel model) {
054        if (currentInfoPanel != null) {
055            model.deleteObserver(currentInfoPanel);
056        }
057        if (referenceInfoPanel != null) {
058            model.deleteObserver(referenceInfoPanel);
059        }
060    }
061    
062    protected final void registerAsObserver(HistoryBrowserModel model) {
063        if (currentInfoPanel != null) {
064            model.addObserver(currentInfoPanel);
065        }
066        if (referenceInfoPanel != null) {
067            model.addObserver(referenceInfoPanel);
068        }
069    }
070    
071    protected abstract JTable buildReferenceTable();
072    
073    protected abstract JTable buildCurrentTable();
074    
075    private void build() {
076        setLayout(new GridBagLayout());
077        GridBagConstraints gc = new GridBagConstraints();
078
079        // ---------------------------
080        gc.gridx = 0;
081        gc.gridy = 0;
082        gc.gridwidth = 1;
083        gc.gridheight = 1;
084        gc.weightx = 0.5;
085        gc.weighty = 0.0;
086        gc.insets = new Insets(5,5,5,0);
087        gc.fill = GridBagConstraints.HORIZONTAL;
088        gc.anchor = GridBagConstraints.FIRST_LINE_START;
089        referenceInfoPanel = new VersionInfoPanel(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
090        add(referenceInfoPanel,gc);
091
092        gc.gridx = 1;
093        gc.gridy = 0;
094        gc.gridwidth = 1;
095        gc.gridheight = 1;
096        gc.fill = GridBagConstraints.HORIZONTAL;
097        gc.weightx = 0.5;
098        gc.weighty = 0.0;
099        gc.anchor = GridBagConstraints.FIRST_LINE_START;
100        currentInfoPanel = new VersionInfoPanel(model, PointInTimeType.CURRENT_POINT_IN_TIME);
101        add(currentInfoPanel,gc);
102
103        adjustmentSynchronizer = new AdjustmentSynchronizer();
104        selectionSynchronizer = new SelectionSynchronizer();
105
106        // ---------------------------
107        gc.gridx = 0;
108        gc.gridy = 1;
109        gc.gridwidth = 1;
110        gc.gridheight = 1;
111        gc.weightx = 0.5;
112        gc.weighty = 1.0;
113        gc.fill = GridBagConstraints.BOTH;
114        gc.anchor = GridBagConstraints.NORTHWEST;
115        add(embedInScrollPane(buildReferenceTable()),gc);
116
117        gc.gridx = 1;
118        gc.gridy = 1;
119        gc.gridwidth = 1;
120        gc.gridheight = 1;
121        gc.weightx = 0.5;
122        gc.weighty = 1.0;
123        gc.fill = GridBagConstraints.BOTH;
124        gc.anchor = GridBagConstraints.NORTHWEST;
125        add(embedInScrollPane(buildCurrentTable()),gc);
126    }
127}