]> git.uio.no Git - ifi-stolz-refaktor.git/blob - case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/packageview/WorkingSetAwareContentProvider.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-after / ui / org / eclipse / jdt / internal / ui / packageview / WorkingSetAwareContentProvider.java
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
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package org.eclipse.jdt.internal.ui.packageview;
12
13 import java.util.ArrayList;
14 import java.util.Arrays;
15 import java.util.Collection;
16 import java.util.Collections;
17 import java.util.HashSet;
18 import java.util.Iterator;
19 import java.util.List;
20 import java.util.Set;
21
22 import org.eclipse.core.runtime.Assert;
23 import org.eclipse.core.runtime.IAdaptable;
24
25 import org.eclipse.core.resources.IProject;
26 import org.eclipse.core.resources.IResource;
27 import org.eclipse.core.resources.ResourcesPlugin;
28
29 import org.eclipse.jface.util.IPropertyChangeListener;
30 import org.eclipse.jface.util.PropertyChangeEvent;
31 import org.eclipse.jface.viewers.TreePath;
32
33 import org.eclipse.ui.IWorkingSet;
34 import org.eclipse.ui.IWorkingSetManager;
35
36 import org.eclipse.jdt.core.IJavaElement;
37 import org.eclipse.jdt.core.IJavaModel;
38 import org.eclipse.jdt.core.IJavaProject;
39 import org.eclipse.jdt.core.JavaCore;
40
41 import org.eclipse.jdt.internal.ui.workingsets.WorkingSetModel;
42
43 public class WorkingSetAwareContentProvider extends PackageExplorerContentProvider implements IMultiElementTreeContentProvider {
44
45         private WorkingSetModel fWorkingSetModel;
46         private IPropertyChangeListener fListener;
47
48         public WorkingSetAwareContentProvider(boolean provideMembers, WorkingSetModel model) {
49                 super(provideMembers);
50                 fWorkingSetModel= model;
51                 fListener= new IPropertyChangeListener() {
52                                         public void propertyChange(PropertyChangeEvent event) {
53                                                 workingSetModelChanged(event);
54                                         }
55                                 };
56                 fWorkingSetModel.addPropertyChangeListener(fListener);
57         }
58
59         /**
60          * {@inheritDoc}
61          */
62         @Override
63         public void dispose() {
64                 fWorkingSetModel.removePropertyChangeListener(fListener);
65                 super.dispose();
66         }
67
68         /**
69          * {@inheritDoc}
70          */
71         @Override
72         public boolean hasChildren(Object element) {
73                 if (element instanceof IWorkingSet)
74                         return true;
75                 return super.hasChildren(element);
76         }
77
78         /**
79          * {@inheritDoc}
80          */
81         @Override
82         public Object[] getChildren(Object element) {
83                 Object[] children;
84                 if (element instanceof WorkingSetModel) {
85                         Assert.isTrue(fWorkingSetModel == element);
86                         return fWorkingSetModel.getActiveWorkingSets();
87                 } else if (element instanceof IWorkingSet) {
88                         children= getWorkingSetChildren((IWorkingSet)element);
89                 } else {
90                         children= super.getChildren(element);
91                 }
92                 return children;
93         }
94
95         private Object[] getWorkingSetChildren(IWorkingSet set) {
96                 IAdaptable[] elements= fWorkingSetModel.getChildren(set);
97                 Set<IAdaptable> result= new HashSet<IAdaptable>(elements.length);
98                 for (int i= 0; i < elements.length; i++) {
99                         IAdaptable element= elements[i];
100                         if (element instanceof IProject) {
101                                 processResource((IProject) element, result); // also add closed projects
102                         } else if (element instanceof IResource) {
103                                 IProject project= ((IResource) element).getProject();
104                                 if (project.isOpen()) {
105                                         processResource((IResource) element, result);
106                                 }
107                         } else if (element instanceof IJavaProject) {
108                                 result.add(element); // also add closed projects
109                         } else if (element instanceof IJavaElement) {
110                                 IJavaElement elem= (IJavaElement) element;
111                                 IProject project= getProject(elem);
112                                 if (project != null && project.isOpen()) {
113                                         result.add(elem);
114                                 }
115                         } else {
116                                 IProject project= (IProject) element.getAdapter(IProject.class);
117                                 if (project != null) {
118                                         processResource(project, result);
119                                 }
120                         }
121                 }
122                 return result.toArray();
123         }
124
125         private void processResource(IResource resource, Collection<IAdaptable> result) {
126                 IJavaElement elem= JavaCore.create(resource);
127                 if (elem != null && elem.exists()) {
128                         result.add(elem);
129                 } else {
130                         result.add(resource);
131                 }
132         }
133
134         private IProject getProject(IJavaElement element) {
135                 IJavaProject project= element.getJavaProject();
136                 if (project == null)
137                         return null;
138                 return project.getProject();
139         }
140
141         /**
142          * {@inheritDoc}
143          */
144         public TreePath[] getTreePaths(Object element) {
145                 if (element instanceof IWorkingSet) {
146                         TreePath path= new TreePath(new Object[] {element});
147                         return new TreePath[] {path};
148                 }
149                 List<Object> modelParents= getModelPath(element);
150                 List<TreePath> result= new ArrayList<TreePath>();
151                 for (int i= 0; i < modelParents.size(); i++) {
152                         result.addAll(getTreePaths(modelParents, i));
153                 }
154                 return result.toArray(new TreePath[result.size()]);
155         }
156
157         private List<Object> getModelPath(Object element) {
158                 List<Object> result= new ArrayList<Object>();
159                 result.add(element);
160                 Object parent= super.getParent(element);
161                 Object input= getViewerInput();
162                 // stop at input or on JavaModel. We never visualize it anyway.
163                 while (parent != null && !parent.equals(input) && !(parent instanceof IJavaModel)) {
164                         result.add(parent);
165                         parent= super.getParent(parent);
166                 }
167                 Collections.reverse(result);
168                 return result;
169         }
170
171         private List<TreePath> getTreePaths(List<Object> modelParents, int index) {
172                 List<TreePath> result= new ArrayList<TreePath>();
173                 Object input= getViewerInput();
174                 Object element= modelParents.get(index);
175                 Object[] parents= fWorkingSetModel.getAllParents(element);
176                 for (int i= 0; i < parents.length; i++) {
177                         List<Object> chain= new ArrayList<Object>();
178                         if (!parents[i].equals(input))
179                                 chain.add(parents[i]);
180                         for (int m= index; m < modelParents.size(); m++) {
181                                 chain.add(modelParents.get(m));
182                         }
183                         result.add(new TreePath(chain.toArray()));
184                 }
185                 return result;
186         }
187
188         /**
189          * {@inheritDoc}
190          */
191         @Override
192         public Object getParent(Object child) {
193                 Object[] parents= fWorkingSetModel.getAllParents(child);
194                 if(parents.length == 0)
195                         return super.getParent(child);
196                 Object first= parents[0];
197                 return first;
198         }
199
200         @Override
201         protected void augmentElementToRefresh(List<Object> toRefresh, int relation, Object affectedElement) {
202                 // we are refreshing the JavaModel and are in working set mode.
203                 if (JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()).equals(affectedElement)) {
204                         toRefresh.remove(affectedElement);
205                         toRefresh.add(fWorkingSetModel);
206                 } else if (relation == GRANT_PARENT) {
207                         Object parent= internalGetParent(affectedElement);
208                         if (parent != null) {
209                                 toRefresh.addAll(Arrays.asList(fWorkingSetModel.getAllParents(parent)));
210                         }
211                 }
212                 List<IAdaptable> nonProjetTopLevelElemens= fWorkingSetModel.getNonProjectTopLevelElements();
213                 if (nonProjetTopLevelElemens.isEmpty())
214                         return;
215                 List<Object> toAdd= new ArrayList<Object>();
216                 for (Iterator<IAdaptable> iter= nonProjetTopLevelElemens.iterator(); iter.hasNext();) {
217                         Object element= iter.next();
218                         if (isChildOf(element, toRefresh))
219                                 toAdd.add(element);
220                 }
221                 toRefresh.addAll(toAdd);
222         }
223
224         private void workingSetModelChanged(PropertyChangeEvent event) {
225                 String property= event.getProperty();
226                 Object newValue= event.getNewValue();
227                 List<Object> toRefresh= new ArrayList<Object>(1);
228                 if (WorkingSetModel.CHANGE_WORKING_SET_MODEL_CONTENT.equals(property)) {
229                         toRefresh.add(fWorkingSetModel);
230                 } else if (IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE.equals(property)) {
231                         toRefresh.add(newValue);
232                 } else if (IWorkingSetManager.CHANGE_WORKING_SET_LABEL_CHANGE.equals(property)) {
233                         toRefresh.add(newValue);
234                 }
235                 ArrayList<Runnable> runnables= new ArrayList<Runnable>();
236                 postRefresh(toRefresh, true, runnables);
237                 executeRunnables(runnables);
238         }
239
240         private boolean isChildOf(Object element, List<Object> potentialParents) {
241                 // Calling super get parent to bypass working set mapping
242                 Object parent= super.getParent(element);
243                 if (parent == null)
244                         return false;
245                 for (Iterator<Object> iter= potentialParents.iterator(); iter.hasNext();) {
246                         Object potentialParent= iter.next();
247                         while(parent != null) {
248                                 if (parent.equals(potentialParent))
249                                         return true;
250                                 parent= super.getParent(parent);
251                         }
252
253                 }
254                 return false;
255         }
256 }