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.gui.widgets.JMultilineLabel;
016import org.openstreetmap.josm.io.ChangesetQuery;
017import org.openstreetmap.josm.spi.preferences.Config;
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            Config.getPref().put(PREF_QUERY_TYPE, "both");
112        } else if (rbOpenOnly.isSelected()) {
113            Config.getPref().put(PREF_QUERY_TYPE, "open");
114        } else if (rbClosedOnly.isSelected()) {
115            Config.getPref().put(PREF_QUERY_TYPE, "closed");
116        }
117    }
118
119    /**
120     * Restore settings from preferences.
121     */
122    public void restoreFromSettings() {
123        String v = Config.getPref().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}