Ticket #15057: gui-update.patch

File gui-update.patch, 14.7 KB (added by bafonins, 2 months ago)

Updated GUI, fixed several sonar warnings, added missing translation markers, fixed preference loading

  • 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()) {
     
    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() {
  • 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>")