001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.gui.conflict.tags; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.awt.BorderLayout; 007 import java.awt.GridBagConstraints; 008 import java.awt.GridBagLayout; 009 010 import javax.swing.BorderFactory; 011 import javax.swing.JCheckBox; 012 import javax.swing.JLabel; 013 import javax.swing.JPanel; 014 import javax.swing.JScrollPane; 015 import javax.swing.event.ChangeEvent; 016 import javax.swing.event.ChangeListener; 017 018 import org.openstreetmap.josm.Main; 019 020 /** 021 * This is a UI widget for resolving tag conflicts, i.e. differences of the tag values 022 * of multiple {@link OsmPrimitive}s. 023 * 024 * 025 */ 026 public class TagConflictResolver extends JPanel { 027 028 /** the model for the tag conflict resolver */ 029 private TagConflictResolverModel model; 030 /** selects whether only tags with conflicts are displayed */ 031 private JCheckBox cbShowTagsWithConflictsOnly; 032 private JCheckBox cbShowTagsWithMultiValuesOnly; 033 034 protected JPanel buildInfoPanel() { 035 JPanel pnl = new JPanel(); 036 pnl.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 037 pnl.setLayout(new GridBagLayout()); 038 GridBagConstraints gc = new GridBagConstraints(); 039 gc.fill = GridBagConstraints.BOTH; 040 gc.weighty = 1.0; 041 gc.weightx = 1.0; 042 gc.anchor = GridBagConstraints.LINE_START; 043 gc.gridwidth = 2; 044 pnl.add(new JLabel(tr("<html>Please select the values to keep for the following tags.</html>")), gc); 045 046 gc.gridwidth = 1; 047 gc.gridy = 1; 048 gc.fill = GridBagConstraints.HORIZONTAL; 049 gc.weighty = 0.0; 050 pnl.add(cbShowTagsWithConflictsOnly = new JCheckBox(tr("Show tags with conflicts only")), gc); 051 pnl.add(cbShowTagsWithMultiValuesOnly = new JCheckBox(tr("Show tags with multiple values only")), gc); 052 cbShowTagsWithConflictsOnly.addChangeListener( 053 new ChangeListener() { 054 public void stateChanged(ChangeEvent e) { 055 model.setShowTagsWithConflictsOnly(cbShowTagsWithConflictsOnly.isSelected()); 056 cbShowTagsWithMultiValuesOnly.setEnabled(cbShowTagsWithConflictsOnly.isSelected()); 057 } 058 } 059 ); 060 cbShowTagsWithConflictsOnly.setSelected( 061 Main.pref.getBoolean(getClass().getName() + ".showTagsWithConflictsOnly", false) 062 ); 063 cbShowTagsWithMultiValuesOnly.addChangeListener( 064 new ChangeListener() { 065 public void stateChanged(ChangeEvent e) { 066 model.setShowTagsWithMultiValuesOnly(cbShowTagsWithMultiValuesOnly.isSelected()); 067 } 068 } 069 ); 070 cbShowTagsWithMultiValuesOnly.setSelected( 071 Main.pref.getBoolean(getClass().getName() + ".showTagsWithMultiValuesOnly", false) 072 ); 073 cbShowTagsWithMultiValuesOnly.setEnabled(cbShowTagsWithConflictsOnly.isSelected()); 074 return pnl; 075 } 076 077 /** 078 * Remembers the current settings in the global preferences 079 * 080 */ 081 public void rememberPreferences() { 082 Main.pref.put(getClass().getName() + ".showTagsWithConflictsOnly", cbShowTagsWithConflictsOnly.isSelected()); 083 Main.pref.put(getClass().getName() + ".showTagsWithMultiValuesOnly", cbShowTagsWithMultiValuesOnly.isSelected()); 084 } 085 086 protected void build() { 087 setLayout(new BorderLayout()); 088 add(buildInfoPanel(), BorderLayout.NORTH); 089 add(new JScrollPane(new TagConflictResolverTable(model)), BorderLayout.CENTER); 090 } 091 092 public TagConflictResolver() { 093 this.model = new TagConflictResolverModel(); 094 build(); 095 } 096 097 /** 098 * Replies the model used by this dialog 099 * 100 * @return the model 101 */ 102 public TagConflictResolverModel getModel() { 103 return model; 104 } 105 }