source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java @ 12841

Last change on this file since 12841 was 12841, checked in by bastiK, 6 weeks ago

see #15229 - fix deprecations caused by [12840]

  • Property svn:eol-style set to native
File size: 10.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.changeset.query;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.GridBagConstraints;
8import java.awt.GridBagLayout;
9import java.awt.Insets;
10import java.awt.event.ItemEvent;
11import java.awt.event.ItemListener;
12import java.util.EnumMap;
13import java.util.Map;
14
15import javax.swing.BorderFactory;
16import javax.swing.ButtonGroup;
17import javax.swing.JCheckBox;
18import javax.swing.JPanel;
19import javax.swing.JRadioButton;
20
21import org.openstreetmap.josm.Main;
22import org.openstreetmap.josm.data.Bounds;
23import org.openstreetmap.josm.data.UserIdentityManager;
24import org.openstreetmap.josm.gui.MainApplication;
25import org.openstreetmap.josm.gui.MapView;
26import org.openstreetmap.josm.gui.widgets.HtmlPanel;
27import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
28import org.openstreetmap.josm.io.ChangesetQuery;
29import org.openstreetmap.josm.tools.Logging;
30
31/**
32 * This panel presents a list of basic queries for changesets.
33 * @since 2689
34 */
35public class BasicChangesetQueryPanel extends JPanel {
36
37    /**
38     * Enumeration of basic, predefined queries
39     */
40    private enum BasicQuery {
41        MOST_RECENT_CHANGESETS,
42        MY_OPEN_CHANGESETS,
43        CHANGESETS_IN_MAP_VIEW;
44    }
45
46    private transient Map<BasicQuery, JRadioButton> rbQueries;
47    private transient Map<BasicQuery, JMultilineLabel> lblQueries;
48    private JCheckBox cbMyChangesetsOnly;
49
50    protected JPanel buildQueriesPanel() {
51        JPanel pnl = new JPanel(new GridBagLayout());
52
53        ButtonGroup bgQueries = new ButtonGroup();
54        rbQueries = new EnumMap<>(BasicQuery.class);
55        lblQueries = new EnumMap<>(BasicQuery.class);
56        SelectQueryHandler selectedQueryHandler = new SelectQueryHandler();
57        for (BasicQuery q: BasicQuery.values()) {
58            JRadioButton rb = new JRadioButton();
59            rb.addItemListener(selectedQueryHandler);
60            rbQueries.put(q, rb);
61            bgQueries.add(rb);
62            lblQueries.put(q, new JMultilineLabel(""));
63        }
64
65        GridBagConstraints gc = new GridBagConstraints();
66        // -- most recent changes
67        gc.fill = GridBagConstraints.NONE;
68        gc.anchor = GridBagConstraints.NORTHWEST;
69        gc.insets = new Insets(0, 0, 5, 3);
70        pnl.add(rbQueries.get(BasicQuery.MOST_RECENT_CHANGESETS), gc);
71
72        gc.gridx = 1;
73        gc.fill = GridBagConstraints.HORIZONTAL;
74        gc.weightx = 1.0;
75        pnl.add(lblQueries.get(BasicQuery.MOST_RECENT_CHANGESETS), gc);
76
77        // -- most recent changes
78        gc.gridx = 0;
79        gc.gridy = 1;
80        gc.fill = GridBagConstraints.NONE;
81        gc.weightx = 0.0;
82        pnl.add(rbQueries.get(BasicQuery.MY_OPEN_CHANGESETS), gc);
83
84        gc.gridx = 1;
85        gc.fill = GridBagConstraints.HORIZONTAL;
86        gc.weightx = 1.0;
87        pnl.add(lblQueries.get(BasicQuery.MY_OPEN_CHANGESETS), gc);
88
89        // -- changesets in map view
90        gc.gridx = 0;
91        gc.gridy = 2;
92        gc.fill = GridBagConstraints.NONE;
93        gc.weightx = 0.0;
94        pnl.add(rbQueries.get(BasicQuery.CHANGESETS_IN_MAP_VIEW), gc);
95
96        gc.gridx = 1;
97        gc.fill = GridBagConstraints.HORIZONTAL;
98        gc.weightx = 1.0;
99        pnl.add(lblQueries.get(BasicQuery.CHANGESETS_IN_MAP_VIEW), gc);
100
101        // -- checkbox my changesets only
102        gc.gridx = 0;
103        gc.gridy = 3;
104        gc.gridwidth = 2;
105        gc.insets = new Insets(5, 0, 3, 3);
106        gc.fill = GridBagConstraints.HORIZONTAL;
107        gc.weightx = 1.0;
108        cbMyChangesetsOnly = new JCheckBox(tr("Download my changesets only"));
109        pnl.add(cbMyChangesetsOnly, gc);
110        cbMyChangesetsOnly.setToolTipText(
111                tr("<html>Select to restrict the query to your changesets only.<br>Unselect to include all changesets in the query.</html>"));
112
113        // grab remaining space
114        gc.gridx = 0;
115        gc.gridy = 4;
116        gc.gridwidth = 2;
117        gc.insets = new Insets(5, 0, 3, 3);
118        gc.fill = GridBagConstraints.BOTH;
119        gc.weightx = 1.0;
120        gc.weighty = 1.0;
121        pnl.add(new JPanel(), gc);
122
123        return pnl;
124    }
125
126    protected JPanel buildInfoPanel() {
127        HtmlPanel pnlInfos = new HtmlPanel();
128        pnlInfos.setText(tr("<html>Please select one the following <strong>standard queries</strong>."
129                + "Select <strong>Download my changesets only</strong>"
130                + " if you only want to download changesets created by yourself.<br>"
131                + "Note that JOSM will download max. 100 changesets.</html>")
132        );
133        return pnlInfos;
134    }
135
136    protected final void build() {
137        setLayout(new BorderLayout(0, 5));
138        setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
139        add(buildInfoPanel(), BorderLayout.NORTH);
140        add(buildQueriesPanel(), BorderLayout.CENTER);
141    }
142
143    /**
144     * Constructs a new {@code BasicChangesetQueryPanel}.
145     */
146    public BasicChangesetQueryPanel() {
147        build();
148    }
149
150    /**
151     * Initializes the panel.
152     */
153    public void init() {
154        JMultilineLabel lbl = lblQueries.get(BasicQuery.MOST_RECENT_CHANGESETS);
155        lbl.setText(tr("<html>Download the latest changesets</html>"));
156
157        // query for open changesets only possible if we have a current user which is at least
158        // partially identified
159        lbl = lblQueries.get(BasicQuery.MY_OPEN_CHANGESETS);
160        if (UserIdentityManager.getInstance().isAnonymous()) {
161            rbQueries.get(BasicQuery.MY_OPEN_CHANGESETS).setEnabled(false);
162            lbl.setText(tr("<html>Download my open changesets<br><em>Disabled. " +
163                    "Please enter your OSM user name in the preferences first.</em></html>"));
164        } else {
165            rbQueries.get(BasicQuery.MY_OPEN_CHANGESETS).setEnabled(true);
166            lbl.setText(tr("<html>Download my open changesets</html>"));
167        }
168
169        // query for changesets in the current map view only if there *is* a current map view
170        lbl = lblQueries.get(BasicQuery.CHANGESETS_IN_MAP_VIEW);
171        if (!MainApplication.isDisplayingMapView()) {
172            rbQueries.get(BasicQuery.CHANGESETS_IN_MAP_VIEW).setEnabled(false);
173            lbl.setText(tr("<html>Download changesets in the current map view.<br><em>Disabled. " +
174                    "There is currently no map view active.</em></html>"));
175        } else {
176            rbQueries.get(BasicQuery.CHANGESETS_IN_MAP_VIEW).setEnabled(true);
177            lbl.setText(tr("<html>Download changesets in the current map view</html>"));
178        }
179
180        restoreFromPreferences();
181    }
182
183    /**
184     * Remember settings in preferences.
185     */
186    public void rememberInPreferences() {
187        BasicQuery q = getSelectedQuery();
188        if (q == null) {
189            Main.pref.put("changeset-query.basic.query", null);
190        } else {
191            Main.pref.put("changeset-query.basic.query", q.toString());
192        }
193        Main.pref.putBoolean("changeset-query.basic.my-changesets-only", cbMyChangesetsOnly.isSelected());
194    }
195
196    /**
197     * Restore settings from preferences.
198     */
199    public void restoreFromPreferences() {
200        BasicQuery q;
201        String value = Main.pref.get("changeset-query.basic.query", null);
202        if (value == null) {
203            q = BasicQuery.MOST_RECENT_CHANGESETS;
204        } else {
205            try {
206                q = BasicQuery.valueOf(BasicQuery.class, value);
207            } catch (IllegalArgumentException e) {
208                Logging.log(Logging.LEVEL_WARN, tr("Unexpected value for preference ''{0}'', got ''{1}''. Resetting to default query.",
209                        "changeset-query.basic.query", value), e);
210                q = BasicQuery.MOST_RECENT_CHANGESETS;
211            }
212        }
213        rbQueries.get(q).setSelected(true);
214        boolean mineOnly = Main.pref.getBoolean("changeset-query.basic.my-changesets-only", false);
215        mineOnly = mineOnly || q.equals(BasicQuery.MY_OPEN_CHANGESETS);
216        cbMyChangesetsOnly.setSelected(mineOnly);
217    }
218
219    protected BasicQuery getSelectedQuery() {
220        for (BasicQuery q : BasicQuery.values()) {
221            if (rbQueries.get(q).isSelected())
222                return q;
223        }
224        return null;
225    }
226
227    /**
228     * Builds the changeset query.
229     * @return the changeset query
230     */
231    public ChangesetQuery buildChangesetQuery() {
232        BasicQuery q = getSelectedQuery();
233        ChangesetQuery query = new ChangesetQuery();
234        UserIdentityManager im = UserIdentityManager.getInstance();
235        if (q == null)
236            return query;
237        switch(q) {
238        case MOST_RECENT_CHANGESETS:
239            break;
240        case MY_OPEN_CHANGESETS:
241            query = query.beingOpen(true);
242            break;
243        case CHANGESETS_IN_MAP_VIEW:
244            MapView mapView = MainApplication.getMap().mapView;
245            Bounds b = mapView.getLatLonBounds(mapView.getBounds());
246            query = query.inBbox(b);
247            break;
248        }
249
250        if (cbMyChangesetsOnly.isSelected()) {
251            if (im.isPartiallyIdentified()) {
252                query = query.forUser(im.getUserName());
253            } else if (im.isFullyIdentified()) {
254                query = query.forUser(im.getUserId()).beingOpen(true);
255            } else
256                // anonymous -- can happen with a fresh config.
257                throw new IllegalStateException(tr("Cannot create changeset query for open changesets of anonymous user"));
258        }
259
260        return query;
261    }
262
263    /**
264     * Responds to changes in the selected query
265     */
266    class SelectQueryHandler implements ItemListener {
267        @Override
268        public void itemStateChanged(ItemEvent e) {
269            BasicQuery q = getSelectedQuery();
270            if (q == null) return;
271            if (q.equals(BasicQuery.MY_OPEN_CHANGESETS)) {
272                cbMyChangesetsOnly.setSelected(true);
273                cbMyChangesetsOnly.setEnabled(false);
274            } else {
275                if (!cbMyChangesetsOnly.isEnabled()) {
276                    cbMyChangesetsOnly.setEnabled(true);
277                }
278            }
279        }
280    }
281}
Note: See TracBrowser for help on using the repository browser.