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