blob: 80c0150f61f00cb92621f87f2f0a9992ad033e0b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2011 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
*
* This is an implementation of an early-draft specification developed under the Java
* Community Process (JCP) and is made available for testing and evaluation purposes
* only. The code is not compatible with any specification of the JCP.
*
* Contributors:
* IBM Corporation - initial API and implementation
* Guven Demir <guven.internet+eclipse@gmail.com> - [package explorer] Alternative package name shortening: abbreviation - https://bugs.eclipse.org/bugs/show_bug.cgi?id=299514
*******************************************************************************/
package org.eclipse.jdt.internal.ui.viewsupport;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.jar.Attributes.Name;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.StyledString.Styler;
import org.eclipse.jdt.core.BindingKey;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IInitializer;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.ILocalVariable;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeParameter;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
import org.eclipse.jdt.internal.corext.util.Messages;
import org.eclipse.jdt.ui.JavaElementLabels;
import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.JavaUIMessages;
/**
* Implementation of {@link JavaElementLabels}.
*
* @since 3.5
*/
public class JavaElementLabelComposer {
/**
* An adapter for buffer supported by the label composer.
*/
public static abstract class FlexibleBuffer {
/**
* Appends the string representation of the given character to the buffer.
*
* @param ch the character to append
* @return a reference to this object
*/
public abstract FlexibleBuffer append(char ch);
/**
* Appends the given string to the buffer.
*
* @param string the string to append
* @return a reference to this object
*/
public abstract FlexibleBuffer append(String string);
/**
* Returns the length of the the buffer.
*
* @return the length of the current string
*/
public abstract int length();
/**
* Sets a styler to use for the given source range. The range must be subrange of actual
* string of this buffer. Stylers previously set for that range will be overwritten.
*
* @param offset the start offset of the range
* @param length the length of the range
* @param styler the styler to set
*
* @throws StringIndexOutOfBoundsException if <code>start</code> is less than zero, or if
* offset plus length is greater than the length of this object.
*/
public abstract void setStyle(int offset, int length, Styler styler);
}
public static class FlexibleStringBuffer extends FlexibleBuffer {
private final StringBuffer fStringBuffer;
public FlexibleStringBuffer(StringBuffer stringBuffer) {
fStringBuffer= stringBuffer;
}
@Override
public FlexibleBuffer append(char ch) {
fStringBuffer.append(ch);
return this;
}
@Override
public FlexibleBuffer append(String string) {
fStringBuffer.append(string);
return this;
}
@Override
public int length() {
return fStringBuffer.length();
}
@Override
public void setStyle(int offset, int length, Styler styler) {
// no style
}
@Override
public String toString() {
return fStringBuffer.toString();
}
}
public static class FlexibleStyledString extends FlexibleBuffer {
private final StyledString fStyledString;
public FlexibleStyledString(StyledString stringBuffer) {
fStyledString= stringBuffer;
}
@Override
public FlexibleBuffer append(char ch) {
fStyledString.append(ch);
return this;
}
@Override
public FlexibleBuffer append(String string) {
fStyledString.append(string);
return this;
}
@Override
public int length() {
return fStyledString.length();
}
@Override
public void setStyle(int offset, int length, Styler styler) {
fStyledString.setStyle(offset, length, styler);
}
@Override
public String toString() {
return fStyledString.toString();
}
}
private static class PackageNameAbbreviation {
private String fPackagePrefix;
private String fAbbreviation;
public PackageNameAbbreviation(String packagePrefix, String abbreviation) {
fPackagePrefix= packagePrefix;
fAbbreviation= abbreviation;
}
public String getPackagePrefix() {
return fPackagePrefix;
}
public String getAbbreviation() {
return fAbbreviation;
}
}
private final static long QUALIFIER_FLAGS= JavaElementLabels.P_COMPRESSED | JavaElementLabels.USE_RESOLVED;
private static final Styler QUALIFIER_STYLE= StyledString.QUALIFIER_STYLER;
private static final Styler COUNTER_STYLE= StyledString.COUNTER_STYLER;
private static final Styler DECORATIONS_STYLE= StyledString.DECORATIONS_STYLER;
/*
* Package name compression
*/
private static String fgPkgNamePattern= ""; //$NON-NLS-1$
private static String fgPkgNamePrefix;
private static String fgPkgNamePostfix;
private static int fgPkgNameChars;
private static int fgPkgNameLength= -1;
/*
* Package name abbreviation
*/
private static String fgPkgNameAbbreviationPattern= ""; //$NON-NLS-1$
private static PackageNameAbbreviation[] fgPkgNameAbbreviation;
private final FlexibleBuffer fBuffer;
private static final boolean getFlag(long flags, long flag) {
return (flags & flag) != 0;
}
/**
* Creates a new java element composer based on the given buffer.
*
* @param buffer the buffer
*/
public JavaElementLabelComposer(FlexibleBuffer buffer) {
fBuffer= buffer;
}
/**
* Creates a new java element composer based on the given buffer.
*
* @param buffer the buffer
*/
public JavaElementLabelComposer(StyledString buffer) {
this(new FlexibleStyledString(buffer));
}
/**
* Creates a new java element composer based on the given buffer.
*
* @param buffer the buffer
*/
public JavaElementLabelComposer(StringBuffer buffer) {
this(new FlexibleStringBuffer(buffer));
}
/**
* Appends the label for a Java element with the flags as defined by this class.
*
* @param element the element to render
* @param flags the rendering flags.
*/
public void appendElementLabel(IJavaElement element, long flags) {
int type= element.getElementType();
IPackageFragmentRoot root= null;
if (type != IJavaElement.JAVA_MODEL && type != IJavaElement.JAVA_PROJECT && type != IJavaElement.PACKAGE_FRAGMENT_ROOT)
root= JavaModelUtil.getPackageFragmentRoot(element);
if (root != null && getFlag(flags, JavaElementLabels.PREPEND_ROOT_PATH)) {
appendPackageFragmentRootLabel(root, JavaElementLabels.ROOT_QUALIFIED);
fBuffer.append(JavaElementLabels.CONCAT_STRING);
}
switch (type) {
case IJavaElement.METHOD:
appendMethodLabel((IMethod) element, flags);
break;
case IJavaElement.FIELD:
appendFieldLabel((IField) element, flags);
break;
case IJavaElement.LOCAL_VARIABLE:
appendLocalVariableLabel((ILocalVariable) element, flags);
break;
case IJavaElement.TYPE_PARAMETER:
appendTypeParameterLabel((ITypeParameter) element, flags);
break;
case IJavaElement.INITIALIZER:
appendInitializerLabel((IInitializer) element, flags);
break;
case IJavaElement.TYPE:
appendTypeLabel((IType) element, flags);
break;
case IJavaElement.CLASS_FILE:
appendClassFileLabel((IClassFile) element, flags);
break;
case IJavaElement.COMPILATION_UNIT:
appendCompilationUnitLabel((ICompilationUnit) element, flags);
break;
case IJavaElement.PACKAGE_FRAGMENT:
appendPackageFragmentLabel((IPackageFragment) element, flags);
break;
case IJavaElement.PACKAGE_FRAGMENT_ROOT:
appendPackageFragmentRootLabel((IPackageFragmentRoot) element, flags);
break;
case IJavaElement.IMPORT_CONTAINER:
case IJavaElement.IMPORT_DECLARATION:
case IJavaElement.PACKAGE_DECLARATION:
appendDeclarationLabel(element, flags);
break;
case IJavaElement.JAVA_PROJECT:
case IJavaElement.JAVA_MODEL:
fBuffer.append(element.getElementName());
break;
default:
fBuffer.append(element.getElementName());
}
if (root != null && getFlag(flags, JavaElementLabels.APPEND_ROOT_PATH)) {
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.CONCAT_STRING);
appendPackageFragmentRootLabel(root, JavaElementLabels.ROOT_QUALIFIED);
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
}
}
/**
* Appends the label for a method. Considers the M_* flags.
*
* @param method the element to render
* @param flags the rendering flags. Flags with names starting with 'M_' are considered.
*/
public void appendMethodLabel(IMethod method, long flags) {
try {
BindingKey resolvedKey= getFlag(flags, JavaElementLabels.USE_RESOLVED) && method.isResolved() ? new BindingKey(method.getKey()) : null;
String resolvedSig= (resolvedKey != null) ? resolvedKey.toSignature() : null;
// type parameters
if (getFlag(flags, JavaElementLabels.M_PRE_TYPE_PARAMETERS)) {
if (resolvedKey != null) {
if (resolvedKey.isParameterizedMethod()) {
String[] typeArgRefs= resolvedKey.getTypeArguments();
if (typeArgRefs.length > 0) {
appendTypeArgumentSignaturesLabel(method, typeArgRefs, flags);
fBuffer.append(' ');
}
} else {
String[] typeParameterSigs= Signature.getTypeParameters(resolvedSig);
if (typeParameterSigs.length > 0) {
appendTypeParameterSignaturesLabel(typeParameterSigs, flags);
fBuffer.append(' ');
}
}
} else if (method.exists()) {
ITypeParameter[] typeParameters= method.getTypeParameters();
if (typeParameters.length > 0) {
appendTypeParametersLabels(typeParameters, flags);
fBuffer.append(' ');
}
}
}
// return type
if (getFlag(flags, JavaElementLabels.M_PRE_RETURNTYPE) && method.exists() && !method.isConstructor()) {
String returnTypeSig= resolvedSig != null ? Signature.getReturnType(resolvedSig) : method.getReturnType();
appendTypeSignatureLabel(method, returnTypeSig, flags);
fBuffer.append(' ');
}
// qualification
if (getFlag(flags, JavaElementLabels.M_FULLY_QUALIFIED)) {
appendTypeLabel(method.getDeclaringType(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS));
fBuffer.append('.');
}
fBuffer.append(getElementName(method));
// parameters
fBuffer.append('(');
String[] declaredParameterTypes= method.getParameterTypes();
if (getFlag(flags, JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.M_PARAMETER_NAMES)) {
String[] types= null;
int nParams= 0;
boolean renderVarargs= false;
boolean isPolymorphic= false;
if (getFlag(flags, JavaElementLabels.M_PARAMETER_TYPES)) {
if (resolvedSig != null) {
types= Signature.getParameterTypes(resolvedSig);
} else {
types= declaredParameterTypes;
}
nParams= types.length;
renderVarargs= method.exists() && Flags.isVarargs(method.getFlags());
if (renderVarargs
&& resolvedSig != null
&& declaredParameterTypes.length == 1
&& JavaModelUtil.isPolymorphicSignature(method)) {
renderVarargs= false;
isPolymorphic= true;
}
}
String[] names= null;
if (getFlag(flags, JavaElementLabels.M_PARAMETER_NAMES) && method.exists()) {
names= method.getParameterNames();
if (isPolymorphic) {
// handled specially below
} else if (types == null) {
nParams= names.length;
} else { // types != null
if (nParams != names.length) {
if (resolvedSig != null && types.length > names.length) {
// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=99137
nParams= names.length;
String[] typesWithoutSyntheticParams= new String[nParams];
System.arraycopy(types, types.length - nParams, typesWithoutSyntheticParams, 0, nParams);
types= typesWithoutSyntheticParams;
} else {
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=101029
// JavaPlugin.logErrorMessage("JavaElementLabels: Number of param types(" + nParams + ") != number of names(" + names.length + "): " + method.getElementName()); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
names= null; // no names rendered
}
}
}
}
for (int i= 0; i < nParams; i++) {
if (i > 0) {
fBuffer.append(JavaElementLabels.COMMA_STRING);
}
if (types != null) {
String paramSig= types[i];
if (renderVarargs && (i == nParams - 1)) {
int newDim= Signature.getArrayCount(paramSig) - 1;
appendTypeSignatureLabel(method, Signature.getElementType(paramSig), flags);
for (int k= 0; k < newDim; k++) {
fBuffer.append('[').append(']');
}
fBuffer.append(JavaElementLabels.ELLIPSIS_STRING);
} else {
appendTypeSignatureLabel(method, paramSig, flags);
}
}
if (names != null) {
if (types != null) {
fBuffer.append(' ');
}
if (isPolymorphic) {
fBuffer.append(names[0] + i);
} else {
fBuffer.append(names[i]);
}
}
}
} else {
if (declaredParameterTypes.length > 0) {
fBuffer.append(JavaElementLabels.ELLIPSIS_STRING);
}
}
fBuffer.append(')');
if (getFlag(flags, JavaElementLabels.M_EXCEPTIONS)) {
String[] types;
if (resolvedKey != null) {
types= resolvedKey.getThrownExceptions();
} else {
types= method.exists() ? method.getExceptionTypes() : new String[0];
}
if (types.length > 0) {
fBuffer.append(" throws "); //$NON-NLS-1$
for (int i= 0; i < types.length; i++) {
if (i > 0) {
fBuffer.append(JavaElementLabels.COMMA_STRING);
}
appendTypeSignatureLabel(method, types[i], flags);
}
}
}
if (getFlag(flags, JavaElementLabels.M_APP_TYPE_PARAMETERS)) {
int offset= fBuffer.length();
if (resolvedKey != null) {
if (resolvedKey.isParameterizedMethod()) {
String[] typeArgRefs= resolvedKey.getTypeArguments();
if (typeArgRefs.length > 0) {
fBuffer.append(' ');
appendTypeArgumentSignaturesLabel(method, typeArgRefs, flags);
}
} else {
String[] typeParameterSigs= Signature.getTypeParameters(resolvedSig);
if (typeParameterSigs.length > 0) {
fBuffer.append(' ');
appendTypeParameterSignaturesLabel(typeParameterSigs, flags);
}
}
} else if (method.exists()) {
ITypeParameter[] typeParameters= method.getTypeParameters();
if (typeParameters.length > 0) {
fBuffer.append(' ');
appendTypeParametersLabels(typeParameters, flags);
}
}
if (getFlag(flags, JavaElementLabels.COLORIZE) && offset != fBuffer.length()) {
fBuffer.setStyle(offset, fBuffer.length() - offset, DECORATIONS_STYLE);
}
}
if (getFlag(flags, JavaElementLabels.M_APP_RETURNTYPE) && method.exists() && !method.isConstructor()) {
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.DECL_STRING);
String returnTypeSig= resolvedSig != null ? Signature.getReturnType(resolvedSig) : method.getReturnType();
appendTypeSignatureLabel(method, returnTypeSig, flags);
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, DECORATIONS_STYLE);
}
}
// category
if (getFlag(flags, JavaElementLabels.M_CATEGORY) && method.exists())
appendCategoryLabel(method, flags);
// post qualification
if (getFlag(flags, JavaElementLabels.M_POST_QUALIFIED)) {
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.CONCAT_STRING);
appendTypeLabel(method.getDeclaringType(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS));
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
}
} catch (JavaModelException e) {
JavaPlugin.log(e); // NotExistsException will not reach this point
}
}
private void appendCategoryLabel(IMember member, long flags) throws JavaModelException {
String[] categories= member.getCategories();
if (categories.length > 0) {
int offset= fBuffer.length();
StringBuffer categoriesBuf= new StringBuffer();
for (int i= 0; i < categories.length; i++) {
if (i > 0)
categoriesBuf.append(JavaElementLabels.CATEGORY_SEPARATOR_STRING);
categoriesBuf.append(categories[i]);
}
fBuffer.append(JavaElementLabels.CONCAT_STRING);
fBuffer.append(Messages.format(JavaUIMessages.JavaElementLabels_category, categoriesBuf.toString()));
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, COUNTER_STYLE);
}
}
}
/**
* Appends labels for type parameters from type binding array.
*
* @param typeParameters the type parameters
* @param flags flags with render options
*/
private void appendTypeParametersLabels(ITypeParameter[] typeParameters, long flags) {
if (typeParameters.length > 0) {
fBuffer.append(getLT());
for (int i = 0; i < typeParameters.length; i++) {
if (i > 0) {
fBuffer.append(JavaElementLabels.COMMA_STRING);
}
fBuffer.append(getElementName(typeParameters[i]));
}
fBuffer.append(getGT());
}
}
/**
* Appends the style label for a field. Considers the F_* flags.
*
* @param field the element to render
* @param flags the rendering flags. Flags with names starting with 'F_' are considered.
*/
public void appendFieldLabel(IField field, long flags) {
try {
if (getFlag(flags, JavaElementLabels.F_PRE_TYPE_SIGNATURE) && field.exists() && !Flags.isEnum(field.getFlags())) {
if (getFlag(flags, JavaElementLabels.USE_RESOLVED) && field.isResolved()) {
appendTypeSignatureLabel(field, new BindingKey(field.getKey()).toSignature(), flags);
} else {
appendTypeSignatureLabel(field, field.getTypeSignature(), flags);
}
fBuffer.append(' ');
}
// qualification
if (getFlag(flags, JavaElementLabels.F_FULLY_QUALIFIED)) {
appendTypeLabel(field.getDeclaringType(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS));
fBuffer.append('.');
}
fBuffer.append(getElementName(field));
if (getFlag(flags, JavaElementLabels.F_APP_TYPE_SIGNATURE) && field.exists() && !Flags.isEnum(field.getFlags())) {
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.DECL_STRING);
if (getFlag(flags, JavaElementLabels.USE_RESOLVED) && field.isResolved()) {
appendTypeSignatureLabel(field, new BindingKey(field.getKey()).toSignature(), flags);
} else {
appendTypeSignatureLabel(field, field.getTypeSignature(), flags);
}
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, DECORATIONS_STYLE);
}
}
// category
if (getFlag(flags, JavaElementLabels.F_CATEGORY) && field.exists())
appendCategoryLabel(field, flags);
// post qualification
if (getFlag(flags, JavaElementLabels.F_POST_QUALIFIED)) {
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.CONCAT_STRING);
appendTypeLabel(field.getDeclaringType(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS));
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
}
} catch (JavaModelException e) {
JavaPlugin.log(e); // NotExistsException will not reach this point
}
}
/**
* Appends the styled label for a local variable.
*
* @param localVariable the element to render
* @param flags the rendering flags. Flags with names starting with 'F_' are considered.
*/
public void appendLocalVariableLabel(ILocalVariable localVariable, long flags) {
if (getFlag(flags, JavaElementLabels.F_PRE_TYPE_SIGNATURE)) {
appendTypeSignatureLabel(localVariable, localVariable.getTypeSignature(), flags);
fBuffer.append(' ');
}
if (getFlag(flags, JavaElementLabels.F_FULLY_QUALIFIED)) {
appendElementLabel(localVariable.getDeclaringMember(), JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.M_FULLY_QUALIFIED | JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS));
fBuffer.append('.');
}
fBuffer.append(getElementName(localVariable));
if (getFlag(flags, JavaElementLabels.F_APP_TYPE_SIGNATURE)) {
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.DECL_STRING);
appendTypeSignatureLabel(localVariable, localVariable.getTypeSignature(), flags);
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, DECORATIONS_STYLE);
}
}
// post qualification
if (getFlag(flags, JavaElementLabels.F_POST_QUALIFIED)) {
fBuffer.append(JavaElementLabels.CONCAT_STRING);
appendElementLabel(localVariable.getDeclaringMember(), JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.M_FULLY_QUALIFIED | JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS));
}
}
/**
* Appends the styled label for a type parameter.
*
* @param typeParameter the element to render
* @param flags the rendering flags. Flags with names starting with 'T_' are considered.
*/
public void appendTypeParameterLabel(ITypeParameter typeParameter, long flags) {
try {
fBuffer.append(getElementName(typeParameter));
if (typeParameter.exists()) {
String[] bounds= typeParameter.getBoundsSignatures();
if (bounds.length > 0 &&
! (bounds.length == 1 && "Ljava.lang.Object;".equals(bounds[0]))) { //$NON-NLS-1$
fBuffer.append(" extends "); //$NON-NLS-1$
for (int j= 0; j < bounds.length; j++) {
if (j > 0) {
fBuffer.append(JavaElementLabels.COMMA_STRING);
}
appendTypeSignatureLabel(typeParameter, bounds[j], flags);
}
}
}
// post qualification
if (getFlag(flags, JavaElementLabels.TP_POST_QUALIFIED)) {
fBuffer.append(JavaElementLabels.CONCAT_STRING);
IMember declaringMember= typeParameter.getDeclaringMember();
appendElementLabel(declaringMember, JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.M_FULLY_QUALIFIED | JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS));
}
} catch (JavaModelException e) {
JavaPlugin.log(e); // NotExistsException will not reach this point
}
}
/**
* Appends the label for a initializer. Considers the I_* flags.
*
* @param initializer the element to render
* @param flags the rendering flags. Flags with names starting with 'I_' are considered.
*/
public void appendInitializerLabel(IInitializer initializer, long flags) {
// qualification
if (getFlag(flags, JavaElementLabels.I_FULLY_QUALIFIED)) {
appendTypeLabel(initializer.getDeclaringType(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS));
fBuffer.append('.');
}
fBuffer.append(JavaUIMessages.JavaElementLabels_initializer);
// post qualification
if (getFlag(flags, JavaElementLabels.I_POST_QUALIFIED)) {
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.CONCAT_STRING);
appendTypeLabel(initializer.getDeclaringType(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS));
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
}
}
protected void appendTypeSignatureLabel(IJavaElement enclosingElement, String typeSig, long flags) {
int sigKind= Signature.getTypeSignatureKind(typeSig);
switch (sigKind) {
case Signature.BASE_TYPE_SIGNATURE:
fBuffer.append(Signature.toString(typeSig));
break;
case Signature.ARRAY_TYPE_SIGNATURE:
appendTypeSignatureLabel(enclosingElement, Signature.getElementType(typeSig), flags);
for (int dim= Signature.getArrayCount(typeSig); dim > 0; dim--) {
fBuffer.append('[').append(']');
}
break;
case Signature.CLASS_TYPE_SIGNATURE:
String baseType= getSimpleTypeName(enclosingElement, typeSig);
fBuffer.append(baseType);
String[] typeArguments= Signature.getTypeArguments(typeSig);
appendTypeArgumentSignaturesLabel(enclosingElement, typeArguments, flags);
break;
case Signature.TYPE_VARIABLE_SIGNATURE:
fBuffer.append(getSimpleTypeName(enclosingElement, typeSig));
break;
case Signature.WILDCARD_TYPE_SIGNATURE:
char ch= typeSig.charAt(0);
if (ch == Signature.C_STAR) { //workaround for bug 85713
fBuffer.append('?');
} else {
if (ch == Signature.C_EXTENDS) {
fBuffer.append("? extends "); //$NON-NLS-1$
appendTypeSignatureLabel(enclosingElement, typeSig.substring(1), flags);
} else if (ch == Signature.C_SUPER) {
fBuffer.append("? super "); //$NON-NLS-1$
appendTypeSignatureLabel(enclosingElement, typeSig.substring(1), flags);
}
}
break;
case Signature.CAPTURE_TYPE_SIGNATURE:
appendTypeSignatureLabel(enclosingElement, typeSig.substring(1), flags);
break;
case Signature.INTERSECTION_TYPE_SIGNATURE:
String[] typeBounds= Signature.getIntersectionTypeBounds(typeSig);
appendTypeBoundsSignaturesLabel(enclosingElement, typeBounds, flags);
break;
default:
// unknown
}
}
/**
* Returns the simple name of the given type signature.
*
* @param enclosingElement the enclosing element in which to resolve the signature
* @param typeSig a {@link Signature#CLASS_TYPE_SIGNATURE} or {@link Signature#TYPE_VARIABLE_SIGNATURE}
* @return the simple name of the given type signature
*/
protected String getSimpleTypeName(IJavaElement enclosingElement, String typeSig) {
return Signature.getSimpleName(Signature.toString(Signature.getTypeErasure(typeSig)));
}
private void appendTypeArgumentSignaturesLabel(IJavaElement enclosingElement, String[] typeArgsSig, long flags) {
if (typeArgsSig.length > 0) {
fBuffer.append(getLT());
for (int i = 0; i < typeArgsSig.length; i++) {
if (i > 0) {
fBuffer.append(JavaElementLabels.COMMA_STRING);
}
appendTypeSignatureLabel(enclosingElement, typeArgsSig[i], flags);
}
fBuffer.append(getGT());
}
}
private void appendTypeBoundsSignaturesLabel(IJavaElement enclosingElement, String[] typeArgsSig, long flags) {
for (int i = 0; i < typeArgsSig.length; i++) {
if (i > 0) {
fBuffer.append(" | "); //$NON-NLS-1$
}
appendTypeSignatureLabel(enclosingElement, typeArgsSig[i], flags);
}
}
/**
* Appends labels for type parameters from a signature.
*
* @param typeParamSigs the type parameter signature
* @param flags flags with render options
*/
private void appendTypeParameterSignaturesLabel(String[] typeParamSigs, long flags) {
if (typeParamSigs.length > 0) {
fBuffer.append(getLT());
for (int i = 0; i < typeParamSigs.length; i++) {
if (i > 0) {
fBuffer.append(JavaElementLabels.COMMA_STRING);
}
fBuffer.append(Signature.getTypeVariable(typeParamSigs[i]));
}
fBuffer.append(getGT());
}
}
/**
* Returns the string for rendering the '<code>&lt;</code>' character.
*
* @return the string for rendering '<code>&lt;</code>'
*/
protected String getLT() {
return "<"; //$NON-NLS-1$
}
/**
* Returns the string for rendering the '<code>&gt;</code>' character.
*
* @return the string for rendering '<code>&gt;</code>'
*/
protected String getGT() {
return ">"; //$NON-NLS-1$
}
/**
* Appends the label for a type. Considers the T_* flags.
*
* @param type the element to render
* @param flags the rendering flags. Flags with names starting with 'T_' are considered.
*/
public void appendTypeLabel(IType type, long flags) {
if (getFlag(flags, JavaElementLabels.T_FULLY_QUALIFIED)) {
IPackageFragment pack= type.getPackageFragment();
if (!pack.isDefaultPackage()) {
appendPackageFragmentLabel(pack, (flags & QUALIFIER_FLAGS));
fBuffer.append('.');
}
}
if (getFlag(flags, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.T_CONTAINER_QUALIFIED)) {
IType declaringType= type.getDeclaringType();
if (declaringType != null) {
appendTypeLabel(declaringType, JavaElementLabels.T_CONTAINER_QUALIFIED | (flags & QUALIFIER_FLAGS));
fBuffer.append('.');
}
int parentType= type.getParent().getElementType();
if (parentType == IJavaElement.METHOD || parentType == IJavaElement.FIELD || parentType == IJavaElement.INITIALIZER) { // anonymous or local
appendElementLabel(type.getParent(), 0);
fBuffer.append('.');
}
}
String typeName= getElementName(type);
if (typeName.length() == 0) { // anonymous
try {
if (type.getParent() instanceof IField && type.isEnum()) {
typeName= '{' + JavaElementLabels.ELLIPSIS_STRING + '}';
} else {
String supertypeName;
String[] superInterfaceSignatures= type.getSuperInterfaceTypeSignatures();
if (superInterfaceSignatures.length > 0) {
supertypeName= getSimpleTypeName(type, superInterfaceSignatures[0]);
} else {
supertypeName= getSimpleTypeName(type, type.getSuperclassTypeSignature());
}
typeName= Messages.format(JavaUIMessages.JavaElementLabels_anonym_type , supertypeName);
}
} catch (JavaModelException e) {
//ignore
typeName= JavaUIMessages.JavaElementLabels_anonym;
}
}
fBuffer.append(typeName);
if (getFlag(flags, JavaElementLabels.T_TYPE_PARAMETERS)) {
if (getFlag(flags, JavaElementLabels.USE_RESOLVED) && type.isResolved()) {
BindingKey key= new BindingKey(type.getKey());
if (key.isParameterizedType()) {
String[] typeArguments= key.getTypeArguments();
appendTypeArgumentSignaturesLabel(type, typeArguments, flags);
} else {
String[] typeParameters= Signature.getTypeParameters(key.toSignature());
appendTypeParameterSignaturesLabel(typeParameters, flags);
}
} else if (type.exists()) {
try {
appendTypeParametersLabels(type.getTypeParameters(), flags);
} catch (JavaModelException e) {
// ignore
}
}
}
// category
if (getFlag(flags, JavaElementLabels.T_CATEGORY) && type.exists()) {
try {
appendCategoryLabel(type, flags);
} catch (JavaModelException e) {
// ignore
}
}
// post qualification
if (getFlag(flags, JavaElementLabels.T_POST_QUALIFIED)) {
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.CONCAT_STRING);
IType declaringType= type.getDeclaringType();
if (declaringType != null) {
appendTypeLabel(declaringType, JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS));
int parentType= type.getParent().getElementType();
if (parentType == IJavaElement.METHOD || parentType == IJavaElement.FIELD || parentType == IJavaElement.INITIALIZER) { // anonymous or local
fBuffer.append('.');
appendElementLabel(type.getParent(), 0);
}
} else {
appendPackageFragmentLabel(type.getPackageFragment(), flags & QUALIFIER_FLAGS);
}
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
}
}
/**
* Returns the string for rendering the {@link IJavaElement#getElementName() element name} of the given element.
*
* @param element the element to render
* @return the string for rendering the element name
*/
protected String getElementName(IJavaElement element) {
return element.getElementName();
}
/**
* Appends the label for a import container, import or package declaration. Considers the D_* flags.
*
* @param declaration the element to render
* @param flags the rendering flags. Flags with names starting with 'D_' are considered.
*/
public void appendDeclarationLabel(IJavaElement declaration, long flags) {
if (getFlag(flags, JavaElementLabels.D_QUALIFIED)) {
IJavaElement openable= (IJavaElement) declaration.getOpenable();
if (openable != null) {
appendElementLabel(openable, JavaElementLabels.CF_QUALIFIED | JavaElementLabels.CU_QUALIFIED | (flags & QUALIFIER_FLAGS));
fBuffer.append('/');
}
}
if (declaration.getElementType() == IJavaElement.IMPORT_CONTAINER) {
fBuffer.append(JavaUIMessages.JavaElementLabels_import_container);
} else {
fBuffer.append(declaration.getElementName());
}
// post qualification
if (getFlag(flags, JavaElementLabels.D_POST_QUALIFIED)) {
int offset= fBuffer.length();
IJavaElement openable= (IJavaElement) declaration.getOpenable();
if (openable != null) {
fBuffer.append(JavaElementLabels.CONCAT_STRING);
appendElementLabel(openable, JavaElementLabels.CF_QUALIFIED | JavaElementLabels.CU_QUALIFIED | (flags & QUALIFIER_FLAGS));
}
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
}
}
/**
* Appends the label for a class file. Considers the CF_* flags.
*
* @param classFile the element to render
* @param flags the rendering flags. Flags with names starting with 'CF_' are considered.
*/
public void appendClassFileLabel(IClassFile classFile, long flags) {
if (getFlag(flags, JavaElementLabels.CF_QUALIFIED)) {
IPackageFragment pack= (IPackageFragment) classFile.getParent();
if (!pack.isDefaultPackage()) {
appendPackageFragmentLabel(pack, (flags & QUALIFIER_FLAGS));
fBuffer.append('.');
}
}
fBuffer.append(classFile.getElementName());
if (getFlag(flags, JavaElementLabels.CF_POST_QUALIFIED)) {
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.CONCAT_STRING);
appendPackageFragmentLabel((IPackageFragment) classFile.getParent(), flags & QUALIFIER_FLAGS);
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
}
}
/**
* Appends the label for a compilation unit. Considers the CU_* flags.
*
* @param cu the element to render
* @param flags the rendering flags. Flags with names starting with 'CU_' are considered.
*/
public void appendCompilationUnitLabel(ICompilationUnit cu, long flags) {
if (getFlag(flags, JavaElementLabels.CU_QUALIFIED)) {
IPackageFragment pack= (IPackageFragment) cu.getParent();
if (!pack.isDefaultPackage()) {
appendPackageFragmentLabel(pack, (flags & QUALIFIER_FLAGS));
fBuffer.append('.');
}
}
fBuffer.append(cu.getElementName());
if (getFlag(flags, JavaElementLabels.CU_POST_QUALIFIED)) {
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.CONCAT_STRING);
appendPackageFragmentLabel((IPackageFragment) cu.getParent(), flags & QUALIFIER_FLAGS);
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
}
}
/**
* Appends the label for a package fragment. Considers the P_* flags.
*
* @param pack the element to render
* @param flags the rendering flags. Flags with names starting with P_' are considered.
*/
public void appendPackageFragmentLabel(IPackageFragment pack, long flags) {
if (getFlag(flags, JavaElementLabels.P_QUALIFIED)) {
appendPackageFragmentRootLabel((IPackageFragmentRoot) pack.getParent(), JavaElementLabels.ROOT_QUALIFIED);
fBuffer.append('/');
}
if (pack.isDefaultPackage()) {
fBuffer.append(JavaElementLabels.DEFAULT_PACKAGE);
} else if (getFlag(flags, JavaElementLabels.P_COMPRESSED)) {
if (isPackageNameAbbreviationEnabled())
appendAbbreviatedPackageFragment(pack);
else
appendCompressedPackageFragment(pack);
} else {
fBuffer.append(pack.getElementName());
}
if (getFlag(flags, JavaElementLabels.P_POST_QUALIFIED)) {
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.CONCAT_STRING);
appendPackageFragmentRootLabel((IPackageFragmentRoot) pack.getParent(), JavaElementLabels.ROOT_QUALIFIED);
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
}
}
private void appendCompressedPackageFragment(IPackageFragment pack) {
appendCompressedPackageFragment(pack.getElementName());
}
private void appendCompressedPackageFragment(String elementName) {
refreshPackageNamePattern();
if (fgPkgNameLength < 0) {
fBuffer.append(elementName);
return;
}
String name= elementName;
int start= 0;
int dot= name.indexOf('.', start);
while (dot > 0) {
if (dot - start > fgPkgNameLength-1) {
fBuffer.append(fgPkgNamePrefix);
if (fgPkgNameChars > 0)
fBuffer.append(name.substring(start, Math.min(start+ fgPkgNameChars, dot)));
fBuffer.append(fgPkgNamePostfix);
} else
fBuffer.append(name.substring(start, dot + 1));
start= dot + 1;
dot= name.indexOf('.', start);
}
fBuffer.append(name.substring(start));
}
private void appendAbbreviatedPackageFragment(IPackageFragment pack) {
refreshPackageNameAbbreviation();
String pkgName= pack.getElementName();
if (fgPkgNameAbbreviation != null && fgPkgNameAbbreviation.length != 0) {
for (int i= 0; i < fgPkgNameAbbreviation.length; i++) {
PackageNameAbbreviation abbr= fgPkgNameAbbreviation[i];
String abbrPrefix= abbr.getPackagePrefix();
if (pkgName.startsWith(abbrPrefix)) {
int abbrPrefixLength= abbrPrefix.length();
int pkgLength= pkgName.length();
if (!(pkgLength == abbrPrefixLength || pkgName.charAt(abbrPrefixLength) == '.'))
continue;
fBuffer.append(abbr.getAbbreviation());
if (pkgLength > abbrPrefixLength) {
fBuffer.append('.');
String remaining= pkgName.substring(abbrPrefixLength + 1);
if (isPackageNameCompressionEnabled())
appendCompressedPackageFragment(remaining);
else
fBuffer.append(remaining);
}
return;
}
}
}
if (isPackageNameCompressionEnabled()) {
appendCompressedPackageFragment(pkgName);
} else {
fBuffer.append(pkgName);
}
}
/**
* Appends the label for a package fragment root. Considers the ROOT_* flags.
*
* @param root the element to render
* @param flags the rendering flags. Flags with names starting with ROOT_' are considered.
*/
public void appendPackageFragmentRootLabel(IPackageFragmentRoot root, long flags) {
// Handle variables different
if (getFlag(flags, JavaElementLabels.ROOT_VARIABLE) && appendVariableLabel(root, flags))
return;
if (root.isArchive())
appendArchiveLabel(root, flags);
else
appendFolderLabel(root, flags);
}
private void appendArchiveLabel(IPackageFragmentRoot root, long flags) {
boolean external= root.isExternal();
if (external)
appendExternalArchiveLabel(root, flags);
else
appendInternalArchiveLabel(root, flags);
}
private boolean appendVariableLabel(IPackageFragmentRoot root, long flags) {
try {
IClasspathEntry rawEntry= root.getRawClasspathEntry();
if (rawEntry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) {
IClasspathEntry entry= JavaModelUtil.getClasspathEntry(root);
if (entry.getReferencingEntry() != null) {
return false; // not the variable entry itself, but a referenced entry
}
IPath path= rawEntry.getPath().makeRelative();
if (getFlag(flags, JavaElementLabels.REFERENCED_ROOT_POST_QUALIFIED)) {
int segements= path.segmentCount();
if (segements > 0) {
fBuffer.append(path.segment(segements - 1));
if (segements > 1) {
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.CONCAT_STRING);
fBuffer.append(path.removeLastSegments(1).toOSString());
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
}
} else {
fBuffer.append(path.toString());
}
} else {
fBuffer.append(path.toString());
}
int offset= fBuffer.length();
fBuffer.append(JavaElementLabels.CONCAT_STRING);
if (root.isExternal())
fBuffer.append(root.getPath().toOSString());
else
fBuffer.append(root.getPath().makeRelative().toString());
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
return true;
}
} catch (JavaModelException e) {
// problems with class path, ignore (bug 202792)
return false;
}
return false;
}
private void appendExternalArchiveLabel(IPackageFragmentRoot root, long flags) {
IPath path;
IClasspathEntry classpathEntry= null;
try {
classpathEntry= JavaModelUtil.getClasspathEntry(root);
IPath rawPath= classpathEntry.getPath();
if (classpathEntry.getEntryKind() != IClasspathEntry.CPE_CONTAINER && !rawPath.isAbsolute())
path= rawPath;
else
path= root.getPath();
} catch (JavaModelException e) {
path= root.getPath();
}
if (getFlag(flags, JavaElementLabels.REFERENCED_ROOT_POST_QUALIFIED)) {
int segements= path.segmentCount();
if (segements > 0) {
fBuffer.append(path.segment(segements - 1));
int offset= fBuffer.length();
if (segements > 1 || path.getDevice() != null) {
fBuffer.append(JavaElementLabels.CONCAT_STRING);
fBuffer.append(path.removeLastSegments(1).toOSString());
}
if (classpathEntry != null) {
IClasspathEntry referencingEntry= classpathEntry.getReferencingEntry();
if (referencingEntry != null) {
fBuffer.append(Messages.format(JavaUIMessages.JavaElementLabels_onClassPathOf, new Object[] { Name.CLASS_PATH.toString(), referencingEntry.getPath().lastSegment() }));
}
}
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
} else {
fBuffer.append(path.toOSString());
}
} else {
fBuffer.append(path.toOSString());
}
}
private void appendInternalArchiveLabel(IPackageFragmentRoot root, long flags) {
IResource resource= root.getResource();
boolean rootQualified= getFlag(flags, JavaElementLabels.ROOT_QUALIFIED);
if (rootQualified) {
fBuffer.append(root.getPath().makeRelative().toString());
} else {
fBuffer.append(root.getElementName());
int offset= fBuffer.length();
boolean referencedPostQualified= getFlag(flags, JavaElementLabels.REFERENCED_ROOT_POST_QUALIFIED);
if (referencedPostQualified && isReferenced(root)) {
fBuffer.append(JavaElementLabels.CONCAT_STRING);
fBuffer.append(resource.getParent().getFullPath().makeRelative().toString());
} else if (getFlag(flags, JavaElementLabels.ROOT_POST_QUALIFIED)) {
fBuffer.append(JavaElementLabels.CONCAT_STRING);
fBuffer.append(root.getParent().getPath().makeRelative().toString());
}
if (referencedPostQualified) {
try {
IClasspathEntry referencingEntry= JavaModelUtil.getClasspathEntry(root).getReferencingEntry();
if (referencingEntry != null) {
fBuffer.append(Messages.format(JavaUIMessages.JavaElementLabels_onClassPathOf, new Object[] { Name.CLASS_PATH.toString(), referencingEntry.getPath().lastSegment() }));
}
} catch (JavaModelException e) {
// ignore
}
}
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
}
}
private void appendFolderLabel(IPackageFragmentRoot root, long flags) {
IResource resource= root.getResource();
if (resource == null) {
appendExternalArchiveLabel(root, flags);
return;
}
boolean rootQualified= getFlag(flags, JavaElementLabels.ROOT_QUALIFIED);
boolean referencedQualified= getFlag(flags, JavaElementLabels.REFERENCED_ROOT_POST_QUALIFIED) && isReferenced(root);
if (rootQualified) {
fBuffer.append(root.getPath().makeRelative().toString());
} else {
IPath projectRelativePath= resource.getProjectRelativePath();
if (projectRelativePath.segmentCount() == 0) {
fBuffer.append(resource.getName());
referencedQualified= false;
} else {
fBuffer.append(projectRelativePath.toString());
}
int offset= fBuffer.length();
if (referencedQualified) {
fBuffer.append(JavaElementLabels.CONCAT_STRING);
fBuffer.append(resource.getProject().getName());
} else if (getFlag(flags, JavaElementLabels.ROOT_POST_QUALIFIED)) {
fBuffer.append(JavaElementLabels.CONCAT_STRING);
fBuffer.append(root.getParent().getElementName());
} else {
return;
}
if (getFlag(flags, JavaElementLabels.COLORIZE)) {
fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
}
}
}
/**
* Returns <code>true</code> if the given package fragment root is
* referenced. This means it is a descendant of a different project but is referenced
* by the root's parent. Returns <code>false</code> if the given root
* doesn't have an underlying resource.
*
* @param root the package fragment root
* @return returns <code>true</code> if the given package fragment root is referenced
*/
private boolean isReferenced(IPackageFragmentRoot root) {
IResource resource= root.getResource();
if (resource != null) {
IProject jarProject= resource.getProject();
IProject container= root.getJavaProject().getProject();
return !container.equals(jarProject);
}
return false;
}
private void refreshPackageNamePattern() {
String pattern= getPkgNamePatternForPackagesView();
final String EMPTY_STRING= ""; //$NON-NLS-1$
if (pattern.equals(fgPkgNamePattern))
return;
else if (pattern.length() == 0) {
fgPkgNamePattern= EMPTY_STRING;
fgPkgNameLength= -1;
return;
}
fgPkgNamePattern= pattern;
int i= 0;
fgPkgNameChars= 0;
fgPkgNamePrefix= EMPTY_STRING;
fgPkgNamePostfix= EMPTY_STRING;
while (i < pattern.length()) {
char ch= pattern.charAt(i);
if (Character.isDigit(ch)) {
fgPkgNameChars= ch-48;
if (i > 0)
fgPkgNamePrefix= pattern.substring(0, i);
if (i >= 0)
fgPkgNamePostfix= pattern.substring(i+1);
fgPkgNameLength= fgPkgNamePrefix.length() + fgPkgNameChars + fgPkgNamePostfix.length();
return;
}
i++;
}
fgPkgNamePrefix= pattern;
fgPkgNameLength= pattern.length();
}
private void refreshPackageNameAbbreviation() {
String pattern= getPkgNameAbbreviationPatternForPackagesView();
if (fgPkgNameAbbreviationPattern.equals(pattern))
return;
fgPkgNameAbbreviationPattern= pattern;
if (pattern == null || pattern.length() == 0) {
fgPkgNameAbbreviationPattern= ""; //$NON-NLS-1$
fgPkgNameAbbreviation= null;
return;
}
PackageNameAbbreviation[] abbrs= parseAbbreviationPattern(pattern);
if (abbrs == null)
abbrs= new PackageNameAbbreviation[0];
fgPkgNameAbbreviation= abbrs;
}
public static PackageNameAbbreviation[] parseAbbreviationPattern(String pattern) {
String[] parts= pattern.split("\\s*(?:\r\n?|\n)\\s*"); //$NON-NLS-1$
ArrayList<PackageNameAbbreviation> result= new ArrayList<PackageNameAbbreviation>();
for (int i= 0; i < parts.length; i++) {
String part= parts[i].trim();
if (part.length() == 0)
continue;
String[] parts2= part.split("\\s*=\\s*", 2); //$NON-NLS-1$
if (parts2.length != 2)
return null;
String prefix= parts2[0].trim();
String abbr= parts2[1].trim();
if (prefix.startsWith("#")) //$NON-NLS-1$
continue;
PackageNameAbbreviation pkgAbbr= new PackageNameAbbreviation(prefix, abbr);
result.add(pkgAbbr);
}
Collections.sort(result, new Comparator<PackageNameAbbreviation>() {
public int compare(PackageNameAbbreviation a1, PackageNameAbbreviation a2) {
return a2.getPackagePrefix().length() - a1.getPackagePrefix().length();
}
});
return result.toArray(new PackageNameAbbreviation[0]);
}
private boolean isPackageNameCompressionEnabled() {
IPreferenceStore store= PreferenceConstants.getPreferenceStore();
return store.getBoolean(PreferenceConstants.APPEARANCE_COMPRESS_PACKAGE_NAMES);
}
private String getPkgNamePatternForPackagesView() {
IPreferenceStore store= PreferenceConstants.getPreferenceStore();
if (!store.getBoolean(PreferenceConstants.APPEARANCE_COMPRESS_PACKAGE_NAMES))
return ""; //$NON-NLS-1$
return store.getString(PreferenceConstants.APPEARANCE_PKG_NAME_PATTERN_FOR_PKG_VIEW);
}
private boolean isPackageNameAbbreviationEnabled() {
IPreferenceStore store= PreferenceConstants.getPreferenceStore();
return store.getBoolean(PreferenceConstants.APPEARANCE_ABBREVIATE_PACKAGE_NAMES);
}
private String getPkgNameAbbreviationPatternForPackagesView() {
IPreferenceStore store= PreferenceConstants.getPreferenceStore();
if (!store.getBoolean(PreferenceConstants.APPEARANCE_ABBREVIATE_PACKAGE_NAMES))
return ""; //$NON-NLS-1$
return store.getString(PreferenceConstants.APPEARANCE_PKG_NAME_ABBREVIATION_PATTERN_FOR_PKG_VIEW);
}
}