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.io.ChangesetQuery;
016import org.openstreetmap.josm.spi.preferences.Config;
017import org.openstreetmap.josm.tools.GBC;
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(tr("Query open changesets only"));
030    private final JRadioButton rbClosedOnly = new JRadioButton(tr("Query closed changesets only"));
031    private final JRadioButton rbBoth = new JRadioButton(tr("Query both open and closed changesets"));
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 = GBC.eol().fill(GridBagConstraints.HORIZONTAL);
050        add(rbOpenOnly, gc);
051        add(rbClosedOnly, gc);
052        add(rbBoth, gc);
053
054        ButtonGroup bgRestrictions = new ButtonGroup();
055        bgRestrictions.add(rbBoth);
056        bgRestrictions.add(rbClosedOnly);
057        bgRestrictions.add(rbOpenOnly);
058    }
059
060    /**
061     * Initializes HMI for user input.
062     */
063    public void startUserInput() {
064        restoreFromSettings();
065    }
066
067    /**
068     * Sets the query restrictions on <code>query</code> for state based restrictions.
069     * @param query the query to fill
070     */
071    @Override
072    public void fillInQuery(ChangesetQuery query) {
073        if (rbBoth.isSelected()) {
074            query.beingClosed(true);
075            query.beingOpen(true);
076        } else if (rbOpenOnly.isSelected()) {
077            query.beingOpen(true);
078        } else if (rbClosedOnly.isSelected()) {
079            query.beingClosed(true);
080        }
081    }
082
083    /**
084     * Remember settings in preferences.
085     */
086    public void rememberSettings() {
087        if (rbBoth.isSelected()) {
088            Config.getPref().put(PREF_QUERY_TYPE, "both");
089        } else if (rbOpenOnly.isSelected()) {
090            Config.getPref().put(PREF_QUERY_TYPE, "open");
091        } else if (rbClosedOnly.isSelected()) {
092            Config.getPref().put(PREF_QUERY_TYPE, "closed");
093        }
094    }
095
096    /**
097     * Restore settings from preferences.
098     */
099    public void restoreFromSettings() {
100        String v = Config.getPref().get(PREF_QUERY_TYPE, "open");
101        rbBoth.setSelected("both".equals(v));
102        rbOpenOnly.setSelected("open".equals(v));
103        rbClosedOnly.setSelected("closed".equals(v));
104    }
105
106    @Override
107    public boolean isValidChangesetQuery() {
108        return true;
109    }
110
111    @Override
112    public void displayMessageIfInvalid() {
113        // Do nothing
114    }
115}