package com.anjlab.eclipse.tapestry5; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.dom.ASTNode; import com.anjlab.eclipse.tapestry5.templates.ProjectSettings; public interface DeclarationReference extends Openable { public static class ASTNodeReference implements DeclarationReference { private final TapestryModule tapestryModule; private final IJavaElement element; private final ASTNode node; public ASTNodeReference(TapestryModule tapestryModule, IJavaElement element, ASTNode node) { this.tapestryModule = tapestryModule; this.element = element; this.node = node; } @Override public IJavaElement getElement() { return element; } public ASTNode getNode() { return node; } @Override public void openInEditor() { EclipseUtils.openDeclaration(element, new SetEditorCaretPositionOffsetLength( node.getStartPosition(), node.getLength())); } @Override public TapestryModule getTapestryModule() { return tapestryModule; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof ASTNodeReference)) { return false; } if (element == null || node == null) { return false; } return element.equals(((ASTNodeReference) obj).element); } } public static class JavaElementReference implements DeclarationReference { private final TapestryModule tapestryModule; private final IJavaElement element; public JavaElementReference(TapestryModule tapestryModule, IJavaElement element) { this.tapestryModule = tapestryModule; this.element = element; } @Override public IJavaElement getElement() { return element; } @Override public void openInEditor() { EclipseUtils.openDeclaration(element, null); } @Override public TapestryModule getTapestryModule() { return tapestryModule; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof JavaElementReference)) { return false; } if (element == null) { return false; } return element.equals(((JavaElementReference) obj).element); } } public static class NonJavaReference implements DeclarationReference { private final TapestryModule tapestryModule; public NonJavaReference(TapestryModule tapestryModule) { this.tapestryModule = tapestryModule; } @Override public IJavaElement getElement() { return null; } @Override public void openInEditor() { // TODO In some cases we do know the file name and location, // so we should implement this method for these cases } @Override public TapestryModule getTapestryModule() { return tapestryModule; } } public static class ProjectSettingsReference implements DeclarationReference { private ProjectSettings projectSettings; public ProjectSettingsReference(ProjectSettings projectSettings) { this.projectSettings = projectSettings; } @Override public void openInEditor() { projectSettings.openInEditor(); } @Override public TapestryModule getTapestryModule() { return null; } @Override public IJavaElement getElement() { return null; } public ProjectSettings getProjectSettings() { return projectSettings; } } TapestryModule getTapestryModule(); IJavaElement getElement(); }