X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/MultipleInputDialog.java b/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/MultipleInputDialog.java new file mode 100644 index 0000000..3af109a --- /dev/null +++ b/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/MultipleInputDialog.java @@ -0,0 +1,362 @@ +package net.sourceforge.phpeclipse.xdebug.ui; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.debug.ui.StringVariableSelectionDialog; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +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.DirectoryDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +public class MultipleInputDialog extends Dialog { + protected static final String FIELD_NAME = "FIELD_NAME"; //$NON-NLS-1$ + protected static final int TEXT = 100; + protected static final int BROWSE = 101; + protected static final int VARIABLE = 102; + + protected Composite panel; + + protected List fieldList = new ArrayList(); + protected List controlList = new ArrayList(); + protected List validators = new ArrayList(); + protected Map valueMap = new HashMap(); + + private String title; + + + + public MultipleInputDialog(Shell shell, String title) { + super(shell); + this.title = title; + setShellStyle(getShellStyle() | SWT.RESIZE); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) + */ + protected void configureShell(Shell shell) { + super.configureShell(shell); + if (title != null) { + shell.setText(title); + } + + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite) + */ + protected Control createButtonBar(Composite parent) { + Control bar = super.createButtonBar(parent); + validateFields(); + return bar; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) + */ + protected Control createDialogArea(Composite parent) { + Composite container = (Composite)super.createDialogArea(parent); + container.setLayout(new GridLayout(2, false)); + container.setLayoutData(new GridData(GridData.FILL_BOTH)); + + panel = new Composite(container, SWT.NONE); + GridLayout layout = new GridLayout(2, false); + panel.setLayout(layout); + panel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + for (Iterator i = fieldList.iterator(); i.hasNext();) { + FieldSummary field = (FieldSummary)i.next(); + switch(field.type) { + case TEXT: + createTextField(field.name, field.initialValue, field.allowsEmpty); + break; + case BROWSE: + createBrowseField(field.name, field.initialValue, field.allowsEmpty); + break; + case VARIABLE: + createVariablesField(field.name, field.initialValue, field.allowsEmpty); + break; + } + } + + fieldList = null; // allow it to be gc'd + Dialog.applyDialogFont(container); + return container; + } + + public void addBrowseField(String labelText, String initialValue, boolean allowsEmpty) { + fieldList.add(new FieldSummary(BROWSE, labelText, initialValue, allowsEmpty)); + } + public void addTextField(String labelText, String initialValue, boolean allowsEmpty) { + fieldList.add(new FieldSummary(TEXT, labelText, initialValue, allowsEmpty)); + } + public void addVariablesField(String labelText, String initialValue, boolean allowsEmpty) { + fieldList.add(new FieldSummary(VARIABLE, labelText, initialValue, allowsEmpty)); + } + + protected void createTextField(String labelText, String initialValue, boolean allowEmpty) { + Label label = new Label(panel, SWT.NONE); + label.setText(labelText); + label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); + + final Text text = new Text(panel, SWT.SINGLE | SWT.BORDER); + text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + text.setData(FIELD_NAME, labelText); + + // make sure rows are the same height on both panels. + label.setSize(label.getSize().x, text.getSize().y); + + if (initialValue != null) { + text.setText(initialValue); + } + + if (!allowEmpty) { + validators.add(new Validator() { + public boolean validate() { + return !text.getText().equals(""); //$NON-NLS-1$ + } + }); + text.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + validateFields(); + } + }); + } + + controlList.add(text); + } + + protected void createBrowseField(String labelText, String initialValue, boolean allowEmpty) { + Label label = new Label(panel, SWT.NONE); + label.setText(labelText); + label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); + + Composite comp = new Composite(panel, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.marginHeight=0; + layout.marginWidth=0; + comp.setLayout(layout); + comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + final Text text = new Text(comp, SWT.SINGLE | SWT.BORDER); + GridData data = new GridData(GridData.FILL_HORIZONTAL); + data.widthHint = 200; + text.setLayoutData(data); + text.setData(FIELD_NAME, labelText); + + // make sure rows are the same height on both panels. + label.setSize(label.getSize().x, text.getSize().y); + + if (initialValue != null) { + text.setText(initialValue); + } + + if (!allowEmpty) { + validators.add(new Validator() { + public boolean validate() { + return !text.getText().equals(""); //$NON-NLS-1$ + } + }); + + text.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + validateFields(); + } + }); + } + + Button button = createButton(comp, IDialogConstants.IGNORE_ID, "&Browse...", false); + button.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + DirectoryDialog dialog = new DirectoryDialog(getShell()); + dialog.setMessage("Select a file:"); + String currentWorkingDir = text.getText(); + if (!currentWorkingDir.trim().equals("")) { //$NON-NLS-1$ + File path = new File(currentWorkingDir); + if (path.exists()) { + dialog.setFilterPath(currentWorkingDir); + } + } + + String selectedDirectory = dialog.open(); + if (selectedDirectory != null) { + text.setText(selectedDirectory); + } + } + }); + + controlList.add(text); + + } + + + public void createVariablesField(String labelText, String initialValue, boolean allowEmpty) { + Label label = new Label(panel, SWT.NONE); + label.setText(labelText); + label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); + + Composite comp = new Composite(panel, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.marginHeight=0; + layout.marginWidth=0; + comp.setLayout(layout); + comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + final Text text = new Text(comp, SWT.SINGLE | SWT.BORDER); + GridData data = new GridData(GridData.FILL_HORIZONTAL); + data.widthHint = 200; + text.setLayoutData(data); + text.setData(FIELD_NAME, labelText); + + // make sure rows are the same height on both panels. + label.setSize(label.getSize().x, text.getSize().y); + + if (initialValue != null) { + text.setText(initialValue); + } + + if (!allowEmpty) { + validators.add(new Validator() { + public boolean validate() { + return !text.getText().equals(""); //$NON-NLS-1$ + } + }); + + text.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + validateFields(); + } + }); + } + + Button button = createButton(comp, IDialogConstants.IGNORE_ID, "Varia&bles...", false); + button.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell()); + int code = dialog.open(); + if (code == IDialogConstants.OK_ID) { + String variable = dialog.getVariableExpression(); + if (variable != null) { + text.insert(variable); + } + } + } + }); + + controlList.add(text); + + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#okPressed() + */ + protected void okPressed() { + for (Iterator i = controlList.iterator(); i.hasNext(); ) { + Control control = (Control)i.next(); + if (control instanceof Text) { + valueMap.put(control.getData(FIELD_NAME), ((Text)control).getText()); + } + } + controlList = null; + super.okPressed(); + } + + + /* (non-Javadoc) + * @see org.eclipse.jface.window.Window#open() + */ + public int open() { + applyDialogFont(panel); + return super.open(); + } + + public Object getValue(String key) { + return valueMap.get(key); + } + + public String getStringValue(String key) { + return (String) getValue(key); + } + + public void validateFields() { + for(Iterator i = validators.iterator(); i.hasNext(); ) { + Validator validator = (Validator) i.next(); + if (!validator.validate()) { + getButton(IDialogConstants.OK_ID).setEnabled(false); + return; + } + } + getButton(IDialogConstants.OK_ID).setEnabled(true); + } + +// /* (non-Javadoc) +// * @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point) +// */ +// protected Point getInitialLocation(Point initialSize) { +// Point initialLocation= DialogSettingsHelper.getInitialLocation(getDialogSettingsSectionName()); +// if (initialLocation != null) { +// return initialLocation; +// } +// return super.getInitialLocation(initialSize); +// } + + + protected String getDialogSettingsSectionName() { + return IDebugUIConstants.PLUGIN_ID + ".MULTIPLE_INPUT_DIALOG_2"; //$NON-NLS-1$ + } + +// /* (non-Javadoc) +// * @see org.eclipse.jface.window.Window#getInitialSize() +// */ +// protected Point getInitialSize() { +// Point size = super.getInitialSize(); +// return DialogSettingsHelper.getInitialSize(getDialogSettingsSectionName(), size); +// } + +// /* (non-Javadoc) +// * @see org.eclipse.jface.window.Window#close() +// */ +// public boolean close() { +// DialogSettingsHelper.persistShellGeometry(getShell(), getDialogSettingsSectionName()); +// return super.close(); +// } + + protected class FieldSummary { + int type; + String name; + String initialValue; + boolean allowsEmpty; + + public FieldSummary(int type, String name, String initialValue, boolean allowsEmpty) { + this.type = type; + this.name = name; + this.initialValue = initialValue; + this.allowsEmpty = allowsEmpty; + } + } + + protected class Validator { + boolean validate() { + return true; + } + } + +}