package com.sap.runlet.expressionpad.launch;
import java.util.Iterator;
import java.util.logging.Logger;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import com.sap.runlet.abstractexpressionpad.Evaluator.ParseResult;
import com.sap.runlet.expressionpad.RunletEvaluator;
import com.sap.tc.moin.repository.mmi.reflect.JmiException;
import dataaccess.expressions.Expression;
public class RunletMainTab extends AbstractLaunchConfigurationTab {
private static Logger log = Logger.getLogger(RunletMainTab.class.getName());
protected static final String NGPM_STDLIB = "ngpm.stdlib"; //$NON-NLS-1$
protected static final String EXPRESSION_ATTRIBUTE = "expression"; //$NON-NLS-1$
protected static final String PROJECT_ATTRIBUTE = "project"; //$NON-NLS-1$
private Text expression;
private Text project;
/**
* Modify listener that simply updates the owning launch configuration dialog.
*/
private ModifyListener modifyListener = new ModifyListener() {
public void modifyText(ModifyEvent evt) {
getStandardDisplay().asyncExec(new Runnable() {
public void run() {
updateLaunchConfigurationDialog();
}
});
}
};
@Override
public void createControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
setControl(comp);
comp.setLayout(new GridLayout(1, true));
comp.setFont(parent.getFont());
Label projectLabel = new Label(comp, SWT.NONE);
projectLabel.setText(Messages.RunletMainTab_4);
project = new Text(comp, SWT.BORDER);
project.setFont(parent.getFont());
project.addModifyListener(modifyListener);
GridData gd = new GridData(SWT.FILL, SWT.NORMAL, /* grab horizontal */ true, /* grab vertical */ false);
project.setLayoutData(gd);
Label heading = new Label(comp, SWT.NONE);
heading.setText(Messages.RunletMainTab_0);
gd = new GridData(SWT.FILL, SWT.NORMAL, /* grab horizontal */ true, /* grab vertical */ false);
heading.setLayoutData(gd);
expression = new Text(comp, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
expression.setFont(parent.getFont());
expression.addModifyListener(modifyListener);
gd = new GridData(SWT.FILL, SWT.FILL, /* grab horizontal */ true, /* grab vertical */ true);
expression.setLayoutData(gd);
}
@Override
public Image getImage() {
return new Image(getStandardDisplay(), getClass().getResourceAsStream(
"/icons/LittleRiver.jpg")); //$NON-NLS-1$
}
private static Display getStandardDisplay() {
Display display = Display.getCurrent();
if (display == null) {
display = Display.getDefault();
}
return display;
}
@Override
public String getName() {
return Messages.RunletMainTab_1;
}
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
try {
expression.setText(configuration.getAttribute(EXPRESSION_ATTRIBUTE, "")); //$NON-NLS-1$
project.setText(configuration.getAttribute(PROJECT_ATTRIBUTE, NGPM_STDLIB)); //$NON-NLS-1$
} catch (CoreException e) {
log.throwing(getClass().getName(), "initializeFrom", e); //$NON-NLS-1$
}
}
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
configuration.setAttribute(EXPRESSION_ATTRIBUTE, expression.getText());
configuration.setAttribute(PROJECT_ATTRIBUTE, project.getText());
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
configuration.setAttribute(EXPRESSION_ATTRIBUTE, "");
configuration.setAttribute(PROJECT_ATTRIBUTE, NGPM_STDLIB);
}
@Override
public boolean isValid(ILaunchConfiguration launchConfig) {
boolean result = true;
try {
String projectName = launchConfig.getAttribute(PROJECT_ATTRIBUTE, project.getText());
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
if (project == null || !project.exists()) {
setErrorMessage(Messages.bind(Messages.RunletMainTab_6, projectName));
result = false;
} else {
RunletEvaluator main = new RunletEvaluator(projectName);
ParseResult<Expression> parseResult = main.parse(launchConfig.getAttribute(EXPRESSION_ATTRIBUTE, expression.getText()));
if (parseResult.getErrors() != null && parseResult.getErrors().size()>0) {
setErrorMessage(parseResult.getErrors().get(0) +
((parseResult.getErrors().size()>1 || (parseResult.getConstraintViolations() != null &&
parseResult.getConstraintViolations().size()>0)) ? Messages.RunletMainTab_8 : "")); //$NON-NLS-2$
result = false;
} else if (parseResult.getConstraintViolations() != null && parseResult.getConstraintViolations().size()>0) {
Iterator<JmiException> i = parseResult.getConstraintViolations().iterator();
setErrorMessage(i.next().getLocalizedMessage()+(i.hasNext() ? Messages.RunletMainTab_10 : "")); //$NON-NLS-2$
result = false;
} else {
setMessage(Messages.RunletMainTab_7); // fine
}
}
} catch (Exception e) {
setErrorMessage(e.getLocalizedMessage());
result = false;
}
result = result && super.isValid(launchConfig);
if (result) {
setErrorMessage(null);
}
return result;
}
}