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

Last change on this file since 6336 was 6336, checked in by Don-vip, 5 years ago

code cleanup / robustness in edit layer handling

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