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]; } }