View Javadoc

1   /*
2    *  XNap - A P2P framework and client.
3    *
4    *  See the file AUTHORS for copyright information.
5    *
6    *  This program is free software; you can redistribute it and/or modify
7    *  it under the terms of the GNU General Public License as published by
8    *  the Free Software Foundation.
9    *
10   *  This program is distributed in the hope that it will be useful,
11   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   *  GNU General Public License for more details.
14   *
15   *  You should have received a copy of the GNU General Public License
16   *  along with this program; if not, write to the Free Software
17   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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      //--- Constant(s) ---
46  
47      //--- Data field(s) ---
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      //--- Constructor(s) ---
67  
68      private ViewerManager()
69      {
70      }
71  
72      //--- Method(s) ---
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 }