KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > mountainminds > eclemma > internal > ui > viewers > ClassesViewer


1 /*******************************************************************************
2  * Copyright (c) 2006 Mountainminds GmbH & Co. KG
3  * This software is provided under the terms of the Eclipse Public License v1.0
4  * See http://www.eclipse.org/legal/epl-v10.html.
5  *
6  * $Id: ClassesViewer.java 107 2006-09-26 19:30:23Z mho $
7  ******************************************************************************/

8 package com.mountainminds.eclemma.internal.ui.viewers;
9
10 import java.util.ArrayList JavaDoc;
11 import java.util.Arrays JavaDoc;
12 import java.util.HashSet JavaDoc;
13 import java.util.Iterator JavaDoc;
14 import java.util.List JavaDoc;
15 import java.util.Set JavaDoc;
16
17 import org.eclipse.jdt.core.IPackageFragmentRoot;
18 import org.eclipse.jdt.ui.JavaElementSorter;
19 import org.eclipse.jface.viewers.ArrayContentProvider;
20 import org.eclipse.jface.viewers.CheckStateChangedEvent;
21 import org.eclipse.jface.viewers.CheckboxTableViewer;
22 import org.eclipse.jface.viewers.ICheckStateListener;
23 import org.eclipse.jface.viewers.ILabelProvider;
24 import org.eclipse.jface.viewers.ISelection;
25 import org.eclipse.jface.viewers.ISelectionChangedListener;
26 import org.eclipse.jface.viewers.ISelectionProvider;
27 import org.eclipse.jface.viewers.IStructuredSelection;
28 import org.eclipse.jface.viewers.LabelProvider;
29 import org.eclipse.jface.viewers.SelectionChangedEvent;
30 import org.eclipse.jface.viewers.StructuredSelection;
31 import org.eclipse.swt.SWT;
32 import org.eclipse.swt.graphics.Image;
33 import org.eclipse.swt.widgets.Composite;
34 import org.eclipse.swt.widgets.Table;
35 import org.eclipse.ui.model.WorkbenchLabelProvider;
36
37 import com.mountainminds.eclemma.core.IClassFiles;
38
39 /**
40  * Viewer for selecting <code>IClassFiles</code> objects from a given list.
41  * The viewer lists the corresponding IPackageFragmentRoots. Source based class
42  * files may have multiple corresponding roots, their selection status is
43  * connected.
44  *
45  * @author Marc R. Hoffmann
46  * @version $Revision: 107 $
47  */

