blob: a5226ac61944900a00f273a6232cc5ead5fccc0c [file] [log] [blame]
package org.eclipse.dltk.validators.internal.externalchecker.ui;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.dltk.core.environment.IEnvironment;
import org.eclipse.dltk.core.environment.IFileHandle;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.SelectionButtonDialogField;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.StringDialogField;
import org.eclipse.dltk.ui.environment.EnvironmentPathBlock;
import org.eclipse.dltk.validators.internal.externalchecker.core.ExternalChecker;
import org.eclipse.dltk.validators.internal.externalchecker.core.ExternalCheckerPlugin;
import org.eclipse.dltk.validators.internal.externalchecker.core.Rule;
import org.eclipse.dltk.validators.ui.ValidatorConfigurationPage;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
public class ExternalCheckerConfigurationPage extends ValidatorConfigurationPage {
private StringDialogField fArguments;
private EnvironmentPathBlock fPath;
private StringDialogField fExtensions;
private SelectionButtonDialogField fPassInterpreterEnvironmentVars;
private Table fTable;
private TableViewer tableViewer;
private Button addRule;
private Button delRule;
private RulesList rulesList = new RulesList();
private String message = ""; //$NON-NLS-1$
private int messageType = IStatus.OK;
private final String TYPES = "TYPES"; //$NON-NLS-1$
public RulesList getRulesList() {
return rulesList;
}
private String[] columnNames = new String[] { "RULES", "TYPES" }; //$NON-NLS-1$ //$NON-NLS-2$
public ExternalCheckerConfigurationPage() {
}
@Override
public IStatus getStatus() {
return new Status(messageType, ExternalCheckerPlugin.PLUGIN_ID, message);
}
private void resetMessage() {
this.message = ""; //$NON-NLS-1$
this.messageType = IStatus.OK;
}
private void setMessage(IEnvironment env, String message, int type) {
String pattern = Messages.ValidatorMessages_path_msgPattern;
message = NLS.bind(pattern, new String[] { env.getName(), message });
setMessage(message, type);
}
private void setMessage(String message, int type) {
if (type > messageType) {
this.message = message;
this.messageType = type;
}
}
protected void validateTclCheckerPath() {
Map<IEnvironment, String> envs = fPath.getPaths();
for (Iterator<IEnvironment> it = envs.keySet().iterator(); it.hasNext();) {
IEnvironment env = it.next();
String txtPath = envs.get(env).toString();
txtPath = txtPath.trim();
if ("".equals(txtPath)) { //$NON-NLS-1$
/*
* setMessage(env,
* ValidatorMessages.ValidatorMessages_path_isempty,
* IStatus.INFO);
*/
continue;
}
IPath path = Path.fromPortableString(txtPath);
IFileHandle file = env.getFile(path);
if (file == null) {
setMessage(env, Messages.ValidatorMessages_path_isinvalid, IStatus.ERROR);
continue;
} else if (!file.isFile()) {
setMessage(env, Messages.ValidatorMessages_path_notexists, IStatus.ERROR);
continue;
} else if (!file.exists()) {
setMessage(env, Messages.ValidatorMessages_path_notexists, IStatus.ERROR);
continue;
}
}
}
protected void validate() {
resetMessage();
validateTclCheckerPath();
updateStatus();
}
@Override
public void applyChanges() {
ExternalChecker externalChecker = getExtrenalChecker();
externalChecker.setArguments(this.fArguments.getText());
externalChecker.setCommand(this.fPath.getPaths());
externalChecker.setRules(rulesList.getRules());
externalChecker.setExtensions(this.fExtensions.getText());
externalChecker.setPassInterpreterEnvironmentVars(this.fPassInterpreterEnvironmentVars.isSelected());
}
private void createPathBrowse(final Composite parent, int columns) {
this.fPath = new EnvironmentPathBlock();
this.fPath.createControl(parent, columns);
fPath.addListener(paths -> validate());
}
@Override
public void createControl(final Composite ancestor, int columns) {
createFields();
this.createPathBrowse(ancestor, columns);
this.fArguments.doFillIntoGrid(ancestor, columns);
this.fExtensions.doFillIntoGrid(ancestor, columns);
this.fPassInterpreterEnvironmentVars.doFillIntoGrid(ancestor, columns);
Label label = new Label(ancestor, SWT.WRAP);
label.setText(Messages.ExternalCheckerConfigurationPage_commaSeparatedListOfExtensions);
GridData data = new GridData(SWT.FILL, SWT.FILL, false, false);
data.horizontalSpan = columns;
data.minimumWidth = 100;
data.widthHint = 100;
label.setLayoutData(data);
this.rulesList.getRules().clear();
// GridLayout layout = (GridLayout)ancestor.getLayout();
Group group = new Group(ancestor, SWT.NONE);
group.setText(Messages.ExternalCheckerConfigurationPage_patternRules);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.horizontalSpan = columns;
group.setLayoutData(data);
GridLayout layout = new GridLayout(2, false);
group.setLayout(layout);
label = new Label(ancestor, SWT.WRAP);
label.setText(Messages.ExternalCheckerConfigurationPage_patternIsARegularExpression);
data = new GridData(SWT.FILL, SWT.FILL, false, false);
data.horizontalSpan = columns;
data.minimumWidth = 100;
data.widthHint = 100;
label.setLayoutData(data);
// label.
// label.setSize(label.computeSize(100, SWT.DEFAULT));
fTable = new Table(group,
SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.widthHint = 300;
data.heightHint = 100;
fTable.setLayoutData(data);
// fTable.setLayout(layout);
fTable.setLinesVisible(true);
fTable.setHeaderVisible(true);
// fTable.setSize(500, 500);
TableColumn col1 = new TableColumn(fTable, SWT.LEFT, 0);
col1.setWidth(200);
col1.setText(Messages.ExternalCheckerConfigurationPage_outputRule);
TableColumn col2 = new TableColumn(fTable, SWT.LEFT, 1);
col2.setWidth(100);
col2.setText(Messages.ExternalCheckerConfigurationPage_type);
tableViewer = new TableViewer(fTable);
tableViewer.setColumnProperties(columnNames);
CellEditor[] editors = new CellEditor[columnNames.length];
TextCellEditor textEditor = new TextCellEditor(fTable);
((Text) textEditor.getControl()).setTextLimit(60);
editors[0] = textEditor;
ComboBoxCellEditor comboEditor = new ComboBoxCellEditor(fTable, rulesList.getTypes(), SWT.READ_ONLY);
editors[1] = comboEditor;
tableViewer.setCellEditors(editors);
tableViewer.setCellModifier(new RuleCelllModifier(this));
tableViewer.setContentProvider(new RulesContentProvider());
tableViewer.setLabelProvider(new RulesLabelProvider());
tableViewer.setInput(rulesList);
Composite buttons = new Composite(group, SWT.NONE);
buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
buttons.setLayout(layout);
data = new GridData(SWT.FILL, SWT.NONE, false, false);
data.verticalAlignment = SWT.TOP;
addRule = new Button(buttons, SWT.PUSH);
addRule.setLayoutData(data);
addRule.setText(Messages.ExternalCheckerConfigurationPage_addRule);
addRule.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent ev) {
rulesList.addRule();
}
});
delRule = new Button(buttons, SWT.PUSH);
delRule.setLayoutData(data);
delRule.setText(Messages.ExternalCheckerConfigurationPage_deleteRule);
delRule.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent ev) {
Rule rule = (Rule) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement();
if (rule != null)
rulesList.removeRule(rule);
}
});
updateValuesFrom();
}
private ExternalChecker getExtrenalChecker() {
return (ExternalChecker) getValidator();
}
private void updateValuesFrom() {
ExternalChecker externalChecker = getExtrenalChecker();
this.fArguments.setText(externalChecker.getArguments());
this.fPath.setPaths(externalChecker.getCommand());
this.fExtensions.setText(externalChecker.getExtensions());
this.fPassInterpreterEnvironmentVars.setSelection(externalChecker.isPassInterpreterEnvironmentVars());
this.rulesList.getRules().clear();
for (int i = 0; i < externalChecker.getNRules(); i++) {
Rule r = externalChecker.getRule(i);
rulesList.addRule(r);
}
}
private void createFields() {
this.fArguments = new StringDialogField();
this.fArguments.setLabelText(Messages.ExternalCheckerConfigurationPage_CheckerArguments);
this.fExtensions = new StringDialogField();
this.fExtensions.setLabelText(Messages.ExternalCheckerConfigurationPage_filenameExtensions);
this.fPassInterpreterEnvironmentVars = new SelectionButtonDialogField(SWT.CHECK);
this.fPassInterpreterEnvironmentVars
.setLabelText(Messages.ExternalCheckerConfigurationPage_passInterpreterEnvironmentVariables);
}
public class RulesContentProvider implements IStructuredContentProvider, IRulesListViewer {
@Override
public Object[] getElements(Object inputElement) {
return rulesList.getRules().toArray();
}
@Override
public void dispose() {
rulesList.removeChangeListener(this);
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (newInput != null)
((RulesList) newInput).addChangeListener(this);
if (oldInput != null)
((RulesList) oldInput).removeChangeListener(this);
}
@Override
public void addRule(Rule r) {
tableViewer.add(r);
tableViewer.editElement(r, 0);
}
@Override
public void removeRule(Rule r) {
tableViewer.remove(r);
}
@Override
public void updateRule(Rule r) {
tableViewer.update(r, null);
}
}
public List<String> getColumnNames() {
return Arrays.asList(columnNames);
}
public String[] getChoices(String property) {
if (TYPES.equals(property)) {
return rulesList.getTypes();
}
return new String[0];
}
}