dc2efc2b6efffd471d24bf46ef1315545cfb4aca
[debian/jabref.git] / src / java / net / sf / jabref / external / ExternalFileMenuItem.java
1 package net.sf.jabref.external;
2
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.io.File;
6 import java.io.IOException;
7
8 import javax.swing.*;
9
10 import net.sf.jabref.*;
11
12 /**
13  * The menu item used in the popup menu for opening external resources associated
14  * with an entry. Shows the resource name and icon given, and adds an action listener
15  * to process the request if the user clicks this menu item.
16  */
17 public class ExternalFileMenuItem extends JMenuItem implements ActionListener {
18
19     private BibtexEntry entry;
20     final String link;
21     final MetaData metaData;
22     ExternalFileType fileType;
23     final JabRefFrame frame;
24
25     public ExternalFileMenuItem(JabRefFrame frame, BibtexEntry entry, String name,
26                                 String link, Icon icon,
27                                 MetaData metaData,
28                                 ExternalFileType fileType) {
29         super(name, icon);
30         this.frame = frame;
31         this.entry = entry;
32         this.link = link;
33         this.metaData = metaData;
34         this.fileType = fileType;
35         addActionListener(this);
36     }
37
38     public ExternalFileMenuItem(JabRefFrame frame, BibtexEntry entry, String name,
39                                 String link, Icon icon, MetaData metaData) {
40         this(frame, entry, name, link, icon, metaData, null);
41     }
42
43     public void actionPerformed(ActionEvent e) {
44         openLink();
45     }
46
47     public boolean openLink() {
48         
49         try {
50             ExternalFileType type = fileType;
51             if (this.fileType == null) {
52                 // We don't already know the file type, so we try to deduce it from the extension:
53                 File file = new File(link);
54                 // We try to check the extension for the file:
55                 String name = file.getName();
56                 int pos = name.indexOf('.');
57                 String extension = ((pos >= 0) && (pos < name.length() - 1)) ? name.substring(pos + 1)
58                     .trim().toLowerCase() : null;
59                 // Now we know the extension, check if it is one we know about:
60                 type = Globals.prefs.getExternalFileTypeByExt(extension);
61                 fileType = type;
62             }
63
64             if (type instanceof UnknownExternalFileType)
65                 return Util.openExternalFileUnknown(frame, entry, metaData, link,
66                         (UnknownExternalFileType)type);
67             else
68                 return Util.openExternalFileAnyFormat(metaData, link, type);
69
70
71
72         } catch (IOException e1) {
73             // See if we should show an error message concerning the application to open the
74             // link with. We check if the file type is set, and if the file type has a non-empty
75             // application link. If that link is referred by the error message, we can assume
76             // that the problem is in the open-with-application setting:
77             if ((fileType != null) && (fileType.getOpenWith() != null)
78                 && (fileType.getOpenWith().length() > 0) &&
79                     (e1.getMessage().indexOf(fileType.getOpenWith()) >= 0)) {
80
81                 JOptionPane.showMessageDialog(frame, Globals.lang("Unable to open link. "
82                     +"The application '%0' associated with the file type '%1' could not be called.",
83                         fileType.getOpenWith(), fileType.getName()),
84                         Globals.lang("Could not open link"), JOptionPane.ERROR_MESSAGE);
85                 return false;
86             }
87
88             e1.printStackTrace();
89         }
90         return false;
91     }
92 }