Avoid message in 31M6:
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / externaltools / launchConfigurations / ExternalToolsMainTab.java
index 7d2ae92..2aa0933 100644 (file)
@@ -1,11 +1,9 @@
 package net.sourceforge.phpdt.externaltools.launchConfigurations;
 
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
+/***********************************************************************************************************************************
+ * Copyright (c) 2000, 2002 IBM Corp. All rights reserved. This file is made available under the terms of the Common Public License
+ * v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/cpl-v10.html
+ **********************************************************************************************************************************/
 
 import java.io.File;
 
@@ -17,6 +15,7 @@ import net.sourceforge.phpdt.externaltools.internal.registry.ExternalToolVariabl
 import net.sourceforge.phpdt.externaltools.model.IExternalToolConstants;
 import net.sourceforge.phpdt.externaltools.model.ToolUtil;
 import net.sourceforge.phpdt.externaltools.variable.ExpandVariableContext;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.ResourcesPlugin;
@@ -27,8 +26,10 @@ import org.eclipse.core.runtime.MultiStatus;
 import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
 import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
+import org.eclipse.debug.ui.ILaunchConfigurationTab;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
@@ -54,518 +55,545 @@ import org.eclipse.ui.dialogs.SelectionDialog;
 
 public class ExternalToolsMainTab extends AbstractLaunchConfigurationTab {
 
-       protected Combo locationField;
-       protected Text workDirectoryField;
-       protected Button fileLocationButton;
-       protected Button workspaceLocationButton;
-       protected Button fileWorkingDirectoryButton;
-       protected Button workspaceWorkingDirectoryButton;
-
-       protected Button runBackgroundButton;
-       protected Text argumentField;
-       protected Button variableButton;
-
-       protected SelectionAdapter selectionAdapter;
-       
-       protected ModifyListener modifyListener = new ModifyListener() {
-               public void modifyText(ModifyEvent e) {
-                       updateLaunchConfigurationDialog();
-               }
-       };
-
-       /**
-        * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
-        */
-       public void createControl(Composite parent) {
-               Composite mainComposite = new Composite(parent, SWT.NONE);
-               setControl(mainComposite);
-               GridLayout layout = new GridLayout();
-               layout.numColumns = 2;
-               GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-               mainComposite.setLayout(layout);
-               mainComposite.setLayoutData(gridData);
-               mainComposite.setFont(parent.getFont());
-               createLocationComponent(mainComposite);
-               createWorkDirectoryComponent(mainComposite);
-               createArgumentComponent(mainComposite);
-               createVerticalSpacer(mainComposite, 2);
-               createRunBackgroundComponent(mainComposite);
-       }
-       
-       /**
-        * Creates the controls needed to edit the location
-        * attribute of an external tool
-        * 
-        * @param parent the composite to create the controls in
-        */
-       protected void createLocationComponent(Composite parent) {
-               Font font = parent.getFont();
-               
-               Composite composite = new Composite(parent, SWT.NONE);
-               GridLayout layout = new GridLayout();
-               layout.marginWidth = 0;
-               layout.marginHeight = 0;
-               layout.numColumns = 1;
-               GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-               composite.setLayout(layout);
-               composite.setLayoutData(gridData);
-               
-               Label label = new Label(composite, SWT.NONE);
-               label.setText(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Location___2")); //$NON-NLS-1$
-               label.setFont(font);
-               
-               locationField = new Combo(composite, SWT.DROP_DOWN | SWT.BORDER);
-               GridData data = new GridData(GridData.FILL_HORIZONTAL);
-               data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-               locationField.setLayoutData(data);
-               locationField.setFont(font);
-               locationField.add("C:\\apache\\php\\php.exe", 0);
-               
-               Composite buttonComposite = new Composite(parent, SWT.NONE);
-               layout = new GridLayout();
-               layout.marginWidth = 0;
-               layout.marginHeight = 0;
-               layout.numColumns = 1;
-               gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
-               buttonComposite.setLayout(layout);
-               buttonComposite.setLayoutData(gridData);
-               buttonComposite.setFont(font);
-               
-               createVerticalSpacer(buttonComposite, 1);
-               
-               workspaceLocationButton= createPushButton(buttonComposite, ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Browse_Workspace..._3"), null); //$NON-NLS-1$
-               workspaceLocationButton.addSelectionListener(new SelectionAdapter() {
-                       public void widgetSelected(SelectionEvent evt) {
-                               handleWorkspaceLocationButtonSelected();
-                       }
-               });
-               fileLocationButton= createPushButton(buttonComposite, ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Brows&e_File_System..._4"), null); //$NON-NLS-1$
-               fileLocationButton.addSelectionListener(new SelectionAdapter() {
-                       public void widgetSelected(SelectionEvent evt) {
-                               handleLocationButtonSelected();
-                       }
-               });
-       }
-       
-       /**
-        * Creates the controls needed to edit the working directory
-        * attribute of an external tool
-        * 
-        * @param parent the composite to create the controls in
-        */
-       protected void createWorkDirectoryComponent(Composite parent) {
-               Font font = parent.getFont();
-               
-               Composite composite = new Composite(parent, SWT.NONE);
-               GridLayout layout = new GridLayout();
-               layout.marginWidth = 0;
-               layout.marginHeight = 0;
-               layout.numColumns = 1;
-               GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-               composite.setLayout(layout);
-               composite.setLayoutData(gridData);
-               
-               Label label = new Label(composite, SWT.NONE);
-               label.setText(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Working_&Directory__5")); //$NON-NLS-1$
-               label.setFont(font);
-               
-               workDirectoryField = new Text(composite, SWT.BORDER);
-               GridData data = new GridData(GridData.FILL_HORIZONTAL);
-               data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-               workDirectoryField.setLayoutData(data);
-               workDirectoryField.setFont(font);
-               
-               Composite buttonComposite = new Composite(parent, SWT.NONE);
-               layout = new GridLayout();
-               layout.marginWidth = 0;
-               layout.marginHeight = 0;
-               layout.numColumns = 1;
-               gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
-               buttonComposite.setLayout(layout);
-               buttonComposite.setLayoutData(gridData);
-               buttonComposite.setFont(font);
-               
-               createVerticalSpacer(buttonComposite, 1);
-               workspaceWorkingDirectoryButton= createPushButton(buttonComposite, ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Browse_Wor&kspace..._6"), null); //$NON-NLS-1$
-               workspaceWorkingDirectoryButton.addSelectionListener(new SelectionAdapter() {
-                       public void widgetSelected(SelectionEvent evt) {
-                               handleWorkspaceWorkingDirectoryButtonSelected();
-                       }
-               });
-               fileWorkingDirectoryButton= createPushButton(buttonComposite, ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Browse_F&ile_System..._7"), null); //$NON-NLS-1$
-               fileWorkingDirectoryButton.addSelectionListener(new SelectionAdapter() {
-                       public void widgetSelected(SelectionEvent evt) {
-                               handleFileWorkingDirectoryButtonSelected();
-                       }
-               });
-       }
-       
-       /**
-        * Creates the controls needed to edit the argument and
-        * prompt for argument attributes of an external tool
-        *
-        * @param parent the composite to create the controls in
-        */
-       protected void createArgumentComponent(Composite parent) {
-               Font font = parent.getFont();
-
-               Label label = new Label(parent, SWT.NONE);
-               label.setText(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.&Arguments___1")); //$NON-NLS-1$
-               GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-               data.horizontalSpan = 2;
-               label.setLayoutData(data);
-               label.setFont(font);
-
-               argumentField = new Text(parent, SWT.BORDER);
-               data = new GridData(GridData.FILL_HORIZONTAL);
-               data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-               argumentField.setLayoutData(data);
-               argumentField.setFont(font);
-               argumentField.addModifyListener(new ModifyListener() {
-                       public void modifyText(ModifyEvent e) {
-                               updateLaunchConfigurationDialog();
-                       }
-               });
-
-               variableButton= createPushButton(parent, ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Varia&bles..._2"), null); //$NON-NLS-1$
-               variableButton.addSelectionListener(new SelectionAdapter() {
-                       public void widgetSelected(SelectionEvent e) {
-                               VariableSelectionDialog dialog= new VariableSelectionDialog(getShell());
-                               if (dialog.open() == SelectionDialog.OK) {
-                                       argumentField.insert(dialog.getForm().getSelectedVariable());
-                               }
-                       }
-               });
-
-               Label instruction = new Label(parent, SWT.NONE);
-               instruction.setText(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Note__Enclose_an_argument_containing_spaces_using_double-quotes_(__)._Not_applicable_for_variables._3")); //$NON-NLS-1$
-               data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-               data.horizontalSpan = 2;
-               instruction.setLayoutData(data);
-               instruction.setFont(font);
-       }
-
-       /**
-        * Creates the controls needed to edit the run in background
-        * attribute of an external tool
-        *
-        * @param parent the composite to create the controls in
-        */
-       protected void createRunBackgroundComponent(Composite parent) {
-               runBackgroundButton = new Button(parent, SWT.CHECK);
-               runBackgroundButton.setText(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Run_tool_in_bac&kground_4")); //$NON-NLS-1$
-               GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-               runBackgroundButton.setLayoutData(data);
-               runBackgroundButton.setFont(parent.getFont());
-               runBackgroundButton.addSelectionListener(getSelectionAdapter());
-       }
-       
-       /**
-        * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-        */
-       public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-               configuration.setAttribute(IExternalToolConstants.ATTR_RUN_IN_BACKGROUND, false);
-       }
-
-       /**
-        * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-        */
-       public void initializeFrom(ILaunchConfiguration configuration) {
-               updateLocation(configuration);
-               updateWorkingDirectory(configuration);
-               updateArgument(configuration);
-               updateRunBackground(configuration);
-       }
-       
-       protected void updateWorkingDirectory(ILaunchConfiguration configuration) {
-               String workingDir= ""; //$NON-NLS-1$
-               try {
-                       workingDir= configuration.getAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY, ""); //$NON-NLS-1$
-               } catch (CoreException ce) {
-                       ExternalToolsPlugin.getDefault().log(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Error_reading_configuration_10"), ce); //$NON-NLS-1$
-               }
-               workDirectoryField.setText(workingDir);
-               workDirectoryField.addModifyListener(modifyListener);
-               
-       }
-       
-       protected void updateLocation(ILaunchConfiguration configuration) {
-               String location= ""; //$NON-NLS-1$
-               try {
-                       location= configuration.getAttribute(IExternalToolConstants.ATTR_LOCATION, ""); //$NON-NLS-1$
-               } catch (CoreException ce) {
-                       ExternalToolsPlugin.getDefault().log(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Error_reading_configuration_10"), ce); //$NON-NLS-1$
-               }
-               locationField.setText(location);
-               locationField.addModifyListener(modifyListener);
-       }
-
-       protected void updateArgument(ILaunchConfiguration configuration) {
-               String arguments= ""; //$NON-NLS-1$
-               try {
-                       arguments= configuration.getAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, ""); //$NON-NLS-1$
-               } catch (CoreException ce) {
-                       ExternalToolsPlugin.getDefault().log(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Error_reading_configuration_7"), ce); //$NON-NLS-1$
-               }
-               argumentField.setText(arguments);
-       }
-
-       protected void updateRunBackground(ILaunchConfiguration configuration) {
-               boolean  runInBackgroud= true;
-               try {
-                       runInBackgroud= configuration.getAttribute(IExternalToolConstants.ATTR_RUN_IN_BACKGROUND, false);
-               } catch (CoreException ce) {
-                       ExternalToolsPlugin.getDefault().log(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Error_reading_configuration_7"), ce); //$NON-NLS-1$
-               }
-               runBackgroundButton.setSelection(runInBackgroud);
-       }
-
-       /**
-        * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-        */
-       public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-               String location= locationField.getText().trim();
-               if (location.length() == 0) {
-                       configuration.setAttribute(IExternalToolConstants.ATTR_LOCATION, (String)null);
-               } else {
-                       configuration.setAttribute(IExternalToolConstants.ATTR_LOCATION, location);
-               }
-               
-               String workingDirectory= workDirectoryField.getText().trim();
-               if (workingDirectory.length() == 0) {
-                       configuration.setAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY, (String)null);
-               } else {
-                       configuration.setAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY, workingDirectory);
-               }
-               
-               setAttribute(IExternalToolConstants.ATTR_RUN_IN_BACKGROUND, configuration, runBackgroundButton.getSelection(), false);
-
-               String arguments= argumentField.getText().trim();
-               if (arguments.length() == 0) {
-                       configuration.setAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, (String)null);
-               } else {
-                       configuration.setAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, arguments);
-               }
-       }
-
-       /**
-        * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-        */
-       public String getName() {
-               return ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Main_17"); //$NON-NLS-1$
-       }
-       
-       /**
-        * @see ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
-        */
-       public boolean isValid(ILaunchConfiguration launchConfig) {
-               setErrorMessage(null);
-               setMessage(null);
-               return validateLocation() && validateWorkDirectory();
-       }
-       
-       /**
-        * Validates the content of the location field.
-        */
-       protected boolean validateLocation() {
-               String value = locationField.getText().trim();
-               if (value.length() < 1) {
-                       setErrorMessage(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.External_tool_location_cannot_be_empty_18")); //$NON-NLS-1$
-                       setMessage(null);
-                       return false;
-               }
-
-               // Translate field contents to the actual file location so we
-               // can check to ensure the file actually exists.
-               MultiStatus multiStatus = new MultiStatus(IExternalToolConstants.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
-               value = ToolUtil.expandFileLocation(value, ExpandVariableContext.EMPTY_CONTEXT, multiStatus);
-               if (!multiStatus.isOK()) {
-                       IStatus[] children = multiStatus.getChildren();
-                       if (children.length > 0) {
-                               setErrorMessage(children[0].getMessage());
-                               setMessage(null);
-                       }
-                       return false;
-               }
-               
-               File file = new File(value);
-               if (!file.exists()) { // The file does not exist.
-                       setErrorMessage(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.External_tool_location_does_not_exist_19")); //$NON-NLS-1$
-                       return false;
-               }
-               if (!file.isFile()) {
-                       setErrorMessage(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.External_tool_location_specified_is_not_a_file_20")); //$NON-NLS-1$
-                       return false;
-               }
-               return true;
-       }
-
-       /**
-        * Validates the content of the working directory field.
-        */
-       protected boolean validateWorkDirectory() {
-               
-               String value = workDirectoryField.getText().trim();
-               if (value.length() > 0) {
-                       // Translate field contents to the actual directory location so we
-                       // can check to ensure the directory actually exists.
-                       MultiStatus multiStatus = new MultiStatus(IExternalToolConstants.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
-                       value = ToolUtil.expandDirectoryLocation(value, ExpandVariableContext.EMPTY_CONTEXT, multiStatus);
-                       if (!multiStatus.isOK()) {
-                               IStatus[] children = multiStatus.getChildren();
-                               if (children.length > 0) {
-                                       setErrorMessage(children[0].getMessage());
-                               }
-                               return false;
-                       }
-                               
-                       File file = new File(value);
-                       if (!file.exists()) { // The directory does not exist.
-                               setErrorMessage(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.External_tool_working_directory_does_not_exist_or_is_invalid_21")); //$NON-NLS-1$
-                               return false;
-                       }
-               }
-               return true;
-       }
-       
-       protected void handleLocationButtonSelected() {
-               FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE);
-               fileDialog.setFileName(locationField.getText());
-               String text= fileDialog.open();
-               if (text != null) {
-                       locationField.setText(text);
-               }
-       }
-       
-       /**
-        * Prompts the user for a workspace location within the workspace and sets
-        * the location as a String containing the workspace_loc variable or
-        * <code>null</code> if no location was obtained from the user.
-        */
-       protected void handleWorkspaceLocationButtonSelected() {
-               ResourceSelectionDialog dialog;
-               dialog = new ResourceSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(), ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Select_a_resource_22")); //$NON-NLS-1$
-               dialog.open();
-               Object[] results = dialog.getResult();
-               if (results == null || results.length < 1) {
-                       return;
-               }
-               IResource resource = (IResource)results[0];
-               StringBuffer buf = new StringBuffer();
-               ToolUtil.buildVariableTag(IExternalToolConstants.VAR_WORKSPACE_LOC, resource.getFullPath().toString(), buf);
-               String text= buf.toString();
-               if (text != null) {
-                       locationField.setText(text);
-               }
-       }
-       
-       /**
-        * Prompts the user for a working directory location within the workspace
-        * and sets the working directory as a String containing the workspace_loc
-        * variable or <code>null</code> if no location was obtained from the user.
-        */
-       protected void handleWorkspaceWorkingDirectoryButtonSelected() {
-               ContainerSelectionDialog containerDialog;
-               containerDialog = new ContainerSelectionDialog(
-                       getShell(), 
-                       ResourcesPlugin.getWorkspace().getRoot(),
-                       false,
-                       ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Select_a_directory__23")); //$NON-NLS-1$
-               containerDialog.open();
-               Object[] resource = containerDialog.getResult();
-               String text= null;
-               if (resource != null && resource.length > 0) {
-                       text= ToolUtil.buildVariableTag(IExternalToolConstants.VAR_RESOURCE_LOC, ((IPath)resource[0]).toString());
-               }
-               if (text != null) {
-                       workDirectoryField.setText(text);
-               }
-       }
-       
-       protected void handleFileWorkingDirectoryButtonSelected() {
-               DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.SAVE);
-               dialog.setMessage(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Select_a_directory__23")); //$NON-NLS-1$
-               dialog.setFilterPath(workDirectoryField.getText());
-               String text= dialog.open();
-               if (text != null) {
-                       workDirectoryField.setText(text);
-               }
-       }
-
-       /**
-        * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
-        */
-       public Image getImage() {
-               return ExternalToolsImages.getImage(IExternalToolConstants.IMG_TAB_MAIN);
-       }
-       
-       /**
-        * Method getSelectionAdapter.
-        * @return SelectionListener
-        */
-       protected SelectionListener getSelectionAdapter() {
-               if (selectionAdapter == null) {
-                       selectionAdapter= new SelectionAdapter() {
-                               public void widgetSelected(SelectionEvent e) {
-                                       updateLaunchConfigurationDialog();
-                               }
-                       };
-               }
-               return selectionAdapter;
-       }
-       
-       private class VariableSelectionDialog extends SelectionDialog {
-               private ExternalToolVariableForm form;
-               private VariableSelectionDialog(Shell parent) {
-                       super(parent);
-                       setTitle(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Select_variable_10")); //$NON-NLS-1$
-               }
-               protected Control createDialogArea(Composite parent) {
-                       // Create the dialog area
-                       Composite composite= (Composite)super.createDialogArea(parent);
-                       ExternalToolVariable[] variables= ExternalToolsPlugin.getDefault().getArgumentVariableRegistry().getArgumentVariables();
-                       form= new ExternalToolVariableForm(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.&Choose_a_variable__11"), variables); //$NON-NLS-1$
-                       form.createContents(composite, new IGroupDialogPage() {
-                               public GridData setButtonGridData(Button button) {
-                                       GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-                                       data.heightHint = convertVerticalDLUsToPixels(IDialogConstants.BUTTON_HEIGHT);
-                                       int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-                                       data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
-                                       button.setLayoutData(data);
-                                       return data;
-                               }
-
-                               public void setMessage(String newMessage, int newType) {
-                                       VariableSelectionDialog.this.setMessage(newMessage);
-                               }
-
-                               public void updateValidState() {
-                               }
-
-                               public int convertHeightHint(int chars) {
-                                       return convertHeightInCharsToPixels(chars);
-                               }
-
-                               public String getMessage() {
-                                       if (!form.isValid()) {
-                                               return ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Invalid_selection_12"); //$NON-NLS-1$
-                                       }
-                                       return null;
-                               }
-
-                               public int getMessageType() {
-                                       if (!form.isValid()) {
-                                               return IMessageProvider.ERROR;
-                                       }
-                                       return 0;
-                               }
-                       });
-                       return composite;
-               }
-
-               private ExternalToolVariableForm getForm() {
-                       return form;
-               }
-       }
-
-}
+  protected Combo locationField;
+
+  protected Text workDirectoryField;
+
+  protected Button fileLocationButton;
+
+  protected Button workspaceLocationButton;
+
+  protected Button fileWorkingDirectoryButton;
+
+  protected Button workspaceWorkingDirectoryButton;
+
+  protected Button runBackgroundButton;
+
+  protected Text argumentField;
+
+  protected Button variableButton;
+
+  protected SelectionAdapter selectionAdapter;
+
+  protected ModifyListener modifyListener = new ModifyListener() {
+    public void modifyText(ModifyEvent e) {
+      updateLaunchConfigurationDialog();
+    }
+  };
+
+  /**
+   * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
+   */
+  public void createControl(Composite parent) {
+    Composite mainComposite = new Composite(parent, SWT.NONE);
+    setControl(mainComposite);
+    GridLayout layout = new GridLayout();
+    layout.numColumns = 2;
+    GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+    mainComposite.setLayout(layout);
+    mainComposite.setLayoutData(gridData);
+    mainComposite.setFont(parent.getFont());
+    createLocationComponent(mainComposite);
+    createWorkDirectoryComponent(mainComposite);
+    createArgumentComponent(mainComposite);
+    createVerticalSpacer(mainComposite, 2);
+    createRunBackgroundComponent(mainComposite);
+  }
+
+  /**
+   * Creates the controls needed to edit the location attribute of an external tool
+   * 
+   * @param parent
+   *          the composite to create the controls in
+   */
+  protected void createLocationComponent(Composite parent) {
+    Font font = parent.getFont();
+
+    Composite composite = new Composite(parent, SWT.NONE);
+    GridLayout layout = new GridLayout();
+    layout.marginWidth = 0;
+    layout.marginHeight = 0;
+    layout.numColumns = 1;
+    GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+    composite.setLayout(layout);
+    composite.setLayoutData(gridData);
+
+    Label label = new Label(composite, SWT.NONE);
+    label.setText(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Location___2")); //$NON-NLS-1$
+    label.setFont(font);
+
+    final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
+    locationField = new Combo(composite, SWT.DROP_DOWN | SWT.BORDER);
+    GridData data = new GridData(GridData.FILL_HORIZONTAL);
+    data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
+    locationField.setLayoutData(data);
+    locationField.setFont(font);
+    locationField.add(store.getString(PHPeclipsePlugin.PHP_RUN_PREF), 0);
+    locationField.add(store.getString(PHPeclipsePlugin.APACHE_RUN_PREF), 1);
+    locationField.add(store.getString(PHPeclipsePlugin.MYSQL_RUN_PREF), 2);
+    locationField.add(store.getString(PHPeclipsePlugin.XAMPP_START_PREF), 3);
+    locationField.add(store.getString(PHPeclipsePlugin.XAMPP_STOP_PREF), 4);
+    Composite buttonComposite = new Composite(parent, SWT.NONE);
+    layout = new GridLayout();
+    layout.marginWidth = 0;
+    layout.marginHeight = 0;
+    layout.numColumns = 1;
+    gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
+    buttonComposite.setLayout(layout);
+    buttonComposite.setLayoutData(gridData);
+    buttonComposite.setFont(font);
+
+    createVerticalSpacer(buttonComposite, 1);
+
+    workspaceLocationButton = createPushButton(buttonComposite, ExternalToolsLaunchConfigurationMessages
+        .getString("ExternalToolsMainTab.&Browse_Workspace..._3"), null); //$NON-NLS-1$
+    workspaceLocationButton.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent evt) {
+        handleWorkspaceLocationButtonSelected();
+      }
+    });
+    fileLocationButton = createPushButton(buttonComposite, ExternalToolsLaunchConfigurationMessages
+        .getString("ExternalToolsMainTab.Brows&e_File_System..._4"), null); //$NON-NLS-1$
+    fileLocationButton.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent evt) {
+        handleLocationButtonSelected();
+      }
+    });
+  }
+
+  /**
+   * Creates the controls needed to edit the working directory attribute of an external tool
+   * 
+   * @param parent
+   *          the composite to create the controls in
+   */
+  protected void createWorkDirectoryComponent(Composite parent) {
+    Font font = parent.getFont();
+
+    Composite composite = new Composite(parent, SWT.NONE);
+    GridLayout layout = new GridLayout();
+    layout.marginWidth = 0;
+    layout.marginHeight = 0;
+    layout.numColumns = 1;
+    GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+    composite.setLayout(layout);
+    composite.setLayoutData(gridData);
+
+    Label label = new Label(composite, SWT.NONE);
+    label.setText(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Working_&Directory__5")); //$NON-NLS-1$
+    label.setFont(font);
+
+    workDirectoryField = new Text(composite, SWT.BORDER);
+    GridData data = new GridData(GridData.FILL_HORIZONTAL);
+    data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
+    workDirectoryField.setLayoutData(data);
+    workDirectoryField.setFont(font);
+
+    Composite buttonComposite = new Composite(parent, SWT.NONE);
+    layout = new GridLayout();
+    layout.marginWidth = 0;
+    layout.marginHeight = 0;
+    layout.numColumns = 1;
+    gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
+    buttonComposite.setLayout(layout);
+    buttonComposite.setLayoutData(gridData);
+    buttonComposite.setFont(font);
+
+    createVerticalSpacer(buttonComposite, 1);
+    workspaceWorkingDirectoryButton = createPushButton(buttonComposite, ExternalToolsLaunchConfigurationMessages
+        .getString("ExternalToolsMainTab.Browse_Wor&kspace..._6"), null); //$NON-NLS-1$
+    workspaceWorkingDirectoryButton.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent evt) {
+        handleWorkspaceWorkingDirectoryButtonSelected();
+      }
+    });
+    fileWorkingDirectoryButton = createPushButton(buttonComposite, ExternalToolsLaunchConfigurationMessages
+        .getString("ExternalToolsMainTab.Browse_F&ile_System..._7"), null); //$NON-NLS-1$
+    fileWorkingDirectoryButton.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent evt) {
+        handleFileWorkingDirectoryButtonSelected();
+      }
+    });
+  }
+
+  /**
+   * Creates the controls needed to edit the argument and prompt for argument attributes of an external tool
+   * 
+   * @param parent
+   *          the composite to create the controls in
+   */
+  protected void createArgumentComponent(Composite parent) {
+    Font font = parent.getFont();
+
+    Label label = new Label(parent, SWT.NONE);
+    label.setText(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.&Arguments___1")); //$NON-NLS-1$
+    GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+    data.horizontalSpan = 2;
+    label.setLayoutData(data);
+    label.setFont(font);
+
+    argumentField = new Text(parent, SWT.BORDER);
+    data = new GridData(GridData.FILL_HORIZONTAL);
+    data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
+    argumentField.setLayoutData(data);
+    argumentField.setFont(font);
+    argumentField.addModifyListener(new ModifyListener() {
+      public void modifyText(ModifyEvent e) {
+        updateLaunchConfigurationDialog();
+      }
+    });
+
+    variableButton = createPushButton(parent, ExternalToolsLaunchConfigurationMessages
+        .getString("ExternalToolsOptionTab.Varia&bles..._2"), null); //$NON-NLS-1$
+    variableButton.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent e) {
+        VariableSelectionDialog dialog = new VariableSelectionDialog(getShell());
+        if (dialog.open() == SelectionDialog.OK) {
+          argumentField.insert(dialog.getForm().getSelectedVariable());
+        }
+      }
+    });
+
+    Label instruction = new Label(parent, SWT.NONE);
+    instruction
+        .setText(ExternalToolsLaunchConfigurationMessages
+            .getString("ExternalToolsOptionTab.Note__Enclose_an_argument_containing_spaces_using_double-quotes_(__)._Not_applicable_for_variables._3")); //$NON-NLS-1$
+    data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+    data.horizontalSpan = 2;
+    instruction.setLayoutData(data);
+    instruction.setFont(font);
+  }
+
+  /**
+   * Creates the controls needed to edit the run in background attribute of an external tool
+   * 
+   * @param parent
+   *          the composite to create the controls in
+   */
+  protected void createRunBackgroundComponent(Composite parent) {
+    runBackgroundButton = new Button(parent, SWT.CHECK);
+    runBackgroundButton.setText(ExternalToolsLaunchConfigurationMessages
+        .getString("ExternalToolsOptionTab.Run_tool_in_bac&kground_4")); //$NON-NLS-1$
+    GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+    runBackgroundButton.setLayoutData(data);
+    runBackgroundButton.setFont(parent.getFont());
+    runBackgroundButton.addSelectionListener(getSelectionAdapter());
+  }
+
+  /**
+   * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
+   */
+  public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
+    configuration.setAttribute(IExternalToolConstants.ATTR_RUN_IN_BACKGROUND, false);
+  }
+
+  /**
+   * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
+   */
+  public void initializeFrom(ILaunchConfiguration configuration) {
+    updateLocation(configuration);
+    updateWorkingDirectory(configuration);
+    updateArgument(configuration);
+    updateRunBackground(configuration);
+  }
+
+  protected void updateWorkingDirectory(ILaunchConfiguration configuration) {
+    String workingDir = ""; //$NON-NLS-1$
+    try {
+      workingDir = configuration.getAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY, ""); //$NON-NLS-1$
+    } catch (CoreException ce) {
+      ExternalToolsPlugin.getDefault().log(
+          ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Error_reading_configuration_10"), ce); //$NON-NLS-1$
+    }
+    workDirectoryField.setText(workingDir);
+    workDirectoryField.addModifyListener(modifyListener);
+
+  }
+
+  protected void updateLocation(ILaunchConfiguration configuration) {
+    String location = ""; //$NON-NLS-1$
+    try {
+      location = configuration.getAttribute(IExternalToolConstants.ATTR_LOCATION, ""); //$NON-NLS-1$
+    } catch (CoreException ce) {
+      ExternalToolsPlugin.getDefault().log(
+          ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Error_reading_configuration_10"), ce); //$NON-NLS-1$
+    }
+    locationField.setText(location);
+    locationField.addModifyListener(modifyListener);
+  }
+
+  protected void updateArgument(ILaunchConfiguration configuration) {
+    String arguments = ""; //$NON-NLS-1$
+    try {
+      arguments = configuration.getAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, ""); //$NON-NLS-1$
+    } catch (CoreException ce) {
+      ExternalToolsPlugin.getDefault().log(
+          ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Error_reading_configuration_7"), ce); //$NON-NLS-1$
+    }
+    argumentField.setText(arguments);
+  }
+
+  protected void updateRunBackground(ILaunchConfiguration configuration) {
+    boolean runInBackgroud = true;
+    try {
+      runInBackgroud = configuration.getAttribute(IExternalToolConstants.ATTR_RUN_IN_BACKGROUND, false);
+    } catch (CoreException ce) {
+      ExternalToolsPlugin.getDefault().log(
+          ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Error_reading_configuration_7"), ce); //$NON-NLS-1$
+    }
+    runBackgroundButton.setSelection(runInBackgroud);
+  }
+
+  /**
+   * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
+   */
+  public void performApply(ILaunchConfigurationWorkingCopy configuration) {
+    String location = locationField.getText().trim();
+    if (location.length() == 0) {
+      configuration.setAttribute(IExternalToolConstants.ATTR_LOCATION, (String) null);
+    } else {
+      configuration.setAttribute(IExternalToolConstants.ATTR_LOCATION, location);
+    }
+
+    String workingDirectory = workDirectoryField.getText().trim();
+    if (workingDirectory.length() == 0) {
+      configuration.setAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY, (String) null);
+    } else {
+      configuration.setAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY, workingDirectory);
+    }
+
+    setAttribute(IExternalToolConstants.ATTR_RUN_IN_BACKGROUND, configuration, runBackgroundButton.getSelection(), false);
+
+    String arguments = argumentField.getText().trim();
+    if (arguments.length() == 0) {
+      configuration.setAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, (String) null);
+    } else {
+      configuration.setAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, arguments);
+    }
+  }
+
+  /**
+   * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
+   */
+  public String getName() {
+    return ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Main_17"); //$NON-NLS-1$
+  }
+
+  /**
+   * @see ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
+   */
+  public boolean isValid(ILaunchConfiguration launchConfig) {
+    setErrorMessage(null);
+    setMessage(null);
+    return validateLocation() && validateWorkDirectory();
+  }
+
+  /**
+   * Validates the content of the location field.
+   */
+  protected boolean validateLocation() {
+    String value = locationField.getText().trim();
+    if (value.length() < 1) {
+      setErrorMessage(ExternalToolsLaunchConfigurationMessages
+          .getString("ExternalToolsMainTab.External_tool_location_cannot_be_empty_18")); //$NON-NLS-1$
+      setMessage(null);
+      return false;
+    }
+
+    // Translate field contents to the actual file location so we
+    // can check to ensure the file actually exists.
+    MultiStatus multiStatus = new MultiStatus(IExternalToolConstants.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
+    value = ToolUtil.expandFileLocation(value, ExpandVariableContext.EMPTY_CONTEXT, multiStatus);
+    if (!multiStatus.isOK()) {
+      IStatus[] children = multiStatus.getChildren();
+      if (children.length > 0) {
+        setErrorMessage(children[0].getMessage());
+        setMessage(null);
+      }
+      return false;
+    }
+
+    File file = new File(value);
+    if (!file.exists()) { // The file does not exist.
+      setErrorMessage(ExternalToolsLaunchConfigurationMessages
+          .getString("ExternalToolsMainTab.External_tool_location_does_not_exist_19")); //$NON-NLS-1$
+      return false;
+    }
+    if (!file.isFile()) {
+      setErrorMessage(ExternalToolsLaunchConfigurationMessages
+          .getString("ExternalToolsMainTab.External_tool_location_specified_is_not_a_file_20")); //$NON-NLS-1$
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Validates the content of the working directory field.
+   */
+  protected boolean validateWorkDirectory() {
+
+    String value = workDirectoryField.getText().trim();
+    if (value.length() > 0) {
+      // Translate field contents to the actual directory location so we
+      // can check to ensure the directory actually exists.
+      MultiStatus multiStatus = new MultiStatus(IExternalToolConstants.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
+      value = ToolUtil.expandDirectoryLocation(value, ExpandVariableContext.EMPTY_CONTEXT, multiStatus);
+      if (!multiStatus.isOK()) {
+        IStatus[] children = multiStatus.getChildren();
+        if (children.length > 0) {
+          setErrorMessage(children[0].getMessage());
+        }
+        return false;
+      }
+
+      File file = new File(value);
+      if (!file.exists()) { // The directory does not exist.
+        setErrorMessage(ExternalToolsLaunchConfigurationMessages
+            .getString("ExternalToolsMainTab.External_tool_working_directory_does_not_exist_or_is_invalid_21")); //$NON-NLS-1$
+        return false;
+      }
+    }
+    return true;
+  }
+
+  protected void handleLocationButtonSelected() {
+    FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE);
+    fileDialog.setFileName(locationField.getText());
+    String text = fileDialog.open();
+    if (text != null) {
+      locationField.setText(text);
+    }
+  }
+
+  /**
+   * Prompts the user for a workspace location within the workspace and sets the location as a String containing the workspace_loc
+   * variable or <code>null</code> if no location was obtained from the user.
+   */
+  protected void handleWorkspaceLocationButtonSelected() {
+    ResourceSelectionDialog dialog;
+    dialog = new ResourceSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(),
+        ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Select_a_resource_22")); //$NON-NLS-1$
+    dialog.open();
+    Object[] results = dialog.getResult();
+    if (results == null || results.length < 1) {
+      return;
+    }
+    IResource resource = (IResource) results[0];
+    StringBuffer buf = new StringBuffer();
+    ToolUtil.buildVariableTag(IExternalToolConstants.VAR_WORKSPACE_LOC, resource.getFullPath().toString(), buf);
+    String text = buf.toString();
+    if (text != null) {
+      locationField.setText(text);
+    }
+  }
+
+  /**
+   * Prompts the user for a working directory location within the workspace and sets the working directory as a String containing
+   * the workspace_loc variable or <code>null</code> if no location was obtained from the user.
+   */
+  protected void handleWorkspaceWorkingDirectoryButtonSelected() {
+    ContainerSelectionDialog containerDialog;
+    containerDialog = new ContainerSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
+        ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Select_a_directory__23")); //$NON-NLS-1$
+    containerDialog.open();
+    Object[] resource = containerDialog.getResult();
+    String text = null;
+    if (resource != null && resource.length > 0) {
+      text = ToolUtil.buildVariableTag(IExternalToolConstants.VAR_RESOURCE_LOC, ((IPath) resource[0]).toString());
+    }
+    if (text != null) {
+      workDirectoryField.setText(text);
+    }
+  }
+
+  protected void handleFileWorkingDirectoryButtonSelected() {
+    DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.SAVE);
+    dialog.setMessage(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Select_a_directory__23")); //$NON-NLS-1$
+    dialog.setFilterPath(workDirectoryField.getText());
+    String text = dialog.open();
+    if (text != null) {
+      workDirectoryField.setText(text);
+    }
+  }
+
+  /**
+   * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
+   */
+  public Image getImage() {
+    return ExternalToolsImages.getImage(IExternalToolConstants.IMG_TAB_MAIN);
+  }
+
+  /**
+   * Method getSelectionAdapter.
+   * 
+   * @return SelectionListener
+   */
+  protected SelectionListener getSelectionAdapter() {
+    if (selectionAdapter == null) {
+      selectionAdapter = new SelectionAdapter() {
+        public void widgetSelected(SelectionEvent e) {
+          updateLaunchConfigurationDialog();
+        }
+      };
+    }
+    return selectionAdapter;
+  }
+
+  private class VariableSelectionDialog extends SelectionDialog {
+    private ExternalToolVariableForm form;
+
+    private VariableSelectionDialog(Shell parent) {
+      super(parent);
+      setTitle(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Select_variable_10")); //$NON-NLS-1$
+    }
+
+    protected Control createDialogArea(Composite parent) {
+      // Create the dialog area
+      Composite composite = (Composite) super.createDialogArea(parent);
+      ExternalToolVariable[] variables = ExternalToolsPlugin.getDefault().getArgumentVariableRegistry().getArgumentVariables();
+      form = new ExternalToolVariableForm(ExternalToolsLaunchConfigurationMessages
+          .getString("ExternalToolsOptionTab.&Choose_a_variable__11"), variables); //$NON-NLS-1$
+      form.createContents(composite, new IGroupDialogPage() {
+        public GridData setButtonGridData(Button button) {
+          GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+          data.heightHint = convertVerticalDLUsToPixels(IDialogConstants.BUTTON_HEIGHT);
+          int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
+          data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
+          button.setLayoutData(data);
+          return data;
+        }
+
+        public void setMessage(String newMessage, int newType) {
+          VariableSelectionDialog.this.setMessage(newMessage);
+        }
+
+        public void updateValidState() {
+        }
+
+        public int convertHeightHint(int chars) {
+          return convertHeightInCharsToPixels(chars);
+        }
+
+        public String getMessage() {
+          if (!form.isValid()) {
+            return ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Invalid_selection_12"); //$NON-NLS-1$
+          }
+          return null;
+        }
+
+        public int getMessageType() {
+          if (!form.isValid()) {
+            return IMessageProvider.ERROR;
+          }
+          return 0;
+        }
+      });
+      return composite;
+    }
+
+    private ExternalToolVariableForm getForm() {
+      return form;
+    }
+  }
+
+}
\ No newline at end of file