Switched to YAML config format.
[instantlauncher.git] / src / main / java / eu / svjatoslav / instantlauncher / FileAssociationManager.java
1 package eu.svjatoslav.instantlauncher;
2
3 import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
4
5 import java.io.File;
6 import java.io.IOException;
7 import java.util.HashMap;
8
9 import static eu.svjatoslav.commons.file.FilePathParser.getFileExtension;
10
11 public class FileAssociationManager {
12
13     private static final String FILE_INDICATOR = "<FILE>";
14
15     private static final String[] TEXT_EDITOR_PATTERN = new String[]{"emc", FILE_INDICATOR};
16
17     private static final String DOCUMENT_EDITOR = "lowriter";
18
19     private static final String SPREADSHEET_EDITOR = "localc";
20
21     private static final String MUSIC_PLAYER = "clementine";
22
23     private static final HashMap<String, String[]> extensionToApplication = new HashMap<>();
24
25     public FileAssociationManager() {
26
27         extensionToApplication.put("txt", TEXT_EDITOR_PATTERN);
28         extensionToApplication.put("xml", TEXT_EDITOR_PATTERN);
29         extensionToApplication.put("org", TEXT_EDITOR_PATTERN);
30         extensionToApplication.put("properties", TEXT_EDITOR_PATTERN);
31         extensionToApplication.put("ini", TEXT_EDITOR_PATTERN);
32         extensionToApplication.put("", TEXT_EDITOR_PATTERN);
33
34         extensionToApplication.put("jpg", new String[]{"eog", FILE_INDICATOR});
35         extensionToApplication.put("jpeg", new String[]{"eog", FILE_INDICATOR});
36         extensionToApplication.put("png", new String[]{"eog", FILE_INDICATOR});
37
38         extensionToApplication.put("pdf", new String[]{"evince", FILE_INDICATOR});
39
40         extensionToApplication.put("mp3", new String[]{"banshee", FILE_INDICATOR});
41         extensionToApplication.put("ogg", new String[]{"banshee", FILE_INDICATOR});
42
43         extensionToApplication.put("avi", new String[]{"vlc", FILE_INDICATOR});
44         extensionToApplication.put("mkv", new String[]{"vlc", FILE_INDICATOR});
45         extensionToApplication.put("ogv", new String[]{"vlc", FILE_INDICATOR});
46         extensionToApplication.put("mp4", new String[]{"vlc", FILE_INDICATOR});
47         extensionToApplication.put("flv", new String[]{"vlc", FILE_INDICATOR});
48         extensionToApplication.put("wmv", new String[]{"vlc", FILE_INDICATOR});
49
50         extensionToApplication.put("flac", new String[]{MUSIC_PLAYER, FILE_INDICATOR});
51         extensionToApplication.put("mp3", new String[]{MUSIC_PLAYER, FILE_INDICATOR});
52         extensionToApplication.put("ogg", new String[]{MUSIC_PLAYER, FILE_INDICATOR});
53         extensionToApplication.put("wav", new String[]{MUSIC_PLAYER, FILE_INDICATOR});
54
55         extensionToApplication.put("ods", new String[]{SPREADSHEET_EDITOR, FILE_INDICATOR});
56         extensionToApplication.put("xls", new String[]{SPREADSHEET_EDITOR, FILE_INDICATOR});
57         extensionToApplication.put("xlsx", new String[]{SPREADSHEET_EDITOR, FILE_INDICATOR});
58
59         extensionToApplication.put("docx", new String[]{DOCUMENT_EDITOR, FILE_INDICATOR});
60         extensionToApplication.put("doc", new String[]{DOCUMENT_EDITOR, FILE_INDICATOR});
61
62         extensionToApplication.put("desktop", new String[]{"run-desktop", FILE_INDICATOR});
63
64         extensionToApplication.put("log", new String[]{"glogg", FILE_INDICATOR});
65         extensionToApplication.put("out", new String[]{"glogg", FILE_INDICATOR});
66
67         extensionToApplication.put("html", new String[]{"firefox", FILE_INDICATOR});
68
69         extensionToApplication.put("htm", new String[]{"firefox", FILE_INDICATOR});
70
71     }
72
73     private static boolean isLogFile(final String fileName) {
74         if (fileName.endsWith(".out"))
75             return true;
76         if (fileName.endsWith(".log"))
77             return true;
78         return fileName.contains(".log.");
79
80     }
81
82     /**
83      * @return <code>true</code> if file was opened. <code>false</code> if
84      * unknown file type.
85      */
86     public static boolean openFile(final File file) {
87
88         if (isLogFile(file.getName())) {
89             runOpeningApplication(file, new String[]{"glogg", FILE_INDICATOR});
90             return true;
91         }
92
93         final String fileExtension = getFileExtension(file);
94
95         if (extensionToApplication.containsKey(fileExtension)) {
96             final String[] commands = extensionToApplication.get(fileExtension);
97             runOpeningApplication(file, commands);
98             return true;
99         } else
100             return false;
101
102     }
103
104     private static void runOpeningApplication(final File file, final String[] commands) {
105         for (int i = 0; i < commands.length; i++)
106             if (commands[i].equals(FILE_INDICATOR))
107                 commands[i] = file.getAbsolutePath();
108
109         try {
110             Runtime.getRuntime().exec(commands);
111             InstantLauncher.exitProgram();
112
113         } catch (final IOException e) {
114             new ExceptionDialog(e);
115         }
116     }
117
118 }