/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* All rights reserved. This program and the accompanying materials
* are 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
*
*******************************************************************************/
package org.deved.antlride.internal.ui.preferences;
import java.text.MessageFormat;
import org.deved.antlride.core.AntlrConstants;
import org.deved.antlride.core.AntlrCore;
import org.deved.antlride.core.resources.AntlrPackages;
import org.deved.antlride.ui.AntlrUIHelper;
import org.eclipse.core.resources.IProject;
import org.eclipse.dltk.ui.preferences.AbstractOptionsBlock;
import org.eclipse.dltk.ui.preferences.PreferenceKey;
import org.eclipse.dltk.ui.util.IStatusChangeListener;
import org.eclipse.dltk.ui.util.PixelConverter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
@SuppressWarnings("restriction")
public class AntlrBuildingBlock extends AbstractOptionsBlock {
private CheckboxListener checkboxListener = new CheckboxListener();
private final static PreferenceKey RUNTIME = new PreferenceKey(
AntlrCore.PLUGIN_ID, AntlrConstants.ANTLR_BUILDER_RUNTIME);
private final static PreferenceKey MAX_NUMBER_OF_PROBLEMS_REPORTED_PER_GRAMMAR = new PreferenceKey(
AntlrCore.PLUGIN_ID,
AntlrConstants.ANTLR_BUILDER_MAX_NUMBER_OF_PROBLEMS_REPORTED_PER_GRAMMAR);
private final static PreferenceKey INCLUDE_STACK_TRACE_ON_INTERNAL_ERRORS = new PreferenceKey(
AntlrCore.PLUGIN_ID,
AntlrConstants.ANTLR_BUILDER_INCLUDE_STACK_TRACE_ON_INTERNAL_ERRORS);
private final static PreferenceKey REPORT = new PreferenceKey(
AntlrCore.PLUGIN_ID, AntlrConstants.ANTLR_BUILDER_REPORT);
private final static PreferenceKey NFA = new PreferenceKey(
AntlrCore.PLUGIN_ID, AntlrConstants.ANTLR_BUILDER_NFA);
private final static PreferenceKey DFA = new PreferenceKey(
AntlrCore.PLUGIN_ID, AntlrConstants.ANTLR_BUILDER_DFA);
// private final static PreferenceKey X_DFA = new PreferenceKey(
// AntlrCore.PLUGIN_ID, AntlrConstants.ANTLR_BUILDER_X_DFA);
private final static PreferenceKey X_NO_PRUNE = new PreferenceKey(
AntlrCore.PLUGIN_ID, AntlrConstants.ANTLR_BUILDER_X_NO_PRUNE);
private final static PreferenceKey X_NO_COLLAPSE = new PreferenceKey(
AntlrCore.PLUGIN_ID, AntlrConstants.ANTLR_BUILDER_X_NO_COLLAPSE);
// private final static PreferenceKey X_DBG_CONVERSION = new PreferenceKey(
// AntlrCore.PLUGIN_ID, AntlrConstants.ANTLR_BUILDER_X_DBG_CONVERSION);
private final static PreferenceKey X_NO_MERGE_STOP_STATES = new PreferenceKey(
AntlrCore.PLUGIN_ID,
AntlrConstants.ANTLR_BUILDER_X_NO_MERGE_STOP_STATES);
private final static PreferenceKey X_DFA_VERBOSE = new PreferenceKey(
AntlrCore.PLUGIN_ID, AntlrConstants.ANTLR_BUILDER_X_DFA_VERBOSE);
// private final static PreferenceKey X_WATCH_CONVERSION = new
// PreferenceKey(
// AntlrCore.PLUGIN_ID,
// AntlrConstants.ANTLR_BUILDER_X_WATCH_CONVERSION);
private final static PreferenceKey X_M = new PreferenceKey(
AntlrCore.PLUGIN_ID, AntlrConstants.ANTLR_BUILDER_X_M);
private final static PreferenceKey X_MAX_DFA_EDGES = new PreferenceKey(
AntlrCore.PLUGIN_ID, AntlrConstants.ANTLR_BUILDER_X_MAX_DFA_EDGES);
private final static PreferenceKey X_CONVERSION_TIME_OUT = new PreferenceKey(
AntlrCore.PLUGIN_ID,
AntlrConstants.ANTLR_BUILDER_X_CONVERSION_TIME_OUT);
private final static PreferenceKey[] keys = { RUNTIME, REPORT, NFA, DFA,
X_NO_PRUNE, X_NO_COLLAPSE, X_NO_MERGE_STOP_STATES, X_DFA_VERBOSE,
X_M, X_MAX_DFA_EDGES, X_CONVERSION_TIME_OUT,
MAX_NUMBER_OF_PROBLEMS_REPORTED_PER_GRAMMAR,
INCLUDE_STACK_TRACE_ON_INTERNAL_ERRORS };
public AntlrBuildingBlock(IStatusChangeListener context, IProject project,
IWorkbenchPreferenceContainer container) {
super(context, project, keys, container);
}
// -report=false[Console]
// -nfa=false
// -dfa=false
// -Xdfa=false[Console]
// -Xnoprune=true
// -Xnocollapse=true
// -Xdbgconversion=false [Console]
// -Xnomergestopstates=true
// -Xdfaverbose =false
// -Xwatchconversion=false[Console]
// -Xm m=4
// -Xmaxdfaedges
// -Xconversiontimeout
@Override
protected Control createOptionsBlock(Composite parent) {
ScrolledForm form = AntlrUIHelper.createScrolledForm(parent);
Composite composite = AntlrUIHelper
.createExpandableSection(form, "General", true);
if (isProjectPreferencePage()) {
createRuntimeSectionForProject(composite);
}
addLabelledTextField(
composite,
AntlrPreferenceMessages.Builder_max_number_of_problems_reported_per_grammar,
"", MAX_NUMBER_OF_PROBLEMS_REPORTED_PER_GRAMMAR, 2, 5,
SWT.RIGHT);
addCheckBox(
composite,
AntlrPreferenceMessages.Builder_include_stack_trace_on_internal_errors,
INCLUDE_STACK_TRACE_ON_INTERNAL_ERRORS, 0);
addCheckBox(composite, AntlrPreferenceMessages.Builder_report, REPORT,
0);
addCheckBox(composite, AntlrPreferenceMessages.Builder_nfa, NFA, 0);
addCheckBox(composite, AntlrPreferenceMessages.Builder_dfa, DFA, 0);
composite = AntlrUIHelper.createExpandableSection(form, "Extended", true);
createExtendedOptionsSection(composite);
return form;
}
@Override
protected boolean processChanges(IWorkbenchPreferenceContainer container) {
String option = "-Xm";
String value = getString(X_M);
if (!validatePositiveNumber(option, value)) {
return false;
}
option = "-Xmaxdfaedges";
value = getString(X_MAX_DFA_EDGES);
if (!validatePositiveNumber(option, value)) {
return false;
}
option = "-Xconversiontimeout";
value = getString(X_CONVERSION_TIME_OUT);
if (!validatePositiveNumber(option, value)) {
return false;
}
return super.processChanges(container);
}
private Composite createRuntimeSectionForProject(Composite composite) {
GridData gd = new GridData();
String[] versions = AntlrPackages.getAvailablePackageNames();
Control[] widgets = addComboBox(composite,
AntlrPreferenceMessages.Builder_Runtime, RUNTIME, versions,
versions);
widgets[0].setLayoutData(gd);
gd = new GridData(SWT.END, SWT.FILL, false, true);
gd.widthHint = 100;
widgets[1].setLayoutData(gd);
return composite;
}
@Override
public void dispose() {
super.dispose();
}
private Composite createExtendedOptionsSection(Composite composite) {
// addCheckBox(composite, AntlrPreferenceMessages.Builder_Xdfa, X_DFA,
// 0);
addCheckBox(composite, AntlrPreferenceMessages.Builder_Xnoprune,
X_NO_PRUNE, 0);
addCheckBox(composite, AntlrPreferenceMessages.Builder_Xnocollapse,
X_NO_COLLAPSE, 0);
// addCheckBox(composite,
// AntlrPreferenceMessages.Builder_Xdbgconversion,
// X_DBG_CONVERSION, 0);
addCheckBox(composite,
AntlrPreferenceMessages.Builder_Xnomergestopstates,
X_NO_MERGE_STOP_STATES, 0);
addCheckBox(composite, AntlrPreferenceMessages.Builder_Xdfaverbose,
X_DFA_VERBOSE, 0);
// addCheckBox(composite,
// AntlrPreferenceMessages.Builder_Xwatchconversion,
// X_WATCH_CONVERSION, 0);
addLabelledTextField(composite, AntlrPreferenceMessages.Builder_Xm,
"-Xm", X_M, 2, 5, SWT.LEFT);
addLabelledTextField(composite,
AntlrPreferenceMessages.Builder_Xmaxdfaedges, "-Xmaxdfaedges",
X_MAX_DFA_EDGES, 6, 5, SWT.LEFT);
addLabelledTextField(composite,
AntlrPreferenceMessages.Builder_Xconversiontimeout,
"-Xconversiontimeout", X_CONVERSION_TIME_OUT, 5, 5, SWT.LEFT);
return composite;
}
protected Control[] addLabelledTextField(Composite composite, String label,
String option, PreferenceKey key, int textLimit, int indentation,
int align) {
PixelConverter pixelConverter = new PixelConverter(composite);
Text textControl;
Label labelControl;
if (align == SWT.LEFT) {
textControl = new Text(composite, SWT.BORDER | SWT.SINGLE);
labelControl = new Label(composite, SWT.NONE);
} else {
labelControl = new Label(composite, SWT.NONE);
textControl = new Text(composite, SWT.BORDER | SWT.SINGLE);
}
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.widthHint = pixelConverter
.convertWidthInCharsToPixels(textLimit + 1);
textControl.setLayoutData(gd);
textControl.setTextLimit(textLimit);
textControl.setText(getString(key));
textControl.setData("key", key);
textControl.setData("option", option);
textControl.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
numberFieldChanged((Text) e.widget);
}
});
labelControl.setText(label);
gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalIndent = indentation;
labelControl.setLayoutData(gd);
return new Control[] { labelControl, textControl };
}
private void numberFieldChanged(Text textControl) {
setString(textControl.getData("key"), textControl.getText());
}
private boolean validatePositiveNumber(String option, String number) {
Integer n = null;
try {
n = new Integer(number);
} catch (Exception ex) {
}
if (n == null || n.intValue() <= 0) {
MessageBox dialog = new MessageBox(getShell(), SWT.OK);
String message = MessageFormat.format(
AntlrPreferenceMessages.Builder_Xnumber_error, option);
dialog.setText(option);
dialog.setMessage(message);
dialog.open();
return false;
}
return true;
}
private Button addCheckBox(Composite parent, String label,
PreferenceKey key, int indentation) {
Button button = new Button(parent, SWT.CHECK);
button.setText(label);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalIndent = indentation;
gd.horizontalSpan = 2;
button.setLayoutData(gd);
button.addSelectionListener(checkboxListener);
String value = getString(key);
button.setData(key);
button.setSelection("true".equals(value));
return button;
}
private Control[] addComboBox(Composite parent, String label,
PreferenceKey key, String[] items, String[] values) {
Label labelControl = new Label(parent, SWT.NONE);
labelControl.setText(label);
Combo combo = new Combo(parent, SWT.SINGLE | SWT.READ_ONLY);
combo.setFont(parent.getFont());
combo.setItems(items);
combo.setData("key", key);
String value = getString(key);
int i = 0;
for (; i < values.length; i++)
if (values[i].equals(value))
break;
if (values.length > 0 && i < values.length) {
combo.select(i);
setString(key, values[i]);
}
for (i = 0; i < values.length; i++)
combo.setData("" + i, values[i]);
combo.addSelectionListener(new ComboboxListener());
return new Control[] { labelControl, combo };
}
private class CheckboxListener implements SelectionListener {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
PreferenceKey key = (PreferenceKey) b.getData();
setBoolean(key, b.getSelection());
}
}
private class ComboboxListener implements SelectionListener {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
Combo b = (Combo) e.widget;
PreferenceKey key = (PreferenceKey) b.getData("key");
String runtimeVersion = (String) b.getData(""
+ b.getSelectionIndex());
// String runtimeVersion = b.getText();
setString(key, runtimeVersion);
}
}
}