Importing the XDebugProxy code in the HEAD. The repo was tagged with T_BEFORE_XDEBUGP...
[phpeclipse.git] / net.sourceforge.phpeclipse.xdebug.ui / src / net / sourceforge / phpeclipse / xdebug / ui / php / launching / PHPPathMapTab.java
diff --git a/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPPathMapTab.java b/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPPathMapTab.java
new file mode 100644 (file)
index 0000000..0992e5d
--- /dev/null
@@ -0,0 +1,476 @@
+package net.sourceforge.phpeclipse.xdebug.ui.php.launching;
+
+import java.text.MessageFormat;
+//import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+//import java.util.Map;
+import java.util.Vector;
+
+import net.sourceforge.phpeclipse.xdebug.core.PathMapItem;
+import net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin;
+import net.sourceforge.phpeclipse.xdebug.php.launching.IXDebugConstants;
+import net.sourceforge.phpeclipse.xdebug.ui.EditPathMapDialog;
+/*import net.sourceforge.phpeclipse.xdebug.ui.EnvironmentVariable;
+import net.sourceforge.phpeclipse.xdebug.ui.MultipleInputDialog;
+import net.sourceforge.phpeclipse.xdebug.ui.php.launching.PHPEnvironmentTab.EnvironmentVariableContentProvider;
+import net.sourceforge.phpeclipse.xdebug.ui.php.launching.PHPEnvironmentTab.EnvironmentVariableLabelProvider;
+*/
+import org.eclipse.core.runtime.CoreException;
+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.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+//import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ColumnLayoutData;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+//import org.eclipse.jface.viewers.ViewerSorter;
+//import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+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.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+public class PHPPathMapTab extends AbstractLaunchConfigurationTab {
+       protected TableViewer fPathMapTable;
+       protected Button fAddButton;
+       protected Button envAddCGIButton;
+       protected Button fEditButton;
+       protected Button fRemoveButton;
+       protected Button fUpButton;
+       protected Button fDownButton;
+
+       
+       protected String[] fPathMapTableColumnHeaders = { "Local", "Remote" };
+
+       protected ColumnLayoutData[] fPathMapTableColumnLayouts = {
+                       new ColumnWeightData(50), new ColumnWeightData(50) };
+       
+       protected static final String P_REMOTE = "remote"; //$NON-NLS-1$
+       protected static final String P_LOCAL = "local"; //$NON-NLS-1$
+       protected static String[] fPathMapTableColumnProperties = { P_REMOTE, P_LOCAL };
+
+       
+       /**
+        * Content provider for the environment table
+        */
+       protected class PathMapContentProvider implements IStructuredContentProvider {
+               public Object[] getElements(Object inputElement) {
+                       PathMapItem[] elements = new PathMapItem[0];
+                       ILaunchConfiguration config = (ILaunchConfiguration) inputElement;
+                       List l;
+                       try {
+                               l = config.getAttribute(IXDebugConstants.ATTR_PHP_PATHMAP, (List) null);
+                       } catch (CoreException e) {
+                               XDebugCorePlugin.log(new Status(IStatus.ERROR,
+                                               XDebugCorePlugin.PLUGIN_ID, IStatus.ERROR,
+                                               "Error reading configuration", e)); //$NON-NLS-1$
+                               return elements;
+                       }
+                       if (l != null && !l.isEmpty()) {
+                               elements = new PathMapItem[l.size()];
+                               for (int i = 0; i < l.size(); i++) {
+                                       elements[i] = new PathMapItem((String) l.get(i));
+                               }
+                       }
+
+                       return elements;
+               }
+
+               public void dispose() {
+               }
+
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+               }
+       }
+       
+       /**
+        * Label provider for the environment table
+        */
+       public class PathMapItemLabelProvider extends LabelProvider
+                       implements ITableLabelProvider {
+               public String getColumnText(Object element, int columnIndex) {
+                       String result = null;
+                       if (element != null) {
+                               PathMapItem var = (PathMapItem) element;
+                               switch (columnIndex) {
+                               case 0: // local
+                                       result = var.getLocalPath().toOSString();
+                                       break;
+                               case 1: // remote
+                                       result = var.getRemotePath().toString();
+                                       break;
+                               }
+                       }
+                       return result;
+               }
+
+               public Image getColumnImage(Object element, int columnIndex) {
+                       return null;
+               }
+       }
+
+
+       public void createControl(Composite parent) {
+               // Create main composite
+               Composite mainComposite = new Composite(parent, SWT.NONE);
+               setControl(mainComposite);
+               // WorkbenchHelp.setHelp(getControl(),
+               // IDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_ENVIRONMENT_TAB);
+               GridLayout layout = new GridLayout();
+               layout.numColumns = 2;
+               GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+               mainComposite.setLayout(layout);
+               mainComposite.setLayoutData(gridData);
+               mainComposite.setFont(parent.getFont());
+
+               createPathMapTable(mainComposite);
+               createTableButtons(mainComposite);
+
+               Dialog.applyDialogFont(mainComposite);
+       }
+       
+       /**
+        * Creates the add/edit/remove buttons for the environment table
+        * 
+        * @param parent
+        *            the composite in which the buttons should be created
+        */
+       protected void createTableButtons(Composite parent) {
+               // Create button composite
+               Composite buttonComposite = new Composite(parent, SWT.NONE);
+               GridLayout glayout = new GridLayout();
+               glayout.marginHeight = 0;
+               glayout.marginWidth = 0;
+               glayout.numColumns = 1;
+               GridData gdata = new GridData(GridData.VERTICAL_ALIGN_BEGINNING
+                               | GridData.HORIZONTAL_ALIGN_END);
+               buttonComposite.setLayout(glayout);
+               buttonComposite.setLayoutData(gdata);
+               buttonComposite.setFont(parent.getFont());
+
+               createVerticalSpacer(buttonComposite, 1);
+               // Create buttons
+               fAddButton = createPushButton(buttonComposite, "New", null);
+               fAddButton.addSelectionListener(new SelectionAdapter() {
+                       public void widgetSelected(SelectionEvent event) {
+                               handleAddButtonSelected();
+                       }
+               });
+
+               fEditButton = createPushButton(buttonComposite, "Edit", null);
+               fEditButton.addSelectionListener(new SelectionAdapter() {
+                       public void widgetSelected(SelectionEvent event) {
+                               handleEditButtonSelected();
+                       }
+               });
+               fEditButton.setEnabled(false);
+
+               fRemoveButton = createPushButton(buttonComposite, "Remove", null);
+               fRemoveButton.addSelectionListener(new SelectionAdapter() {
+                       public void widgetSelected(SelectionEvent event) {
+                               handleRemoveButtonSelected();
+                       }
+               });
+               fRemoveButton.setEnabled(false);
+               
+               fUpButton = createPushButton(buttonComposite, "Up", null);
+               fUpButton.addSelectionListener(new SelectionAdapter() {
+                       public void widgetSelected(SelectionEvent event) {
+                               handleUpButtonSelected();
+                       }
+               });
+               fUpButton.setEnabled(false);
+               
+               fDownButton = createPushButton(buttonComposite, "Down", null);
+               fDownButton.addSelectionListener(new SelectionAdapter() {
+                       public void widgetSelected(SelectionEvent event) {
+                               handleDownButtonSelected();
+                       }
+               });
+               fDownButton.setEnabled(false);
+       }
+
+       
+       /**
+        * Creates and configures the table that displayed the key/value pairs that
+        * comprise the environment.
+        * 
+        * @param parent
+        *            the composite in which the table should be created
+        */
+       protected void createPathMapTable(Composite parent) {
+               Font font = parent.getFont();
+               // Create table composite
+               Composite tableComposite = new Composite(parent, SWT.NONE);
+               GridLayout layout = new GridLayout();
+               layout.marginHeight = 0;
+               layout.marginWidth = 0;
+               layout.numColumns = 1;
+               GridData gridData = new GridData(GridData.FILL_BOTH);
+               gridData.heightHint = 150;
+               tableComposite.setLayout(layout);
+               tableComposite.setLayoutData(gridData);
+               tableComposite.setFont(font);
+               // Create label
+               Label label = new Label(tableComposite, SWT.NONE);
+               label.setFont(font);
+               label.setText("&Map remote path to local path");
+               // Create table
+               fPathMapTable = new TableViewer(tableComposite, SWT.BORDER
+                               | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
+               Table table = fPathMapTable.getTable();
+               TableLayout tableLayout = new TableLayout();
+               table.setLayout(tableLayout);
+               table.setHeaderVisible(true);
+               table.setFont(font);
+               gridData = new GridData(GridData.FILL_BOTH);
+               fPathMapTable.getControl().setLayoutData(gridData);
+               fPathMapTable.setContentProvider(new PathMapContentProvider());
+               fPathMapTable.setLabelProvider(new PathMapItemLabelProvider());
+               fPathMapTable.setColumnProperties(fPathMapTableColumnProperties);
+               fPathMapTable.addSelectionChangedListener(new ISelectionChangedListener() {
+                       public void selectionChanged(SelectionChangedEvent event) {
+                               handleTableSelectionChanged(event);
+                       }
+               });
+               fPathMapTable.addDoubleClickListener(new IDoubleClickListener() {
+                       public void doubleClick(DoubleClickEvent event) {
+                               if (!fPathMapTable.getSelection().isEmpty()) {
+                                       handleEditButtonSelected();
+                               }
+                       }
+               });
+               // Create columns
+               for (int i = 0; i < fPathMapTableColumnHeaders.length; i++) {
+                       tableLayout.addColumnData(fPathMapTableColumnLayouts[i]);
+                       TableColumn tc = new TableColumn(table, SWT.NONE, i);
+                       tc.setResizable(fPathMapTableColumnLayouts[i].resizable);
+                       tc.setText(fPathMapTableColumnHeaders[i]);
+               }
+       }
+       
+       /**
+        * Responds to a selection changed event in the environment table
+        * @param event the selection change event
+        */
+       protected void handleTableSelectionChanged(SelectionChangedEvent event) {
+               int size = ((IStructuredSelection)event.getSelection()).size();
+               int idx = fPathMapTable.getTable().getSelectionIndex();
+               int count = fPathMapTable.getTable().getItemCount();
+               if (size==1) {
+                       fEditButton.setEnabled(idx>0);
+                       fUpButton.setEnabled(idx>0);
+                       fDownButton.setEnabled((idx>=0)&&(idx<count-1));
+               }
+               
+               fRemoveButton.setEnabled(size > 0);
+       }
+       
+       /**
+        * Creates an editor for the value of the selected environment variable.
+        */
+       private void handleUpButtonSelected() {
+               IStructuredSelection sel = (IStructuredSelection) fPathMapTable.getSelection();
+               PathMapItem mapItem = (PathMapItem) sel.getFirstElement();
+               boolean found=false;
+               if (mapItem == null) {
+                       return;
+               }
+               IPath local = mapItem.getLocalPath();
+               TableItem[] items = fPathMapTable.getTable().getItems();
+               int i;
+               for (i = 0; i < items.length; i++) {
+                       PathMapItem item = (PathMapItem) items[i].getData();
+                       if (item.getLocalPath().equals(local)) {
+                               found=true;
+                               break;
+                       }
+               }
+               if ((i>0) && found) {
+                       fPathMapTable.getControl().setRedraw(false);
+                       fPathMapTable.remove(mapItem);
+                       fPathMapTable.insert(mapItem,i-1);
+                       fPathMapTable.getControl().setRedraw(true);
+                       fPathMapTable.setSelection(new StructuredSelection(mapItem),true);
+                       updateLaunchConfigurationDialog();
+               }
+       }
+       
+       private void handleDownButtonSelected() {
+               IStructuredSelection sel = (IStructuredSelection) fPathMapTable.getSelection();
+               PathMapItem mapItem = (PathMapItem) sel.getFirstElement();
+               boolean found=false;
+               if (mapItem == null) {
+                       return;
+               }
+               IPath local = mapItem.getLocalPath();
+               TableItem[] items = fPathMapTable.getTable().getItems();
+               int i;
+               for (i = 0; i < items.length; i++) {
+                       PathMapItem item = (PathMapItem) items[i].getData();
+                       if (item.getLocalPath().equals(local)) {
+                               found=true;
+                               break;
+                       }
+               }
+
+               if ((i<items.length-1) && found) {
+                       fPathMapTable.getControl().setRedraw(false);
+                       fPathMapTable.remove(mapItem);
+                       fPathMapTable.insert(mapItem,i+1);
+                       fPathMapTable.getControl().setRedraw(true);
+                       fPathMapTable.setSelection(new StructuredSelection(mapItem),true);
+                       updateLaunchConfigurationDialog();
+               }
+       }
+       
+       /**
+        * Creates an editor for the value of the selected environment variable.
+        */
+       private void handleEditButtonSelected() {
+               IStructuredSelection sel = (IStructuredSelection) fPathMapTable.getSelection();
+               PathMapItem item = (PathMapItem) sel.getFirstElement();
+               if (item == null) {
+                       return;
+               }
+
+               EditPathMapDialog dialog = new EditPathMapDialog(getShell(), "Edit pathmap", new String[] { item.getLocalPath().toString(),item.getRemotePath().toString() });
+
+               if (dialog.open() != EditPathMapDialog.OK) {
+                       return;
+               }
+               String[] pathPair = dialog.getPathPair();
+               String newLocalPath=pathPair[0];
+               String newRemotePath=pathPair[1];
+               
+               if (!item.getLocalPath().toString().equals(newLocalPath)) {
+                       if (addVariable(new PathMapItem(newLocalPath,newRemotePath))) {
+                               fPathMapTable.remove(item);
+                       }
+               } else {
+                       item.setRemotePath(newRemotePath);
+                       fPathMapTable.update(item, null);
+                       updateLaunchConfigurationDialog();
+               }
+       }
+       
+       /**
+        * Adds a new environment variable to the table.
+        */
+       protected void handleAddButtonSelected() {
+           EditPathMapDialog dialog = new EditPathMapDialog(getShell(), "Edit File Map", new String[] { "", "" });
+               if (dialog.open() != EditPathMapDialog.OK) {
+                       return;
+               }
+               String[] pathPair = dialog.getPathPair();
+               
+               Path local = new Path(pathPair[0]);
+               Path remote = new Path(pathPair[1]);
+               
+               String strlocal = local.toString();
+               String strremote = remote.toString();
+               if (strlocal != null && strremote != null && strlocal.length() > 0 && strremote.length() > 0) {
+                               addVariable(new PathMapItem(strlocal,strremote));
+               }
+       }
+       
+       /**
+        * Removes the selected environment variable from the table.
+        */
+       private void handleRemoveButtonSelected() {
+               IStructuredSelection sel = (IStructuredSelection) fPathMapTable.getSelection();
+               fPathMapTable.getControl().setRedraw(false);
+               for (Iterator i = sel.iterator(); i.hasNext();) {
+                       PathMapItem item = (PathMapItem) i.next();
+                       fPathMapTable.remove(item);
+               }
+               fPathMapTable.getControl().setRedraw(true);
+               updateLaunchConfigurationDialog();
+       }
+
+       /**
+        * Attempts to add the given variable. Returns whether the variable was
+        * added or not (as when the user answers not to overwrite an existing
+        * variable).
+        * 
+        * @param variable the variable to add
+        * @return whether the variable was added
+        */
+       protected boolean addVariable(PathMapItem mapItem) {
+               IPath local = mapItem.getLocalPath();
+               TableItem[] items = fPathMapTable.getTable().getItems();
+               for (int i = 0; i < items.length; i++) {
+                       PathMapItem item = (PathMapItem) items[i].getData();
+                       if (item.getLocalPath().equals(local)) {
+                               boolean overWrite = MessageDialog.openQuestion(getShell(),"Overwrite variable?",
+                                               MessageFormat.format("A local path named {0} already exists. Overwrite?",new String[] { local.toString() }));
+                               if (!overWrite) {
+                                       return false;
+                               }
+                               fPathMapTable.remove(item);
+                               break;
+                       }
+               }
+               fPathMapTable.add(mapItem);
+               updateLaunchConfigurationDialog();
+               return true;
+       }
+       
+
+
+       public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
+               // TODO Auto-generated method stub
+
+       }
+
+       public void initializeFrom(ILaunchConfiguration configuration) {
+               fPathMapTable.setInput(configuration);
+       }
+
+       public void performApply(ILaunchConfigurationWorkingCopy configuration) {
+               // Convert the table's items into a List so that this can be saved in the
+               // configuration's attributes.
+               TableItem[] items = fPathMapTable.getTable().getItems();
+               List vec = new Vector(items.length);
+               for (int i = 0; i < items.length; i++) {
+                       PathMapItem item = (PathMapItem) items[i].getData();
+                       vec.add(item.getStringData());
+               }
+               if (vec.size() == 0) {
+                       configuration.setAttribute(IXDebugConstants.ATTR_PHP_PATHMAP, (List) null);
+               } else {
+                       configuration.setAttribute(IXDebugConstants.ATTR_PHP_PATHMAP, vec);
+               }
+       }
+
+       public String getName() {
+               return "Pathmap";
+       }
+}
\ No newline at end of file