Ticket #15057: gui-update-v2.patch

File gui-update-v2.patch, 15.4 KB (added by bafonins, 4 months ago)

Same as previous patch, but set up button indices properly in the snippet edit dialog. Now 'Save button' is always active and the dialog can be saved by simply pressing enter.

  • src/org/openstreetmap/josm/actions/OverpassDownloadAction.java

     
    77import java.awt.BorderLayout;
    88import java.awt.Component;
    99import java.awt.Dimension;
     10import java.awt.GridBagLayout;
    1011import java.awt.event.ActionEvent;
    1112import java.awt.event.FocusEvent;
    1213import java.awt.event.FocusListener;
     
    2425import javax.swing.JOptionPane;
    2526import javax.swing.JPanel;
    2627import javax.swing.JScrollPane;
     28import javax.swing.event.ListSelectionEvent;
     29import javax.swing.event.ListSelectionListener;
    2730import javax.swing.plaf.basic.BasicArrowButton;
    2831
    2932import org.openstreetmap.josm.Main;
     
    3942import org.openstreetmap.josm.gui.widgets.JosmTextArea;
    4043import org.openstreetmap.josm.io.OverpassDownloadReader;
    4144import org.openstreetmap.josm.tools.GBC;
     45import org.openstreetmap.josm.tools.ImageProvider;
    4246import org.openstreetmap.josm.tools.Shortcut;
    4347
    4448/**
     
    157161        private static OverpassDownloadDialog instance;
    158162        private static final BooleanProperty OVERPASS_QUERY_LIST_OPENED =
    159163                new BooleanProperty("download.overpass.query-list.opened", false);
     164        private static final String ACTION_IMG_SUBDIR = "dialogs";
    160165
    161166        private OverpassDownloadDialog(Component parent) {
    162167            super(parent, ht("/Action/OverpassDownload"));
     
    176181
    177182        @Override
    178183        protected void buildMainPanelAboveDownloadSelections(JPanel pnl) {
    179             // needed for the invisible checkboxes cbDownloadGpxData, cbDownloadNotes
    180             pnl.add(new JLabel(), GBC.eol());
    181 
    182184            DisableActionsFocusListener disableActionsFocusListener =
    183185                    new DisableActionsFocusListener(slippyMapChooser.getNavigationComponentActionMap());
    184186
     
    190192                }
    191193            };
    192194
    193             JButton openQueryWizard = new JButton("Query Wizard");
     195            JButton openQueryWizard = new JButton(tr("Query Wizard"));
    194196            openQueryWizard.setToolTipText(tooltip);
    195197            openQueryWizard.addActionListener(queryWizardAction);
    196198
     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
    197203            // CHECKSTYLE.OFF: LineLength
    198204            this.overpassQuery = new JosmTextArea(
    199205                    "/*\n" +
     
    215221                }
    216222            });
    217223
     224
    218225            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
    222241            JScrollPane scrollPane = new JScrollPane(overpassQuery);
    223             BasicArrowButton arrowButton = new BasicArrowButton(overpassQueryList.isVisible()
     242            BasicArrowButton arrowButton = new BasicArrowButton(listPanel.isVisible()
    224243                ? BasicArrowButton.EAST
    225244                : BasicArrowButton.WEST);
     245            arrowButton.setToolTipText(tr("Show/hide Overpass snippet list"));
    226246            arrowButton.addActionListener(e -> {
    227                 if (overpassQueryList.isVisible()) {
    228                     overpassQueryList.setVisible(false);
     247                if (listPanel.isVisible()) {
     248                    listPanel.setVisible(false);
    229249                    arrowButton.setDirection(BasicArrowButton.WEST);
    230250                    OVERPASS_QUERY_LIST_OPENED.put(Boolean.FALSE);
    231251                } else {
    232                     overpassQueryList.setVisible(true);
     252                    listPanel.setVisible(true);
    233253                    arrowButton.setDirection(BasicArrowButton.EAST);
    234                     OVERPASS_QUERY_LIST_OPENED.put(Boolean.FALSE);
     254                    OVERPASS_QUERY_LIST_OPENED.put(Boolean.TRUE);
    235255                }
    236256            });
    237257
     
    241261
    242262            JPanel pane = new JPanel(new BorderLayout());
    243263            pane.add(innerPanel, BorderLayout.CENTER);
    244             pane.add(overpassQueryList, BorderLayout.EAST);
     264            pane.add(listPanel, BorderLayout.EAST);
    245265
    246266            GBC gbc = GBC.eol().fill(GBC.HORIZONTAL); gbc.ipady = 200;
    247             pnl.add(openQueryWizard, GBC.std().insets(5, 5, 5, 5));
    248267            pnl.add(pane, gbc);
    249268        }
    250269
    251         String getOverpassQuery() {
     270        public String getOverpassQuery() {
    252271            return overpassQuery.getText();
    253272        }
    254273
     
    280299        public void triggerDownload() {
    281300            super.btnDownload.doClick();
    282301        }
     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        }
    283388    }
    284389}
  • src/org/openstreetmap/josm/gui/download/OverpassQueryList.java

     
    1919import java.util.Collection;
    2020import java.util.Collections;
    2121import java.util.HashMap;
     22import java.util.List;
    2223import java.util.Locale;
    2324import java.util.Map;
    2425import java.util.Objects;
     
    102103     */
    103104    public synchronized Optional<SelectorItem> getSelectedItem() {
    104105        int idx = lsResult.getSelectedIndex();
    105         if (lsResultModel.getSize() == 0 || idx == -1) {
     106        if (lsResultModel.getSize() <= idx || idx == -1) {
    106107            return Optional.empty();
    107108        }
    108109
     
    147148     * Removes currently selected item, saves the current state to preferences and
    148149     * updates the view.
    149150     */
    150     private synchronized void removeSelectedItem() {
     151    public synchronized void removeSelectedItem() {
    151152        Optional<SelectorItem> it = this.getSelectedItem();
    152153
    153154        if (!it.isPresent()) {
     
    159160
    160161        SelectorItem item = it.get();
    161162        if (this.items.remove(item.getKey(), item)) {
     163            clearSelection();
    162164            savePreferences();
    163165            filterItems();
    164166        }
     
    168170     * Opens {@link EditItemDialog} for the selected item, saves the current state
    169171     * to preferences and updates the view.
    170172     */
    171     private synchronized void editSelectedItem() {
     173    public synchronized void editSelectedItem() {
    172174        Optional<SelectorItem> it = this.getSelectedItem();
    173175
    174176        if (!it.isPresent()) {
     
    184186                componentParent,
    185187                tr("Edit item"),
    186188                item,
    187                 tr("Save"));
     189                tr("Save"), tr("Cancel"));
    188190        dialog.showDialog();
    189191
    190192        Optional<SelectorItem> editedItem = dialog.getOutputItem();
     
    201203     * Opens {@link EditItemDialog}, saves the state to preferences if a new item is added
    202204     * and updates the view.
    203205     */
    204     private synchronized void createNewItem() {
     206    public synchronized void createNewItem() {
    205207        EditItemDialog dialog = new EditItemDialog(componentParent, tr("Add snippet"), tr("Add"));
    206208        dialog.showDialog();
    207209
     
    221223    @Override
    222224    protected void filterItems() {
    223225        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());
    224229
    225         super.lsResultModel.setItems(this.items.values().stream()
    226                 .filter(item -> item.getKey().contains(text))
    227                 .collect(Collectors.toList()));
     230        super.lsResultModel.setItems(matchingItems);
    228231    }
    229232
    230233    private void doubleClickEvent() {
     
    477480            panel.add(this.name, GBC.eol().insets(5).anchor(GBC.SOUTHEAST).fill(GBC.HORIZONTAL));
    478481            panel.add(queryScrollPane, constraint);
    479482
    480             setDefaultButton(SUCCESS_BTN);
    481             setCancelButton(CANCEL_BTN);
     483            setDefaultButton(SUCCESS_BTN + 1);
     484            setCancelButton(CANCEL_BTN + 1);
    482485            setPreferredSize(new Dimension(400, 400));
    483486            setContent(panel, false);
    484487        }
  • src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java

     
    3636 */
    3737public final class OverpassQueryWizardDialog extends ExtendedDialog {
    3838
     39    private final HistoryComboBox queryWizard;
    3940    private static final String HEADLINE_START = "<h3>";
    4041    private static final String HEADLINE_END = "</h3>";
    4142    private static final String TR_START = "<tr>";
     
    4243    private static final String TR_END = "</tr>";
    4344    private static final String TD_START = "<td>";
    4445    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>";
    4748    private static final CollectionProperty OVERPASS_WIZARD_HISTORY =
    4849            new CollectionProperty("download.overpass.wizard", new ArrayList<String>());
     50    private final transient OverpassTurboQueryWizard overpassQueryBuilder;
    4951
    5052    // dialog buttons
    5153    private static final int BUILD_QUERY = 0;
     
    199201                .append("<table>").append(TR_START).append(TD_START)
    200202                .append(Utils.joinAsHtmlUnorderedList(Arrays.asList("<i>type:node</i>", "<i>type:relation</i>", "<i>type:way</i>")))
    201203                .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)
    203205                .append(TD_END).append(TR_END)
    204206                .append(TR_START).append(TD_START)
    205207                .append(Utils.joinAsHtmlUnorderedList(
     
    214216                                "is set to 1000m, but it can be changed in the generated query.", "<i>tourism=hotel around Berlin</i> -"),
    215217                        tr("{0} all objects within the current selection that have {1} as attribute.", "<i>tourism=hotel in bbox</i> -",
    216218                                "'tourism=hotel'"))))
    217                 .append("<span>")
     219                .append(SPAN_START)
    218220                .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)
    220222                .append(TD_END).append(TR_END)
    221223                .append(TR_START).append(TD_START)
    222224                .append(Utils.joinAsHtmlUnorderedList(Arrays.asList("<i>key=value</i>", "<i>key=*</i>", "<i>key~regex</i>",
     
    230232                        tr("<i>expression1 {0} expression2</i>", "or"),
    231233                        tr("<i>expression1 {0} expression2</i>", "and"))))
    232234                .append(TD_END).append(TD_START)
    233                 .append("<span>")
     235                .append(SPAN_START)
    234236                .append(tr("Basic logical operators can be used to create more sophisticated queries. Instead of \"or\" - \"|\", \"||\" " +
    235237                        "can be used, and instead of \"and\" - \"&\", \"&&\"."))
    236                 .append("</span>")
     238                .append(SPAN_END)
    237239                .append(TD_END).append(TR_END).append("</table>")
    238240                .append("</body>")
    239241                .append("</html>")