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(new ImageProvider("openrecent").setSize(ImageProvider.ImageSizes.MENU).get()); 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}