48 public class ClassesViewer implements ISelectionProvider {
49
50   private static class PackageFragmentRootLabelProvider extends LabelProvider {
51
52     private ILabelProvider delegate = new WorkbenchLabelProvider();
53
54     public Image getImage(Object JavaDoc element) {
55       return delegate.getImage(element);
56     }
57
58     public String JavaDoc getText(Object JavaDoc element) {
59       IPackageFragmentRoot root = (IPackageFragmentRoot) element;
60       return root.getPath().toString();
61     }
62
63     public void dispose() {
64       delegate.dispose();
65     }
66
67   }
68
69   private final Table table;
70   private final CheckboxTableViewer viewer;
71   private final List JavaDoc listeners = new ArrayList JavaDoc();
72
73   private IClassFiles[] input;
74   private boolean includebinaries;
75   private final Set JavaDoc selectedclasses = new HashSet JavaDoc();
76
77   /**
78    * Creates a new viewer within the given parent.
79    *
80    * @param parent
81    * composite to create the viewer's table in
82    * @param style
83    * flags specifying the table's style
84    */

85   public ClassesViewer(Composite parent, int style) {
86     this(new Table(parent, SWT.CHECK | style));
87   }
88
89   /**
90    * Attaches the viewer to the given table.
91    *
92    * @param table
93    * view table
94    */

95   public ClassesViewer(Table table) {
96     this.table = table;
97     viewer = new CheckboxTableViewer(table);
98     viewer.setContentProvider(new ArrayContentProvider());
99     viewer.setLabelProvider(new PackageFragmentRootLabelProvider());
100     viewer.setSorter(new JavaElementSorter());
101     viewer.addCheckStateListener(new ICheckStateListener() {
102       public void checkStateChanged(CheckStateChangedEvent event) {
103         updateCheckedStatus(event.getElement(), event.getChecked());
104       }
105     });
106   }
107
108   /**
109    * Returns the table used by the viewer.
110    *
111    * @return table used by the viewer
112    */

113   public Table getTable() {
114     return table;
115   }
116
117   /**
118    * Sets the input for this viewer.
119    *
120    * @param input
121    * list of classfiles objects the user can select from
122    */

123   public void setInput(IClassFiles[] input) {
124     this.input = input;
125     viewer.setInput(getPackageFragmentRoots(input));
126   }
127
128   /**
129    * Specifies whether binary classpath entries should also be listed.
130    *
131    * @param includebinaries
132    * <code>true</code> if binary entries should be listed
133    */

134   public void setIncludeBinaries(boolean includebinaries) {
135     this.includebinaries = includebinaries;
136     if (!includebinaries) {
137       for (Iterator JavaDoc i = selectedclasses.iterator(); i.hasNext();) {
138         if (((IClassFiles) i.next()).isBinary()) {
139           i.remove();
140         }
141       }
142     }
143     if (input != null) {
144       viewer.setInput(getPackageFragmentRoots(input));
145     }
146   }
147
148   /**
149    * Sets the initially checked classes.
150    *
151    * @param classfiles
152    * list of classfiles that should be checked
153    */

154   public void setSelectedClasses(IClassFiles[] classfiles) {
155     selectedclasses.clear();
156     selectedclasses.addAll(Arrays.asList(classfiles));
157     viewer.setCheckedElements(getPackageFragmentRoots(classfiles));
158   }
159
160   /**
161    * Sets the initially checked classes from the given locations.
162    *
163    * @param locations
164    * location strings of the classes to select
165    */

166   public void setSelectedClasses(String JavaDoc[] locations) {
167     Set JavaDoc lset = new HashSet JavaDoc(Arrays.asList(locations));
168     selectedclasses.clear();
169     for (int i = 0; i < input.length; i++) {
170       if (lset.contains(input[i].getLocation().toString())) {
171         selectedclasses.add(input[i]);
172       }
173     }
174     viewer.setCheckedElements(getPackageFragmentRoots(selectedclasses.toArray()));
175   }
176   
177   public void selectAll() {
178     selectedclasses.clear();
179     for (int i = 0; i < input.length; i++) {
180       if (includebinaries || !input[i].isBinary()) {
181         selectedclasses.add(input[i]);
182       }
183     }
184     viewer.setCheckedElements(getPackageFragmentRoots(selectedclasses.toArray()));
185   }
186
187   public void deselectAll() {
188     selectedclasses.clear();
189     viewer.setCheckedElements(new Object JavaDoc[0]);
190   }
191   
192   /**
193    * Returns the currently checked classes.
194    *
195    * @return list of class files that are currently checked
196    */

197   public IClassFiles[] getSelectedClasses() {
198     return (IClassFiles[]) selectedclasses.toArray(new IClassFiles[0]);
199   }
200
201   /**
202    * Returns the locations of the currently checked classes.
203    *
204    * @return list of locations of class files that are currently checked
205    */

206   public String JavaDoc[] getSelectedClassesLocations() {
207     String JavaDoc[] locs = new String JavaDoc[selectedclasses.size()];
208     int idx = 0;
209     for (Iterator JavaDoc i = selectedclasses.iterator(); i.hasNext();) {
210       locs[idx++] = ((IClassFiles) i.next()).getLocation().toString();
211     }
212     return locs;
213   }
214
215   /**
216    * Registers the given selection listener if not already registered.
217    *
218    * @param listener
219    * listener to add
220    */

221   public void addSelectionChangedListener(ISelectionChangedListener listener) {
222     if (!listeners.contains(listener)) {
223       listeners.add(listener);
224     }
225   }
226
227   /**
228    * Removes the given selection listener.
229    *
230    * @param listener
231    * listener to remove
232    */

233   public void removeSelectionChangedListener(ISelectionChangedListener listener) {
234     listeners.remove(listener);
235   }
236   
237   private IPackageFragmentRoot[] getPackageFragmentRoots(Object JavaDoc[] classfiles) {
238     Set JavaDoc roots = new HashSet JavaDoc();
239     for (int i = 0; i < classfiles.length; i++) {
240       IClassFiles cf = (IClassFiles) classfiles[i];
241       if (includebinaries || !cf.isBinary()) {
242         roots.addAll(Arrays.asList(cf.getPackageFragmentRoots()));
243       }
244     }
245     return (IPackageFragmentRoot[]) roots
246         .toArray(new IPackageFragmentRoot[roots.size()]);
247   }
248
249   private void updateCheckedStatus(Object JavaDoc root, boolean checked) {
250     for (int i = 0; i < input.length; i++) {
251       IClassFiles cf = input[i];
252       if (Arrays.asList(cf.getPackageFragmentRoots()).contains(root)) {
253         if (checked) {
254           selectedclasses.add(cf);
255         } else {
256           selectedclasses.remove(cf);
257         }
258         break;
259       }
260     }
261     viewer.setCheckedElements(getPackageFragmentRoots(selectedclasses.toArray()));
262     fireSelectionEvent();
263   }
264
265   private void fireSelectionEvent() {
266     SelectionChangedEvent evt = new SelectionChangedEvent(this, getSelection());
267     for (Iterator JavaDoc i = listeners.iterator(); i.hasNext();) {
268       ISelectionChangedListener l = (ISelectionChangedListener) i.next();
269       l.selectionChanged(evt);
270     }
271   }
272   
273   // ISelectionProvider interface
274

275   public ISelection getSelection() {
276     return new StructuredSelection(getSelectedClasses());
277   }
278
279   public void setSelection(ISelection selection) {
280     Object JavaDoc[] classfiles = ((IStructuredSelection) selection).toArray();
281     selectedclasses.clear();
282     selectedclasses.addAll(Arrays.asList(classfiles));
283     viewer.setCheckedElements(getPackageFragmentRoots(classfiles));
284   }
285   
286 }
287
Popular Tags