Ticket #15057: gui-update.patch
File gui-update.patch, 14.7 KB (added by , 7 years ago) |
---|
-
src/org/openstreetmap/josm/actions/OverpassDownloadAction.java
7 7 import java.awt.BorderLayout; 8 8 import java.awt.Component; 9 9 import java.awt.Dimension; 10 import java.awt.GridBagLayout; 10 11 import java.awt.event.ActionEvent; 11 12 import java.awt.event.FocusEvent; 12 13 import java.awt.event.FocusListener; … … 24 25 import javax.swing.JOptionPane; 25 26 import javax.swing.JPanel; 26 27 import javax.swing.JScrollPane; 28 import javax.swing.event.ListSelectionEvent; 29 import javax.swing.event.ListSelectionListener; 27 30 import javax.swing.plaf.basic.BasicArrowButton; 28 31 29 32 import org.openstreetmap.josm.Main; … … 39 42 import org.openstreetmap.josm.gui.widgets.JosmTextArea; 40 43 import org.openstreetmap.josm.io.OverpassDownloadReader; 41 44 import org.openstreetmap.josm.tools.GBC; 45 import org.openstreetmap.josm.tools.ImageProvider; 42 46 import org.openstreetmap.josm.tools.Shortcut; 43 47 44 48 /** … … 157 161 private static OverpassDownloadDialog instance; 158 162 private static final BooleanProperty OVERPASS_QUERY_LIST_OPENED = 159 163 new BooleanProperty("download.overpass.query-list.opened", false); 164 private static final String ACTION_IMG_SUBDIR = "dialogs"; 160 165 161 166 private OverpassDownloadDialog(Component parent) { 162 167 super(parent, ht("/Action/OverpassDownload")); … … 176 181 177 182 @Override 178 183 protected void buildMainPanelAboveDownloadSelections(JPanel pnl) { 179 // needed for the invisible checkboxes cbDownloadGpxData, cbDownloadNotes180 pnl.add(new JLabel(), GBC.eol());181 182 184 DisableActionsFocusListener disableActionsFocusListener = 183 185 new DisableActionsFocusListener(slippyMapChooser.getNavigationComponentActionMap()); 184 186 … … 190 192 } 191 193 }; 192 194 193 JButton openQueryWizard = new JButton( "Query Wizard");195 JButton openQueryWizard = new JButton(tr("Query Wizard")); 194 196 openQueryWizard.setToolTipText(tooltip); 195 197 openQueryWizard.addActionListener(queryWizardAction); 196 198 199 // use eol() that is needed for the invisible checkboxes cbDownloadGpxData, cbDownloadNotes 200 pnl.add(openQueryWizard, GBC.eol()); 201 pnl.add(new JLabel(tr("Overpass query:")), GBC.std().insets(5, 5, 0, 0).anchor(GBC.NORTHWEST)); 202 197 203 // CHECKSTYLE.OFF: LineLength 198 204 this.overpassQuery = new JosmTextArea( 199 205 "/*\n" + … … 215 221 } 216 222 }); 217 223 224 218 225 this.overpassQueryList = new OverpassQueryList(this, this.overpassQuery); 219 overpassQueryList.setToolTipText(tr("Show/hide Overpass snippet list")); 220 overpassQueryList.setVisible(OVERPASS_QUERY_LIST_OPENED.get()); 221 overpassQueryList.setPreferredSize(new Dimension(350, 300)); 226 this.overpassQueryList.setPreferredSize(new Dimension(350, 300)); 227 228 EditSnippetAction edit = new EditSnippetAction(); 229 RemoveSnippetAction remove = new RemoveSnippetAction(); 230 this.overpassQueryList.addSelectionListener(edit); 231 this.overpassQueryList.addSelectionListener(remove); 232 233 JPanel listPanel = new JPanel(new GridBagLayout()); 234 listPanel.add(new JLabel(tr("Your saved queries:")), GBC.eol().insets(2).anchor(GBC.CENTER)); 235 listPanel.add(this.overpassQueryList, GBC.eol().fill(GBC.BOTH)); 236 listPanel.add(new JButton(new AddSnippetAction()), GBC.std().fill(GBC.HORIZONTAL)); 237 listPanel.add(new JButton(edit), GBC.std().fill(GBC.HORIZONTAL)); 238 listPanel.add(new JButton(remove), GBC.std().fill(GBC.HORIZONTAL)); 239 listPanel.setVisible(OVERPASS_QUERY_LIST_OPENED.get()); 240 222 241 JScrollPane scrollPane = new JScrollPane(overpassQuery); 223 BasicArrowButton arrowButton = new BasicArrowButton( overpassQueryList.isVisible()242 BasicArrowButton arrowButton = new BasicArrowButton(listPanel.isVisible() 224 243 ? BasicArrowButton.EAST 225 244 : BasicArrowButton.WEST); 245 arrowButton.setToolTipText(tr("Show/hide Overpass snippet list")); 226 246 arrowButton.addActionListener(e -> { 227 if ( overpassQueryList.isVisible()) {228 overpassQueryList.setVisible(false);247 if (listPanel.isVisible()) { 248 listPanel.setVisible(false); 229 249 arrowButton.setDirection(BasicArrowButton.WEST); 230 250 OVERPASS_QUERY_LIST_OPENED.put(Boolean.FALSE); 231 251 } else { 232 overpassQueryList.setVisible(true);252 listPanel.setVisible(true); 233 253 arrowButton.setDirection(BasicArrowButton.EAST); 234 OVERPASS_QUERY_LIST_OPENED.put(Boolean. FALSE);254 OVERPASS_QUERY_LIST_OPENED.put(Boolean.TRUE); 235 255 } 236 256 }); 237 257 … … 241 261 242 262 JPanel pane = new JPanel(new BorderLayout()); 243 263 pane.add(innerPanel, BorderLayout.CENTER); 244 pane.add( overpassQueryList, BorderLayout.EAST);264 pane.add(listPanel, BorderLayout.EAST); 245 265 246 266 GBC gbc = GBC.eol().fill(GBC.HORIZONTAL); gbc.ipady = 200; 247 pnl.add(openQueryWizard, GBC.std().insets(5, 5, 5, 5));248 267 pnl.add(pane, gbc); 249 268 } 250 269 251 String getOverpassQuery() {270 public String getOverpassQuery() { 252 271 return overpassQuery.getText(); 253 272 } 254 273 … … 280 299 public void triggerDownload() { 281 300 super.btnDownload.doClick(); 282 301 } 302 303 /** 304 * Action that delegates snippet creation to {@link OverpassQueryList#createNewItem()}. 305 */ 306 class AddSnippetAction extends AbstractAction { 307 308 /** 309 * Constructs a new {@code AddSnippetAction}. 310 */ 311 AddSnippetAction() { 312 super(); 313 putValue(SMALL_ICON, ImageProvider.get(ACTION_IMG_SUBDIR, "add")); 314 putValue(SHORT_DESCRIPTION, tr("Add new snippet")); 315 } 316 317 @Override 318 public void actionPerformed(ActionEvent e) { 319 overpassQueryList.createNewItem(); 320 } 321 } 322 323 /** 324 * Action that delegates snippet removal to {@link OverpassQueryList#removeSelectedItem()}. 325 */ 326 class RemoveSnippetAction extends AbstractAction implements ListSelectionListener { 327 328 /** 329 * Constructs a new {@code RemoveSnippetAction}. 330 */ 331 RemoveSnippetAction() { 332 super(); 333 putValue(SMALL_ICON, ImageProvider.get(ACTION_IMG_SUBDIR, "delete")); 334 putValue(SHORT_DESCRIPTION, tr("Delete selected snippet")); 335 checkEnabled(); 336 } 337 338 @Override 339 public void actionPerformed(ActionEvent e) { 340 overpassQueryList.removeSelectedItem(); 341 } 342 343 /** 344 * Disables the action if no items are selected. 345 */ 346 void checkEnabled() { 347 setEnabled(overpassQueryList.getSelectedItem().isPresent()); 348 } 349 350 @Override 351 public void valueChanged(ListSelectionEvent e) { 352 checkEnabled(); 353 } 354 } 355 356 /** 357 * Action that delegates snippet edit to {@link OverpassQueryList#editSelectedItem()}. 358 */ 359 class EditSnippetAction extends AbstractAction implements ListSelectionListener { 360 361 /** 362 * Constructs a new {@code EditSnippetAction}. 363 */ 364 EditSnippetAction() { 365 super(); 366 putValue(SMALL_ICON, ImageProvider.get(ACTION_IMG_SUBDIR, "edit")); 367 putValue(SHORT_DESCRIPTION, tr("Edit selected snippet")); 368 checkEnabled(); 369 } 370 371 @Override 372 public void actionPerformed(ActionEvent e) { 373 overpassQueryList.editSelectedItem(); 374 } 375 376 /** 377 * Disables the action if no items are selected. 378 */ 379 void checkEnabled() { 380 setEnabled(overpassQueryList.getSelectedItem().isPresent()); 381 } 382 383 @Override 384 public void valueChanged(ListSelectionEvent e) { 385 checkEnabled(); 386 } 387 } 283 388 } 284 389 } -
src/org/openstreetmap/josm/gui/download/OverpassQueryList.java
19 19 import java.util.Collection; 20 20 import java.util.Collections; 21 21 import java.util.HashMap; 22 import java.util.List; 22 23 import java.util.Locale; 23 24 import java.util.Map; 24 25 import java.util.Objects; … … 102 103 */ 103 104 public synchronized Optional<SelectorItem> getSelectedItem() { 104 105 int idx = lsResult.getSelectedIndex(); 105 if (lsResultModel.getSize() == 0|| idx == -1) {106 if (lsResultModel.getSize() <= idx || idx == -1) { 106 107 return Optional.empty(); 107 108 } 108 109 … … 147 148 * Removes currently selected item, saves the current state to preferences and 148 149 * updates the view. 149 150 */ 150 p rivatesynchronized void removeSelectedItem() {151 public synchronized void removeSelectedItem() { 151 152 Optional<SelectorItem> it = this.getSelectedItem(); 152 153 153 154 if (!it.isPresent()) { … … 159 160 160 161 SelectorItem item = it.get(); 161 162 if (this.items.remove(item.getKey(), item)) { 163 clearSelection(); 162 164 savePreferences(); 163 165 filterItems(); 164 166 } … … 168 170 * Opens {@link EditItemDialog} for the selected item, saves the current state 169 171 * to preferences and updates the view. 170 172 */ 171 p rivatesynchronized void editSelectedItem() {173 public synchronized void editSelectedItem() { 172 174 Optional<SelectorItem> it = this.getSelectedItem(); 173 175 174 176 if (!it.isPresent()) { … … 201 203 * Opens {@link EditItemDialog}, saves the state to preferences if a new item is added 202 204 * and updates the view. 203 205 */ 204 p rivatesynchronized void createNewItem() {206 public synchronized void createNewItem() { 205 207 EditItemDialog dialog = new EditItemDialog(componentParent, tr("Add snippet"), tr("Add")); 206 208 dialog.showDialog(); 207 209 … … 221 223 @Override 222 224 protected void filterItems() { 223 225 String text = edSearchText.getText().toLowerCase(Locale.ENGLISH); 226 List<SelectorItem> matchingItems = this.items.values().stream() 227 .filter(item -> item.getKey().contains(text)) 228 .collect(Collectors.toList()); 224 229 225 super.lsResultModel.setItems(this.items.values().stream() 226 .filter(item -> item.getKey().contains(text)) 227 .collect(Collectors.toList())); 230 super.lsResultModel.setItems(matchingItems); 228 231 } 229 232 230 233 private void doubleClickEvent() { -
src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java
36 36 */ 37 37 public final class OverpassQueryWizardDialog extends ExtendedDialog { 38 38 39 private final HistoryComboBox queryWizard; 39 40 private static final String HEADLINE_START = "<h3>"; 40 41 private static final String HEADLINE_END = "</h3>"; 41 42 private static final String TR_START = "<tr>"; … … 42 43 private static final String TR_END = "</tr>"; 43 44 private static final String TD_START = "<td>"; 44 45 private static final String TD_END = "</td>"; 45 private final HistoryComboBox queryWizard;46 private final OverpassTurboQueryWizard overpassQueryBuilder;46 private static final String SPAN_START = "<span>"; 47 private static final String SPAN_END = "</span>"; 47 48 private static final CollectionProperty OVERPASS_WIZARD_HISTORY = 48 49 new CollectionProperty("download.overpass.wizard", new ArrayList<String>()); 50 private final transient OverpassTurboQueryWizard overpassQueryBuilder; 49 51 50 52 // dialog buttons 51 53 private static final int BUILD_QUERY = 0; … … 199 201 .append("<table>").append(TR_START).append(TD_START) 200 202 .append(Utils.joinAsHtmlUnorderedList(Arrays.asList("<i>type:node</i>", "<i>type:relation</i>", "<i>type:way</i>"))) 201 203 .append(TD_END).append(TD_START) 202 .append( "<span>").append(tr("Download objects of a certain type.")).append("</span>")204 .append(SPAN_START).append(tr("Download objects of a certain type.")).append(SPAN_END) 203 205 .append(TD_END).append(TR_END) 204 206 .append(TR_START).append(TD_START) 205 207 .append(Utils.joinAsHtmlUnorderedList( … … 214 216 "is set to 1000m, but it can be changed in the generated query.", "<i>tourism=hotel around Berlin</i> -"), 215 217 tr("{0} all objects within the current selection that have {1} as attribute.", "<i>tourism=hotel in bbox</i> -", 216 218 "'tourism=hotel'")))) 217 .append( "<span>")219 .append(SPAN_START) 218 220 .append(tr("Instead of <i>location</i> any valid place name can be used like address, city, etc.")) 219 .append( "</span>")221 .append(SPAN_END) 220 222 .append(TD_END).append(TR_END) 221 223 .append(TR_START).append(TD_START) 222 224 .append(Utils.joinAsHtmlUnorderedList(Arrays.asList("<i>key=value</i>", "<i>key=*</i>", "<i>key~regex</i>", … … 230 232 tr("<i>expression1 {0} expression2</i>", "or"), 231 233 tr("<i>expression1 {0} expression2</i>", "and")))) 232 234 .append(TD_END).append(TD_START) 233 .append( "<span>")235 .append(SPAN_START) 234 236 .append(tr("Basic logical operators can be used to create more sophisticated queries. Instead of \"or\" - \"|\", \"||\" " + 235 237 "can be used, and instead of \"and\" - \"&\", \"&&\".")) 236 .append( "</span>")238 .append(SPAN_END) 237 239 .append(TD_END).append(TR_END).append("</table>") 238 240 .append("</body>") 239 241 .append("</html>")