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