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