/******************************************************************************* * Copyright (c) 2009 xored software, Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * xored software, Inc. - initial API and Implementation (Alex Panchenko) *******************************************************************************/ package org.eclipse.dltk.tcl.activestatedebugger.preferences; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.IProjectFragment; import org.eclipse.dltk.core.IScriptFolder; import org.eclipse.dltk.core.IScriptProject; import org.eclipse.dltk.core.ModelException; import org.eclipse.dltk.ui.StandardModelElementContentProvider2; import org.eclipse.jface.viewers.Viewer; import org.eclipse.ui.model.IWorkbenchAdapter; public class InstrumentationContentProvider extends StandardModelElementContentProvider2 { public InstrumentationContentProvider() { super(false, false); } private boolean fIsFlatLayout = false; private Object input; @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.input = newInput; } @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof SelectionDialogInput) { final SelectionDialogInput input = (SelectionDialogInput) inputElement; final Set<IScriptProject> projects = input.collectProjects(); final List<Object> result = new ArrayList<Object>(); result.addAll(projects); final LibraryContainerElement libContainer = new LibraryContainerElement( input); if (libContainer.getChildren().length != 0) { result.add(libContainer); } final PackageContainerElement packageContainer = new PackageContainerElement( input); if (packageContainer.getChildren().length != 0) { result.add(packageContainer); } final SourceContainerElement sourceContainer = new SourceContainerElement( input); if (sourceContainer.getChildren().length != 0) { result.add(sourceContainer); } return result.toArray(); } return NO_CHILDREN; } @Override protected boolean isValidProjectFragment(IProjectFragment root) { return !root.isExternal(); } @Override protected Object internalGetParent(Object element) { if (element instanceof IScriptProject) { return null; } if (element instanceof IProjectFragment && LibraryContainerElement.isValid((IProjectFragment) element)) { return new LibraryContainerElement((SelectionDialogInput) input); } if (element instanceof PackageElement) { return new PackageContainerElement((SelectionDialogInput) input); } if (element instanceof SourceElement) { return new SourceContainerElement((SelectionDialogInput) input); } if (!fIsFlatLayout && element instanceof IScriptFolder) { return getHierarchicalPackageParent((IScriptFolder) element); } return super.internalGetParent(element); } @Override public Object[] getChildren(Object element) { if (element instanceof IWorkbenchAdapter) { return ((IWorkbenchAdapter) element).getChildren(element); } else { return super.getChildren(element); } } @Override protected Object[] getProjectFragmentContent(final IProjectFragment root) throws ModelException { if (fIsFlatLayout) { return super.getProjectFragmentContent(root); } // hierarchical package mode final ArrayList<Object> result = new ArrayList<Object>(); getHierarchicalPackageChildren(root, null, result); if (fForeignResources && !isProjectProjectFragment(root)) { final Object[] nonJavaResources = root.getForeignResources(); for (int i = 0; i < nonJavaResources.length; i++) { result.add(nonJavaResources[i]); } } return result.toArray(); } @Override protected Object[] getScriptFolderContent(final IScriptFolder fragment) throws ModelException { if (fIsFlatLayout) { return super.getScriptFolderContent(fragment); } // hierarchical package mode ArrayList<Object> result = new ArrayList<Object>(); getHierarchicalPackageChildren((IProjectFragment) fragment.getParent(), fragment, result); Object[] nonPackages = super.getScriptFolderContent(fragment); if (result.isEmpty()) { return nonPackages; } for (int i = 0; i < nonPackages.length; i++) { result.add(nonPackages[i]); } return result.toArray(); } /** * Returns the hierarchical packages inside a given fragment or root. * * @param parent * The parent package fragment root * @param fragment * The package to get the children for or 'null' to get the * children of the root. * @param result * Collection where the resulting elements are added * @throws JavaModelException */ @SuppressWarnings("unchecked") private void getHierarchicalPackageChildren(final IProjectFragment parent, final IScriptFolder fragment, final Collection result) throws ModelException { IModelElement[] children = parent.getChildren(); List<IModelElement> newElements = new ArrayList<IModelElement>(); if (fragment == null || fragment.isRootFolder()) { for (int i = 0; i < children.length; ++i) { if (children[i] instanceof IScriptFolder) { IScriptFolder scriptFolder = ((IScriptFolder) children[i]); if (scriptFolder.isRootFolder()) { IModelElement[] members = scriptFolder.getChildren(); for (int j = 0; j < members.length; ++j) { newElements.add(members[j]); } continue; } } newElements.add(children[i]); } children = newElements .toArray(new IModelElement[newElements.size()]); } String prefix = fragment != null ? fragment.getElementName() + IScriptFolder.PACKAGE_DELIMETER_STR : ""; //$NON-NLS-1$ int prefixLen = prefix.length(); for (int i = 0; i < children.length; i++) { if (children[i] instanceof IScriptFolder) { IScriptFolder curr = (IScriptFolder) children[i]; String name = curr.getElementName(); if (name.startsWith(prefix) && name.length() > prefixLen && name.indexOf(IScriptFolder.PACKAGE_DELIMITER, prefixLen) == -1) { // if (fFoldPackages) { // curr = ScriptExplorerContentProvider.getFolded( // children, curr); // } result.add(curr); } /* * else if (fragment == null && curr.isRootFolder()) { * result.add(curr); } */ } else { result.add(children[i]); } } } public Object getHierarchicalPackageParent(final IScriptFolder child) { String name = child.getElementName(); IProjectFragment parent = (IProjectFragment) child.getParent(); int index = name.lastIndexOf(IScriptFolder.PACKAGE_DELIMITER); if (index != -1) { String realParentName = name.substring(0, index); IScriptFolder element = parent.getScriptFolder(realParentName); if (element.exists()) { // try { // if (fFoldPackages // && ScriptExplorerContentProvider.isEmpty(element) // && ScriptExplorerContentProvider // .findSinglePackageChild(element, parent // .getChildren()) != null) { // return getHierarchicalPackageParent(element); // } // } catch (ModelException e) { // ignore // } return element; } else { // bug 65240 IResource resource = element.getResource(); if (resource != null) { return resource; } } } if (parent.getResource() instanceof IProject) { return parent.getScriptProject(); } return parent; } }