Commit 352592cb authored by Miklos Magyari's avatar Miklos Magyari
Browse files

Refactored semantic highligting code to its own class


Signed-off-by: Miklos Magyari's avatarMiklos Magyari <miklos.magyari@sigmatechnology.se>
parent 2b763eff
......@@ -14,6 +14,7 @@ import org.eclipse.titan.designer.AST.TTCN3.definitions.FormalParameter.paramete
import org.eclipse.titan.designer.AST.TTCN3.definitions.Group;
import org.eclipse.titan.designer.compiler.JavaGenData;
import org.eclipse.titan.designer.declarationsearch.Declaration;
import org.eclipse.titan.designer.editors.AstSyntaxHighlightTokens;
import org.eclipse.titan.designer.editors.ProposalCollector;
import org.eclipse.titan.designer.editors.actions.DeclarationCollector;
import org.eclipse.titan.designer.parsers.CompilationTimeStamp;
......@@ -399,6 +400,6 @@ public abstract class Assignment extends ASTNode implements IOutlineElement, ILo
* Should be called from the beginning of check()
*/
protected void removeSyntaxDecoration() {
getMyScope().getModuleScope().removeSyntaxDecoration(identifier.location.getOffset());
AstSyntaxHighlightTokens.removeSyntaxDecoration(location);
}
}
......@@ -7,31 +7,19 @@
******************************************************************************/
package org.eclipse.titan.designer.AST;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.collections.impl.map.mutable.primitive.IntObjectHashMap;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IPositionUpdater;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.titan.designer.Activator;
import org.eclipse.titan.designer.AST.TTCN3.definitions.Def_Type;
import org.eclipse.titan.designer.compiler.JavaGenData;
import org.eclipse.titan.designer.declarationsearch.Declaration;
import org.eclipse.titan.designer.editors.AstSyntaxHighlightTokens;
import org.eclipse.titan.designer.editors.ColorManager;
import org.eclipse.titan.designer.editors.DocumentTracker;
import org.eclipse.titan.designer.editors.controls.PeekSource;
import org.eclipse.titan.designer.editors.controls.Ttcn3HoverContent;
import org.eclipse.titan.designer.editors.ttcn3editor.TTCN3Editor;
import org.eclipse.titan.designer.parsers.CompilationTimeStamp;
import org.eclipse.titan.designer.parsers.ProjectStructureDataCollector;
import org.eclipse.titan.designer.preferences.PreferenceConstants;
import org.eclipse.titan.designer.productUtilities.ProductConstants;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor;
......@@ -50,16 +38,6 @@ public abstract class Module extends Scope implements IOutlineElement, ILocateab
TTCN3_MODULE
}
public enum SyntaxDecoration {
Constant, /* TTCN3 constant */
DefType, /* own type defined with the 'type' keyword */
Deprecated, /* object marked as 'deprecated' in the status field of document comment */
Variable, /* TTCN3 variable */
}
/** Map of style tokens associated with special AST-based syntax elements */
private static Map<SyntaxDecoration, IToken> tokenMap = new HashMap<>();
public static final String MODULE = "module";
protected IProject project;
......@@ -79,34 +57,6 @@ public abstract class Module extends Scope implements IOutlineElement, ILocateab
private TTCN3Editor editor;
static {
final IPreferencesService prefs = Platform.getPreferencesService();
final boolean isSemanticHighlightingEnabled = prefs.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER,
PreferenceConstants.ENABLE_SEMANTIC_HIGHLIGHTING, false, null);
if (isSemanticHighlightingEnabled) {
addTokens();
}
Activator.getDefault().getPreferenceStore().addPropertyChangeListener((event) -> {
final String property = event.getProperty();
if (PreferenceConstants.ENABLE_SEMANTIC_HIGHLIGHTING.equals(property)) {
final boolean isEnabled = prefs.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER,
PreferenceConstants.ENABLE_SEMANTIC_HIGHLIGHTING, false, null);
if (isEnabled) {
addTokens();
}
}
});
}
private static void addTokens() {
ColorManager colorManager = new ColorManager();
tokenMap.put(SyntaxDecoration.Constant, colorManager.createTokenFromPreference(PreferenceConstants.COLOR_AST_CONSTANT));
tokenMap.put(SyntaxDecoration.DefType, colorManager.createTokenFromPreference(PreferenceConstants.COLOR_AST_DEFTYPE));
tokenMap.put(SyntaxDecoration.Deprecated, colorManager.createTokenFromPreference(PreferenceConstants.COLOR_AST_DEPRECATED));
tokenMap.put(SyntaxDecoration.Variable, colorManager.createTokenFromPreference(PreferenceConstants.COLOR_AST_VARIABLE));
}
public Module(final Identifier identifier, final IProject project) {
this.project = project;
this.identifier = identifier;
......@@ -420,63 +370,9 @@ public abstract class Module extends Scope implements IOutlineElement, ILocateab
}
return hoverContent;
}
/** Sets a special syntax token at the given location */
public void addSyntaxDecoration(int offset, String text, SyntaxDecoration decoration) {
final IntObjectHashMap<IToken> syntaxMap = AstSyntaxHighlightTokens.getOffsetMap(identifier.getDisplayName());
if (syntaxMap == null) {
return;
}
IToken token = tokenMap.get(decoration);
syntaxMap.asSynchronized().put(offset, token);
}
public void removeSyntaxDecoration(int offset) {
final IntObjectHashMap<IToken> syntaxMap = AstSyntaxHighlightTokens.getOffsetMap(identifier.getDisplayName());
if (syntaxMap == null) {
return;
}
syntaxMap.asSynchronized().remove(offset);
}
public void removeSpecificSyntaxDecoration(int offset, SyntaxDecoration decoration) {
final IntObjectHashMap<IToken> syntaxMap = AstSyntaxHighlightTokens.getOffsetMap(identifier.getDisplayName());
if (syntaxMap == null) {
return;
}
final IToken token = tokenMap.get(decoration);
if (syntaxMap.get(offset) == token) {
syntaxMap.asSynchronized().remove(offset);
}
}
/**
* Returns the special syntax token at a given offset, if exists
* @param offset
* @return
*/
public IToken getSyntaxToken(int offset) {
final IntObjectHashMap<IToken> syntaxMap = AstSyntaxHighlightTokens.getOffsetMap(identifier.getDisplayName());
if (syntaxMap == null) {
return null;
}
return syntaxMap.get(offset);
}
@Override
public synchronized void update(DocumentEvent event) {
final IntObjectHashMap<IToken> syntaxMap = AstSyntaxHighlightTokens.getOffsetMap(identifier.getDisplayName());
if (syntaxMap == null) {
return;
}
int change = event.getText().length() - event.fLength;
IntObjectHashMap<IToken> tempMap = new IntObjectHashMap<>();
syntaxMap.forEachKeyValue((int key, IToken value) -> {
tempMap.put(key < event.fOffset ? key : key + change, value);
});
AstSyntaxHighlightTokens.setOffsetMap(identifier.getDisplayName(), tempMap);
public void update(DocumentEvent event) {
}
}
......@@ -17,7 +17,6 @@ import org.eclipse.titan.designer.AST.GovernedSimple.CodeSectionType;
import org.eclipse.titan.designer.AST.ISetting.Setting_type;
import org.eclipse.titan.designer.AST.ISubReference.Subreference_type;
import org.eclipse.titan.designer.AST.IType.Type_type;
import org.eclipse.titan.designer.AST.Module.SyntaxDecoration;
import org.eclipse.titan.designer.AST.ReferenceFinder.Hit;
import org.eclipse.titan.designer.AST.ASN1.ASN1Assignment;
import org.eclipse.titan.designer.AST.ASN1.types.ASN1_Choice_Type;
......@@ -56,6 +55,8 @@ import org.eclipse.titan.designer.AST.TTCN3.values.Expression_Value.Operation_ty
import org.eclipse.titan.designer.AST.TTCN3.values.expressions.ExpressionStruct;
import org.eclipse.titan.designer.compiler.JavaGenData;
import org.eclipse.titan.designer.declarationsearch.Declaration;
import org.eclipse.titan.designer.editors.AstSyntaxHighlightTokens;
import org.eclipse.titan.designer.editors.AstSyntaxHighlightTokens.SyntaxDecoration;
import org.eclipse.titan.designer.parsers.CompilationTimeStamp;
import org.eclipse.titan.designer.parsers.ttcn3parser.ReParseException;
import org.eclipse.titan.designer.parsers.ttcn3parser.TTCN3ReparseUpdater;
......@@ -654,7 +655,7 @@ public class Reference extends ASTNode implements ILocateableNode, IIncrementall
if (referredAssignment instanceof ICommentable) {
final DocumentComment comment = ((ICommentable)referredAssignment).getDocumentComment();
if (comment != null && comment.isDeprecated()) {
getMyScope().getModuleScope().addSyntaxDecoration(getLocation().getOffset(),
AstSyntaxHighlightTokens.addSyntaxDecoration(getLocation(),
referredAssignment.identifier.getDisplayName(), SyntaxDecoration.Deprecated);
isDecorated = true;
}
......@@ -663,21 +664,21 @@ public class Reference extends ASTNode implements ILocateableNode, IIncrementall
if (referredAssignment instanceof Definition) {
final Definition definition = (Definition)referredAssignment;
if (definition instanceof Def_Const) {
getMyScope().getModuleScope().addSyntaxDecoration(getLocation().getOffset(),
AstSyntaxHighlightTokens.addSyntaxDecoration(getLocation(),
referredAssignment.identifier.getDisplayName(), SyntaxDecoration.Constant);
isDecorated = true;
} else if (definition instanceof Def_Var) {
getMyScope().getModuleScope().addSyntaxDecoration(getLocation().getOffset(),
AstSyntaxHighlightTokens.addSyntaxDecoration(getLocation(),
referredAssignment.identifier.getDisplayName(), SyntaxDecoration.Variable);
isDecorated = true;
} else if (definition instanceof Def_Type) {
getMyScope().getModuleScope().addSyntaxDecoration(getLocation().getOffset(),
AstSyntaxHighlightTokens.addSyntaxDecoration(getLocation(),
referredAssignment.identifier.getDisplayName(), SyntaxDecoration.DefType);
isDecorated = true;
}
}
if (isDecorated == false) {
getMyScope().getModuleScope().removeSyntaxDecoration(getLocation().getOffset());
AstSyntaxHighlightTokens.removeSyntaxDecoration(getLocation());
}
return referredAssignment;
......
......@@ -28,7 +28,6 @@ import org.eclipse.titan.designer.AST.IValue;
import org.eclipse.titan.designer.AST.IValue.Value_type;
import org.eclipse.titan.designer.AST.Identifier;
import org.eclipse.titan.designer.AST.Location;
import org.eclipse.titan.designer.AST.Module.SyntaxDecoration;
import org.eclipse.titan.designer.AST.NamingConventionHelper;
import org.eclipse.titan.designer.AST.ReferenceChain;
import org.eclipse.titan.designer.AST.ReferenceFinder;
......@@ -41,6 +40,8 @@ import org.eclipse.titan.designer.AST.TTCN3.types.Array_Type;
import org.eclipse.titan.designer.AST.TTCN3.types.ClassTypeBody;
import org.eclipse.titan.designer.AST.TTCN3.types.ComponentTypeBody;
import org.eclipse.titan.designer.compiler.JavaGenData;
import org.eclipse.titan.designer.editors.AstSyntaxHighlightTokens;
import org.eclipse.titan.designer.editors.AstSyntaxHighlightTokens.SyntaxDecoration;
import org.eclipse.titan.designer.editors.ProposalCollector;
import org.eclipse.titan.designer.editors.actions.DeclarationCollector;
import org.eclipse.titan.designer.editors.controls.HoverContentType;
......@@ -260,7 +261,7 @@ public final class Def_Const extends Definition {
value.setGenNameRecursive(getGenName());
value.setCodeSection(CodeSectionType.CS_PRE_INIT);
getMyScope().getModuleScope().addSyntaxDecoration(getIdentifier().getLocation().getOffset(),
AstSyntaxHighlightTokens.addSyntaxDecoration(getIdentifier().getLocation(),
getIdentifier().getDisplayName(), SyntaxDecoration.Constant);
}
......
......@@ -25,7 +25,6 @@ import org.eclipse.titan.designer.AST.IType.Type_type;
import org.eclipse.titan.designer.AST.IType.ValueCheckingOptions;
import org.eclipse.titan.designer.AST.IValue;
import org.eclipse.titan.designer.AST.IValue.Value_type;
import org.eclipse.titan.designer.AST.Module.SyntaxDecoration;
import org.eclipse.titan.designer.AST.Identifier;
import org.eclipse.titan.designer.AST.Location;
import org.eclipse.titan.designer.AST.NamingConventionHelper;
......@@ -45,6 +44,8 @@ import org.eclipse.titan.designer.AST.TTCN3.types.ComponentTypeBody;
import org.eclipse.titan.designer.AST.TTCN3.types.Referenced_Type;
import org.eclipse.titan.designer.AST.TTCN3.values.expressions.ExpressionStruct;
import org.eclipse.titan.designer.compiler.JavaGenData;
import org.eclipse.titan.designer.editors.AstSyntaxHighlightTokens;
import org.eclipse.titan.designer.editors.AstSyntaxHighlightTokens.SyntaxDecoration;
import org.eclipse.titan.designer.editors.ProposalCollector;
import org.eclipse.titan.designer.editors.actions.DeclarationCollector;
import org.eclipse.titan.designer.editors.controls.HoverContentType;
......@@ -252,7 +253,7 @@ public final class Def_Var extends Definition {
initialValue.setGenNameRecursive(getGenName());
initialValue.setCodeSection(CodeSectionType.CS_INLINE);
}
getMyScope().getModuleScope().addSyntaxDecoration(getIdentifier().getLocation().getOffset(),
AstSyntaxHighlightTokens.addSyntaxDecoration(getIdentifier().getLocation(),
getIdentifier().getDisplayName(), SyntaxDecoration.Variable);
}
......@@ -563,13 +564,29 @@ public final class Def_Var extends Definition {
}
}
final IType assType = getType(getLastTimeChecked());
IType assType = getType(getLastTimeChecked());
if (assType instanceof Referenced_Type) {
assType = assType.getTypeRefdLast(lastTimeChecked);
}
hoverContent.addIcon(getOutlineIcon());
hoverContent.addText("var ");
hoverContent.addStyledText(assType != null ? assType.getTypename() : "<?>")
.addStyledText(" ").addStyledText(getFullNameForDocComment(), SWT.BOLD);
hoverContent.closeHeader();
if (assType instanceof Class_Type) {
final Class_Type ct = (Class_Type)assType;
final ClassTypeBody body = ct.getClassBody();
if (body != null) {
body.addClassMembers(this, hoverContent, dc);
}
}
if (assType instanceof IMemberInfo) {
final IMemberInfo mInfo = (IMemberInfo)assType;
mInfo.addMembersContent(hoverContent);
}
if (dc != null) {
dc.addDescsContent(hoverContent);
dc.addStatusContent(hoverContent);
......
......@@ -39,7 +39,6 @@ import org.eclipse.titan.designer.AST.IType;
import org.eclipse.titan.designer.AST.Identifier;
import org.eclipse.titan.designer.AST.Location;
import org.eclipse.titan.designer.AST.MarkerHandler;
import org.eclipse.titan.designer.AST.Module.SyntaxDecoration;
import org.eclipse.titan.designer.AST.NULL_Location;
import org.eclipse.titan.designer.AST.Reference;
import org.eclipse.titan.designer.AST.ReferenceFinder;
......@@ -61,6 +60,8 @@ import org.eclipse.titan.designer.AST.TTCN3.attributes.SingleWithAttribute.Attri
import org.eclipse.titan.designer.AST.TTCN3.attributes.WithAttributesPath;
import org.eclipse.titan.designer.AST.TTCN3.statements.StatementBlock;
import org.eclipse.titan.designer.compiler.JavaGenData;
import org.eclipse.titan.designer.editors.AstSyntaxHighlightTokens;
import org.eclipse.titan.designer.editors.AstSyntaxHighlightTokens.SyntaxDecoration;
import org.eclipse.titan.designer.editors.ProposalCollector;
import org.eclipse.titan.designer.editors.actions.DeclarationCollector;
import org.eclipse.titan.designer.editors.controls.PeekSource;
......@@ -529,10 +530,10 @@ public abstract class Definition extends Assignment implements IAppendableSyntax
parseDocumentComment();
}
if (documentComment.isDeprecated()) {
getMyScope().getModuleScope().addSyntaxDecoration(getIdentifier().getLocation().getOffset(),
AstSyntaxHighlightTokens.addSyntaxDecoration(getIdentifier().getLocation(),
getIdentifier().getDisplayName(), SyntaxDecoration.Deprecated);
} else {
getMyScope().getModuleScope().removeSpecificSyntaxDecoration(getIdentifier().getLocation().getOffset(), SyntaxDecoration.Deprecated);
AstSyntaxHighlightTokens.removeSpecificSyntaxDecoration(getIdentifier().getLocation(), SyntaxDecoration.Deprecated);
}
}
}
......
......@@ -19,9 +19,10 @@ import org.eclipse.collections.impl.map.sorted.mutable.TreeSortedMap;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.titan.designer.Activator;
import org.eclipse.titan.designer.AST.Module.SyntaxDecoration;
import org.eclipse.titan.designer.AST.Location;
import org.eclipse.titan.designer.preferences.PreferenceConstants;
import org.eclipse.titan.designer.productUtilities.ProductConstants;
......@@ -34,6 +35,13 @@ import org.eclipse.titan.designer.productUtilities.ProductConstants;
*
*/
public final class AstSyntaxHighlightTokens {
public enum SyntaxDecoration {
Constant, /* TTCN3 constant */
DefType, /* own type defined with the 'type' keyword */
Deprecated, /* object marked as 'deprecated' in the status field of document comment */
Variable, /* TTCN3 variable */
}
private static Map<String, IntObjectHashMap<IToken>> offsetMaps = new HashMap<>();
private static Map<String, MutableSortedMap<Integer,Integer>> depthMaps = new HashMap<>();
......@@ -41,6 +49,9 @@ public final class AstSyntaxHighlightTokens {
private static List<IToken> bracketcolors = new ArrayList<IToken>();
/** Map of style tokens associated with special AST-based syntax elements */
private static Map<SyntaxDecoration, IToken> tokenMap = new HashMap<>();
static {
final IPreferencesService prefs = Platform.getPreferencesService();
final boolean isSemanticHighlightingEnabled = prefs.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER,
......@@ -63,6 +74,10 @@ public final class AstSyntaxHighlightTokens {
private static void addTokens() {
final ColorManager colorManager = new ColorManager();
tokenMap.put(SyntaxDecoration.Constant, colorManager.createTokenFromPreference(PreferenceConstants.COLOR_AST_CONSTANT));
tokenMap.put(SyntaxDecoration.DefType, colorManager.createTokenFromPreference(PreferenceConstants.COLOR_AST_DEFTYPE));
tokenMap.put(SyntaxDecoration.Deprecated, colorManager.createTokenFromPreference(PreferenceConstants.COLOR_AST_DEPRECATED));
tokenMap.put(SyntaxDecoration.Variable, colorManager.createTokenFromPreference(PreferenceConstants.COLOR_AST_VARIABLE));
bracketcolors.add(colorManager.createTokenFromPreference(PreferenceConstants.BRACKETCOLOR0));
bracketcolors.add(colorManager.createTokenFromPreference(PreferenceConstants.BRACKETCOLOR1));
bracketcolors.add(colorManager.createTokenFromPreference(PreferenceConstants.BRACKETCOLOR2));
......@@ -139,4 +154,83 @@ public final class AstSyntaxHighlightTokens {
}
return depth;
}
/** Sets a special syntax token at the given location */
public static void addSyntaxDecoration(Location location, String text, SyntaxDecoration decoration) {
final IFile file = (IFile)location.getFile();
if (file != null) {
addSyntaxDecoration(file.getFullPath().toOSString(), location.getOffset(), text, decoration);
}
}
public static void addSyntaxDecoration(String key, int offset, String text, SyntaxDecoration decoration) {
final IntObjectHashMap<IToken> syntaxMap = AstSyntaxHighlightTokens.getOffsetMap(key);
if (syntaxMap == null) {
return;
}
IToken token = tokenMap.get(decoration);
syntaxMap.asSynchronized().put(offset, token);
}
public static void removeSyntaxDecoration(Location location) {
final IFile file = (IFile)location.getFile();
if (file != null) {
removeSyntaxDecoration(file.getFullPath().toOSString(), location.getOffset());
}
}
public static void removeSyntaxDecoration(String key, int offset) {
final IntObjectHashMap<IToken> syntaxMap = AstSyntaxHighlightTokens.getOffsetMap(key);
if (syntaxMap == null) {
return;
}
syntaxMap.asSynchronized().remove(offset);
}
public static void removeSpecificSyntaxDecoration(Location location, SyntaxDecoration decoration) {
final IFile file = (IFile)location.getFile();
if (file != null) {
removeSpecificSyntaxDecoration(file.getFullPath().toOSString(), location.getOffset(), decoration);
}
}
public static void removeSpecificSyntaxDecoration(String key, int offset, SyntaxDecoration decoration) {
final IntObjectHashMap<IToken> syntaxMap = AstSyntaxHighlightTokens.getOffsetMap(key);
if (syntaxMap == null) {
return;
}
final IToken token = tokenMap.get(decoration);
if (syntaxMap.get(offset) == token) {
syntaxMap.asSynchronized().remove(offset);
}
}
/**
* Returns the special syntax token at a given offset, if exists
* @param offset
* @return
*/
public static IToken getSyntaxToken(String key, int offset) {
final IntObjectHashMap<IToken> syntaxMap = AstSyntaxHighlightTokens.getOffsetMap(key);
if (syntaxMap == null) {
return null;
}
return syntaxMap.get(offset);
}
public static synchronized void update(String filename, DocumentEvent event) {
final IntObjectHashMap<IToken> syntaxMap = AstSyntaxHighlightTokens.getOffsetMap(filename);
if (syntaxMap == null) {
return;
}
int change = event.getText().length() - event.fLength;
IntObjectHashMap<IToken> tempMap = new IntObjectHashMap<>();
syntaxMap.forEachKeyValue((int key, IToken value) -> {
tempMap.put(key < event.fOffset ? key : key + change, value);
});
AstSyntaxHighlightTokens.setOffsetMap(filename, tempMap);
}
}
......@@ -16,6 +16,7 @@ import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WordRule;
import org.eclipse.titan.designer.Activator;
import org.eclipse.titan.designer.AST.Module;
import org.eclipse.titan.designer.editors.AstSyntaxHighlightTokens;
import org.eclipse.titan.designer.editors.DocumentTracker;
import org.eclipse.titan.designer.editors.IDocumentGetter;
import org.eclipse.titan.designer.preferences.PreferenceConstants;
......@@ -92,7 +93,8 @@ public class AstWordRule extends WordRule {
final IDocumentGetter codeScanner = (IDocumentGetter)scanner;
final Module module = DocumentTracker.get(codeScanner.getDocument());
if (module != null) {
final IToken decoration = module.getSyntaxToken(codeScanner.getTokenOffset());
final String filename = module.getLocation().getFile().getFullPath().toOSString();
final IToken decoration = AstSyntaxHighlightTokens.getSyntaxToken(filename, codeScanner.getTokenOffset());
if (decoration != null) {
return decoration;
}
......
......@@ -31,6 +31,7 @@ import org.eclipse.jface.text.reconciler.IReconciler;
import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
import org.eclipse.titan.common.logging.ErrorReporter;
import org.eclipse.titan.designer.AST.Module;
import org.eclipse.titan.designer.editors.AstSyntaxHighlightTokens;
import org.eclipse.titan.designer.editors.DocumentTracker;
import org.eclipse.titan.designer.preferences.PreferenceConstants;
import org.eclipse.titan.designer.productUtilities.ProductConstants;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment