Ticket #15167: merge-download-dialog-v5.patch

File merge-download-dialog-v5.patch, 18.4 KB (added by bafonins, 7 years ago)

moved the info label in non expert mode.

  • src/org/openstreetmap/josm/gui/download/AbstractDownloadSourcePanel.java

     
    9797    public void triggerDownload(DownloadSettings downloadSettings) {
    9898        getDownloadSource().doDownload(getData(), downloadSettings);
    9999    }
     100
     101    /**
     102     * Returns a simple name describing this panel. This string can be used from other GUI parts
     103     * of JOSM to save the user preferences related to the GUI settings. For example, the panel for downloading
     104     * the OSM data can be named 'downloadosmpanel'. Note, choose the name such that it is unique to avoid
     105     * collisions with other names.
     106     * @return A simple name describing this panel.
     107     */
     108    public abstract String getSimpleName();
    100109}
  • src/org/openstreetmap/josm/gui/download/DownloadDialog.java

     
    1515import java.awt.event.KeyEvent;
    1616import java.awt.event.WindowAdapter;
    1717import java.awt.event.WindowEvent;
     18import java.beans.PropertyChangeListener;
    1819import java.util.ArrayList;
    1920import java.util.Arrays;
    2021import java.util.List;
     
    3233import javax.swing.JSplitPane;
    3334import javax.swing.JTabbedPane;
    3435import javax.swing.KeyStroke;
     36import javax.swing.event.ChangeEvent;
     37import javax.swing.event.ChangeListener;
    3538
    3639import org.openstreetmap.josm.Main;
    3740import org.openstreetmap.josm.actions.ExpertToggleAction;
     
    4952import org.openstreetmap.josm.tools.GBC;
    5053import org.openstreetmap.josm.tools.ImageProvider;
    5154import org.openstreetmap.josm.tools.InputMapUtils;
     55import org.openstreetmap.josm.tools.JosmRuntimeException;
    5256import org.openstreetmap.josm.tools.Logging;
    5357import org.openstreetmap.josm.tools.OsmUrlToBounds;
    5458import org.openstreetmap.josm.tools.WindowGeometry;
     
    6165    /**
    6266     * Preference properties
    6367     */
     68    private static final String TAB_SPLIT_NAMESPACE = "download.tabsplit.";
    6469    private static final IntegerProperty DOWNLOAD_TAB = new IntegerProperty("download.tab", 0);
    6570    private static final IntegerProperty DOWNLOAD_SOURCE_TAB = new IntegerProperty("download-source.tab", 0);
    66     private static final IntegerProperty DIALOG_SPLIT = new IntegerProperty("download.split", 200);
    6771    private static final BooleanProperty DOWNLOAD_AUTORUN = new BooleanProperty("download.autorun", false);
    6872    private static final BooleanProperty DOWNLOAD_NEWLAYER = new BooleanProperty("download.newlayer", false);
    6973    private static final BooleanProperty DOWNLOAD_ZOOMTODATA = new BooleanProperty("download.zoomtodata", true);
     
    114118    protected final JPanel buildMainPanel() {
    115119        mainPanel = new JPanel(new GridBagLayout());
    116120
    117         downloadSources.add(new OSMDownloadSource());
    118         downloadSources.add(new OverpassDownloadSource());
     121        // add default download sources
     122        addDownloadSource(new OSMDownloadSource());
     123        addDownloadSource(new OverpassDownloadSource());
    119124
    120         // register all default download sources
    121         for (int i = 0; i < downloadSources.size(); i++) {
    122             downloadSources.get(i).addGui(this);
    123         }
    124 
    125125        // must be created before hook
    126126        slippyMapChooser = new SlippyMapChooser();
    127127
     
    140140            s.addGui(this);
    141141        }
    142142
    143         // allow to collapse the panes completely
    144         downloadSourcesTab.setMinimumSize(new Dimension(0, 0));
     143        // allow to collapse the panes, but reserve some space for tabs
     144        downloadSourcesTab.setMinimumSize(new Dimension(0, 25));
    145145        tpDownloadAreaSelectors.setMinimumSize(new Dimension(0, 0));
    146146
    147147        dialogSplit = new JSplitPane(
     
    148148                JSplitPane.VERTICAL_SPLIT,
    149149                downloadSourcesTab,
    150150                tpDownloadAreaSelectors);
     151        dialogSplit.addPropertyChangeListener(getDividerChangedListener());
    151152
     153        ChangeListener tabChangedListener = getDownloadSourceTabChangeListener();
     154        tabChangedListener.stateChanged(new ChangeEvent(downloadSourcesTab));
     155        downloadSourcesTab.addChangeListener(tabChangedListener);
     156
    152157        mainPanel.add(dialogSplit, GBC.eol().fill());
    153158
    154159        cbNewLayer = new JCheckBox(tr("Download as new layer"));
     
    170175
    171176        ExpertToggleAction.addVisibilitySwitcher(cbZoomToDownloadedData);
    172177
    173         if (!ExpertToggleAction.isExpert()) {
    174             JLabel infoLabel = new JLabel(
    175                     tr("Use left click&drag to select area, arrows or right mouse button to scroll map, wheel or +/- to zoom."));
    176             mainPanel.add(infoLabel, GBC.eol().anchor(GBC.SOUTH).insets(0, 0, 0, 0));
    177         }
     178        mainPanel.add(new JLabel(), GBC.eol()); // place info label at a new line
     179        JLabel infoLabel = new JLabel(
     180                tr("Use left click&drag to select area, arrows or right mouse button to scroll map, wheel or +/- to zoom."));
     181        mainPanel.add(infoLabel, GBC.eol().anchor(GBC.CENTER).insets(0, 0, 0, 0));
     182
     183        ExpertToggleAction.addExpertModeChangeListener(isExpert -> infoLabel.setVisible(!isExpert), true);
     184
    178185        return mainPanel;
    179186    }
    180187
     
    252259        addWindowListener(new WindowEventHandler());
    253260        ExpertToggleAction.addExpertModeChangeListener(expertListener);
    254261        restoreSettings();
     262
     263        // if no bounding box is selected make sure it is still propagated.
     264        if (currentBounds == null) {
     265            boundingBoxChanged(null, null);
     266        }
    255267    }
    256268
    257269    /**
     
    314326
    315327    /**
    316328     * Determines if the dialog autorun is enabled in preferences.
    317      * @return {@code true} if the download dialog must be open at startup, {@code false} otherwise
     329     * @return {@code true} if the download dialog must be open at startup, {@code false} otherwise.
    318330     */
    319331    public static boolean isAutorunEnabled() {
    320332        return DOWNLOAD_AUTORUN.get();
     
    321333    }
    322334
    323335    /**
    324      * Adds a new download area selector to the download dialog
     336     * Adds a new download area selector to the download dialog.
    325337     *
    326      * @param selector the download are selector
    327      * @param displayName the display name of the selector
     338     * @param selector the download are selector.
     339     * @param displayName the display name of the selector.
    328340     */
    329341    public void addDownloadAreaSelector(JPanel selector, String displayName) {
    330342        tpDownloadAreaSelectors.add(displayName, selector);
     
    331343    }
    332344
    333345    /**
    334      * Adds a new download source to the download dialog
     346     * Adds a new download source to the download dialog if it is not added.
    335347     *
    336348     * @param downloadSource The download source to be added.
    337349     * @param <T> The type of the download data.
     350     * @throws JosmRuntimeException If the download source is already added. Note, download sources are
     351     * compared by their reference.
    338352     */
    339353    public <T> void addDownloadSource(DownloadSource<T> downloadSource) {
     354        if (downloadSources.contains(downloadSource)) {
     355            throw new JosmRuntimeException("The download source you are trying to add already exists.");
     356        }
     357
     358        downloadSources.add(downloadSource);
    340359        if ((ExpertToggleAction.isExpert() && downloadSource.onlyExpert()) || !downloadSource.onlyExpert()) {
    341360            addNewDownloadSourceTab(downloadSource);
    342361        }
     
    343362    }
    344363
    345364    /**
    346      * Refreshes the tile sources
     365     * Refreshes the tile sources.
    347366     * @since 6364
    348367     */
    349368    public final void refreshTileSources() {
     
    358377    public void rememberSettings() {
    359378        DOWNLOAD_TAB.put(tpDownloadAreaSelectors.getSelectedIndex());
    360379        DOWNLOAD_SOURCE_TAB.put(downloadSourcesTab.getSelectedIndex());
    361         DIALOG_SPLIT.put(dialogSplit.getDividerLocation());
    362380        DOWNLOAD_NEWLAYER.put(cbNewLayer.isSelected());
    363381        DOWNLOAD_ZOOMTODATA.put(cbZoomToDownloadedData.isSelected());
    364382        if (currentBounds != null) {
     
    373391        cbNewLayer.setSelected(DOWNLOAD_NEWLAYER.get());
    374392        cbStartup.setSelected(isAutorunEnabled());
    375393        cbZoomToDownloadedData.setSelected(DOWNLOAD_ZOOMTODATA.get());
    376         dialogSplit.setDividerLocation(DIALOG_SPLIT.get());
    377394
    378395        try {
    379396            tpDownloadAreaSelectors.setSelectedIndex(DOWNLOAD_TAB.get());
     
    407424
    408425    /**
    409426     * Returns the previously saved bounding box from preferences.
    410      * @return The bounding box saved in preferences if any, {@code null} otherwise
     427     * @return The bounding box saved in preferences if any, {@code null} otherwise.
    411428     * @since 6509
    412429     */
    413430    public static Bounds getSavedDownloadBounds() {
     
    499516     * @param downloadSource The download source to be added.
    500517     * @param <T> The type of the download data.
    501518     */
    502     private <T> void addNewDownloadSourceTab(DownloadSource<T> downloadSource) {
     519    protected <T> void addNewDownloadSourceTab(DownloadSource<T> downloadSource) {
    503520        AbstractDownloadSourcePanel<T> panel = downloadSource.createPanel();
    504521        downloadSourcesTab.add(panel, downloadSource.getLabel());
    505522        Icon icon = panel.getIcon();
     
    535552    }
    536553
    537554    /**
     555     * Creates a listener that reacts on tab switches for {@code downloadSourcesTab} in order
     556     * to adjust proper division of the dialog according to user saved preferences or minimal size
     557     * of the panel.
     558     * @return A listener to adjust dialog division.
     559     */
     560    private ChangeListener getDownloadSourceTabChangeListener() {
     561        return ec -> {
     562            JTabbedPane tabbedPane = (JTabbedPane) ec.getSource();
     563            Component selectedComponent = tabbedPane.getSelectedComponent();
     564            if (selectedComponent instanceof AbstractDownloadSourcePanel) {
     565                AbstractDownloadSourcePanel<?> panel = (AbstractDownloadSourcePanel<?>) selectedComponent;
     566                dialogSplit.setDividerLocation(Main.pref.getInteger(
     567                        TAB_SPLIT_NAMESPACE + panel.getSimpleName(),
     568                        panel.getMinimumSize().height));
     569            }
     570        };
     571    }
     572
     573    /**
     574     * Creates a listener that react on dialog splitters movements to save users preferences.
     575     * @return A listener to save user preferred split of the dialog.
     576     */
     577    private PropertyChangeListener getDividerChangedListener() {
     578        return evt -> {
     579            if (evt.getPropertyName().equalsIgnoreCase(JSplitPane.DIVIDER_LOCATION_PROPERTY)) {
     580                Component selectedComponent = downloadSourcesTab.getSelectedComponent();
     581                if (selectedComponent instanceof AbstractDownloadSourcePanel) {
     582                    AbstractDownloadSourcePanel<?> panel = (AbstractDownloadSourcePanel<?>) selectedComponent;
     583                    Main.pref.put(
     584                            TAB_SPLIT_NAMESPACE + panel.getSimpleName(),
     585                            String.valueOf(dialogSplit.getDividerLocation())
     586                    );
     587                }
     588            }
     589        };
     590    }
     591
     592    /**
    538593     * Action that is executed when the cancel button is pressed.
    539594     */
    540595    class CancelAction extends AbstractAction {
     
    554609
    555610        @Override
    556611        public void actionPerformed(ActionEvent e) {
    557             AbstractDownloadSourcePanel<?> pnl = (AbstractDownloadSourcePanel<?>) downloadSourcesTab.getSelectedComponent();
    558             run();
    559             pnl.checkCancel();
     612            Component panel = downloadSourcesTab.getSelectedComponent();
     613            if (panel instanceof AbstractDownloadSourcePanel) {
     614                AbstractDownloadSourcePanel<?> pnl = (AbstractDownloadSourcePanel<?>) panel;
     615                run();
     616                pnl.checkCancel();
     617            } else {
     618                run();
     619            }
    560620        }
    561621    }
    562622
     
    572632        }
    573633
    574634        /**
    575          * Starts the download, if possible
     635         * Starts the download and closes the dialog, if all requirements for the current download source are met.
     636         * Otherwise the download is not started and the dialog remains visible.
    576637         */
    577638        public void run() {
    578639            Component panel = downloadSourcesTab.getSelectedComponent();
  • src/org/openstreetmap/josm/gui/download/DownloadSettings.java

     
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.gui.download;
    33
     4import org.openstreetmap.josm.data.Bounds;
     5
    46import java.util.Optional;
    57
    6 import org.openstreetmap.josm.data.Bounds;
    7 
    88/**
    99 * The global settings of {@link DownloadDialog}.
    1010 * <p>
     
    5151     * @return The bounds or an empty {@link Optional} if no bounds are selected
    5252     */
    5353    public Optional<Bounds> getDownloadBounds() {
    54         if (downloadBounds == null) {
    55             return Optional.empty();
    56         } else {
    57             return Optional.of(downloadBounds);
    58         }
     54        return Optional.ofNullable(downloadBounds);
    5955    }
    6056}
  • src/org/openstreetmap/josm/gui/download/DownloadSource.java

     
    3030    String getLabel();
    3131
    3232    /**
    33      * Add a download source to the dialog, see {@link DownloadDialog}.
    34      * @param dialog The download dialog.
    35      */
    36     void addGui(DownloadDialog dialog);
    37 
    38     /**
    3933     * Defines whether this download source should be visible only in the expert mode.
    4034     * @return Returns {@code true} if the download source should be visible only in the
    4135     * expert mode, {@code false} otherwise.
  • src/org/openstreetmap/josm/gui/download/OSMDownloadSource.java

     
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    66import java.awt.Color;
     7import java.awt.Dimension;
    78import java.awt.Font;
    89import java.awt.GridBagLayout;
    910import java.util.ArrayList;
     
    117118    }
    118119
    119120    @Override
    120     public void addGui(DownloadDialog dialog) {
    121         dialog.addDownloadSource(this);
    122     }
    123 
    124     @Override
    125121    public boolean onlyExpert() {
    126122        return false;
    127123    }
     
    137133        private final JCheckBox cbDownloadNotes;
    138134        private final JLabel sizeCheck = new JLabel();
    139135
     136        private static final String SIMPLE_NAME = "osmdownloadpanel";
    140137        private static final BooleanProperty DOWNLOAD_OSM = new BooleanProperty("download.osm.data", true);
    141138        private static final BooleanProperty DOWNLOAD_GPS = new BooleanProperty("download.osm.gps", false);
    142139        private static final BooleanProperty DOWNLOAD_NOTES = new BooleanProperty("download.osm.notes", false);
    143140
    144141        /**
    145          * Creates a new {@link OSMDownloadSourcePanel}
    146          * @param ds The osm download source the panel is for
     142         * Creates a new {@link OSMDownloadSourcePanel}.
     143         * @param ds The osm download source the panel is for.
    147144         */
    148145        public OSMDownloadSourcePanel(OSMDownloadSource ds) {
    149146            super(ds);
     
    174171            add(cbDownloadGpxData, GBC.std().insets(1, 5, 1, 5));
    175172            add(cbDownloadNotes, GBC.eol().insets(1, 5, 1, 5));
    176173            add(sizeCheck, GBC.eol().anchor(GBC.EAST).insets(5, 5, 5, 2));
     174
     175            setMinimumSize(new Dimension(450, 115));
    177176        }
    178177
    179178        @Override
     
    277276            updateSizeCheck(bbox);
    278277        }
    279278
     279        @Override
     280        public String getSimpleName() {
     281            return SIMPLE_NAME;
     282        }
     283
    280284        private void updateSizeCheck(Bounds bbox) {
    281             boolean isAreaTooLarge = false;
    282285            if (bbox == null) {
    283286                sizeCheck.setText(tr("No area selected yet"));
    284287                sizeCheck.setForeground(Color.darkGray);
    285             } else if (!isDownloadNotes() && !isDownloadOsmData() && !isDownloadGpxData()) {
     288                return;
     289            }
     290
     291            boolean isAreaTooLarge = false;
     292            if (!isDownloadNotes() && !isDownloadOsmData() && !isDownloadGpxData()) {
    286293                isAreaTooLarge = false;
    287294            } else if (isDownloadNotes() && !isDownloadOsmData() && !isDownloadGpxData()) {
    288295                // see max_note_request_area in https://github.com/openstreetmap/openstreetmap-website/blob/master/config/example.application.yml
  • src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java

     
    7070    }
    7171
    7272    @Override
    73     public void addGui(DownloadDialog dialog) {
    74         dialog.addDownloadSource(this);
    75     }
    76 
    77     @Override
    7873    public boolean onlyExpert() {
    7974        return true;
    8075    }
     
    8883        private JosmTextArea overpassQuery;
    8984        private OverpassQueryList overpassQueryList;
    9085
     86        private static final String SIMPLE_NAME = "overpassdownloadpanel";
    9187        private static final BooleanProperty OVERPASS_QUERY_LIST_OPENED =
    9288                new BooleanProperty("download.overpass.query-list.opened", false);
    9389        private static final String ACTION_IMG_SUBDIR = "dialogs";
     
    179175            add(leftPanel, BorderLayout.WEST);
    180176            add(innerPanel, BorderLayout.CENTER);
    181177            add(listPanel, BorderLayout.EAST);
     178
     179            setMinimumSize(new Dimension(450, 240));
    182180        }
    183181
    184182        @Override
     
    274272            return ImageProvider.get("download-overpass");
    275273        }
    276274
     275        @Override
     276        public String getSimpleName() {
     277            return SIMPLE_NAME;
     278        }
     279
    277280        /**
    278281         * Action that delegates snippet creation to {@link OverpassQueryList#createNewItem()}.
    279282         */