package net.sourceforge.phpdt.internal.debug.ui.launcher; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.sourceforge.phpdt.internal.debug.ui.PHPDebugUiMessages; import net.sourceforge.phpdt.internal.debug.ui.PHPDebugUiPlugin; import net.sourceforge.phpdt.internal.debug.ui.preferences.EditInterpreterDialog; import net.sourceforge.phpdt.internal.launching.PHPInterpreter; import net.sourceforge.phpdt.internal.launching.PHPLaunchConfigurationAttribute; import net.sourceforge.phpdt.internal.launching.PHPRuntime; import net.sourceforge.phpdt.internal.ui.PHPUiImages; import net.sourceforge.phpeclipse.LoadPathEntry; import net.sourceforge.phpeclipse.PHPCore; import net.sourceforge.phpeclipse.resourcesview.PHPProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.ui.internal.dialogs.ListContentProvider; public class PHPEnvironmentTab extends AbstractLaunchConfigurationTab { protected ListViewer loadPathListViewer; protected java.util.List installedInterpretersWorkingCopy; protected Combo interpreterCombo; protected Button loadPathDefaultButton; public PHPEnvironmentTab() { super(); } public void createControl(Composite parent) { Composite composite = createPageRoot(parent); TabFolder tabFolder = new TabFolder(composite, SWT.NONE); GridData gridData = new GridData(GridData.FILL_BOTH); tabFolder.setLayoutData(gridData); addLoadPathTab(tabFolder); addInterpreterTab(tabFolder); } protected void addLoadPathTab(TabFolder tabFolder) { Composite loadPathComposite = new Composite(tabFolder, SWT.NONE); loadPathComposite.setLayout(new GridLayout()); loadPathListViewer = new ListViewer(loadPathComposite, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL); loadPathListViewer.setContentProvider(new ListContentProvider()); loadPathListViewer.setLabelProvider(new LoadPathEntryLabelProvider()); loadPathListViewer.getList().setLayoutData(new GridData(GridData.FILL_BOTH)); TabItem loadPathTab = new TabItem(tabFolder, SWT.NONE, 0); loadPathTab.setText(PHPDebugUiMessages.getString("LaunchConfigurationTab.PHPEnvironment.loadPathTab.label")); loadPathTab.setControl(loadPathComposite); loadPathTab.setData(loadPathListViewer); loadPathDefaultButton = new Button(loadPathComposite, SWT.CHECK); loadPathDefaultButton.setText(PHPDebugUiMessages.getString("LaunchConfigurationTab.PHPEnvironment.loadPathDefaultButton.label")); loadPathDefaultButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); loadPathDefaultButton.addSelectionListener(getLoadPathDefaultButtonSelectionListener()); loadPathDefaultButton.setEnabled(false); //for now, until the load path is customizable on the configuration } protected SelectionListener getLoadPathSelectionListener() { return new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { System.out.println("Loadpath list selection occurred: " + e.getSource()); } }; } protected SelectionListener getLoadPathDefaultButtonSelectionListener() { return new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { setUseLoadPathDefaults(((Button) e.getSource()).getSelection()); } }; } protected void addInterpreterTab(TabFolder tabFolder) { Composite interpreterComposite = new Composite(tabFolder, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 0; layout.marginWidth = 0; interpreterComposite.setLayout(layout); interpreterComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); createVerticalSpacer(interpreterComposite, 2); interpreterCombo = new Combo(interpreterComposite, SWT.READ_ONLY); interpreterCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); initializeInterpreterCombo(interpreterCombo); interpreterCombo.addModifyListener(getInterpreterComboModifyListener()); Button interpreterAddButton = new Button(interpreterComposite, SWT.PUSH); interpreterAddButton.setText(PHPDebugUiMessages.getString("LaunchConfigurationTab.PHPEnvironment.interpreterAddButton.label")); interpreterAddButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { PHPInterpreter newInterpreter = new PHPInterpreter(null, null); EditInterpreterDialog editor = new EditInterpreterDialog(getShell(), PHPDebugUiMessages.getString("LaunchConfigurationTab.PHPEnvironment.editInterpreterDialog.title")); editor.create(); editor.setInterpreterToEdit(newInterpreter); if (EditInterpreterDialog.OK == editor.open()) { PHPRuntime.getDefault().addInstalledInterpreter(newInterpreter); interpreterCombo.add(newInterpreter.getName()); interpreterCombo.select(interpreterCombo.indexOf(newInterpreter.getName())); } } }); TabItem interpreterTab = new TabItem(tabFolder, SWT.NONE); interpreterTab.setText(PHPDebugUiMessages.getString("LaunchConfigurationTab.PHPEnvironment.interpreterTab.label")); interpreterTab.setControl(interpreterComposite); } protected ModifyListener getInterpreterComboModifyListener() { return new ModifyListener() { public void modifyText(ModifyEvent evt) { updateLaunchConfigurationDialog(); } }; } protected void createVerticalSpacer(Composite comp, int colSpan) { Label label = new Label(comp, SWT.NONE); GridData gd = new GridData(); gd.horizontalSpan = colSpan; label.setLayoutData(gd); } public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { } public void initializeFrom(ILaunchConfiguration configuration) { initializeLoadPath(configuration); initializeInterpreterSelection(configuration); } protected void initializeLoadPath(ILaunchConfiguration configuration) { boolean useDefaultLoadPath = true; try { useDefaultLoadPath = configuration.getAttribute(PHPLaunchConfigurationAttribute.USE_DEFAULT_LOAD_PATH, true); setUseLoadPathDefaults(useDefaultLoadPath); if (useDefaultLoadPath) { String projectName = configuration.getAttribute(PHPLaunchConfigurationAttribute.PROJECT_NAME, ""); if (projectName != "") { PHPProject project = PHPCore.getPHPProject(projectName); if (project != null) { List loadPathEntries = project.getLoadPathEntries(); loadPathListViewer.setInput(loadPathEntries); } } } } catch (CoreException e) { log(e); } } protected void setUseLoadPathDefaults(boolean useDefaults) { loadPathListViewer.getList().setEnabled(!useDefaults); loadPathDefaultButton.setSelection(useDefaults); } protected void initializeInterpreterSelection(ILaunchConfiguration configuration) { String interpreterName = null; try { interpreterName = configuration.getAttribute(PHPLaunchConfigurationAttribute.SELECTED_INTERPRETER, ""); } catch (CoreException e) { log(e); } if (interpreterName != null && !interpreterName.equals("")) interpreterCombo.select(interpreterCombo.indexOf(interpreterName)); } protected void initializeInterpreterCombo(Combo interpreterCombo) { installedInterpretersWorkingCopy = new ArrayList(); installedInterpretersWorkingCopy.addAll(PHPRuntime.getDefault().getInstalledInterpreters()); String[] interpreterNames = new String[installedInterpretersWorkingCopy.size()]; for (int interpreterIndex = 0; interpreterIndex < installedInterpretersWorkingCopy.size(); interpreterIndex++) { PHPInterpreter interpreter = (PHPInterpreter) installedInterpretersWorkingCopy.get(interpreterIndex); interpreterNames[interpreterIndex] = interpreter.getName(); } interpreterCombo.setItems(interpreterNames); PHPInterpreter selectedInterpreter = PHPRuntime.getDefault().getSelectedInterpreter(); if (selectedInterpreter != null) interpreterCombo.select(interpreterCombo.indexOf(selectedInterpreter.getName())); } public void performApply(ILaunchConfigurationWorkingCopy configuration) { int selectionIndex = interpreterCombo.getSelectionIndex(); if (selectionIndex >= 0) configuration.setAttribute(PHPLaunchConfigurationAttribute.SELECTED_INTERPRETER, interpreterCombo.getItem(selectionIndex)); configuration.setAttribute(PHPLaunchConfigurationAttribute.USE_DEFAULT_LOAD_PATH, loadPathDefaultButton.getSelection()); if (!loadPathDefaultButton.getSelection()) { List loadPathEntries = (List) loadPathListViewer.getInput(); List loadPathStrings = new ArrayList(); for (Iterator iterator = loadPathEntries.iterator(); iterator.hasNext();) { LoadPathEntry entry = (LoadPathEntry) iterator.next(); loadPathStrings.add(entry.getPath().toString()); } configuration.setAttribute(PHPLaunchConfigurationAttribute.CUSTOM_LOAD_PATH, loadPathStrings); } } protected Composite createPageRoot(Composite parent) { Composite composite = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); layout.numColumns = 2; composite.setLayout(layout); createVerticalSpacer(composite, 2); setControl(composite); return composite; } public String getName() { return PHPDebugUiMessages.getString("LaunchConfigurationTab.PHPEnvironment.name"); } public boolean isValid(ILaunchConfiguration launchConfig) { try { String selectedInterpreter = launchConfig.getAttribute(PHPLaunchConfigurationAttribute.SELECTED_INTERPRETER, ""); if (selectedInterpreter.length() == 0) { setErrorMessage(PHPDebugUiMessages.getString("LaunchConfigurationTab.PHPEnvironment.interpreter_not_selected_error_message")); return false; } } catch (CoreException e) { log(e); } setErrorMessage(null); return true; } protected void log(Throwable t) { PHPDebugUiPlugin.getDefault().log(t); } public Image getImage() { return PHPUiImages.get(PHPUiImages.IMG_CTOOLS_PHP); } }