001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.dialogs.changeset.query; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.awt.Color; 007import java.awt.GridBagConstraints; 008import java.awt.GridBagLayout; 009 010import javax.swing.BorderFactory; 011import javax.swing.ButtonGroup; 012import javax.swing.JPanel; 013import javax.swing.JRadioButton; 014 015import org.openstreetmap.josm.Main; 016import org.openstreetmap.josm.gui.widgets.JMultilineLabel; 017import org.openstreetmap.josm.io.ChangesetQuery; 018 019/** 020 * This is the panel for selecting whether the changeset query should be restricted to 021 * open or closed changesets. 022 * @since 11326 (extracted from AdvancedChangesetQueryPanel) 023 */ 024public class OpenAndCloseStateRestrictionPanel extends JPanel implements RestrictionPanel { 025 026 private static final String PREF_ROOT = "changeset-query.advanced.open-restrictions"; 027 private static final String PREF_QUERY_TYPE = PREF_ROOT + ".query-type"; 028 029 private final JRadioButton rbOpenOnly = new JRadioButton(); 030 private final JRadioButton rbClosedOnly = new JRadioButton(); 031 private final JRadioButton rbBoth = new JRadioButton(); 032 033 /** 034 * Constructs a new {@code OpenAndCloseStateRestrictionPanel}. 035 */ 036 public OpenAndCloseStateRestrictionPanel() { 037 build(); 038 } 039 040 protected void build() { 041 setLayout(new GridBagLayout()); 042 setBorder(BorderFactory.createCompoundBorder( 043 BorderFactory.createEmptyBorder(3, 3, 3, 3), 044 BorderFactory.createCompoundBorder( 045 BorderFactory.createLineBorder(Color.GRAY), 046 BorderFactory.createEmptyBorder(5, 5, 5, 5) 047 ) 048 )); 049 GridBagConstraints gc = new GridBagConstraints(); 050 gc.anchor = GridBagConstraints.NORTHWEST; 051 gc.fill = GridBagConstraints.HORIZONTAL; 052 gc.weightx = 0.0; 053 add(rbOpenOnly, gc); 054 055 gc.gridx = 1; 056 gc.weightx = 1.0; 057 add(new JMultilineLabel(tr("Query open changesets only")), gc); 058 059 gc.gridy = 1; 060 gc.gridx = 0; 061 gc.weightx = 0.0; 062 add(rbClosedOnly, gc); 063 064 gc.gridx = 1; 065 gc.weightx = 1.0; 066 add(new JMultilineLabel(tr("Query closed changesets only")), gc); 067 068 gc.gridy = 2; 069 gc.gridx = 0; 070 gc.weightx = 0.0; 071 add(rbBoth, gc); 072 073 gc.gridx = 1; 074 gc.weightx = 1.0; 075 add(new JMultilineLabel(tr("Query both open and closed changesets")), gc); 076 077 ButtonGroup bgRestrictions = new ButtonGroup(); 078 bgRestrictions.add(rbBoth); 079 bgRestrictions.add(rbClosedOnly); 080 bgRestrictions.add(rbOpenOnly); 081 } 082 083 /** 084 * Initializes HMI for user input. 085 */ 086 public void startUserInput() { 087 restoreFromSettings(); 088 } 089 090 /** 091 * Sets the query restrictions on <code>query</code> for state based restrictions. 092 * @param query the query to fill 093 */ 094 @Override 095 public void fillInQuery(ChangesetQuery query) { 096 if (rbBoth.isSelected()) { 097 query.beingClosed(true); 098 query.beingOpen(true); 099 } else if (rbOpenOnly.isSelected()) { 100 query.beingOpen(true); 101 } else if (rbClosedOnly.isSelected()) { 102 query.beingClosed(true); 103 } 104 } 105 106 /** 107 * Remember settings in preferences. 108 */ 109 public void rememberSettings() { 110 if (rbBoth.isSelected()) { 111 Main.pref.put(PREF_QUERY_TYPE, "both"); 112 } else if (rbOpenOnly.isSelected()) { 113 Main.pref.put(PREF_QUERY_TYPE, "open"); 114 } else if (rbClosedOnly.isSelected()) { 115 Main.pref.put(PREF_QUERY_TYPE, "closed"); 116 } 117 } 118 119 /** 120 * Restore settings from preferences. 121 */ 122 public void restoreFromSettings() { 123 String v = Main.pref.get(PREF_QUERY_TYPE, "open"); 124 rbBoth.setSelected("both".equals(v)); 125 rbOpenOnly.setSelected("open".equals(v)); 126 rbClosedOnly.setSelected("closed".equals(v)); 127 } 128 129 @Override 130 public boolean isValidChangesetQuery() { 131 return true; 132 } 133 134 @Override 135 public void displayMessageIfInvalid() { 136 // Do nothing 137 } 138}