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(ImageProvider.get("openrecent", ImageProvider.ImageSizes.MENU)); 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 OpenRecentAction(file)); 063 } 064 add(new JSeparator()); 065 if (clearAction == null) { 066 clearAction = new ClearAction(); 067 } 068 JMenuItem clearItem = new JMenuItem(clearAction); 069 clearItem.setEnabled(!fileHistory.isEmpty()); 070 add(clearItem); 071 } 072 073 static final class OpenRecentAction extends AbstractAction { 074 private final String file; 075 076 OpenRecentAction(String file) { 077 this.file = file; 078 putValue(NAME, file); 079 putValue("help", ht("/Action/OpenRecent")); 080 putValue("toolbar", Boolean.FALSE); 081 } 082 083 @Override 084 public void actionPerformed(ActionEvent e) { 085 OpenFileTask task = new OpenFileTask(Collections.singletonList(new File(file)), null); 086 task.setRecordHistory(true); 087 Main.worker.submit(task); 088 } 089 } 090 091 private static class ClearAction extends AbstractAction { 092 093 ClearAction() { 094 super(tr("Clear")); 095 putValue(SHORT_DESCRIPTION, tr("Clear the list of recently opened files")); 096 putValue("help", ht("/Action/OpenRecent")); 097 putValue("toolbar", "recentlyopenedfiles/clear"); 098 } 099 100 @Override 101 public void actionPerformed(ActionEvent e) { 102 Main.pref.putCollection("file-open.history", null); 103 } 104 } 105}