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