/*******************************************************************************
* Copyright (c) 2007, 2010 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/**
*
*/
package org.eclipse.wst.jsdt.internal.ui.packageview;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.wst.jsdt.core.IClassFile;
import org.eclipse.wst.jsdt.core.IJavaScriptElement;
import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
import org.eclipse.wst.jsdt.core.IPackageFragment;
import org.eclipse.wst.jsdt.core.IPackageFragmentRoot;
import org.eclipse.wst.jsdt.core.IParent;
import org.eclipse.wst.jsdt.core.IType;
import org.eclipse.wst.jsdt.core.JavaScriptModelException;
import org.eclipse.wst.jsdt.internal.ui.JavaPluginImages;
public class NamespaceGroup implements IAdaptable {
String fNamePrefix;
int fNamePrefixLength;
private IPackageFragmentRoot fPackageFragmentRoot;
private PackageFragmentRootContainer fPackageFragmentRootContainer;
private IJavaScriptUnit fJavaScriptUnit;
public static final class WorkBenchAdapter implements IWorkbenchAdapter {
private static final String EMPTY_STRING = ""; //$NON-NLS-1$
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object
* )
*/
public Object[] getChildren(Object o) {
if (o instanceof NamespaceGroup)
return ((NamespaceGroup) o).getChildren();
return new Object[0];
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.
* lang.Object)
*/
public ImageDescriptor getImageDescriptor(Object object) {
return JavaPluginImages.DESC_OBJS_LOGICAL_PACKAGE;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
*/
public String getLabel(Object o) {
if (o instanceof NamespaceGroup) {
return ((NamespaceGroup) o).fNamePrefix;
}
return EMPTY_STRING;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
*/
public Object getParent(Object o) {
// TODO Auto-generated method stub
System.out.println("Unimplemented method:WorkBenchAdapter.getParent"); //$NON-NLS-1$
return null;
}
}
/**
* <p>Create a {@link NamespaceGroup} with a {@link IPackageFragmentRoot} as the parent</p>
*
* @param root parent of this group
* @param prefix the prefix of this group
*/
public NamespaceGroup(IPackageFragmentRoot root, String prefix) {
fPackageFragmentRoot = root;
fNamePrefix = prefix;
fNamePrefixLength = fNamePrefix.length();
this.fJavaScriptUnit = null;
}
/**
* <p>Create a {@link NamespaceGroup} with a {@link PackageFragmentRootContainer} as the parent</p>
*
* @param root parent of this group
* @param prefix the prefix of this group
*/
public NamespaceGroup(PackageFragmentRootContainer root, String prefix) {
fPackageFragmentRootContainer = root;
fNamePrefix = prefix;
fNamePrefixLength = fNamePrefix.length();
this.fJavaScriptUnit = null;
}
/**
* <p>Create a {@link NamespaceGroup} with a {@link IJavaScriptUnit} as the parent</p>
*
* @param unit parent of this group
* @param prefix the prefix of this group
*/
public NamespaceGroup(IJavaScriptUnit unit, String prefix) {
fNamePrefix = prefix;
fNamePrefixLength = fNamePrefix.length();
this.fJavaScriptUnit = unit;
}
/**
* @return If this group has a {@link IPackageFragmentRoot} as its parent then
* returns that parent, else returns <code>null</code>
*/
public IPackageFragmentRoot getPackageFragmentRoot() {
return fPackageFragmentRoot;
}
/**
* @return If this group has a {@link PackageFragmentRootContainer} as its parent then
* returns that parent, else returns <code>null</code>
*/
public PackageFragmentRootContainer getPackageFragmentRootContainer() {
return fPackageFragmentRootContainer;
}
/**
* @return If this group has a {@link IJavaScriptUnit} as its parent then
* returns that parent, else returns <code>null</code>
*/
public IJavaScriptUnit getJavaScriptUnit() {
return this.fJavaScriptUnit;
}
Object getParent() {
if (fPackageFragmentRoot != null)
return fPackageFragmentRoot;
if (fPackageFragmentRootContainer != null)
return fPackageFragmentRootContainer;
if(fJavaScriptUnit != null) {
return this.fJavaScriptUnit;
}
return null;
}
private int computeParentHash() {
if (fPackageFragmentRoot != null)
return fPackageFragmentRoot.hashCode();
if (fPackageFragmentRootContainer != null)
return fPackageFragmentRootContainer.hashCode();
return 0;
}
public String getText() {
return fNamePrefix;
}
public boolean equals(Object obj) {
if (obj instanceof NamespaceGroup && getParent() != null) {
return fNamePrefix.equals(((NamespaceGroup) obj).fNamePrefix) && getParent().equals(((NamespaceGroup) obj).getParent());
}
return super.equals(obj);
}
public int hashCode() {
return computeParentHash() + super.hashCode();
}
/*
* Copied from org.eclipse.wst.jsdt.ui.StandardJavaScriptElementContentProvider
*/
protected IJavaScriptElement[] filter(IJavaScriptElement[] children) {
boolean initializers= false;
for (int i= 0; i < children.length; i++) {
if (matches(children[i])) {
initializers= true;
break;
}
}
if (!initializers)
return children;
List v= new ArrayList();
for (int i= 0; i < children.length; i++) {
if (matches(children[i]))
continue;
v.add(children[i]);
}
IJavaScriptElement[] result = (IJavaScriptElement[]) v.toArray(new IJavaScriptElement[v.size()]);
return result;
}
/*
* Copied from org.eclipse.wst.jsdt.ui.StandardJavaScriptElementContentProvider
*/
protected boolean matches(IJavaScriptElement element) {
if (element.getElementType() == IJavaScriptElement.TYPE && (element.getParent().getElementType() == IJavaScriptElement.JAVASCRIPT_UNIT || element.getParent().getElementType() == IJavaScriptElement.CLASS_FILE)) {
IType type = (IType) element;
try {
return type.isAnonymous();
}
catch (JavaScriptModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return false;
}
public Object[] getChildren() {
Object[] children = null;
try {
children = ((IParent)this.getParent()).getChildren();
}
catch (JavaScriptModelException ex1) {
// TODO Auto-generated catch block
ex1.printStackTrace();
}
if (children == null)
return null;
List allChildren = new ArrayList();
boolean unique = false;
try {
while (!unique && children != null && children.length > 0) {
for (int i = 0; i < children.length; i++) {
String display1 = ((IJavaScriptElement) children[0]).getDisplayName();
String display2 = ((IJavaScriptElement) children[i]).getDisplayName();
if (!((display1 == display2) || (display1 != null && display1.compareTo(display2) == 0))) {
allChildren.addAll(Arrays.asList(children));
unique = true;
break;
}
}
List more = new ArrayList();
for (int i = 0; !unique && i < children.length; i++) {
if (children[i] instanceof IPackageFragment) {
more.addAll(Arrays.asList(((IPackageFragment) children[i]).getChildren()));
}
else if (children[i] instanceof IPackageFragmentRoot) {
more.addAll(Arrays.asList(((IPackageFragmentRoot) children[i]).getChildren()));
}
else if (children[i] instanceof IClassFile) {
more.addAll(Arrays.asList(filter(((IClassFile) children[i]).getChildren())));
}
else if (children[i] instanceof IJavaScriptUnit) {
more.addAll(Arrays.asList(filter(((IJavaScriptUnit) children[i]).getChildren())));
}
else {
/* bottomed out, now at javaElement level */
unique = true;
break;
}
}
if (!unique)
children = more.toArray();
}
}
catch (JavaScriptModelException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
return allChildren.toArray();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class adapter) {
if (adapter == IWorkbenchAdapter.class) {
return new WorkBenchAdapter();
}
// else if (adapter == IProject.class) {
// return getParent().getProject().getProject();
// }
return Platform.getAdapterManager().getAdapter(this, adapter);
}
public String toString() {
return "Namespacegroup: " + fNamePrefix; //$NON-NLS-1$
}
}