X-Git-Url: http://git.phpeclipse.com 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 index 0000000..0992e5d --- /dev/null +++ b/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/php/launching/PHPPathMapTab.java @@ -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 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 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