1 /*******************************************************************************
2 * Copyright (c) 2000, 2011 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.ui.browsing;
13 import java.util.ArrayList;
14 import java.util.List;
16 import org.eclipse.swt.widgets.Control;
17 import org.eclipse.swt.widgets.Display;
19 import org.eclipse.jface.viewers.IStructuredContentProvider;
20 import org.eclipse.jface.viewers.StructuredViewer;
21 import org.eclipse.jface.viewers.TableViewer;
23 import org.eclipse.jdt.core.IJavaElement;
24 import org.eclipse.jdt.core.IJavaElementDelta;
25 import org.eclipse.jdt.core.IJavaProject;
26 import org.eclipse.jdt.core.IPackageFragment;
27 import org.eclipse.jdt.core.IPackageFragmentRoot;
28 import org.eclipse.jdt.core.JavaModelException;
30 import org.eclipse.jdt.ui.JavaElementLabels;
33 * Table content provider for the hierarchical layout in the packages view.
35 * XXX: The standard Java browsing part content provider needs and calls
36 * the browsing part/view. This class currently doesn't need to do so
37 * but might be required to later.
40 //TODO: made public and added setRefreshLoggingEnabled(..) to track down https://bugs.eclipse.org/bugs/show_bug.cgi?id=243132
41 public class PackagesViewFlatContentProvider extends LogicalPackagesProvider implements IStructuredContentProvider {
43 private boolean fRefreshLoggingEnabled;
45 public void setRefreshLoggingEnabled(boolean enabled) {
46 fRefreshLoggingEnabled= enabled;
49 PackagesViewFlatContentProvider(StructuredViewer viewer) {
54 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
56 public Object[] getChildren(Object parentElement) {
58 if(parentElement instanceof IJavaElement){
59 IJavaElement element= (IJavaElement) parentElement;
61 int type= element.getElementType();
65 case IJavaElement.JAVA_PROJECT :
66 IJavaProject project= (IJavaProject) element;
67 IPackageFragment[] children= getPackageFragments(project.getPackageFragments());
68 if(isInCompoundState()) {
69 fMapToLogicalPackage.clear();
70 fMapToPackageFragments.clear();
71 return combineSamePackagesIntoLogialPackages(children);
75 case IJavaElement.PACKAGE_FRAGMENT_ROOT :
76 fMapToLogicalPackage.clear();
77 fMapToPackageFragments.clear();
78 IPackageFragmentRoot root= (IPackageFragmentRoot) element;
79 return root.getChildren();
81 case IJavaElement.PACKAGE_FRAGMENT :
82 //no children in flat view
86 //do nothing, empty array returned
88 } catch (JavaModelException e) {
97 * Weeds out packageFragments from external jars and folders
99 private IPackageFragment[] getPackageFragments(IPackageFragment[] iPackageFragments) {
100 List<IPackageFragment> list= new ArrayList<IPackageFragment>();
101 for (int i= 0; i < iPackageFragments.length; i++) {
102 IPackageFragment fragment= iPackageFragments[i];
103 IJavaElement el= fragment.getParent();
104 if (el instanceof IPackageFragmentRoot) {
105 IPackageFragmentRoot root= (IPackageFragmentRoot) el;
106 if (root.isExternal())
111 return list.toArray(new IPackageFragment[list.size()]);
115 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
117 public Object[] getElements(Object inputElement) {
118 return getChildren(inputElement);
122 protected void processDelta(IJavaElementDelta delta) throws JavaModelException {
124 int kind= delta.getKind();
125 final IJavaElement element= delta.getElement();
127 if (fRefreshLoggingEnabled) {
128 String elementLabel= JavaElementLabels.getElementLabel(element, JavaElementLabels.ALL_FULLY_QUALIFIED);
129 new Exception("Delta for: " + elementLabel).printStackTrace(System.out); //$NON-NLS-1$
132 if (isClassPathChange(delta)) {
133 Object input= fViewer.getInput();
135 if (fInputIsProject && input.equals(element.getJavaProject())) {
138 } else if (!fInputIsProject && input.equals(element)) {
139 if (element.exists())
148 if (kind == IJavaElementDelta.REMOVED) {
149 Object input= fViewer.getInput();
150 if (input != null && input.equals(element)) {
156 if (element instanceof IPackageFragment) {
157 final IPackageFragment frag= (IPackageFragment) element;
159 if (kind == IJavaElementDelta.REMOVED) {
162 } else if (kind == IJavaElementDelta.ADDED) {
165 } else if (kind == IJavaElementDelta.CHANGED) {
167 Object toBeRefreshed= element;
169 IPackageFragment pkgFragment= (IPackageFragment) element;
170 LogicalPackage logicalPkg= findLogicalPackage(pkgFragment);
171 //deal with packages that have been filtered and are now visible
172 if (logicalPkg != null)
173 toBeRefreshed= findElementToRefresh(logicalPkg);
175 toBeRefreshed= findElementToRefresh(pkgFragment);
177 postRefresh(toBeRefreshed);
179 //in this view there will be no children of PackageFragment to refresh
182 processAffectedChildren(delta);
185 //test to see if element to be refreshed is being filtered out
186 //and if so refresh the viewers input element (JavaProject or PackageFragmentRoot)
187 private Object findElementToRefresh(IPackageFragment fragment) {
188 if (fViewer.testFindItem(fragment) == null) {
190 return fragment.getJavaProject();
191 else return fragment.getParent();
196 //test to see if element to be refreshed is being filtered out
197 //and if so refresh the viewers input element (JavaProject or PackageFragmentRoot)
198 private Object findElementToRefresh(LogicalPackage logicalPackage) {
199 return logicalPackage.generated_107260625128017049(this);
202 private void processAffectedChildren(IJavaElementDelta delta) throws JavaModelException {
203 IJavaElementDelta[] children= delta.getAffectedChildren();
204 for (int i= 0; i < children.length; i++) {
205 IJavaElementDelta elementDelta= children[i];
206 processDelta(elementDelta);
210 void postAdd(final Object child) {
211 postRunnable(new Runnable() {
213 Control ctrl = fViewer.getControl();
214 if (ctrl != null && !ctrl.isDisposed()) {
215 ((TableViewer)fViewer).add(child);
222 void postRemove(final Object object) {
223 postRunnable(new Runnable() {
225 Control ctrl = fViewer.getControl();
226 if (ctrl != null && !ctrl.isDisposed()) {
227 ((TableViewer)fViewer).remove(object);
233 private void postRunnable(final Runnable r) {
234 Control ctrl= fViewer.getControl();
235 if (ctrl != null && !ctrl.isDisposed()) {
236 // fBrowsingPart.setProcessSelectionEvents(false);
238 Display currentDisplay= Display.getCurrent();
239 if (currentDisplay != null && currentDisplay.equals(ctrl.getDisplay()))
240 ctrl.getDisplay().syncExec(r);
242 ctrl.getDisplay().asyncExec(r);
244 // fBrowsingPart.setProcessSelectionEvents(true);
249 private void removeElement(IPackageFragment frag) {
250 String key= getKey(frag);
251 LogicalPackage lp= fMapToLogicalPackage.get(key);
254 lp.generated_6417398543703521005(frag, key, this);
257 fMapToPackageFragments.remove(key);
262 private void postRefresh(final Object element) {
263 if (fRefreshLoggingEnabled) {
264 new Exception("postRefresh: " + element).printStackTrace(System.out); //$NON-NLS-1$
267 postRunnable(new Runnable() {
269 Control ctrl= fViewer.getControl();
270 if (ctrl != null && !ctrl.isDisposed()) {
271 fViewer.refresh(element);
277 private void addElement(IPackageFragment frag) {
278 String key= getKey(frag);
279 LogicalPackage lp= fMapToLogicalPackage.get(key);
281 if(lp != null && lp.belongs(frag)){
286 IPackageFragment fragment= fMapToPackageFragments.get(key);
287 if(fragment != null){
288 //must create a new LogicalPackage
289 if(!fragment.equals(frag)){
290 lp= new LogicalPackage(fragment);
291 lp.generated_4157276551819242824(frag, key, this, fragment);
298 fMapToPackageFragments.put(key, frag);