/******************************************************************************* * 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 * * Contributors: * IBM Corporation - initial API and implementation * Anton Leherbauer (Wind River Systems) - Adapted for CDT *******************************************************************************/ package org.eclipse.cdt.internal.ui.editor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.graphics.RGB; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTImplicitName; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.ILabel; import org.eclipse.cdt.core.dom.ast.IMacroBinding; import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.c.ICExternalBinding; import org.eclipse.cdt.core.dom.ast.c.ICFunctionScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.PreferenceConstants; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator; /** * Semantic highlightings. * Derived from JDT. * * @since 4.0 */ public class SemanticHighlightings { private static final RGB RGB_BLACK = new RGB(0, 0, 0); /** * A named preference part that controls the highlighting of static fields. */ public static final String STATIC_FIELD="staticField"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of fields. */ public static final String FIELD="field"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of method declarations. */ public static final String METHOD_DECLARATION="methodDeclaration"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of static method invocations. */ public static final String STATIC_METHOD_INVOCATION="staticMethod"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of function declarations. */ public static final String FUNCTION_DECLARATION="functionDeclaration"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of functions. */ public static final String FUNCTION="function"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of local variables. */ public static final String LOCAL_VARIABLE_DECLARATION="localVariableDeclaration"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of local variable references. */ public static final String LOCAL_VARIABLE="localVariable"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of global variables. */ public static final String GLOBAL_VARIABLE="globalVariable"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of parameter variables. */ public static final String PARAMETER_VARIABLE="parameterVariable"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of template parameters. */ public static final String TEMPLATE_PARAMETER="templateParameter"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of methods. */ public static final String METHOD="method"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of classes. */ public static final String CLASS="class"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of enums. */ public static final String ENUM="enum"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of macro references. */ public static final String MACRO_REFERENCE="macroSubstitution"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of macro definitions. */ public static final String MACRO_DEFINITION="macroDefinition"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of typedefs. */ public static final String TYPEDEF="typedef"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of namespaces. */ public static final String NAMESPACE="namespace"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of labels. */ public static final String LABEL="label"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of enumerators. */ public static final String ENUMERATOR="enumerator"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of problems. */ public static final String PROBLEM="problem"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of external SDK. */ public static final String EXTERNAL_SDK="externalSDK"; //$NON-NLS-1$ /** * A named preference part that controls the highlighting of operators that have been overloaded. */ public static final String OVERLOADED_OPERATOR="overloadedOperator"; //$NON-NLS-1$ /** Init debugging mode */ private static final boolean DEBUG= "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.cdt.ui/debug/SemanticHighlighting")); //$NON-NLS-1$//$NON-NLS-2$ /** * Semantic highlightings */ private static SemanticHighlighting[] fgSemanticHighlightings; /** * Semantic highlighting for static fields. */ private static final class StaticFieldHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return STATIC_FIELD; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return new RGB(0, 0, 192); } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_staticField; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTName) { IASTName name= (IASTName)node; if (name instanceof ICPPASTQualifiedName && name.isReference()) { return false; } IBinding binding= token.getBinding(); if (binding instanceof IField && !(binding instanceof IProblemBinding)) { return ((IField)binding).isStatic(); } } return false; } } /** * Semantic highlighting for fields. */ private static final class FieldHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return FIELD; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return new RGB(0, 0, 192); } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_field; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTName) { IASTName name= (IASTName)node; if (name instanceof ICPPASTQualifiedName && name.isReference()) { return false; } IBinding binding= token.getBinding(); if (binding instanceof IField) { return true; } } return false; } } /** * Semantic highlighting for method declarations. */ private static final class MethodDeclarationHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return METHOD_DECLARATION; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return RGB_BLACK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_methodDeclaration; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTImplicitName) return false; if (node instanceof IASTName) { IASTName name= (IASTName)node; if (!name.isReference()) { IBinding binding= token.getBinding(); if (binding instanceof ICPPMethod) { return true; } else if (binding instanceof IProblemBinding) { // try to be derive from AST node= name.getParent(); while (node instanceof IASTName) { node= node.getParent(); } if (node instanceof ICPPASTFunctionDeclarator) { if (name instanceof ICPPASTQualifiedName) { ICPPASTQualifiedName qName= (ICPPASTQualifiedName)name; IASTName[] names= qName.getNames(); if (names.length > 1) { if (names[names.length - 2].getBinding() instanceof ICPPClassType) { return true; } } } else { while (node != token.getRoot() && !(node.getParent() instanceof IASTDeclSpecifier)) { node= node.getParent(); } if (node instanceof ICPPASTCompositeTypeSpecifier) { return true; } } } } } } return false; } } /** * Semantic highlighting for static method invocations. */ private static final class StaticMethodInvocationHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return STATIC_METHOD_INVOCATION; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return RGB_BLACK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_staticMethodInvocation; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTName) { IASTName name= (IASTName)node; if (name instanceof ICPPASTQualifiedName) { return false; } if (!name.isReference()) { return false; } IBinding binding= token.getBinding(); if (binding instanceof ICPPMethod && !(binding instanceof IProblemBinding)) { return ((ICPPMethod)binding).isStatic(); } } return false; } } /** * Semantic highlighting for methods. */ private static final class MethodHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return METHOD; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return RGB_BLACK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_method; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTImplicitName) return false; if (node instanceof IASTName) { IASTName name= (IASTName)node; if (name instanceof ICPPASTQualifiedName && name.isReference()) { return false; } IBinding binding= token.getBinding(); if (binding instanceof ICPPMethod) { return true; } } return false; } } /** * Semantic highlighting for function declarations. */ private static final class FunctionDeclarationHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return FUNCTION_DECLARATION; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return RGB_BLACK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_functionDeclaration; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTImplicitName) return false; if (node instanceof IASTName) { IASTName name= (IASTName)node; if (name.isDeclaration()) { IBinding binding= token.getBinding(); if (binding instanceof IFunction && !(binding instanceof ICPPMethod)) { return true; } else if (binding instanceof IProblemBinding) { // try to derive from AST if (name instanceof ICPPASTQualifiedName) { return false; } node= name.getParent(); while (node instanceof IASTName) { node= node.getParent(); } if (node instanceof IASTFunctionDeclarator) { while (node != token.getRoot() && !(node.getParent() instanceof IASTDeclSpecifier)) { node= node.getParent(); } if (node instanceof ICPPASTCompositeTypeSpecifier) { return false; } return true; } } } } return false; } } /** * Semantic highlighting for functions. */ private static final class FunctionHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return FUNCTION; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return RGB_BLACK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_function; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTImplicitName) return false; if (node instanceof IASTName) { IASTName name= (IASTName)node; if (name instanceof ICPPASTQualifiedName && name.isReference()) { return false; } IBinding binding= token.getBinding(); if (binding instanceof IFunction && !(binding instanceof ICPPMethod)) { return true; } } return false; } } /** * Semantic highlighting for local variable declarations. */ private static final class LocalVariableDeclarationHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return LOCAL_VARIABLE_DECLARATION; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return new RGB(128, 0, 0); } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_localVariableDeclaration; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTName) { IASTName name= (IASTName)node; if (name.isDeclaration()) { IBinding binding= token.getBinding(); if (binding instanceof IVariable && !(binding instanceof IField) && !(binding instanceof IParameter) && !(binding instanceof IProblemBinding)) { try { IScope scope= binding.getScope(); if (LocalVariableHighlighting.isLocalScope(scope)) { return true; } } catch (DOMException exc) { CUIPlugin.log(exc); } } } } return false; } } /** * Semantic highlighting for local variables. */ private static final class LocalVariableHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return LOCAL_VARIABLE; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return RGB_BLACK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_localVariable; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTName) { IASTName name= (IASTName)node; if (name.isReference()) { IBinding binding= token.getBinding(); if (binding instanceof IVariable && !(binding instanceof IField) && !(binding instanceof IParameter) && !(binding instanceof IProblemBinding)) { try { IScope scope= binding.getScope(); if (isLocalScope(scope)) { return true; } } catch (DOMException exc) { CUIPlugin.log(exc); } } } } return false; } public static boolean isLocalScope(IScope scope) { while (scope != null) { if (scope instanceof ICPPFunctionScope || scope instanceof ICPPBlockScope || scope instanceof ICFunctionScope) { return true; } try { scope= scope.getParent(); } catch (DOMException e) { scope= null; } } return false; } } /** * Semantic highlighting for global variables. */ private static final class GlobalVariableHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return GLOBAL_VARIABLE; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return RGB_BLACK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_globalVariable; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTName) { IASTName name= (IASTName)node; if (name instanceof ICPPASTQualifiedName) { return false; } IBinding binding= token.getBinding(); if (binding instanceof IVariable && !(binding instanceof IField) && !(binding instanceof IParameter) && !(binding instanceof ICPPTemplateNonTypeParameter) && !(binding instanceof IProblemBinding)) { try { IScope scope= binding.getScope(); if (!LocalVariableHighlighting.isLocalScope(scope)) { return true; } } catch (DOMException exc) { CUIPlugin.log(exc); } } } return false; } } /** * Semantic highlighting for parameter variables. */ private static final class ParameterVariableHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return PARAMETER_VARIABLE; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return RGB_BLACK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_parameterVariable; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IBinding binding= token.getBinding(); if (binding instanceof IParameter) { return true; } return false; } } /** * Semantic highlighting for template parameters. */ private static final class TemplateParameterHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return TEMPLATE_PARAMETER; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return new RGB(100, 70, 50); } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_templateParameter; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTName) { IBinding binding= token.getBinding(); if (binding instanceof ICPPTemplateParameter) { return true; } } return false; } } /** * Semantic highlighting for classes. */ private static final class ClassHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return CLASS; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return new RGB(0, 80, 50); } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_classes; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof ICPPASTQualifiedName || node instanceof ICPPASTTemplateId) { return false; } if (node instanceof IASTName) { IBinding binding= token.getBinding(); if (binding instanceof ICPPClassType && !(binding instanceof ICPPTemplateParameter)) { return true; } } return false; } } /** * Semantic highlighting for enums. */ private static final class EnumHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return ENUM; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return new RGB(100, 70, 50); } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_enums; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTName) { IBinding binding= token.getBinding(); if (binding instanceof IEnumeration) { return true; } } return false; } } /** * Semantic highlighting for macro references. */ private static final class MacroReferenceHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return MACRO_REFERENCE; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return RGB_BLACK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_macroSubstitution; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IBinding binding= token.getBinding(); if (binding instanceof IMacroBinding) { IASTName name= (IASTName)token.getNode(); if (name.isReference()) { return true; } } return false; } } /** * Semantic highlighting for macro definitions. */ private static final class MacroDefinitionHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return MACRO_DEFINITION; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return RGB_BLACK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_macroDefintion; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IBinding binding= token.getBinding(); if (binding instanceof IMacroBinding) { IASTName name= (IASTName)token.getNode(); if (!name.isReference()) { return true; } } return false; } } /** * Semantic highlighting for typedefs. */ private static final class TypedefHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return TYPEDEF; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return new RGB(0, 80, 50); } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_typeDef; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTName) { IASTName name= (IASTName)node; if (name instanceof ICPPASTQualifiedName) { return false; } IBinding binding= token.getBinding(); if (binding instanceof ITypedef) { return true; } } return false; } } /** * Semantic highlighting for namespaces. */ private static final class NamespaceHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return NAMESPACE; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return RGB_BLACK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_namespace; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IBinding binding= token.getBinding(); if (binding instanceof ICPPNamespace) { return true; } return false; } } /** * Semantic highlighting for labels. */ private static final class LabelHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return LABEL; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return RGB_BLACK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_label; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IBinding binding= token.getBinding(); if (binding instanceof ILabel) { return true; } return false; } } /** * Semantic highlighting for enumerators. */ private static final class EnumeratorHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return ENUMERATOR; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return new RGB(0, 0, 192); } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_enumerator; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTName) { IASTName name= (IASTName)node; if (name instanceof ICPPASTQualifiedName) { return false; } IBinding binding= token.getBinding(); if (binding instanceof IEnumerator) { return true; } } return false; } } /** * Semantic highlighting for problems. */ private static final class ProblemHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return PROBLEM; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return new RGB(224, 0, 0); } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isStrikethroughByDefault() */ @Override public boolean isStrikethroughByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_problem; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTProblem) { return true; } IBinding binding= token.getBinding(); if (binding instanceof IProblemBinding) { return true; } return false; } } /** * Semantic highlighting for external SDK references. */ private static final class ExternalSDKHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return EXTERNAL_SDK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return new RGB(100, 40, 128); } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isStrikethroughByDefault() */ @Override public boolean isStrikethroughByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_externalSDK; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node= token.getNode(); if (node instanceof IASTName) { IASTName name= (IASTName)node; if (name instanceof ICPPASTQualifiedName) { return false; } if (name instanceof IASTImplicitName) { return false; } if (name.isReference()) { IBinding binding= token.getBinding(); IIndex index= token.getRoot().getIndex(); return isExternalSDKReference(binding, index); } } return false; } private boolean isExternalSDKReference(IBinding binding, IIndex index) { if (binding instanceof IFunction) { try { if (binding instanceof IIndexBinding) { if (((IIndexBinding) binding).isFileLocal()) { return false; } } else if (!(binding instanceof ICExternalBinding)) { return false; } IIndexName[] decls= index.findNames(binding, IIndex.FIND_DECLARATIONS | IIndex.SEARCH_ACROSS_LANGUAGE_BOUNDARIES); for (IIndexName decl : decls) { IIndexFile indexFile= decl.getFile(); if (indexFile != null && indexFile.getLocation().getFullPath() != null) { return false; } } if (decls.length != 0) { return true; } } catch (CoreException exc) { CUIPlugin.log(exc.getStatus()); return false; } } return false; } } /** * Semantic highlighting for functions. */ private static final class OverloadedOperatorHighlighting extends SemanticHighlighting { /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey() */ @Override public String getPreferenceKey() { return OVERLOADED_OPERATOR; } @Override public boolean requiresImplicitNames() { return true; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @Override public RGB getDefaultTextColor() { return new RGB(200, 100, 0); // orange } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold() */ @Override public boolean isBoldByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault() */ @Override public boolean isItalicByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault() */ @Override public boolean isEnabledByDefault() { return false; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName() */ @Override public String getDisplayName() { return CEditorMessages.SemanticHighlighting_overloadedOperators; } /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken) */ @Override public boolean consumes(SemanticToken token) { IASTNode node = token.getNode(); // so far we only have implicit names for overloaded operators and destructors, so this works if (node instanceof IASTImplicitName) { IASTImplicitName name = (IASTImplicitName) node; if (name.isReference() && name.isOperator()) { IBinding binding = name.resolveBinding(); if (binding instanceof ICPPMethod && !(binding instanceof IProblemBinding) && ((ICPPMethod) binding).isImplicit()) { return false; } if (binding instanceof ICPPUnknownBinding) return false; char[] chars = name.toCharArray(); if (chars[0] == '~' || OverloadableOperator.isNew(chars) || OverloadableOperator.isDelete(chars)) { return false; } return true; } } return false; } } /** * A named preference that controls the given semantic highlighting's color. * * @param semanticHighlighting the semantic highlighting * @return the color preference key */ public static String getColorPreferenceKey(SemanticHighlighting semanticHighlighting) { return PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX + semanticHighlighting.getPreferenceKey() + PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_COLOR_SUFFIX; } /** * A named preference that controls if the given semantic highlighting has the text attribute bold. * * @param semanticHighlighting the semantic highlighting * @return the bold preference key */ public static String getBoldPreferenceKey(SemanticHighlighting semanticHighlighting) { return PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX + semanticHighlighting.getPreferenceKey() + PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_BOLD_SUFFIX; } /** * A named preference that controls if the given semantic highlighting has the text attribute italic. * * @param semanticHighlighting the semantic highlighting * @return the italic preference key */ public static String getItalicPreferenceKey(SemanticHighlighting semanticHighlighting) { return PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX + semanticHighlighting.getPreferenceKey() + PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ITALIC_SUFFIX; } /** * A named preference that controls if the given semantic highlighting has the text attribute strikethrough. * * @param semanticHighlighting the semantic highlighting * @return the strikethrough preference key */ public static String getStrikethroughPreferenceKey(SemanticHighlighting semanticHighlighting) { return PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX + semanticHighlighting.getPreferenceKey() + PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_STRIKETHROUGH_SUFFIX; } /** * A named preference that controls if the given semantic highlighting has the text attribute underline. * * @param semanticHighlighting the semantic highlighting * @return the underline preference key */ public static String getUnderlinePreferenceKey(SemanticHighlighting semanticHighlighting) { return PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX + semanticHighlighting.getPreferenceKey() + PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_UNDERLINE_SUFFIX; } /** * A named preference that controls if the given semantic highlighting is enabled. * * @param semanticHighlighting the semantic highlighting * @return the enabled preference key */ public static String getEnabledPreferenceKey(SemanticHighlighting semanticHighlighting) { return PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX + semanticHighlighting.getPreferenceKey() + PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED_SUFFIX; } /** * @return The semantic highlightings, the order defines the precedence of matches, the first match wins. */ public static SemanticHighlighting[] getSemanticHighlightings() { if (fgSemanticHighlightings == null) fgSemanticHighlightings= new SemanticHighlighting[] { new MacroReferenceHighlighting(), // before all others! new ProblemHighlighting(), new ExternalSDKHighlighting(), new ClassHighlighting(), new StaticFieldHighlighting(), new FieldHighlighting(), // after all other fields new MethodDeclarationHighlighting(), new StaticMethodInvocationHighlighting(), new ParameterVariableHighlighting(), // before local variables new LocalVariableDeclarationHighlighting(), new LocalVariableHighlighting(), new GlobalVariableHighlighting(), new TemplateParameterHighlighting(), // before template arguments! new OverloadedOperatorHighlighting(), // before both method and function new MethodHighlighting(), // before types to get ctors new EnumHighlighting(), new MacroDefinitionHighlighting(), new FunctionDeclarationHighlighting(), new FunctionHighlighting(), new TypedefHighlighting(), new NamespaceHighlighting(), new LabelHighlighting(), new EnumeratorHighlighting(), }; return fgSemanticHighlightings; } /** * Initialize default preferences in the given preference store. * @param store The preference store */ public static void initDefaults(IPreferenceStore store) { store.setDefault(PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED, true); SemanticHighlighting[] semanticHighlightings= getSemanticHighlightings(); for (SemanticHighlighting semanticHighlighting : semanticHighlightings) { store.setDefault(SemanticHighlightings.getEnabledPreferenceKey(semanticHighlighting), DEBUG || semanticHighlighting.isEnabledByDefault()); PreferenceConverter.setDefault(store, SemanticHighlightings.getColorPreferenceKey(semanticHighlighting), semanticHighlighting.getDefaultTextColor()); store.setDefault(SemanticHighlightings.getBoldPreferenceKey(semanticHighlighting), semanticHighlighting.isBoldByDefault()); store.setDefault(SemanticHighlightings.getItalicPreferenceKey(semanticHighlighting), semanticHighlighting.isItalicByDefault()); store.setDefault(SemanticHighlightings.getStrikethroughPreferenceKey(semanticHighlighting), semanticHighlighting.isStrikethroughByDefault()); store.setDefault(SemanticHighlightings.getUnderlinePreferenceKey(semanticHighlighting), DEBUG || semanticHighlighting.isUnderlineByDefault()); } } /** * Tests whether <code>event</code> in <code>store</code> affects the * enablement of semantic highlighting. * * @param store the preference store where <code>event</code> was observed * @param event the property change under examination * @return <code>true</code> if <code>event</code> changed semantic * highlighting enablement, <code>false</code> if it did not */ public static boolean affectsEnablement(IPreferenceStore store, PropertyChangeEvent event) { if (event.getProperty().equals(PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED)) { return true; } String relevantKey= null; SemanticHighlighting[] highlightings= getSemanticHighlightings(); for (SemanticHighlighting highlighting : highlightings) { if (event.getProperty().equals(getEnabledPreferenceKey(highlighting))) { relevantKey= event.getProperty(); break; } } if (relevantKey == null) return false; for (SemanticHighlighting highlighting : highlightings) { String key= getEnabledPreferenceKey(highlighting); if (key.equals(relevantKey)) continue; if (store.getBoolean(key)) return false; // another is still enabled or was enabled before } // all others are disabled, so toggling relevantKey affects the enablement return true; } /** * Tests whether semantic highlighting is currently enabled. * * @param store the preference store to consult * @return <code>true</code> if semantic highlighting is enabled, * <code>false</code> if it is not */ public static boolean isEnabled(IPreferenceStore store) { if (!store.getBoolean(PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED)) { return false; } SemanticHighlighting[] highlightings= getSemanticHighlightings(); boolean enable= false; for (SemanticHighlighting highlighting : highlightings) { String enabledKey= getEnabledPreferenceKey(highlighting); if (store.getBoolean(enabledKey)) { enable= true; break; } } return enable; } /** * Do not instantiate */ private SemanticHighlightings() { } }