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}