package org.jabref.gui.menus;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import org.jabref.JabRefExecutorService;
import org.jabref.gui.JabRefFrame;
import org.jabref.logic.l10n.Localization;
import org.jabref.logic.util.io.FileHistory;
import org.jabref.preferences.JabRefPreferences;
public class FileHistoryMenu extends JMenu implements ActionListener {
private final FileHistory history;
private final JabRefFrame frame;
private final JabRefPreferences prefs;
public FileHistoryMenu(JabRefPreferences prefs, JabRefFrame frame) {
String name = Localization.menuTitle("Recent libraries");
int i = name.indexOf('&');
if (i >= 0) {
setText(name.substring(0, i) + name.substring(i + 1));
char mnemonic = Character.toUpperCase(name.charAt(i + 1));
setMnemonic((int) mnemonic);
} else {
setText(name);
}
this.frame = frame;
this.prefs = prefs;
history = prefs.getFileHistory();
if (history.isEmpty()) {
setEnabled(false);
} else {
setItems();
}
}
/**
* Adds the filename to the top of the menu. If it already is in
* the menu, it is merely moved to the top.
*
* @param filename a <code>String</code> value
*/
public void newFile(String filename) {
history.newFile(filename);
setItems();
if (!isEnabled()) {
setEnabled(true);
}
}
private void setItems() {
removeAll();
for (int count = 0; count < history.size(); count++) {
addItem(history.getFileName(count), count + 1);
}
}
private void addItem(String filename, int num) {
String number = Integer.toString(num);
JMenuItem item = new JMenuItem(number + ". " + filename);
char mnemonic = Character.toUpperCase(number.charAt(0));
item.setMnemonic((int) mnemonic);
item.addActionListener(this);
add(item);
//history.addFirst(item);
}
public void storeHistory() {
prefs.storeFileHistory(history);
}
@Override
public void actionPerformed(ActionEvent e) {
String name = ((JMenuItem) e.getSource()).getText();
int pos = name.indexOf(' ');
name = name.substring(pos + 1);
final Path fileToOpen = Paths.get(name);
// the existence check has to be done here (and not in open.openIt) as we have to call "removeItem" if the file does not exist
if (!Files.exists(fileToOpen)) {
JOptionPane.showMessageDialog(frame, Localization.lang("File not found") + ": " + fileToOpen.getFileName(),
Localization.lang("Error"), JOptionPane.ERROR_MESSAGE);
history.removeItem(name);
setItems();
return;
}
JabRefExecutorService.INSTANCE.execute(() -> frame.getOpenDatabaseAction().openFile(fileToOpen, true));
}
}