1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.xnap.gui.viewer;
21
22 import java.io.File;
23 import java.util.Arrays;
24 import java.util.Comparator;
25 import java.util.HashSet;
26 import java.util.Hashtable;
27 import java.util.LinkedList;
28 import java.util.List;
29
30 import org.apache.log4j.Logger;
31 import org.xnap.event.ListListener;
32 import org.xnap.event.ListSupport;
33 import org.xnap.util.FileHelper;
34 import org.xnap.util.Preferences;
35
36 /***
37 * This class keeps track of the installed viewers and their handled file
38 * extensions. It follows the singleton pattern.
39 *
40 * {@link ListListener}s can be notified of additions or removals of viewers.
41 */
42 public class ViewerManager
43 {
44
45
46
47
48
49 private static Logger logger = Logger.getLogger(ViewerManager.class);
50 private static Preferences prefs = Preferences.getInstance();
51 private static ViewerManager instance = new ViewerManager();
52
53 private ListSupport listeners = new ListSupport(this);
54
55 /***
56 * Maps extensions to viewers.
57 */
58 private Hashtable viewersByExtension = new Hashtable();
59 /***
60 * Map of all registered viewers.
61 */
62 private HashSet allViewers = new HashSet();
63
64 private List independentViewers = new LinkedList();
65
66
67
68 private ViewerManager()
69 {
70 }
71
72
73
74 public static ViewerManager getInstance()
75 {
76 return instance;
77 }
78
79 public void addListListener(ListListener listener)
80 {
81 listeners.addListListener(listener);
82 }
83
84 public void removeListListener(ListListener listener)
85 {
86 listeners.removeListListener(listener);
87 }
88 /***
89 * Returns the <code>Viewer</code> object that is registered to handle
90 * <code>file</code>.
91 *
92 * @return null, if no suitable viewer was found; the viewer, otherwise
93 */
94 public synchronized Viewer getDefaultViewer(File file)
95 {
96 Viewer[] viewers = getViewers(file);
97 return (viewers != null) ? viewers[0] : null;
98 }
99
100 /***
101 * Returns array of all viewers registered for this type of file.
102 *
103 * @param file the file's extension is used to determine the viewers
104 * @return array of viewers or null
105 */
106 public synchronized Viewer[] getViewers(File file)
107 {
108 String ext = FileHelper.extension(file.getName());
109 LinkedList list = new LinkedList();
110
111 LinkedList extList = (LinkedList)viewersByExtension.get(ext);
112 if (extList != null) {
113 list.addAll(extList);
114 }
115 list.addAll(independentViewers);
116 if (list.size() > 0) {
117 return (Viewer[])list.toArray(new Viewer[0]);
118 }
119 return null;
120 }
121
122 /***
123 * Returns an array of all registered vierwers.
124 */
125 public synchronized Viewer[] getViewers()
126 {
127 Viewer[] v = (Viewer[])allViewers.toArray(new Viewer[0]);
128 Arrays.sort(v, new ViewerComparator());
129 return v;
130 }
131
132 /***
133 * Registers <code>viewer</code> to handle files with extension
134 * <code>extension</code>.
135 */
136 public synchronized void register(String extension, Viewer viewer)
137 {
138 LinkedList list = (LinkedList)viewersByExtension.get(extension);
139 if (list == null) {
140 list = new LinkedList();
141 viewersByExtension.put(extension, list);
142 }
143 if (viewer.getName().equals(prefs.getDefaultViewer(extension))) {
144 list.addFirst(viewer);
145 }
146 else {
147 list.addLast(viewer);
148 }
149 add(viewer);
150 }
151
152 /***
153 * Registers <code>viewer</code> to handle files with any extension.
154 */
155 public synchronized void register(Viewer viewer)
156 {
157 independentViewers.add(viewer);
158 add(viewer);
159 }
160
161 /***
162 * Registers <code>viewer</code> to handle files with extension
163 * <code>extensions</code>.
164 */
165 public synchronized void register(String[] extensions, Viewer viewer)
166 {
167 for (int i = 0; i < extensions.length; i++) {
168 register(extensions[i], viewer);
169 }
170 }
171
172 /***
173 * Unregisters <code>viewer</code> to handle files with extension
174 * <code>extensions</code>.
175 */
176 public synchronized void unregister(String extension, Viewer viewer)
177 {
178 LinkedList list = (LinkedList)viewersByExtension.get(extension);
179 if (list != null) {
180 list.remove(viewer);
181 }
182 remove(viewer);
183 }
184
185 /***
186 * Unregisters <code>viewer</code> to handle files with any extension.
187 */
188 public synchronized void unregister(Viewer viewer)
189 {
190 independentViewers.remove(viewer);
191 remove(viewer);
192 }
193
194 /***
195 * Registers <code>viewer</code> to handle files with extension
196 * <code>extensions</code>.
197 */
198 public synchronized void unregister(String[] extensions, Viewer viewer)
199 {
200 for (int i = 0; i < extensions.length; i++) {
201 unregister(extensions[i], viewer);
202 }
203 }
204
205 public synchronized void setDefaultViewer(File file, Viewer viewer)
206 {
207 String extension = FileHelper.extension(file.getName());
208 prefs.setDefaultViewer(extension, viewer.getName());
209 LinkedList list = (LinkedList)viewersByExtension.get(extension);
210 if (list != null) {
211 if (list.remove(viewer)) {
212 list.addFirst(viewer);
213 }
214 }
215 }
216
217 private void add(Viewer viewer)
218 {
219 if (allViewers.add(viewer)) {
220 listeners.fireItemAdded(viewer);
221 }
222 }
223
224 private void remove(Viewer viewer)
225 {
226 if (allViewers.remove(viewer)) {
227 listeners.fireItemRemoved(viewer);
228 }
229 }
230
231 /***
232 * Compares {@link Viewer} objects by name.
233 */
234 private class ViewerComparator implements Comparator
235 {
236 public int compare(Object o1, Object o2)
237 {
238 return ((Viewer)o1).getName().compareToIgnoreCase
239 (((Viewer)o2).getName());
240 }
241 }
242 }