package net.sf.jabref.external; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import javax.swing.*; import net.sf.jabref.*; /** * The menu item used in the popup menu for opening external resources associated * with an entry. Shows the resource name and icon given, and adds an action listener * to process the request if the user clicks this menu item. */ public class ExternalFileMenuItem extends JMenuItem implements ActionListener { private BibtexEntry entry; final String link; final MetaData metaData; ExternalFileType fileType; final JabRefFrame frame; private String fieldName = null; public ExternalFileMenuItem(JabRefFrame frame, BibtexEntry entry, String name, String link, Icon icon, MetaData metaData, ExternalFileType fileType) { super(name, icon); this.frame = frame; this.entry = entry; this.link = link; this.metaData = metaData; this.fileType = fileType; addActionListener(this); } public ExternalFileMenuItem(JabRefFrame frame, BibtexEntry entry, String name, String link, Icon icon, MetaData metaData, String fieldName) { this(frame, entry, name, link, icon, metaData, (ExternalFileType)null); this.fieldName = fieldName; } public void actionPerformed(ActionEvent e) { boolean success = openLink(); if (!success) { frame.output(Globals.lang("Unable to open link.")); } } public boolean openLink() { frame.output(Globals.lang("External viewer called") + "."); try { ExternalFileType type = fileType; if (this.fileType == null) { if (this.fieldName != null) { Util.openExternalViewer(frame.basePanel().metaData(), link, fieldName); return true; } else { // We don't already know the file type, so we try to deduce it from the extension: File file = new File(link); // We try to check the extension for the file: String name = file.getName(); int pos = name.indexOf('.'); String extension = ((pos >= 0) && (pos < name.length() - 1)) ? name.substring(pos + 1) .trim().toLowerCase() : null; // Now we know the extension, check if it is one we know about: type = Globals.prefs.getExternalFileTypeByExt(extension); fileType = type; } } if (type instanceof UnknownExternalFileType) return Util.openExternalFileUnknown(frame, entry, metaData, link, (UnknownExternalFileType)type); else return Util.openExternalFileAnyFormat(metaData, link, type); } catch (IOException e1) { // See if we should show an error message concerning the application to open the // link with. We check if the file type is set, and if the file type has a non-empty // application link. If that link is referred by the error message, we can assume // that the problem is in the open-with-application setting: if ((fileType != null) && (fileType.getOpenWith() != null) && (fileType.getOpenWith().length() > 0) && (e1.getMessage().indexOf(fileType.getOpenWith()) >= 0)) { JOptionPane.showMessageDialog(frame, Globals.lang("Unable to open link. " +"The application '%0' associated with the file type '%1' could not be called.", fileType.getOpenWith(), fileType.getName()), Globals.lang("Could not open link"), JOptionPane.ERROR_MESSAGE); return false; } e1.printStackTrace(); } return false; } }