2  * Created on 14.07.2004
 
   4  * TODO To change the template for this generated file go to
 
   5  * Window - Preferences - Java - Code Style - Code Templates
 
   7 package net.sourceforge.phpdt.internal.debug.ui.launcher;
 
   9 import java.text.MessageFormat;
 
  10 import java.util.Comparator;
 
  11 import java.util.HashMap;
 
  12 import java.util.Iterator;
 
  14 import java.util.TreeMap;
 
  16 import net.sourceforge.phpdt.internal.debug.ui.PHPDebugUiMessages;
 
  18 import org.eclipse.core.runtime.CoreException;
 
  19 import org.eclipse.core.runtime.IStatus;
 
  20 import org.eclipse.core.runtime.Status;
 
  21 import org.eclipse.debug.core.DebugPlugin;
 
  22 import org.eclipse.debug.core.ILaunchConfiguration;
 
  23 import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
 
  24 import org.eclipse.debug.core.ILaunchManager;
 
  25 import org.eclipse.debug.internal.ui.DebugPluginImages;
 
  26 import org.eclipse.debug.internal.ui.DebugUIPlugin;
 
  27 import org.eclipse.debug.internal.ui.DialogSettingsHelper;
 
  28 import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
 
  29 import org.eclipse.debug.internal.ui.MultipleInputDialog;
 
  30 import org.eclipse.debug.internal.ui.launchConfigurations.EnvironmentVariable;
 
  31 import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsMessages;
 
  32 import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
 
  33 import org.eclipse.debug.ui.IDebugUIConstants;
 
  34 import org.eclipse.jface.dialogs.Dialog;
 
  35 import org.eclipse.jface.dialogs.IDialogSettings;
 
  36 import org.eclipse.jface.dialogs.MessageDialog;
 
  37 import org.eclipse.jface.viewers.ColumnLayoutData;
 
  38 import org.eclipse.jface.viewers.ColumnWeightData;
 
  39 import org.eclipse.jface.viewers.DoubleClickEvent;
 
  40 import org.eclipse.jface.viewers.IDoubleClickListener;
 
  41 import org.eclipse.jface.viewers.ILabelProvider;
 
  42 import org.eclipse.jface.viewers.ILabelProviderListener;
 
  43 import org.eclipse.jface.viewers.ISelectionChangedListener;
 
  44 import org.eclipse.jface.viewers.IStructuredContentProvider;
 
  45 import org.eclipse.jface.viewers.IStructuredSelection;
 
  46 import org.eclipse.jface.viewers.ITableLabelProvider;
 
  47 import org.eclipse.jface.viewers.LabelProvider;
 
  48 import org.eclipse.jface.viewers.SelectionChangedEvent;
 
  49 import org.eclipse.jface.viewers.TableLayout;
 
  50 import org.eclipse.jface.viewers.TableViewer;
 
  51 import org.eclipse.jface.viewers.Viewer;
 
  52 import org.eclipse.jface.viewers.ViewerSorter;
 
  53 import org.eclipse.jface.window.Window;
 
  54 import org.eclipse.swt.SWT;
 
  55 import org.eclipse.swt.events.SelectionAdapter;
 
  56 import org.eclipse.swt.events.SelectionEvent;
 
  57 import org.eclipse.swt.graphics.Font;
 
  58 import org.eclipse.swt.graphics.Image;
 
  59 import org.eclipse.swt.graphics.Point;
 
  60 import org.eclipse.swt.layout.GridData;
 
  61 import org.eclipse.swt.layout.GridLayout;
 
  62 import org.eclipse.swt.widgets.Button;
 
  63 import org.eclipse.swt.widgets.Composite;
 
  64 import org.eclipse.swt.widgets.Label;
 
  65 import org.eclipse.swt.widgets.Shell;
 
  66 import org.eclipse.swt.widgets.Table;
 
  67 import org.eclipse.swt.widgets.TableColumn;
 
  68 import org.eclipse.swt.widgets.TableItem;
 
  69 import org.eclipse.ui.dialogs.ListSelectionDialog;
 
  70 import org.eclipse.ui.help.WorkbenchHelp;
 
  75  * TODO To change the template for this generated type comment go to
 
  76  * Window - Preferences - Java - Code Style - Code Templates
 
  78 public class PHPEnvironmentTab2 extends AbstractLaunchConfigurationTab {
 
  81         protected TableViewer environmentTable;
 
  82         protected String[] envTableColumnHeaders =
 
  84        LaunchConfigurationsMessages.EnvironmentTab_Variable_1, //$NON-NLS-1$
 
  85        LaunchConfigurationsMessages.EnvironmentTab_Value_2 //$NON-NLS-1$
 
  87         protected ColumnLayoutData[] envTableColumnLayouts =
 
  89                 new ColumnWeightData(50),
 
  90                 new ColumnWeightData(50)
 
  92    private static final String NAME_LABEL= LaunchConfigurationsMessages.EnvironmentTab_8; //$NON-NLS-1$
 
  93    private static final String VALUE_LABEL= LaunchConfigurationsMessages.EnvironmentTab_9; //$NON-NLS-1$
 
  94         protected static final String P_VARIABLE = "variable"; //$NON-NLS-1$
 
  95         protected static final String P_VALUE = "value"; //$NON-NLS-1$
 
  96         protected static String[] envTableColumnProperties =
 
 101         protected Button envAddButton;
 
 102         protected Button envAddCGIButton;
 
 103         protected Button envEditButton;
 
 104         protected Button envRemoveButton;
 
 105         protected Button appendEnvironment;
 
 106         protected Button replaceEnvironment;
 
 107         protected Button envSelectButton;
 
 110          * Content provider for the environment table
 
 112         protected class EnvironmentVariableContentProvider implements IStructuredContentProvider {
 
 113                 public Object[] getElements(Object inputElement) {
 
 114                         EnvironmentVariable[] elements = new EnvironmentVariable[0];
 
 115                         ILaunchConfiguration config = (ILaunchConfiguration) inputElement;
 
 118                                 m = config.getAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, (Map) null);
 
 119                         } catch (CoreException e) {
 
 120                                 DebugUIPlugin.log(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, "Error reading configuration", e)); //$NON-NLS-1$
 
 123                         if (m != null && !m.isEmpty()) {
 
 124                                 elements = new EnvironmentVariable[m.size()];
 
 125                                 String[] varNames = new String[m.size()];
 
 126                                 m.keySet().toArray(varNames);
 
 127                                 for (int i = 0; i < m.size(); i++) {
 
 128                                         elements[i] = new EnvironmentVariable(varNames[i], (String) m.get(varNames[i]));
 
 133                 public void dispose() {
 
 135                 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 
 136                         if (newInput == null){
 
 139                         if (viewer instanceof TableViewer){
 
 140                                 TableViewer tableViewer= (TableViewer) viewer;
 
 141                                 if (tableViewer.getTable().isDisposed()) {
 
 144                                 tableViewer.setSorter(new ViewerSorter() {
 
 145                                         public int compare(Viewer iviewer, Object e1, Object e2) {
 
 148                                                 } else if (e2 == null) {
 
 151                                                         return ((EnvironmentVariable)e1).getName().compareToIgnoreCase(((EnvironmentVariable)e2).getName());
 
 160          * Label provider for the environment table
 
 162         public class EnvironmentVariableLabelProvider extends LabelProvider implements ITableLabelProvider {
 
 163                 public String getColumnText(Object element, int columnIndex)    {
 
 164                         String result = null;
 
 165                         if (element != null) {
 
 166                                 EnvironmentVariable var = (EnvironmentVariable) element;
 
 167                                 switch (columnIndex) {
 
 169                                                 result = var.getName();
 
 172                                                 result = var.getValue();
 
 178                 public Image getColumnImage(Object element, int columnIndex) {
 
 184          * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
 
 186         public void createControl(Composite parent) {
 
 187                 // Create main composite
 
 188                 Composite mainComposite = new Composite(parent, SWT.NONE);
 
 189                 setControl(mainComposite);
 
 190                 WorkbenchHelp.setHelp(getControl(), IDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_ENVIRONMENT_TAB);
 
 191                 GridLayout layout = new GridLayout();
 
 192                 layout.numColumns = 2;
 
 193                 GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
 
 194                 mainComposite.setLayout(layout);
 
 195                 mainComposite.setLayoutData(gridData);
 
 196                 mainComposite.setFont(parent.getFont());
 
 198                 createEnvironmentTable(mainComposite);
 
 199                 createTableButtons(mainComposite);
 
 200                 createAppendReplace(mainComposite);
 
 202                 Dialog.applyDialogFont(mainComposite);
 
 206          * Creates and configures the widgets which allow the user to
 
 207          * choose whether the specified environment should be appended
 
 208          * to the native environment or if it should completely replace it.
 
 209          * @param parent the composite in which the widgets should be created
 
 211         protected void createAppendReplace(Composite parent) {
 
 212                 Composite appendReplaceComposite= new Composite(parent, SWT.NONE);
 
 213                 GridData gridData= new GridData();
 
 214                 gridData.horizontalSpan= 2;
 
 215                 GridLayout layout= new GridLayout();
 
 216                 appendReplaceComposite.setLayoutData(gridData);
 
 217                 appendReplaceComposite.setLayout(layout);
 
 218                 appendReplaceComposite.setFont(parent.getFont());
 
 220        appendEnvironment= createRadioButton(appendReplaceComposite, LaunchConfigurationsMessages.EnvironmentTab_16); //$NON-NLS-1$
 
 221                 appendEnvironment.addSelectionListener(new SelectionAdapter() {
 
 222                         public void widgetSelected(SelectionEvent e) {
 
 223                                 updateLaunchConfigurationDialog();
 
 226        replaceEnvironment= createRadioButton(appendReplaceComposite, LaunchConfigurationsMessages.EnvironmentTab_17); //$NON-NLS-1$
 
 230          * Updates the enablement of the append/replace widgets. The
 
 231          * widgets should disable when there are no environment variables specified.
 
 233         protected void updateAppendReplace() {
 
 234                 boolean enable= environmentTable.getTable().getItemCount() > 0;
 
 235                 appendEnvironment.setEnabled(enable);
 
 236                 replaceEnvironment.setEnabled(enable);
 
 240          * Creates and configures the table that displayed the key/value
 
 241          * pairs that comprise the environment.
 
 242          * @param parent the composite in which the table should be created
 
 244         protected void createEnvironmentTable(Composite parent) {
 
 245                 Font font= parent.getFont();
 
 246                 // Create table composite
 
 247                 Composite tableComposite = new Composite(parent, SWT.NONE);
 
 248                 GridLayout layout = new GridLayout();
 
 249                 layout.marginHeight = 0;
 
 250                 layout.marginWidth = 0;
 
 251                 layout.numColumns = 1;
 
 252                 GridData gridData = new GridData(GridData.FILL_BOTH);
 
 253                 gridData.heightHint = 150;
 
 254                 tableComposite.setLayout(layout);
 
 255                 tableComposite.setLayoutData(gridData);
 
 256                 tableComposite.setFont(font);
 
 258                 Label label = new Label(tableComposite, SWT.NONE);
 
 260        label.setText(LaunchConfigurationsMessages.EnvironmentTab_Environment_variables_to_set__3); //$NON-NLS-1$
 
 262                 environmentTable = new TableViewer(tableComposite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
 
 263                 Table table = environmentTable.getTable();
 
 264                 TableLayout tableLayout = new TableLayout();
 
 265                 table.setLayout(tableLayout);
 
 266                 table.setHeaderVisible(true);
 
 268                 gridData = new GridData(GridData.FILL_BOTH);
 
 269                 environmentTable.getControl().setLayoutData(gridData);
 
 270                 environmentTable.setContentProvider(new EnvironmentVariableContentProvider());
 
 271                 environmentTable.setLabelProvider(new EnvironmentVariableLabelProvider());
 
 272                 environmentTable.setColumnProperties(envTableColumnProperties);
 
 273                 environmentTable.addSelectionChangedListener(new ISelectionChangedListener() {
 
 274                         public void selectionChanged(SelectionChangedEvent event) {
 
 275                                 handleTableSelectionChanged(event);
 
 278                 environmentTable.addDoubleClickListener(new IDoubleClickListener() {
 
 279                         public void doubleClick(DoubleClickEvent event) {
 
 280                                 if (!environmentTable.getSelection().isEmpty()) {
 
 281                                         handleEnvEditButtonSelected();
 
 286                 for (int i = 0; i < envTableColumnHeaders.length; i++) {
 
 287                         tableLayout.addColumnData(envTableColumnLayouts[i]);
 
 288                         TableColumn tc = new TableColumn(table, SWT.NONE, i);
 
 289                         tc.setResizable(envTableColumnLayouts[i].resizable);
 
 290                         tc.setText(envTableColumnHeaders[i]);
 
 295          * Responds to a selection changed event in the environment table
 
 296          * @param event the selection change event
 
 298         protected void handleTableSelectionChanged(SelectionChangedEvent event) {
 
 299                 int size = ((IStructuredSelection)event.getSelection()).size();
 
 300                 envEditButton.setEnabled(size == 1);
 
 301                 envRemoveButton.setEnabled(size > 0);
 
 305          * Creates the add/edit/remove buttons for the environment table
 
 306          * @param parent the composite in which the buttons should be created
 
 308         protected void createTableButtons(Composite parent) {
 
 309                 // Create button composite
 
 310                 Composite buttonComposite = new Composite(parent, SWT.NONE);
 
 311                 GridLayout glayout = new GridLayout();
 
 312                 glayout.marginHeight = 0;
 
 313                 glayout.marginWidth = 0;
 
 314                 glayout.numColumns = 1;
 
 315                 GridData gdata = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_END);
 
 316                 buttonComposite.setLayout(glayout);
 
 317                 buttonComposite.setLayoutData(gdata);
 
 318                 buttonComposite.setFont(parent.getFont());
 
 320                 createVerticalSpacer(buttonComposite, 1);
 
 322        envAddButton = createPushButton(buttonComposite, LaunchConfigurationsMessages.EnvironmentTab_New_4, null); //$NON-NLS-1$
 
 323                 envAddButton.addSelectionListener(new SelectionAdapter()
 
 325                         public void widgetSelected(SelectionEvent event) {
 
 326                                 handleEnvAddButtonSelected();
 
 329                 envAddCGIButton = createPushButton(buttonComposite, PHPDebugUiMessages.getString("LaunchConfigurationTab.PHPEnvironment2.CGIButton"), null); //$NON-NLS-1$
 
 330                 envAddCGIButton.addSelectionListener(new SelectionAdapter() {
 
 331                         public void widgetSelected(SelectionEvent event) {
 
 332                                 handleEnvAddCGIButtonSelected();
 
 336        envSelectButton = createPushButton(buttonComposite, LaunchConfigurationsMessages.EnvironmentTab_18, null); //$NON-NLS-1$
 
 337                 envSelectButton.addSelectionListener(new SelectionAdapter() {
 
 338                         public void widgetSelected(SelectionEvent event) {
 
 339                                 handleEnvSelectButtonSelected();
 
 342        envEditButton = createPushButton(buttonComposite, LaunchConfigurationsMessages.EnvironmentTab_Edit_5, null); //$NON-NLS-1$
 
 343                 envEditButton.addSelectionListener(new SelectionAdapter()
 
 345                         public void widgetSelected(SelectionEvent event) {
 
 346                                 handleEnvEditButtonSelected();
 
 349                 envEditButton.setEnabled(false);
 
 350        envRemoveButton = createPushButton(buttonComposite, LaunchConfigurationsMessages.EnvironmentTab_Remove_6, null); //$NON-NLS-1$
 
 351                 envRemoveButton.addSelectionListener(new SelectionAdapter()
 
 353                         public void widgetSelected(SelectionEvent event) {
 
 354                                 handleEnvRemoveButtonSelected();
 
 357                 envRemoveButton.setEnabled(false);
 
 361          * Adds a new environment variable to the table.
 
 363         protected void handleEnvAddButtonSelected() {
 
 364        MultipleInputDialog dialog = new MultipleInputDialog(getShell(), LaunchConfigurationsMessages.EnvironmentTab_22); //$NON-NLS-1$
 
 365                 dialog.addTextField(NAME_LABEL, null, false);
 
 366                 dialog.addVariablesField(VALUE_LABEL, null, true);
 
 368                 if (dialog.open() != Window.OK) {
 
 372                 String name = dialog.getStringValue(NAME_LABEL);
 
 373                 String value = dialog.getStringValue(VALUE_LABEL);
 
 375                 if (name != null && value != null && name.length() > 0 && value.length() >0) {
 
 376                         addVariable(new EnvironmentVariable(name.trim(), value.trim()));
 
 377                         updateAppendReplace();
 
 382          * Attempts to add the given variable. Returns whether the variable
 
 383          * was added or not (as when the user answers not to overwrite an
 
 384          * existing variable).
 
 385          * @param variable the variable to add
 
 386          * @return whether the variable was added
 
 388         protected boolean addVariable(EnvironmentVariable variable) {
 
 389                 String name= variable.getName();
 
 390                 TableItem[] items = environmentTable.getTable().getItems();
 
 391                 for (int i = 0; i < items.length; i++) {
 
 392                         EnvironmentVariable existingVariable = (EnvironmentVariable) items[i].getData();
 
 393                         if (existingVariable.getName().equals(name)) {
 
 394                boolean overWrite= MessageDialog.openQuestion(getShell(), LaunchConfigurationsMessages.EnvironmentTab_12, MessageFormat.format(LaunchConfigurationsMessages.EnvironmentTab_13, new String[] {name})); //$NON-NLS-1$ //$NON-NLS-2$
 
 398                                 environmentTable.remove(existingVariable);
 
 402                 environmentTable.add(variable);
 
 403                 updateLaunchConfigurationDialog();
 
 408          * Displays a dialog that allows user to select native environment variables 
 
 409          * to add to the table.
 
 411         private void handleEnvSelectButtonSelected() {
 
 412                 //get Environment Variables from the OS
 
 413                 Map envVariables = getNativeEnvironment();
 
 415                 //get Environment Variables from the table
 
 416                 TableItem[] items = environmentTable.getTable().getItems();
 
 417                 for (int i = 0; i < items.length; i++) {
 
 418                         EnvironmentVariable var = (EnvironmentVariable) items[i].getData();
 
 419                         envVariables.remove(var.getName());
 
 422        ListSelectionDialog dialog = new NativeEnvironmentDialog(getShell(), envVariables, createSelectionDialogContentProvider(), createSelectionDialogLabelProvider(), LaunchConfigurationsMessages.EnvironmentTab_19); //$NON-NLS-1$
 
 423        dialog.setTitle(LaunchConfigurationsMessages.EnvironmentTab_20); //$NON-NLS-1$
 
 425                 int button = dialog.open();
 
 426                 if (button == Window.OK) {
 
 427                         Object[] selected = dialog.getResult();         
 
 428                         for (int i = 0; i < selected.length; i++) {
 
 429                                 environmentTable.add(selected[i]);                              
 
 433                 updateAppendReplace();
 
 434                 updateLaunchConfigurationDialog();
 
 438          * Displays a dialog that allows user to select native environment variables 
 
 439          * to add to the table.
 
 441         private void handleEnvAddCGIButtonSelected() {
 
 443                 Map envVariables = new HashMap();
 
 446                 envVariables.put("HTTP_COOKIE",new EnvironmentVariable("HTTP_COOKIE", "TestCookie=1"));
 
 447                 envVariables.put("REDIRECT_QUERY_STRING",new EnvironmentVariable("REDIRECT_QUERY_STRING", ""));
 
 448                 envVariables.put("REDIRECT_STATUS",new EnvironmentVariable("REDIRECT_STATUS", "200"));
 
 449                 envVariables.put("REDIRECT_URL",new EnvironmentVariable("REDIRECT_URL", ""));
 
 450                 envVariables.put("SERVER_SOFTWARE",new EnvironmentVariable("SERVER_SOFTWARE","DBG / 2.1"));
 
 451                 envVariables.put("SERVER_NAME",new EnvironmentVariable("SERVER_NAME","localhost"));
 
 452                 envVariables.put("SERVER_ADDR",new EnvironmentVariable("SERVER_ADDR","127.0.0.1"));
 
 453                 envVariables.put("SERVER_PORT",new EnvironmentVariable("SERVER_PORT","80"));
 
 454                 envVariables.put("REMOTE_ADDR",new EnvironmentVariable("REMOTE_ADDR","127.0.0.1"));
 
 455                 envVariables.put("GATEWAY_INTERFACE",new EnvironmentVariable("GATEWAY_INTERFACE","CGI / 1.1"));
 
 456                 envVariables.put("SERVER_PROTOCOL",new EnvironmentVariable("SERVER_PROTOCOL","HTTP / 1.1"));
 
 457                 envVariables.put("REQUEST_METHOD",new EnvironmentVariable("REQUEST_METHOD","GET"));
 
 458                 envVariables.put("QUERY_STRING",new EnvironmentVariable("QUERY_STRING",""));
 
 459                 envVariables.put("REDIRECT_QUERY_STRING",new EnvironmentVariable("REDIRECT_QUERY_STRING",""));
 
 460 //              envVariables.put("REQUEST_URI" + OSFilePath;
 
 461 //              envVariables.put("PATH_INFO=" + OSFilePath;
 
 462 //              envVariables.put("PATH_TRANSLATED=" + OSFilePath;
 
 465                 //get Environment Variables from the table
 
 466                 TableItem[] items = environmentTable.getTable().getItems();
 
 467                 for (int i = 0; i < items.length; i++) {
 
 468                         EnvironmentVariable var = (EnvironmentVariable) items[i].getData();
 
 469                         envVariables.remove(var.getName());
 
 472        ListSelectionDialog dialog = new NativeEnvironmentDialog(getShell(), envVariables, createSelectionDialogContentProvider(), createSelectionDialogLabelProvider(), LaunchConfigurationsMessages.EnvironmentTab_19); //$NON-NLS-1$
 
 473        dialog.setTitle(LaunchConfigurationsMessages.EnvironmentTab_20); //$NON-NLS-1$
 
 475                 int button = dialog.open();
 
 476                 if (button == Window.OK) {
 
 477                         Object[] selected = dialog.getResult();         
 
 478                         for (int i = 0; i < selected.length; i++) {
 
 479                                 environmentTable.add(selected[i]);                              
 
 483                 updateAppendReplace();
 
 484                 updateLaunchConfigurationDialog();
 
 489          * Creates a label provider for the native native environment variable selection dialog.
 
 490          * @return A label provider for the native native environment variable selection dialog.
 
 492         private ILabelProvider createSelectionDialogLabelProvider() {
 
 493                 return new ILabelProvider() {
 
 494                         public Image getImage(Object element) {
 
 497                         public String getText(Object element) {
 
 498                                 EnvironmentVariable var = (EnvironmentVariable) element;
 
 499                                 return var.getName() + " [" + var.getValue() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
 
 501                         public void addListener(ILabelProviderListener listener) {
 
 503                         public void dispose() {
 
 505                         public boolean isLabelProperty(Object element, String property) {
 
 508                         public void removeListener(ILabelProviderListener listener) {
 
 514          * Creates a content provider for the native native environment variable selection dialog.
 
 515          * @return A content provider for the native native environment variable selection dialog.
 
 517         private IStructuredContentProvider createSelectionDialogContentProvider() {
 
 518                 return new IStructuredContentProvider() {
 
 519                         public Object[] getElements(Object inputElement) {
 
 520                                 EnvironmentVariable[] elements = null;
 
 521                                 if (inputElement instanceof HashMap) {
 
 522                                         Comparator comparator = new Comparator() {
 
 523                                                 public int compare(Object o1, Object o2) {
 
 524                                                         String s1 = (String)o1;
 
 525                                                         String s2 = (String)o2;
 
 526                                                         return s1.compareTo(s2);
 
 530                                         TreeMap envVars = new TreeMap(comparator);
 
 531                                         envVars.putAll((Map)inputElement);
 
 532                                         elements = new EnvironmentVariable[envVars.size()];
 
 534                                         for (Iterator iterator = envVars.keySet().iterator(); iterator.hasNext(); index++) {
 
 535                                                 Object key = iterator.next();
 
 536                                                 elements[index] = (EnvironmentVariable) envVars.get(key);
 
 541                         public void dispose() { 
 
 543                         public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 
 549          * Gets native environment variable from the LaunchManager. Creates EnvironmentVariable objects.
 
 550          * @return Map of name - EnvironmentVariable pairs based on native environment.
 
 552         private Map getNativeEnvironment() {
 
 553                 Map stringVars = DebugPlugin.getDefault().getLaunchManager().getNativeEnvironment();
 
 554                 HashMap vars = new HashMap();
 
 555                 for (Iterator i = stringVars.keySet().iterator(); i.hasNext(); ) {
 
 556                         String key = (String) i.next();
 
 557                         String value = (String) stringVars.get(key);
 
 558                         vars.put(key, new EnvironmentVariable(key, value));
 
 564          * Creates an editor for the value of the selected environment variable.
 
 566         private void handleEnvEditButtonSelected() {
 
 567                 IStructuredSelection sel= (IStructuredSelection) environmentTable.getSelection();
 
 568                 EnvironmentVariable var= (EnvironmentVariable) sel.getFirstElement();
 
 572                 String originalName= var.getName();
 
 573                 String value= var.getValue();
 
 574        MultipleInputDialog dialog= new MultipleInputDialog(getShell(), LaunchConfigurationsMessages.EnvironmentTab_11); //$NON-NLS-1$
 
 575                 dialog.addTextField(NAME_LABEL, originalName, false);
 
 576                 dialog.addVariablesField(VALUE_LABEL, value, true);
 
 578                 if (dialog.open() != Window.OK) {
 
 581                 String name= dialog.getStringValue(NAME_LABEL);
 
 582                 value= dialog.getStringValue(VALUE_LABEL);
 
 583                 if (!originalName.equals(name)) {
 
 584                         if (addVariable(new EnvironmentVariable(name, value))) {
 
 585                                 environmentTable.remove(var);
 
 589                         environmentTable.update(var, null);
 
 590                         updateLaunchConfigurationDialog();
 
 595          * Removes the selected environment variable from the table.
 
 597         private void handleEnvRemoveButtonSelected() {
 
 598                 IStructuredSelection sel = (IStructuredSelection) environmentTable.getSelection();
 
 599                 environmentTable.getControl().setRedraw(false);
 
 600                 for (Iterator i = sel.iterator(); i.hasNext(); ) {
 
 601                         EnvironmentVariable var = (EnvironmentVariable) i.next();       
 
 602                 environmentTable.remove(var);
 
 604                 environmentTable.getControl().setRedraw(true);
 
 605                 updateAppendReplace();
 
 606                 updateLaunchConfigurationDialog();
 
 610          * Updates the environment table for the given launch configuration
 
 611          * @param configuration
 
 613         protected void updateEnvironment(ILaunchConfiguration configuration) {
 
 614                 environmentTable.setInput(configuration);
 
 618          * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
 
 620         public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
 
 624          * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
 
 626         public void initializeFrom(ILaunchConfiguration configuration) {
 
 627                 boolean append= true;
 
 629                         append = configuration.getAttribute(ILaunchManager.ATTR_APPEND_ENVIRONMENT_VARIABLES, true);
 
 630                 } catch (CoreException e) {
 
 631                         DebugUIPlugin.log(e.getStatus());
 
 634                         appendEnvironment.setSelection(true);
 
 635                 replaceEnvironment.setSelection(false);
 
 637                         replaceEnvironment.setSelection(true);
 
 638                         appendEnvironment.setSelection(false);
 
 640                 updateEnvironment(configuration);
 
 641                 updateAppendReplace();
 
 645          * Stores the environment in the given configuration
 
 646          * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
 
 648         public void performApply(ILaunchConfigurationWorkingCopy configuration) {       
 
 649                 // Convert the table's items into a Map so that this can be saved in the
 
 650                 // configuration's attributes.
 
 651                 TableItem[] items = environmentTable.getTable().getItems();
 
 652                 Map map = new HashMap(items.length);
 
 653                 for (int i = 0; i < items.length; i++)
 
 655                         EnvironmentVariable var = (EnvironmentVariable) items[i].getData();
 
 656                         map.put(var.getName(), var.getValue());
 
 658                 if (map.size() == 0) {
 
 659                         configuration.setAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, (Map) null);
 
 661                         configuration.setAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, map);
 
 663                 configuration.setAttribute(ILaunchManager.ATTR_APPEND_ENVIRONMENT_VARIABLES, appendEnvironment.getSelection());
 
 667          * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
 
 669         public String getName() {
 
 670        return LaunchConfigurationsMessages.EnvironmentTab_Environment_7; //$NON-NLS-1$
 
 674          * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
 
 676         public Image getImage() {
 
 677                 return DebugPluginImages.getImage(IDebugUIConstants.IMG_OBJS_ENVIRONMENT);
 
 681          * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
 
 683         public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
 
 684                 // do nothing when activated
 
 688          * @see org.eclipse.debug.ui.ILaunchConfigurationTab#deactivated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
 
 690         public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
 
 691                 // do nothing when deactivated
 
 694         private class NativeEnvironmentDialog extends ListSelectionDialog {
 
 695                 public NativeEnvironmentDialog(Shell parentShell, Object input, IStructuredContentProvider contentProvider, ILabelProvider labelProvider, String message) {
 
 696                         super(parentShell, input, contentProvider, labelProvider, message);
 
 697                         setShellStyle(getShellStyle() | SWT.RESIZE);
 
 700                 protected IDialogSettings getDialogSettings() {
 
 701                         IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings();
 
 702                         IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
 
 703                         if (section == null) {
 
 704                                 section = settings.addNewSection(getDialogSettingsSectionName());
 
 710                  * Returns the name of the section that this dialog stores its settings in
 
 714                 protected String getDialogSettingsSectionName() {
 
 715                         return IDebugUIConstants.PLUGIN_ID + ".ENVIRONMENT_TAB.NATIVE_ENVIROMENT_DIALOG"; //$NON-NLS-1$
 
 720                  * @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
 
 722                 protected Point getInitialLocation(Point initialSize) {
 
 723                         Point initialLocation= DialogSettingsHelper.getInitialLocation(getDialogSettingsSectionName());
 
 724                         if (initialLocation != null) {
 
 725                                 return initialLocation;
 
 727                         return super.getInitialLocation(initialSize);
 
 731                  * @see org.eclipse.jface.window.Window#getInitialSize()
 
 733                 protected Point getInitialSize() {
 
 734                         Point size = super.getInitialSize();
 
 735                         return DialogSettingsHelper.getInitialSize(getDialogSettingsSectionName(), size);
 
 739                  * @see org.eclipse.jface.window.Window#close()
 
 741                 public boolean close() {
 
 742                         DialogSettingsHelper.persistShellGeometry(getShell(), getDialogSettingsSectionName());
 
 743                         return super.close();