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 AbstractAction() {
063                {
064                    putValue(NAME, file);
065                    putValue("help", ht("/Action/OpenRecent"));
066                    putValue("toolbar", Boolean.FALSE);
067                }
068                @Override
069                public void actionPerformed(ActionEvent e) {
070                    File f = new File(file);
071                    OpenFileTask task = new OpenFileTask(Collections.singletonList(f), null);
072                    task.setRecordHistory(true);
073                    Main.worker.submit(task);
074                }
075            });
076        }
077        add(new JSeparator());
078        if (clearAction == null) {
079            clearAction = new ClearAction();
080        }
081        JMenuItem clearItem = new JMenuItem(clearAction);
082        clearItem.setEnabled(!fileHistory.isEmpty());
083        add(clearItem);
084    }
085
086    private static class ClearAction extends AbstractAction {
087
088        ClearAction() {
089            super(tr("Clear"));
090            putValue(SHORT_DESCRIPTION, tr("Clear the list of recently opened files"));
091            putValue("help", ht("/Action/OpenRecent"));
092            putValue("toolbar", "recentlyopenedfiles/clear");
093        }
094
095        @Override
096        public void actionPerformed(ActionEvent e) {
097            Main.pref.putCollection("file-open.history", null);
098        }
099    }
100}