/*******************************************************************************
* Copyright (c) 2009 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.el.core.resolver;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IDE;
import org.jboss.tools.common.el.core.ELCorePlugin;
import org.jboss.tools.common.el.core.ElCoreMessages;
import org.jboss.tools.common.el.core.parser.LexicalToken;
import org.jboss.tools.common.text.ITextSourceReference;
/**
* @author Alexey Kazakov
*/
public class ELSegmentImpl implements ELSegment {
protected IResource resource;
protected ITextSourceReference sourceReference;
protected LexicalToken token;
protected boolean resolved = false;
protected boolean validatable = true;
protected List<IVariable> variables = new ArrayList<IVariable>();
protected List<Var> vars = new ArrayList<Var>();
public ELSegmentImpl(LexicalToken token) {
this.token = token;
}
/* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.ELSegment#getResource()
*/
public IResource getResource() {
return resource;
}
/* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.ELSegment#getSourceReference()
*/
public ITextSourceReference getSourceReference() {
if(sourceReference==null) {
sourceReference = new ITextSourceReference() {
public int getStartPosition() {
return token.getStart();
}
public int getLength() {
return token.getLength();
}
public IResource getResource() {
return resource;
}
};
}
return sourceReference;
}
public static class VarOpenable implements IOpenableReference {
Var var;
VarOpenable(Var var) {
this.var = var;
}
@Override
public boolean open() {
IEditorPart part = null;
IWorkbenchWindow window = ELCorePlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
if (window == null) return false;
IWorkbenchPage page = window.getActivePage();
try {
part = IDE.openEditor(page, var.getFile());
} catch (PartInitException e) {
ELCorePlugin.getDefault().logError(e);
}
if(part != null) {
part.getEditorSite().getSelectionProvider().setSelection(new TextSelection(var.getDeclarationOffset(), var.getDeclarationLength()));
}
return false;
}
@Override
public String getLabel() {
return MessageFormat.format(ElCoreMessages.OpenVarDefinition, var.getName(), var.getFile().getName());
}
public Var getVar() {
return var;
}
@Override
public Image getImage() {
return null;
}
}
/**
* Default empty implementation. Subclasses should override this method.
*
* @return
*/
public IOpenableReference[] getOpenable() {
if(!vars.isEmpty()) {
List<IOpenableReference> rs = new ArrayList<IOpenableReference>();
for (Var var: vars) {
rs.add(new VarOpenable(var));
}
return rs.toArray(new VarOpenable[0]);
}
return new IOpenableReference[0];
}
/* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.ELSegment#getToken()
*/
public LexicalToken getToken() {
return token;
}
/* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.ELSegment#isResolved()
*/
public boolean isResolved() {
return resolved;
}
/**
* @param resource the resource to set
*/
public void setResource(IResource resource) {
this.resource = resource;
}
/**
* @param sourceReference the sourceReference to set
*/
public void setSourceReference(ITextSourceReference sourceReference) {
this.sourceReference = sourceReference;
}
/**
* @param token the token to set
*/
public void setToken(LexicalToken token) {
this.token = token;
}
/**
* @param resolved the resolved to set
*/
public void setResolved(boolean resolved) {
this.resolved = resolved;
}
/**
* @return the variables
*/
public List<IVariable> getVariables() {
return variables;
}
/**
* @param variable the variables to set
*/
public void setVariables(List<IVariable> variables) {
this.variables = variables;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return token!=null?token.getText() + "(" + resolved + ")": super.toString(); //$NON-NLS-1$ //$NON-NLS-2$
}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.el.core.resolver.ELSegment#isValidatable()
*/
@Override
public boolean isValidatable() {
return validatable;
}
/**
* @param validatable the validatable to set
*/
public void setValidatable(boolean validatable) {
this.validatable = validatable;
}
public void setVars(List<Var> vars) {
this.vars = vars;
}
public Var getVar() {
return vars.isEmpty() ? null : vars.iterator().next();
}
}