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