Initial implementation of the new Debug Plugin
[phpeclipse.git] / net.sourceforge.phpeclipse.xdebug.ui / src / net / sourceforge / phpeclipse / xdebug / ui / MultipleInputDialog.java
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 (file)
index 0000000..3af109a
--- /dev/null
@@ -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;
+               }
+       }
+
+}