/*
* 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.tvl.goworks.editor.go.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.netbeans.api.annotations.common.StaticResource;
import org.openide.util.ImageUtilities;
public class GoNode extends NavigatorNode {
@StaticResource
private static final String CONST_STATIC_PUBLIC = "org/tvl/goworks/editor/go/resources/const_static_public.png";
@StaticResource
private static final String CONST_STATIC_PROTECTED = "org/tvl/goworks/editor/go/resources/const_static_protected.png";
@StaticResource
private static final String CONST_PUBLIC = "org/tvl/goworks/editor/go/resources/const_public.png";
@StaticResource
private static final String CONST_PROTECTED = "org/tvl/goworks/editor/go/resources/const_protected.png";
@StaticResource
private static final String FIELD_STATIC_PUBLIC = "org/tvl/goworks/editor/go/resources/field_static_16.png";
@StaticResource
private static final String FIELD_STATIC_PROTECTED = "org/tvl/goworks/editor/go/resources/field_static_protected_16.png";
@StaticResource
private static final String FIELD_PUBLIC = "org/tvl/goworks/editor/go/resources/fields.png";
@StaticResource
private static final String FIELD_PROTECTED = "org/tvl/goworks/editor/go/resources/field_protected_16.png";
@StaticResource
private static final String METHOD_STATIC_PUBLIC = "org/tvl/goworks/editor/go/resources/methods_static.png";
@StaticResource
private static final String METHOD_STATIC_PROTECTED = "org/tvl/goworks/editor/go/resources/methods_static_protected.png";
@StaticResource
private static final String METHOD_PUBLIC = "org/tvl/goworks/editor/go/resources/methods.png";
@StaticResource
private static final String METHOD_PROTECTED = "org/tvl/goworks/editor/go/resources/methods_protected.png";
@StaticResource
private static final String STRUCT = "org/tvl/goworks/editor/go/resources/struct_16.png";
@StaticResource
private static final String INTERFACE = "org/tvl/goworks/editor/go/resources/interface.png";
@StaticResource
private static final String TYPEDEF = "org/tvl/goworks/editor/go/resources/typedef_16.png";
public GoNode(NavigatorPanelUI ui, DeclarationDescription description) {
super(ui, description, DeclarationNodeFactory.INSTANCE);
}
@Override
public DeclarationDescription getDescription() {
return (DeclarationDescription)super.getDescription();
}
@Override
public Image getIcon(int type) {
String imageName;
switch (getDescription().getKind()) {
case CONSTANT:
if (getDescription().isExported()) {
imageName = CONST_STATIC_PUBLIC;
} else {
imageName = CONST_STATIC_PROTECTED;
}
break;
case VARIABLE:
if (getDescription().isExported()) {
imageName = FIELD_STATIC_PUBLIC;
} else {
imageName = FIELD_STATIC_PROTECTED;
}
break;
case FIELD:
if (getDescription().isExported()) {
imageName = FIELD_PUBLIC;
} else {
imageName = FIELD_PROTECTED;
}
break;
case FUNCTION:
if (getDescription().isExported()) {
imageName = METHOD_STATIC_PUBLIC;
} else {
imageName = METHOD_STATIC_PROTECTED;
}
break;
case METHOD:
if (getDescription().isExported()) {
imageName = METHOD_PUBLIC;
} else {
imageName = METHOD_PROTECTED;
}
break;
case STRUCT:
imageName = STRUCT;
break;
case INTERFACE:
imageName = INTERFACE;
break;
case TYPEDEF:
imageName = TYPEDEF;
break;
case UNKNOWN:
default:
// TODO: use error image
imageName = STRUCT;
break;
}
return ImageUtilities.loadImage(imageName);
}
public static class DeclarationDescription extends Description {
private final DeclarationKind kind;
private final String sortText;
public DeclarationDescription() {
this.kind = DeclarationKind.UNKNOWN;
this.sortText = null;
}
public DeclarationDescription(String name, DeclarationKind kind) {
super(name);
this.kind = kind;
this.sortText = getSortOrder(kind) + "_" + name.toLowerCase();
}
@Override
public String getSortText() {
if (sortText != null) {
return sortText;
}
return super.getSortText();
}
public DeclarationKind getKind() {
return kind;
}
public boolean isExported() {
return !getName().isEmpty() && Character.isUpperCase(getName().charAt(0));
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof DeclarationDescription)) {
return false;
}
return super.equals(obj);
}
@Override
public int hashCode() {
return super.hashCode();
}
private static int getSortOrder(DeclarationKind kind) {
// functions sort before vars, but fields sort before methods
switch (kind) {
case CONSTANT:
return 0;
case FUNCTION:
case FIELD:
return 1;
case METHOD:
case VARIABLE:
return 2;
case STRUCT:
case INTERFACE:
case TYPEDEF:
return 3;
case UNKNOWN:
default:
return 4;
}
}
}
protected static class DeclarationNodeFactory implements Factory {
public static final DeclarationNodeFactory INSTANCE = new DeclarationNodeFactory();
@Override
public NavigatorNode createNode(NavigatorPanelUI ui, Description key) {
if (!(key instanceof DeclarationDescription)) {
throw new UnsupportedOperationException();
}
return new GoNode(ui, (DeclarationDescription)key);
}
}
}