package org.erlide.ui.prefs.plugin; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.layout.PixelConverter; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.erlide.ui.util.StatusInfo; import org.erlide.util.ErlLogger; import org.osgi.service.prefs.BackingStoreException; public class CodeAssistPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private Button autoActivateButton; private Text delayText; private Text erlangTriggersText; private Text eDocTriggersText; private CodeAssistPreferences prefs; private Label labelControl; @Override protected Control createContents(final Composite parent) { final Composite composite = new Composite(parent, SWT.NONE); // composite.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, // false)); // composite.setLayout(new GridLayout(3, false)); final GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false); composite.setLayoutData(data); final GridLayout layout = new GridLayout(); layout.numColumns = 3; composite.setLayout(layout); addAutoActivationSection(composite); performDefaults(); updateAutoActivationControls(); return composite; } private void addAutoActivationSection(final Composite composite) { autoActivateButton = new Button(composite, SWT.CHECK); autoActivateButton.setText("&Enable auto activation"); GridData gd; // gd = new GridData(SWT.FILL, SWT.FILL, true, // false, 3, 1); gd = new GridData(); gd.horizontalSpan = 3; autoActivateButton.setLayoutData(gd); autoActivateButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { updateAutoActivationControls(); } }); delayText = addLabelledTextField(composite, "Auto activation dela&y:", 4, 0); erlangTriggersText = addLabelledTextField(composite, "Auto activation triggers for &Erlang:", 100, 4, 0); eDocTriggersText = addLabelledTextField(composite, "Auto activation triggers for E&Doc:", 100, 4, 0); eDocTriggersText.setVisible(false); labelControl.setVisible(false); } protected void updateAutoActivationControls() { final boolean enabled = autoActivateButton.getSelection(); delayText.setEnabled(enabled); erlangTriggersText.setEnabled(enabled); eDocTriggersText.setEnabled(enabled); } protected Text addLabelledTextField(final Composite parent, final String label, final int textlimit, final int indent) { return addLabelledTextField(parent, label, textlimit, textlimit, indent); } protected Text addLabelledTextField(final Composite parent, final String label, final int modelTextLimit, final int fieldTextLimit, final int indent) { final PixelConverter pixelConverter = new PixelConverter(parent); labelControl = new Label(parent, SWT.WRAP); labelControl.setText(label); labelControl.setLayoutData(new GridData()); final Text textBox = new Text(parent, SWT.BORDER | SWT.SINGLE); textBox.setLayoutData(new GridData()); textBox.addModifyListener(new ModifyListener() { @Override public void modifyText(final ModifyEvent e) { validateSettings(); } }); final GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL); if (modelTextLimit != 0) { textBox.setTextLimit(modelTextLimit); } if (fieldTextLimit != 0) { data.widthHint = pixelConverter .convertWidthInCharsToPixels(fieldTextLimit + 1); } data.horizontalIndent = indent; data.horizontalSpan = 2; textBox.setLayoutData(data); return textBox; } protected void validateSettings() { statusChanged(ErlidePreferencePage.validatePositiveNumber(delayText.getText())); statusChanged(validateCommaSeparatedCharacters(erlangTriggersText.getText())); statusChanged(validateCommaSeparatedCharacters(eDocTriggersText.getText())); } private IStatus validateCommaSeparatedCharacters(final String text) { final StatusInfo status = new StatusInfo(); status.setOK(); if (text.length() > 1) { final String[] chars = text.split(","); for (final String c : chars) { if (c.trim().length() != 1) { status.setError( "Trigger keys should be a list of comma-separated characters"); break; } } } return status; } private void statusChanged(final IStatus status) { final boolean valid = !status.matches(IStatus.ERROR); setValid(valid); ErlidePreferencePage.applyToStatusLine(this, status); } @Override public boolean performOk() { try { prefs.setAutoActivate(autoActivateButton.getSelection()); final Integer i = new Integer(delayText.getText()); prefs.setDelayInMS(i.intValue()); prefs.setErlangTriggers(erlangTriggersText.getText()); prefs.seteDocTriggers(eDocTriggersText.getText()); prefs.store(); } catch (final BackingStoreException e) { ErlLogger.warn(e); } return super.performOk(); } @Override protected void performDefaults() { prefs = new CodeAssistPreferences(); prefs.load(); if (autoActivateButton == null) { return; } autoActivateButton.setSelection(prefs.isAutoActivate()); delayText.setText(Integer.toString(prefs.getDelayInMS())); erlangTriggersText.setText(prefs.getErlangTriggers()); eDocTriggersText.setText(prefs.geteDocTriggers()); super.performDefaults(); } @Override public void init(final IWorkbench workbench) { } }