PageRenderTime 54ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/eclipse_SDK-3.7.1/plugins/org.eclipse.jdt.ui.source_3.7.1.r371_v20110824-0800/org/eclipse/jdt/internal/ui/browsing/PackagesViewHierarchicalContentProvider.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 648 lines | 502 code | 89 blank | 57 comment | 172 complexity | a3492a5c3f1e2d8a1ee7ddbd281cbbcd MD5 | raw file
  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.browsing;
  12. import java.util.ArrayList;
  13. import java.util.Arrays;
  14. import java.util.Iterator;
  15. import java.util.List;
  16. import org.eclipse.swt.widgets.Control;
  17. import org.eclipse.swt.widgets.Display;
  18. import org.eclipse.core.runtime.CoreException;
  19. import org.eclipse.core.runtime.IAdaptable;
  20. import org.eclipse.core.resources.IFolder;
  21. import org.eclipse.core.resources.IResource;
  22. import org.eclipse.jface.viewers.ITreeContentProvider;
  23. import org.eclipse.jface.viewers.StructuredViewer;
  24. import org.eclipse.jface.viewers.TreeViewer;
  25. import org.eclipse.jdt.core.ICompilationUnit;
  26. import org.eclipse.jdt.core.IJavaElement;
  27. import org.eclipse.jdt.core.IJavaElementDelta;
  28. import org.eclipse.jdt.core.IJavaProject;
  29. import org.eclipse.jdt.core.IPackageFragment;
  30. import org.eclipse.jdt.core.IPackageFragmentRoot;
  31. import org.eclipse.jdt.core.JavaCore;
  32. import org.eclipse.jdt.core.JavaModelException;
  33. import org.eclipse.jdt.internal.ui.JavaPlugin;
  34. /**
  35. * Tree content provider for the hierarchical layout in the packages view.
  36. * <p>
  37. * XXX: The standard Java browsing part content provider needs and calls
  38. * the browsing part/view. This class currently doesn't need to do so
  39. * but might be required to later.
  40. * </p>
  41. */
  42. class PackagesViewHierarchicalContentProvider extends LogicalPackagesProvider implements ITreeContentProvider {
  43. public PackagesViewHierarchicalContentProvider(StructuredViewer viewer){
  44. super(viewer);
  45. }
  46. /*
  47. * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object)
  48. */
  49. public Object[] getChildren(Object parentElement) {
  50. try {
  51. if (parentElement instanceof IJavaElement) {
  52. IJavaElement iJavaElement= (IJavaElement) parentElement;
  53. int type= iJavaElement.getElementType();
  54. switch (type) {
  55. case IJavaElement.JAVA_PROJECT :
  56. {
  57. //create new element mapping
  58. fMapToLogicalPackage.clear();
  59. fMapToPackageFragments.clear();
  60. IJavaProject project= (IJavaProject) parentElement;
  61. IPackageFragment[] topLevelChildren= getTopLevelChildrenByElementName(project.getPackageFragments());
  62. List<IPackageFragment> list= new ArrayList<IPackageFragment>();
  63. for (int i= 0; i < topLevelChildren.length; i++) {
  64. IPackageFragment fragment= topLevelChildren[i];
  65. IJavaElement el= fragment.getParent();
  66. if (el instanceof IPackageFragmentRoot) {
  67. IPackageFragmentRoot root= (IPackageFragmentRoot) el;
  68. if (!root.isArchive() || !root.isExternal())
  69. list.add(fragment);
  70. }
  71. }
  72. IPackageFragmentRoot[] packageFragmentRoots= project.getPackageFragmentRoots();
  73. List<Object> folders= new ArrayList<Object>();
  74. for (int i= 0; i < packageFragmentRoots.length; i++) {
  75. IPackageFragmentRoot root= packageFragmentRoots[i];
  76. IResource resource= root.getUnderlyingResource();
  77. if (resource != null && resource instanceof IFolder) {
  78. folders.addAll(getFolders(((IFolder)resource).members()));
  79. }
  80. }
  81. Object[] logicalPackages= combineSamePackagesIntoLogialPackages(list.toArray(new IPackageFragment[list.size()]));
  82. if (folders.size() > 0) {
  83. if (logicalPackages.length > 0)
  84. folders.addAll(Arrays.asList(logicalPackages));
  85. return folders.toArray();
  86. } else {
  87. return logicalPackages;
  88. }
  89. }
  90. case IJavaElement.PACKAGE_FRAGMENT_ROOT :
  91. {
  92. IPackageFragmentRoot root= (IPackageFragmentRoot) parentElement;
  93. //create new element mapping
  94. fMapToLogicalPackage.clear();
  95. fMapToPackageFragments.clear();
  96. IResource resource= root.getUnderlyingResource();
  97. if (root.isArchive() || root.isExternal()) {
  98. IPackageFragment[] fragments= new IPackageFragment[0];
  99. IJavaElement[] els= root.getChildren();
  100. fragments= getTopLevelChildrenByElementName(els);
  101. addFragmentsToMap(fragments);
  102. return fragments;
  103. } else if (resource != null && resource instanceof IFolder) {
  104. List<IAdaptable> children= getFoldersAndElements(((IFolder)resource).members());
  105. IPackageFragment defaultPackage= root.getPackageFragment(""); //$NON-NLS-1$
  106. if(defaultPackage.exists())
  107. children.add(defaultPackage);
  108. addFragmentsToMap(children);
  109. return children.toArray();
  110. } else {
  111. return NO_CHILDREN;
  112. }
  113. }
  114. case IJavaElement.PACKAGE_FRAGMENT :
  115. {
  116. IPackageFragment packageFragment= (IPackageFragment) parentElement;
  117. if (packageFragment.isDefaultPackage())
  118. return NO_CHILDREN;
  119. IPackageFragmentRoot parent= (IPackageFragmentRoot) packageFragment.getParent();
  120. IPackageFragment[] fragments= findNextLevelChildrenByElementName(parent, packageFragment);
  121. addFragmentsToMap(fragments);
  122. Object[] nonJavaResources= packageFragment.getNonJavaResources();
  123. if (nonJavaResources.length == 0) {
  124. return fragments;
  125. }
  126. ArrayList<Object> combined= new ArrayList<Object>();
  127. combined.addAll(Arrays.asList(fragments));
  128. for (int i= 0; i < nonJavaResources.length; i++) {
  129. Object curr= nonJavaResources[i];
  130. if (curr instanceof IFolder) {
  131. combined.add(curr);
  132. }
  133. }
  134. return combined.toArray();
  135. }
  136. }
  137. //@Improve: rewrite using concatenate
  138. } else if (parentElement instanceof LogicalPackage) {
  139. List<IPackageFragment> children= new ArrayList<IPackageFragment>();
  140. LogicalPackage logicalPackage= (LogicalPackage) parentElement;
  141. IPackageFragment[] elements= logicalPackage.getFragments();
  142. for (int i= 0; i < elements.length; i++) {
  143. IPackageFragment fragment= elements[i];
  144. IPackageFragment[] objects= findNextLevelChildrenByElementName((IPackageFragmentRoot) fragment.getParent(), fragment);
  145. children.addAll(Arrays.asList(objects));
  146. }
  147. return combineSamePackagesIntoLogialPackages(children.toArray(new IPackageFragment[children.size()]));
  148. } else if (parentElement instanceof IFolder) {
  149. IFolder folder= (IFolder)parentElement;
  150. IResource[] resources= folder.members();
  151. List<IAdaptable> children = getFoldersAndElements(resources);
  152. addFragmentsToMap(children);
  153. return children.toArray();
  154. }
  155. } catch (JavaModelException e) {
  156. return NO_CHILDREN;
  157. } catch (CoreException e) {
  158. return NO_CHILDREN;
  159. }
  160. return NO_CHILDREN;
  161. }
  162. private void addFragmentsToMap(List<IAdaptable> elements) {
  163. List<Object> packageFragments= new ArrayList<Object>();
  164. for (Iterator<IAdaptable> iter= elements.iterator(); iter.hasNext();) {
  165. Object elem= iter.next();
  166. if (elem instanceof IPackageFragment)
  167. packageFragments.add(elem);
  168. }
  169. addFragmentsToMap(packageFragments.toArray(new IPackageFragment[packageFragments.size()]));
  170. }
  171. private List<IAdaptable> getFoldersAndElements(IResource[] resources) {
  172. List<IAdaptable> list= new ArrayList<IAdaptable>();
  173. for (int i= 0; i < resources.length; i++) {
  174. IResource resource= resources[i];
  175. if (resource instanceof IFolder) {
  176. IFolder folder= (IFolder) resource;
  177. IJavaElement element= JavaCore.create(folder);
  178. if (element instanceof IPackageFragment) {
  179. list.add(element);
  180. } else {
  181. list.add(folder);
  182. }
  183. }
  184. }
  185. return list;
  186. }
  187. private List<IFolder> getFolders(IResource[] resources) {
  188. List<IFolder> list= new ArrayList<IFolder>();
  189. for (int i= 0; i < resources.length; i++) {
  190. IResource resource= resources[i];
  191. if (resource instanceof IFolder) {
  192. IFolder folder= (IFolder) resource;
  193. IJavaElement element= JavaCore.create(folder);
  194. if (element == null) {
  195. list.add(folder);
  196. }
  197. }
  198. }
  199. return list;
  200. }
  201. private IPackageFragment[] findNextLevelChildrenByElementName(IPackageFragmentRoot parent, IPackageFragment fragment) {
  202. List<IPackageFragment> list= new ArrayList<IPackageFragment>();
  203. try {
  204. IJavaElement[] children= parent.getChildren();
  205. String fragmentname= fragment.getElementName();
  206. for (int i= 0; i < children.length; i++) {
  207. IJavaElement element= children[i];
  208. if (element instanceof IPackageFragment) {
  209. IPackageFragment frag= (IPackageFragment) element;
  210. String name= element.getElementName();
  211. if (name.length() > fragmentname.length() && name.charAt(fragmentname.length()) == '.' && frag.exists() && !IPackageFragment.DEFAULT_PACKAGE_NAME.equals(fragmentname) && name.startsWith(fragmentname) && !name.equals(fragmentname)) {
  212. String tail= name.substring(fragmentname.length() + 1);
  213. if (!IPackageFragment.DEFAULT_PACKAGE_NAME.equals(tail) && tail.indexOf('.') == -1) {
  214. list.add(frag);
  215. }
  216. }
  217. }
  218. }
  219. } catch (JavaModelException e) {
  220. JavaPlugin.log(e);
  221. }
  222. return list.toArray(new IPackageFragment[list.size()]);
  223. }
  224. private IPackageFragment[] getTopLevelChildrenByElementName(IJavaElement[] elements){
  225. List<IJavaElement> topLevelElements= new ArrayList<IJavaElement>();
  226. for (int i= 0; i < elements.length; i++) {
  227. IJavaElement iJavaElement= elements[i];
  228. //if the name of the PackageFragment is the top level package it will contain no "." separators
  229. if (iJavaElement instanceof IPackageFragment && iJavaElement.getElementName().indexOf('.')==-1){
  230. topLevelElements.add(iJavaElement);
  231. }
  232. }
  233. return topLevelElements.toArray(new IPackageFragment[topLevelElements.size()]);
  234. }
  235. /*
  236. * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(Object)
  237. */
  238. public Object getParent(Object element) {
  239. if (element instanceof IPackageFragment) {
  240. IPackageFragment fragment= (IPackageFragment) element;
  241. if(!fragment.exists())
  242. return null;
  243. Object parent= getHierarchicalParent(fragment);
  244. if(parent instanceof IPackageFragment) {
  245. IPackageFragment pkgFragment= (IPackageFragment)parent;
  246. LogicalPackage logicalPkg= findLogicalPackage(pkgFragment);
  247. if (logicalPkg != null)
  248. return logicalPkg;
  249. else {
  250. LogicalPackage lp= createLogicalPackage(pkgFragment);
  251. if(lp == null)
  252. return pkgFragment;
  253. else return lp;
  254. }
  255. }
  256. return parent;
  257. } else if(element instanceof LogicalPackage){
  258. LogicalPackage el= (LogicalPackage) element;
  259. IPackageFragment fragment= el.getFragments()[0];
  260. Object parent= getHierarchicalParent(fragment);
  261. if(parent instanceof IPackageFragment){
  262. IPackageFragment pkgFragment= (IPackageFragment) parent;
  263. LogicalPackage logicalPkg= findLogicalPackage(pkgFragment);
  264. if (logicalPkg != null)
  265. return logicalPkg;
  266. else {
  267. LogicalPackage lp= createLogicalPackage(pkgFragment);
  268. if(lp == null)
  269. return pkgFragment;
  270. else return lp;
  271. }
  272. } else
  273. return fragment.getJavaProject();
  274. } else if (element instanceof IFolder) {
  275. IFolder folder = (IFolder) element;
  276. IResource res = folder.getParent();
  277. IJavaElement el = JavaCore.create(res);
  278. if (el != null) {
  279. return el;
  280. } else {
  281. return res;
  282. }
  283. }
  284. return null;
  285. }
  286. /*
  287. * Check if the given IPackageFragment should be the member of a
  288. * LogicalPackage and if so creates the LogicalPackage and adds it to the
  289. * map.
  290. */
  291. private LogicalPackage createLogicalPackage(IPackageFragment pkgFragment) {
  292. if(!fInputIsProject)
  293. return null;
  294. List<IPackageFragment> fragments= new ArrayList<IPackageFragment>();
  295. try {
  296. IPackageFragmentRoot[] roots= pkgFragment.getJavaProject().getPackageFragmentRoots();
  297. for (int i= 0; i < roots.length; i++) {
  298. IPackageFragmentRoot root= roots[i];
  299. IPackageFragment fragment= root.getPackageFragment(pkgFragment.getElementName());
  300. if(fragment.exists() && !fragment.equals(pkgFragment))
  301. fragments.add(fragment);
  302. }
  303. if(!fragments.isEmpty()) {
  304. LogicalPackage logicalPackage= new LogicalPackage(pkgFragment);
  305. fMapToLogicalPackage.put(getKey(pkgFragment), logicalPackage);
  306. Iterator<IPackageFragment> iter= fragments.iterator();
  307. while(iter.hasNext()){
  308. IPackageFragment f= iter.next();
  309. if(logicalPackage.belongs(f)){
  310. logicalPackage.add(f);
  311. fMapToLogicalPackage.put(getKey(f), logicalPackage);
  312. }
  313. }
  314. return logicalPackage;
  315. }
  316. } catch (JavaModelException e) {
  317. JavaPlugin.log(e);
  318. }
  319. return null;
  320. }
  321. private Object getHierarchicalParent(IPackageFragment fragment) {
  322. IJavaElement parent= fragment.getParent();
  323. if ((parent instanceof IPackageFragmentRoot) && parent.exists()) {
  324. IPackageFragmentRoot root= (IPackageFragmentRoot) parent;
  325. if (root.isArchive() || root.isExternal() || !fragment.exists()) {
  326. return findNextLevelParentByElementName(fragment);
  327. } else {
  328. IResource resource= fragment.getResource();
  329. if ((resource != null) && (resource instanceof IFolder)) {
  330. IFolder folder= (IFolder) resource;
  331. IResource res= folder.getParent();
  332. IJavaElement el= JavaCore.create(res);
  333. if (el != null) {
  334. return el;
  335. } else {
  336. return res;
  337. }
  338. }
  339. }
  340. }
  341. return parent;
  342. }
  343. private Object findNextLevelParentByElementName(IPackageFragment child) {
  344. String name= child.getElementName();
  345. int index= name.lastIndexOf('.');
  346. if (index != -1) {
  347. String realParentName= name.substring(0, index);
  348. IPackageFragment element= ((IPackageFragmentRoot) child.getParent()).getPackageFragment(realParentName);
  349. if (element.exists()) {
  350. return element;
  351. }
  352. }
  353. return child.getParent();
  354. }
  355. /*
  356. * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(Object)
  357. */
  358. public boolean hasChildren(Object element) {
  359. if (element instanceof IPackageFragment) {
  360. IPackageFragment fragment= (IPackageFragment) element;
  361. if(fragment.isDefaultPackage() || !fragment.exists())
  362. return false;
  363. }
  364. return getChildren(element).length > 0;
  365. }
  366. /*
  367. * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
  368. */
  369. public Object[] getElements(Object inputElement) {
  370. return getChildren(inputElement);
  371. }
  372. @Override
  373. protected void processDelta(IJavaElementDelta delta) throws JavaModelException {
  374. int kind = delta.getKind();
  375. final IJavaElement element = delta.getElement();
  376. if (isClassPathChange(delta)) {
  377. Object input= fViewer.getInput();
  378. if (input != null) {
  379. if (fInputIsProject && input.equals(element.getJavaProject())) {
  380. postRefresh(input);
  381. return;
  382. } else if (!fInputIsProject && input.equals(element)) {
  383. if (element.exists())
  384. postRefresh(input);
  385. else
  386. postRemove(input);
  387. return;
  388. }
  389. }
  390. }
  391. if (kind == IJavaElementDelta.REMOVED) {
  392. Object input= fViewer.getInput();
  393. if (input != null && input.equals(element)) {
  394. postRemove(input);
  395. return;
  396. }
  397. }
  398. if (element instanceof IPackageFragment) {
  399. final IPackageFragment frag = (IPackageFragment) element;
  400. //if fragment was in LogicalPackage refresh,
  401. //otherwise just remove
  402. if (kind == IJavaElementDelta.REMOVED) {
  403. removeElement(frag);
  404. return;
  405. } else if (kind == IJavaElementDelta.ADDED) {
  406. Object parent= getParent(frag);
  407. addElement(frag, parent);
  408. return;
  409. } else if (kind == IJavaElementDelta.CHANGED) {
  410. //just refresh
  411. LogicalPackage logicalPkg= findLogicalPackage(frag);
  412. //in case changed object is filtered out
  413. if (logicalPkg != null)
  414. postRefresh(findElementToRefresh(logicalPkg));
  415. else
  416. postRefresh(findElementToRefresh(frag));
  417. return;
  418. }
  419. }
  420. processAffectedChildren(delta);
  421. }
  422. private Object findElementToRefresh(Object object) {
  423. Object toBeRefreshed= object;
  424. if (fViewer.testFindItem(object) == null) {
  425. Object parent= getParent(object);
  426. if(parent instanceof IPackageFragmentRoot && fInputIsProject)
  427. parent= ((IPackageFragmentRoot)parent).getJavaProject();
  428. if(parent != null)
  429. toBeRefreshed= parent;
  430. }
  431. return toBeRefreshed;
  432. }
  433. private void processAffectedChildren(IJavaElementDelta delta) throws JavaModelException {
  434. IJavaElementDelta[] affectedChildren = delta.getAffectedChildren();
  435. for (int i = 0; i < affectedChildren.length; i++) {
  436. if (!(affectedChildren[i] instanceof ICompilationUnit)) {
  437. processDelta(affectedChildren[i]);
  438. }
  439. }
  440. }
  441. private void postAdd(final Object child, final Object parent) {
  442. postRunnable(new Runnable() {
  443. public void run() {
  444. Control ctrl = fViewer.getControl();
  445. if (ctrl != null && !ctrl.isDisposed()) {
  446. ((TreeViewer)fViewer).add(parent, child);
  447. }
  448. }
  449. });
  450. }
  451. private void postRemove(final Object object) {
  452. postRunnable(new Runnable() {
  453. public void run() {
  454. Control ctrl = fViewer.getControl();
  455. if (ctrl != null && !ctrl.isDisposed()) {
  456. ((TreeViewer)fViewer).remove(object);
  457. }
  458. }
  459. });
  460. }
  461. private void postRefresh(final Object object) {
  462. postRunnable(new Runnable() {
  463. public void run() {
  464. Control ctrl= fViewer.getControl();
  465. if (ctrl != null && !ctrl.isDisposed()) {
  466. ((TreeViewer) fViewer).refresh(object);
  467. }
  468. }
  469. });
  470. }
  471. private void postRunnable(final Runnable r) {
  472. Control ctrl= fViewer.getControl();
  473. if (ctrl != null && !ctrl.isDisposed()) {
  474. // fBrowsingPart.setProcessSelectionEvents(false);
  475. try {
  476. Display currentDisplay= Display.getCurrent();
  477. if (currentDisplay != null && currentDisplay.equals(ctrl.getDisplay()))
  478. ctrl.getDisplay().syncExec(r);
  479. else
  480. ctrl.getDisplay().asyncExec(r);
  481. } finally {
  482. // fBrowsingPart.setProcessSelectionEvents(true);
  483. }
  484. }
  485. }
  486. private void addElement(IPackageFragment frag, Object parent) {
  487. String key= getKey(frag);
  488. LogicalPackage lp= fMapToLogicalPackage.get(key);
  489. //if fragment must be added to an existing LogicalPackage
  490. if (lp != null && lp.belongs(frag)){
  491. lp.add(frag);
  492. return;
  493. }
  494. //if a new LogicalPackage must be created
  495. IPackageFragment iPackageFragment= fMapToPackageFragments.get(key);
  496. if (iPackageFragment!= null && !iPackageFragment.equals(frag)){
  497. lp= new LogicalPackage(iPackageFragment);
  498. lp.add(frag);
  499. //add new LogicalPackage to LogicalPackages map
  500. fMapToLogicalPackage.put(key, lp);
  501. //determine who to refresh
  502. if (parent instanceof IPackageFragmentRoot){
  503. IPackageFragmentRoot root= (IPackageFragmentRoot) parent;
  504. if (fInputIsProject){
  505. postRefresh(root.getJavaProject());
  506. } else {
  507. postRefresh(root);
  508. }
  509. } else {
  510. //@Improve: Should this be replaced by a refresh?
  511. postAdd(lp, parent);
  512. postRemove(iPackageFragment);
  513. }
  514. }
  515. //if this is a new Package Fragment
  516. else {
  517. fMapToPackageFragments.put(key, frag);
  518. //determine who to refresh
  519. if (parent instanceof IPackageFragmentRoot) {
  520. IPackageFragmentRoot root= (IPackageFragmentRoot) parent;
  521. if (fInputIsProject) {
  522. postAdd(frag, root.getJavaProject());
  523. } else
  524. postAdd(frag, root);
  525. } else {
  526. postAdd(frag, parent);
  527. }
  528. }
  529. }
  530. private void removeElement(IPackageFragment frag) {
  531. String key= getKey(frag);
  532. LogicalPackage lp= fMapToLogicalPackage.get(key);
  533. if(lp != null){
  534. lp.remove(frag);
  535. //if the LogicalPackage needs to revert back to a PackageFragment
  536. //remove it from the LogicalPackages map and add the PackageFragment
  537. //to the PackageFragment map
  538. if (lp.getFragments().length == 1) {
  539. IPackageFragment fragment= lp.getFragments()[0];
  540. fMapToPackageFragments.put(key, fragment);
  541. fMapToLogicalPackage.remove(key);
  542. //remove the LogicalPackage from viewer
  543. postRemove(lp);
  544. Object parent= getParent(fragment);
  545. if (parent instanceof IPackageFragmentRoot) {
  546. parent= ((IPackageFragmentRoot)parent).getJavaProject();
  547. }
  548. postAdd(fragment, parent);
  549. }
  550. } else {
  551. //remove the fragment from the fragment map and viewer
  552. IPackageFragment fragment= fMapToPackageFragments.get(key);
  553. if (fragment!= null && fragment.equals(frag)) {
  554. fMapToPackageFragments.remove(key);
  555. postRemove(frag);
  556. }
  557. }
  558. }
  559. }