| 1 | // License: GPL. For details, see LICENSE file.
|
|---|
| 2 | package org.openstreetmap.josm.gui.dialogs.changeset.query;
|
|---|
| 3 |
|
|---|
| 4 | import static org.openstreetmap.josm.tools.I18n.tr;
|
|---|
| 5 |
|
|---|
| 6 | import java.awt.BorderLayout;
|
|---|
| 7 | import java.awt.GridBagConstraints;
|
|---|
| 8 | import java.awt.GridBagLayout;
|
|---|
| 9 | import java.awt.Insets;
|
|---|
| 10 | import java.awt.event.ItemEvent;
|
|---|
| 11 | import java.awt.event.ItemListener;
|
|---|
| 12 | import java.util.HashMap;
|
|---|
| 13 | import java.util.Map;
|
|---|
| 14 |
|
|---|
| 15 | import javax.swing.BorderFactory;
|
|---|
| 16 | import javax.swing.ButtonGroup;
|
|---|
| 17 | import javax.swing.JCheckBox;
|
|---|
| 18 | import javax.swing.JPanel;
|
|---|
| 19 | import javax.swing.JRadioButton;
|
|---|
| 20 |
|
|---|
| 21 | import org.openstreetmap.josm.Main;
|
|---|
| 22 | import org.openstreetmap.josm.data.Bounds;
|
|---|
| 23 | import org.openstreetmap.josm.gui.JMultilineLabel;
|
|---|
| 24 | import org.openstreetmap.josm.gui.JosmUserIdentityManager;
|
|---|
| 25 | import org.openstreetmap.josm.gui.widgets.HtmlPanel;
|
|---|
| 26 | import org.openstreetmap.josm.io.ChangesetQuery;
|
|---|
| 27 |
|
|---|
| 28 | /**
|
|---|
| 29 | * This panel presents a list of basic queries for changests.
|
|---|
| 30 | *
|
|---|
| 31 | */
|
|---|
| 32 | public 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 ButtonGroup bgQueries;
|
|---|
| 44 | private Map<BasicQuery, JRadioButton> rbQueries;
|
|---|
| 45 | private Map<BasicQuery, JMultilineLabel> lblQueries;
|
|---|
| 46 | private JCheckBox cbMyChangesetsOnly;
|
|---|
| 47 | private HtmlPanel pnlInfos;
|
|---|
| 48 |
|
|---|
| 49 |
|
|---|
| 50 | protected JPanel buildQueriesPanel() {
|
|---|
| 51 | JPanel pnl = new JPanel(new GridBagLayout());
|
|---|
| 52 |
|
|---|
| 53 | bgQueries = new ButtonGroup();
|
|---|
| 54 | rbQueries = new HashMap<BasicQuery, JRadioButton>();
|
|---|
| 55 | lblQueries = new HashMap<BasicQuery, JMultilineLabel>();
|
|---|
| 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 | pnl.add(cbMyChangesetsOnly = new JCheckBox(tr("Download my changesets only")), gc);
|
|---|
| 109 | cbMyChangesetsOnly.setToolTipText(tr("<html>Select to restrict the query to your changsets only.<br>Unselect to include all changesets in the query.</html>"));
|
|---|
| 110 |
|
|---|
| 111 | // grab remaining space
|
|---|
| 112 | gc.gridx = 0;
|
|---|
| 113 | gc.gridy = 4;
|
|---|
| 114 | gc.gridwidth = 2;
|
|---|
| 115 | gc.insets = new Insets(5,0,3,3);
|
|---|
| 116 | gc.fill = GridBagConstraints.BOTH;
|
|---|
| 117 | gc.weightx = 1.0;
|
|---|
| 118 | gc.weighty = 1.0;
|
|---|
| 119 | pnl.add(new JPanel(), gc);
|
|---|
| 120 |
|
|---|
| 121 | return pnl;
|
|---|
| 122 | }
|
|---|
| 123 |
|
|---|
| 124 | protected JPanel buildInfoPanel() {
|
|---|
| 125 | pnlInfos = new HtmlPanel();
|
|---|
| 126 | pnlInfos.setText("<html>Please select one the following <strong>standard queries</strong>."
|
|---|
| 127 | + "Select <strong>Download my changesets only</strong>"
|
|---|
| 128 | + " if you only want to download changesets created by yourself.<br>"
|
|---|
| 129 | + "Note that JOSM will download max. 100 changesets.</html>"
|
|---|
| 130 | );
|
|---|
| 131 | return pnlInfos;
|
|---|
| 132 | }
|
|---|
| 133 |
|
|---|
| 134 | protected void build() {
|
|---|
| 135 | setLayout(new BorderLayout(0,5));
|
|---|
| 136 | setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
|
|---|
| 137 | add(buildInfoPanel(), BorderLayout.NORTH);
|
|---|
| 138 | add(buildQueriesPanel(), BorderLayout.CENTER);
|
|---|
| 139 | }
|
|---|
| 140 |
|
|---|
| 141 | public BasicChangesetQueryPanel() {
|
|---|
| 142 | build();
|
|---|
| 143 | }
|
|---|
| 144 |
|
|---|
| 145 | public void init() {
|
|---|
| 146 | JMultilineLabel lbl = lblQueries.get(BasicQuery.MOST_RECENT_CHANGESETS);
|
|---|
| 147 | lbl.setText("<html>Download the latest changesets</html>");
|
|---|
| 148 |
|
|---|
| 149 | // query for open changesets only possible if we have a current user which is at least
|
|---|
| 150 | // partially identified
|
|---|
| 151 | lbl = lblQueries.get(BasicQuery.MY_OPEN_CHANGESETS);
|
|---|
| 152 | if (JosmUserIdentityManager.getInstance().isAnonymous()) {
|
|---|
| 153 | rbQueries.get(BasicQuery.MY_OPEN_CHANGESETS).setEnabled(false);
|
|---|
| 154 | lbl.setText("<html>Download my open changesets<br><em>Disabled. Please enter your OSM user name in the preferences first.</em></html>");
|
|---|
| 155 | } else {
|
|---|
| 156 | rbQueries.get(BasicQuery.MY_OPEN_CHANGESETS).setEnabled(true);
|
|---|
| 157 | lbl.setText("<html>Download my open changesets</html>");
|
|---|
| 158 | }
|
|---|
| 159 |
|
|---|
| 160 | // query for changesets in the current map view only if there *is* a current
|
|---|
| 161 | // map view
|
|---|
| 162 | lbl = lblQueries.get(BasicQuery.CHANGESETS_IN_MAP_VIEW);
|
|---|
| 163 | if (Main.map == null || Main.map.mapView == null) {
|
|---|
| 164 | rbQueries.get(BasicQuery.CHANGESETS_IN_MAP_VIEW).setEnabled(false);
|
|---|
| 165 | lbl.setText("<html>Download changesets in the current map view.<br><em>Disabled. There is currently no map view active.</em></html>");
|
|---|
| 166 | } else {
|
|---|
| 167 | rbQueries.get(BasicQuery.CHANGESETS_IN_MAP_VIEW).setEnabled(true);
|
|---|
| 168 | lbl.setText("<html>Download changesets in the current map view</html>");
|
|---|
| 169 | }
|
|---|
| 170 |
|
|---|
| 171 | restoreFromPreferences();
|
|---|
| 172 | }
|
|---|
| 173 |
|
|---|
| 174 | public void rememberInPreferences() {
|
|---|
| 175 | BasicQuery q = getSelectedQuery();
|
|---|
| 176 | if (q == null) {
|
|---|
| 177 | Main.pref.put("changeset-query.basic.query", null);
|
|---|
| 178 | } else {
|
|---|
| 179 | Main.pref.put("changeset-query.basic.query", q.toString());
|
|---|
| 180 | }
|
|---|
| 181 | Main.pref.put("changeset-query.basic.my-changesets-only", cbMyChangesetsOnly.isSelected());
|
|---|
| 182 | }
|
|---|
| 183 |
|
|---|
| 184 | public void restoreFromPreferences() {
|
|---|
| 185 | BasicQuery q;
|
|---|
| 186 | String value = Main.pref.get("changeset-query.basic.query", null);
|
|---|
| 187 | if (value == null) {
|
|---|
| 188 | q = BasicQuery.MOST_RECENT_CHANGESETS;
|
|---|
| 189 | } else {
|
|---|
| 190 | try {
|
|---|
| 191 | q = BasicQuery.valueOf(BasicQuery.class, value);
|
|---|
| 192 | } catch(IllegalArgumentException e) {
|
|---|
| 193 | System.err.println(tr("Warning: unexpected value for preference ''{0}'', got ''{1}''. Resetting to default query.","changeset-query.basic.query", value));
|
|---|
| 194 | q = BasicQuery.MOST_RECENT_CHANGESETS;
|
|---|
| 195 | }
|
|---|
| 196 | }
|
|---|
| 197 | rbQueries.get(q).setSelected(true);
|
|---|
| 198 | boolean mineOnly = Main.pref.getBoolean("changeset-query.basic.my-changesets-only", false);
|
|---|
| 199 | mineOnly = mineOnly || q.equals(BasicQuery.MY_OPEN_CHANGESETS);
|
|---|
| 200 | cbMyChangesetsOnly.setSelected(mineOnly);
|
|---|
| 201 | }
|
|---|
| 202 |
|
|---|
| 203 | protected BasicQuery getSelectedQuery() {
|
|---|
| 204 | for (BasicQuery q : BasicQuery.values()) {
|
|---|
| 205 | if (rbQueries.get(q).isSelected())
|
|---|
| 206 | return q;
|
|---|
| 207 | }
|
|---|
| 208 | return null;
|
|---|
| 209 | }
|
|---|
| 210 |
|
|---|
| 211 | public ChangesetQuery buildChangesetQuery() {
|
|---|
| 212 | BasicQuery q = getSelectedQuery();
|
|---|
| 213 | ChangesetQuery query = new ChangesetQuery();
|
|---|
| 214 | JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
|
|---|
| 215 | if (q == null)
|
|---|
| 216 | return query;
|
|---|
| 217 | switch(q) {
|
|---|
| 218 | case MOST_RECENT_CHANGESETS:
|
|---|
| 219 | break;
|
|---|
| 220 | case MY_OPEN_CHANGESETS:
|
|---|
| 221 | query = query.beingOpen(true);
|
|---|
| 222 | break;
|
|---|
| 223 | case CHANGESETS_IN_MAP_VIEW:
|
|---|
| 224 | Bounds b = Main.map.mapView.getLatLonBounds(Main.map.mapView.getBounds());
|
|---|
| 225 | query = query.inBbox(b);
|
|---|
| 226 | break;
|
|---|
| 227 | }
|
|---|
| 228 |
|
|---|
| 229 | if (cbMyChangesetsOnly.isSelected()) {
|
|---|
| 230 | if (im.isPartiallyIdentified()) {
|
|---|
| 231 | query = query.forUser(im.getUserName());
|
|---|
| 232 | } else if (im.isFullyIdentified()) {
|
|---|
| 233 | query = query.forUser(im.getUserId()).beingOpen(true);
|
|---|
| 234 | } else
|
|---|
| 235 | // anonymous -- should not happen. Message doesn't have to be translated.
|
|---|
| 236 | throw new IllegalStateException("Cannot create changeset query for open changesets of anonymous user");
|
|---|
| 237 | }
|
|---|
| 238 |
|
|---|
| 239 | return query;
|
|---|
| 240 | }
|
|---|
| 241 |
|
|---|
| 242 | /**
|
|---|
| 243 | * Responds to changes in the selected query
|
|---|
| 244 | *
|
|---|
| 245 | */
|
|---|
| 246 | class SelectQueryHandler implements ItemListener {
|
|---|
| 247 | public void itemStateChanged(ItemEvent e) {
|
|---|
| 248 | BasicQuery q = getSelectedQuery();
|
|---|
| 249 | if (q == null) return;
|
|---|
| 250 | if (q.equals(BasicQuery.MY_OPEN_CHANGESETS)) {
|
|---|
| 251 | cbMyChangesetsOnly.setSelected(true);
|
|---|
| 252 | cbMyChangesetsOnly.setEnabled(false);
|
|---|
| 253 | } else {
|
|---|
| 254 | if (! cbMyChangesetsOnly.isEnabled()) {
|
|---|
| 255 | cbMyChangesetsOnly.setEnabled(true);
|
|---|
| 256 | }
|
|---|
| 257 | }
|
|---|
| 258 | }
|
|---|
| 259 | }
|
|---|
| 260 | }
|
|---|