/*******************************************************************************
* Copyright (c) 2005, 2007 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
*
*******************************************************************************/
package org.eclipse.vjet.eclipse.ui;
import org.eclipse.vjet.eclipse.core.IImportContainer;
import org.eclipse.vjet.eclipse.core.IImportDeclaration;
import org.eclipse.vjet.eclipse.core.IJSMethod;
import org.eclipse.vjet.eclipse.core.VjetPlugin;
import org.eclipse.vjet.eclipse.internal.core.util.Util;
import org.eclipse.dltk.mod.core.IField;
import org.eclipse.dltk.mod.core.IModelElement;
import org.eclipse.dltk.mod.core.IPackageDeclaration;
import org.eclipse.dltk.mod.core.IProjectFragment;
import org.eclipse.dltk.mod.core.ISourceModule;
import org.eclipse.dltk.mod.core.IType;
import org.eclipse.dltk.mod.core.ModelException;
import org.eclipse.dltk.mod.internal.core.IJSInitializer;
import org.eclipse.dltk.mod.internal.core.JSSourceFieldElementInfo;
import org.eclipse.dltk.mod.internal.core.JSSourceMethod;
import org.eclipse.dltk.mod.internal.core.JSSourceMethodElementInfo;
import org.eclipse.dltk.mod.internal.core.SourceField;
import org.eclipse.dltk.mod.internal.core.VjoLocalVariable;
import org.eclipse.dltk.mod.ui.ScriptElementLabels;
public class VjoElementLabels extends ScriptElementLabels {
private final static long QUALIFIER_FLAGS = P_COMPRESSED | USE_RESOLVED;
@Override
public void getElementLabel(IModelElement element, long flags,
StringBuffer buf) {
int type = element.getElementType();
switch (type) {
case IImportContainer.ELEMENT_TYPE:
buf.append("import declarations");
break;
case IImportDeclaration.ELEMENT_TYPE:
buf.append(element.getElementName());
break;
case IJSInitializer.ELEMENT_TYPE:
buf.append("{...}");
break;
case IModelElement.FIELD:
if (element instanceof VjoLocalVariable) {
getLocalVariableLabel((VjoLocalVariable) element, flags, buf);
} else if (element instanceof SourceField) {
getJsFieldLabel((SourceField) element,flags, buf);
}
break;
case IModelElement.METHOD:
if (element instanceof IJSMethod) {
getJsMethodLabel((IJSMethod) element, flags, buf);
}
break;
// add by Jack
case IModelElement.PROJECT_FRAGMENT: {
IProjectFragment root = (IProjectFragment) element;
if (root.isExternal() && Util.isNativeCacheDir(root.getPath())) {
if (root.isArchive() || Util.isNativeCacheDir(root.getPath())) {
buf.append(root.getPath().lastSegment() + "["+ VjetPlugin.DES_VJET_SDK + "]");
break;
}
}
}
// end add
default:
super.getElementLabel(element, flags, buf);
}
// if (element instanceof IField || element instanceof IMethod) {
//
// IType declaredType = ((IMember) element).getDeclaringType();
//
// if (showFullyQualifiedNames()) {
// buf.append(" - ");
// buf.append(declaredType.getFullyQualifiedName().replaceAll("/", "."));
// }
//
// }
}
private void getJsFieldLabel(SourceField field, long flags, StringBuffer buf) {
try {
// qualification
if (getFlag(flags, F_FULLY_QUALIFIED)) {
getTypeLabel(field.getDeclaringType(), T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS), buf);
buf.append('.');
}
getFieldNameAndType(field,buf);
// post qualification
if (getFlag(flags, F_POST_QUALIFIED)) {
buf.append(CONCAT_STRING);
getTypeLabel(field.getDeclaringType(), T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS), buf);
}
} catch (Exception e) {
e.printStackTrace();
// JavaPlugin.log(e); // NotExistsException will not reach this
// point
}
}
private void getFieldNameAndType(SourceField field, StringBuffer buf) {
buf.append(field.getElementName());
buf.append(" : ");
SourceField sourceField = (SourceField) field;
JSSourceFieldElementInfo elementInfo;
try {
elementInfo = (JSSourceFieldElementInfo) sourceField
.getElementInfo();
buf.append(elementInfo.getType());
} catch (ModelException e) {
buf.append("error determining type");
}
}
/**
* this method is copied from org.eclipse.dltk.mod.ui.ScriptElementLabels.getMethodLabel, and fix for bug 2637
* @param method
* @param flags
* @param buf
*/
private void getJsMethodLabel(IJSMethod method, long flags, StringBuffer buf) {
try {
// qualification
if (getFlag(flags, M_FULLY_QUALIFIED)) {
IType type = method.getDeclaringType();
if (type != null) {
getTypeLabel(type, T_FULLY_QUALIFIED
| (flags & QUALIFIER_FLAGS), buf);
buf.append(getTypeDelimiter());
}
}
buf.append(method.getElementName());
// parameters
buf.append('(');
if (getFlag(flags, M_PARAMETER_TYPES | M_PARAMETER_NAMES)) {
// TODO: Add type detection calls from here.
String[] names = null;
String[] initializers = null;
int nParams = 0;
// if (getFlag(flags, M_PARAMETER_NAMES) && method.exists()) {
// names = method.getParameters();
// initializers = method.getParameterInitializers();
// nParams = names.length;
// }
//fix 2637
if (getFlag(flags, M_PARAMETER_TYPES) && method.exists()) {
names = method.getParameterTypes();
initializers = method.getParameterInitializers();
nParams = names.length;
}
for (int i = 0; i < nParams; i++) {
if (i > 0) {
buf.append(COMMA_STRING);
}
if (names != null) {
buf.append(names[i]);
JSSourceMethodElementInfo elementInfo = (JSSourceMethodElementInfo)((JSSourceMethod)method).getElementInfo();
if (elementInfo.getIsVariables()[i])
buf.append("...");
}
if (getFlag(flags, M_PARAMETER_INITIALIZERS)
&& initializers != null && initializers[i] != null) {// &&
// initializers[i].length()
// > 0
// ) {
buf.append("=\"" + initializers[i] + "\""); //$NON-NLS-1$ //$NON-NLS-2$
}
}
} else {
String[] params = method.getParameters();
if (params.length > 0) {
buf.append(ELLIPSIS_STRING);
}
}
buf.append(')');
// post qualification
if (getFlag(flags, M_POST_QUALIFIED)) {
IType declaringType = method.getDeclaringType();
if (declaringType != null) {
buf.append(CONCAT_STRING);
getTypeLabel(declaringType, T_FULLY_QUALIFIED
| (flags & QUALIFIER_FLAGS), buf);
}
}
// TODO: Add return type method flag detection here,
// if( getFlag( flags, M_APP_RETURNTYPE ) && method.exists( ) ) {
if(method.getReturnType()!=null){
buf.append(" : ");
buf.append(method.getReturnType());
}
// }
} catch (ModelException e) {
e.printStackTrace();
}
}
// protected boolean showFullyQualifiedNames() {
// return false;
// }
// private IProjectFragment findProjectFragment(IModelElement element) {
// while (element != null
// && element.getElementType() != IModelElement.PROJECT_FRAGMENT) {
// element = element.getParent();
// }
// return (IProjectFragment) element;
// }
@Override
protected void getTypeLabel(IType type, long flags, StringBuffer buf) {
if(type==null)
return;
// IScriptProject project = type.getScriptProject();
//ebay comment
// if (getFlag(flags, T_FULLY_QUALIFIED)) {
//
// IResource resource = type.getResource();
// IProjectFragment pack = null;
// if (resource != null) {
// pack = project.getProjectFragment(resource);
// } else {
// pack = findProjectFragment(type);
// }
// if (pack == null) {
// pack = findProjectFragment(type);
// }
// getScriptFolderLabel(pack, (flags & QUALIFIER_FLAGS), buf);
//
//
// }
//ebay add start, treat like a java package but project fragment
if (getFlag(flags, T_FULLY_QUALIFIED)) {
IPackageDeclaration pkg=getPackage(type);
if(pkg!=null){
//IPackageFragment pack= type.getPackageFragment();
if (!pkg.getElementName().equals("")) {
buf.append(pkg.getElementName());
}else{
buf.append(DEFAULT_PACKAGE);
}
buf.append('.');
}
}//ebay add end
if (getFlag(flags, T_FULLY_QUALIFIED | T_CONTAINER_QUALIFIED)) {
IModelElement elem = type.getParent();
IType declaringType = (elem instanceof IType) ? (IType) elem : null;
if (declaringType != null) {
getTypeLabel(declaringType, T_CONTAINER_QUALIFIED
| (flags & QUALIFIER_FLAGS), buf);
buf.append(getTypeDelimiter());
}else{
int parentType = type.getParent().getElementType();
if (parentType == IModelElement.METHOD
|| parentType == IModelElement.FIELD) { // anonymous
// or
// local
getElementLabel(type.getParent(),
(parentType == IModelElement.METHOD ? M_FULLY_QUALIFIED
: F_FULLY_QUALIFIED)
| (flags & QUALIFIER_FLAGS), buf);
buf.append(getTypeDelimiter());
}
}
}
String typeName = type.getElementName();
if (typeName.length() == 0) { // anonymous
try {
if (type.getParent() instanceof IField) {
typeName = '{' + ELLIPSIS_STRING + '}';
} else {
String[] superNames = type.getSuperClasses();
if (superNames != null) {
int count = 0;
typeName += DECL_STRING;
for (int i = 0; i < superNames.length; ++i) {
if (count > 0) {
typeName += COMMA_STRING + " "; //$NON-NLS-1$
}
typeName += superNames[i];
count++;
}
}
}
} catch (ModelException e) {
// ignore
typeName = ""; //$NON-NLS-1$
}
}
buf.append(typeName);
// post qualification
if (getFlag(flags, T_POST_QUALIFIED)) {
IModelElement elem = type.getParent();
IType declaringType = (elem instanceof IType) ? (IType) elem : null;
if (declaringType != null) {
buf.append(CONCAT_STRING);
getTypeLabel(declaringType, T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS), buf);
int parentType = type.getParent().getElementType();
if (parentType == IModelElement.METHOD || parentType == IModelElement.FIELD) { // anonymous
// or
// local
buf.append(getTypeDelimiter());
getElementLabel(type.getParent(), 0, buf);
}
} else {
// ebay change
int parentType = type.getParent().getElementType();
if (parentType == IModelElement.METHOD || parentType == IModelElement.FIELD) { // anonymous
// or
// local
buf.append(CONCAT_STRING);
getElementLabel(type.getParent(), (parentType == IModelElement.METHOD ? M_FULLY_QUALIFIED : F_FULLY_QUALIFIED) | (flags & QUALIFIER_FLAGS),
buf);
}
if (parentType == IModelElement.SOURCE_MODULE || parentType == IModelElement.BINARY_MODULE) {
IPackageDeclaration pack = getPackage(type);
if (pack != null) {
buf.append(CONCAT_STRING);
if (!pack.getElementName().equals("")) {
buf.append(pack.getElementName());
}else{
buf.append(DEFAULT_PACKAGE);
}
}
}
}
}
}
private IPackageDeclaration getPackage(IType type) {
if (type == null)
return null;
ISourceModule jsModule = (ISourceModule) type.getAncestor(IModelElement.SOURCE_MODULE);
if (jsModule == null) {
return null;
}
int parentType = jsModule.getElementType();
if (parentType == IModelElement.SOURCE_MODULE
|| parentType == IModelElement.BINARY_MODULE) {
IPackageDeclaration pack = null;
try {
IPackageDeclaration[] pkgs = jsModule.getPackageDeclarations();
pack = pkgs.length > 0 ? pkgs[0] : null;
return pack;
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
private static final boolean getFlag(long flags, long flag) {
return (flags & flag) != 0;
}
/**
* Appends the label for a local variable to a {@link StringBuffer}.
*
* @param localVariable
* The element to render.
* @param flags
* The rendering flags. Flags with names starting with 'F_' are
* considered.
* @param buf
* The buffer to append the resulting label to.
*/
public static void getLocalVariableLabel(VjoLocalVariable localVariable,
long flags, StringBuffer buf) {
// if (getFlag(flags, F_PRE_TYPE_SIGNATURE)) {
// getTypeSignatureLabel(localVariable.getTypeSignature(), flags, buf);
// buf.append(' ');
// }
//
// if (getFlag(flags, F_FULLY_QUALIFIED)) {
// getElementLabel(localVariable.getParent(), M_PARAMETER_TYPES |
// M_FULLY_QUALIFIED | T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS),
// buf);
// buf.append('.');
// }
buf.append(localVariable.getElementName());
buf.append(" : ");
buf.append(localVariable.getTypeSignature());
// if (getFlag(flags, F_APP_TYPE_SIGNATURE)) {
// buf.append(DECL_STRING);
// getTypeSignatureLabel(localVariable.getTypeSignature(), flags, buf);
// }
//
// // post qualification
// if (getFlag(flags, F_POST_QUALIFIED)) {
// buf.append(CONCAT_STRING);
// getElementLabel(localVariable.getParent(), M_PARAMETER_TYPES |
// M_FULLY_QUALIFIED | T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS),
// buf);
// }
}
}