/*
* Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC
* All rights reserved.
*
* The source code of this document is proprietary work, and is not licensed for
* distribution. For information about licensing, contact Sam Harwell at:
* sam@tunnelvisionlabs.com
*/
package org.antlr.works.editor.grammar.navigation;
import java.awt.Image;
import org.antlr.netbeans.editor.navigation.Description;
import org.antlr.netbeans.editor.navigation.NavigatorNode;
import org.antlr.netbeans.editor.navigation.NavigatorPanelUI;
import org.antlr.v4.tool.Grammar;
import org.openide.util.ImageUtilities;
public class GrammarNode extends NavigatorNode {
public static Image PARSER_IMAGE;
public static Image LEXER_IMAGE;
public static Image FRAGMENT_IMAGE;
public static Image TOKEN_IMAGE;
public static Image MODE_IMAGE;
public static Image CHANNEL_IMAGE;
static {
PARSER_IMAGE = ImageUtilities.loadImage("org/antlr/works/editor/grammar/navigation/resources/parsericon.png");
LEXER_IMAGE = ImageUtilities.loadImage("org/antlr/works/editor/grammar/navigation/resources/lexericon.png");
FRAGMENT_IMAGE = ImageUtilities.loadImage("org/antlr/works/editor/grammar/navigation/resources/fragmenticon.png");
TOKEN_IMAGE = ImageUtilities.loadImage("org/antlr/works/editor/grammar/navigation/resources/tokenicon.png");
MODE_IMAGE = ImageUtilities.loadImage("org/antlr/works/editor/grammar/navigation/resources/modeicon.png");
CHANNEL_IMAGE = ImageUtilities.loadImage("org/antlr/works/editor/grammar/navigation/resources/channelicon.png");
}
public GrammarNode(NavigatorPanelUI ui, Description description) {
super(ui, description, GrammarNodeFactory.INSTANCE);
}
@Override
public GrammarRulesPanelUI getUI() {
return (GrammarRulesPanelUI)super.getUI();
}
@Override
public void updateRecursively(Description newDescription) {
super.updateRecursively(newDescription);
if (newDescription != null && newDescription.getName() != null) {
String currentRuleName = getUI().getCurrentRuleName();
boolean currentNode = newDescription.getName().equals(currentRuleName);
// TODO: highlight current node
}
}
@Override
public Image getIcon(int type) {
if (getDescription() instanceof GrammarNodeDescription) {
switch (((GrammarNodeDescription)getDescription()).getDeclarationKind()) {
case PARSER_RULE:
return PARSER_IMAGE;
case LEXER_RULE:
return LEXER_IMAGE;
case FRAGMENT_RULE:
return FRAGMENT_IMAGE;
case TOKEN:
return TOKEN_IMAGE;
case MODE:
return MODE_IMAGE;
case CHANNEL:
return CHANNEL_IMAGE;
case UNKNOWN:
case UNDEFINED:
default:
break;
}
}
String name = getDescription().getName();
if (!getDescription().getChildren().isEmpty()) {
name = getDescription().getChildren().iterator().next().getName();
}
if (name == null) {
return super.getIcon(type);
} else if (Grammar.isTokenName(name)) {
return LEXER_IMAGE;
} else {
return PARSER_IMAGE;
}
}
public static class GrammarNodeDescription extends Description {
private final DeclarationKind declarationKind;
public GrammarNodeDescription(DeclarationKind declarationKind) {
this.declarationKind = declarationKind;
}
public GrammarNodeDescription(DeclarationKind declarationKind, String name) {
super(name);
this.declarationKind = declarationKind;
}
public DeclarationKind getDeclarationKind() {
return declarationKind;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof GrammarNodeDescription)) {
return false;
}
return super.equals(obj);
}
@Override
public int hashCode() {
return super.hashCode();
}
}
protected static class GrammarNodeFactory implements Factory {
public static final GrammarNodeFactory INSTANCE = new GrammarNodeFactory();
@Override
public NavigatorNode createNode(NavigatorPanelUI ui, Description key) {
return new GrammarNode(ui, key);
}
}
}