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