001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.io;
003
004import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
005import static org.openstreetmap.josm.tools.I18n.tr;
006
007import java.awt.event.ActionEvent;
008import java.io.File;
009import java.util.Collection;
010import java.util.Collections;
011
012import javax.swing.AbstractAction;
013import javax.swing.JMenu;
014import javax.swing.JMenuItem;
015import javax.swing.JSeparator;
016import javax.swing.event.MenuEvent;
017import javax.swing.event.MenuListener;
018
019import org.openstreetmap.josm.actions.OpenFileAction.OpenFileTask;
020import org.openstreetmap.josm.gui.MainApplication;
021import org.openstreetmap.josm.spi.preferences.Config;
022import org.openstreetmap.josm.tools.ImageProvider;
023
024/**
025 * Show list of recently opened files
026 */
027public class RecentlyOpenedFilesMenu extends JMenu {
028    private ClearAction clearAction;
029
030    /**
031     * Constructs a new {@code RecentlyOpenedFilesMenu}.
032     */
033    public RecentlyOpenedFilesMenu() {
034        super(tr("Open Recent"));
035        setToolTipText(tr("List of recently opened files"));
036        setIcon(ImageProvider.get("openrecent", ImageProvider.ImageSizes.MENU));
037        putClientProperty("help", ht("/Action/OpenRecent"));
038
039        // build dynamically
040        addMenuListener(new MenuListener() {
041            @Override
042            public void menuSelected(MenuEvent e) {
043                rebuild();
044            }
045
046            @Override
047            public void menuDeselected(MenuEvent e) {
048                // Do nothing
049            }
050
051            @Override
052            public void menuCanceled(MenuEvent e) {
053                // Do nothing
054            }
055        });
056    }
057
058    private void rebuild() {
059        removeAll();
060        Collection<String> fileHistory = Config.getPref().getList("file-open.history");
061
062        for (final String file : fileHistory) {
063            add(new OpenRecentAction(file));
064        }
065        add(new JSeparator());
066        if (clearAction == null) {
067            clearAction = new ClearAction();
068        }
069        JMenuItem clearItem = new JMenuItem(clearAction);
070        clearItem.setEnabled(!fileHistory.isEmpty());
071        add(clearItem);
072    }
073
074    static final class OpenRecentAction extends AbstractAction {
075        private final String file;
076
077        OpenRecentAction(String file) {
078            this.file = file;
079            putValue(NAME, file);
080            putValue("help", ht("/Action/OpenRecent"));
081            putValue("toolbar", Boolean.FALSE);
082        }
083
084        @Override
085        public void actionPerformed(ActionEvent e) {
086            OpenFileTask task = new OpenFileTask(Collections.singletonList(new File(file)), null);
087            task.setRecordHistory(true);
088            MainApplication.worker.submit(task);
089        }
090    }
091
092    private static class ClearAction extends AbstractAction {
093
094        ClearAction() {
095            super(tr("Clear"));
096            putValue(SHORT_DESCRIPTION, tr("Clear the list of recently opened files"));
097            putValue("help", ht("/Action/OpenRecent"));
098            putValue("toolbar", "recentlyopenedfiles/clear");
099        }
100
101        @Override
102        public void actionPerformed(ActionEvent e) {
103            Config.getPref().putList("file-open.history", null);
104        }
105    }
106}