/******************************************************************************* * Copyright (c) 2009,2014 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Zend Technologies * Dawid Paku�a [339547] *******************************************************************************/ package org.eclipse.php.internal.debug.ui.wizards; import java.io.File; import java.text.MessageFormat; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.php.internal.debug.core.PHPExeException; import org.eclipse.php.internal.debug.core.PHPExeUtil; import org.eclipse.php.internal.debug.core.PHPExeUtil.PHPExeInfo; import org.eclipse.php.internal.debug.core.preferences.PHPexeItem; import org.eclipse.php.internal.debug.ui.PHPDebugUIImages; import org.eclipse.php.internal.debug.ui.PHPDebugUIMessages; import org.eclipse.php.internal.ui.util.PixelConverter; import org.eclipse.php.internal.ui.wizards.CompositeFragment; import org.eclipse.php.internal.ui.wizards.IControlHandler; import org.eclipse.php.internal.ui.wizards.fields.*; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; public class PHPExeCompositeFragment extends CompositeFragment implements IPHPExeCompositeFragment { private static final String PHP_INI = "php.ini"; //$NON-NLS-1$ private PHPexeItem[] existingItems; private StringDialogField fPHPexeName; private StringButtonDialogField fPHPExePath; private StringButtonDialogField fPHPIni; private Button fLoadDefaultPHPIni; private Label fSapiTypesLabel; private Combo fSapiTypes; private Label fVersionLabel; private String initialName; private boolean isIniFileSet = false; public PHPExeCompositeFragment(Composite parent, IControlHandler handler, boolean isForEditing) { super(parent, handler, isForEditing); createDescription(); } protected void createDescription() { setDisplayName(PHPDebugUIMessages.PHPExeCompositeFragment_2); setDescription(PHPDebugUIMessages.PHPExeCompositeFragment_0); controlHandler.setDescription(getDescription()); setImageDescriptor(PHPDebugUIImages.getImageDescriptor(PHPDebugUIImages.IMG_WIZBAN_PHPEXE)); controlHandler.setImageDescriptor(getImageDescriptor()); switch (controlHandler.getKind()) { case WIZARD: setTitle(PHPDebugUIMessages.PHPExeCompositeFragment_10); break; case EDITOR: setTitle(PHPDebugUIMessages.PHPExeCompositeFragment_11); break; default: break; } controlHandler.setTitle(getTitle()); } protected String getPHPexeName() { return fPHPexeName.getText(); } protected File getInstallLocation() { return new File(fPHPExePath.getText()); } protected File getIniLocation() { return new File(fPHPIni.getText()); } protected void createContents(Composite parent) { PixelConverter pixelConverter = new PixelConverter(parent); Composite settingsComposite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 3; settingsComposite.setLayout(layout); settingsComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); fPHPexeName = new StringDialogField(); fPHPexeName.setLabelText(PHPDebugUIMessages.addPHPexeDialog_phpName); fPHPExePath = new StringButtonDialogField(new IStringButtonAdapter() { public void changeControlPressed(DialogField field) { FileDialog dialog = new FileDialog(getShell()); dialog.setFilterPath(fPHPExePath.getText()); dialog.setText(PHPDebugUIMessages.addPHPexeDialog_pickPHPRootDialog_message); String newPath = dialog.open(); if (newPath != null) { fPHPExePath.setText(newPath); } } }); fPHPExePath.setLabelText(PHPDebugUIMessages.addPHPexeDialog_phpHome); fPHPExePath.setButtonLabel(PHPDebugUIMessages.addPHPexeDialog_browse1); fPHPIni = new StringButtonDialogField(new IStringButtonAdapter() { public void changeControlPressed(DialogField field) { FileDialog dialog = new FileDialog(getShell()); dialog.setFilterPath(fPHPIni.getText()); dialog.setFilterExtensions(new String[] { "*.ini", "*.*" }); //$NON-NLS-1$ //$NON-NLS-2$ dialog.setText(PHPDebugUIMessages.addPHPexeDialog_pickPHPIniDialog_message); String newPath = dialog.open(); if (newPath != null) { fPHPIni.setText(newPath); isIniFileSet = true; } } }); fPHPIni.setLabelText(PHPDebugUIMessages.addPHPexeDialog_phpIni); fPHPIni.setButtonLabel(PHPDebugUIMessages.addPHPexeDialog_browse1); fPHPexeName.doFillIntoGrid(settingsComposite, 3); fPHPExePath.doFillIntoGrid(settingsComposite, 3); ((GridData) fPHPExePath.getTextControl(settingsComposite).getLayoutData()).widthHint = pixelConverter .convertWidthInCharsToPixels(50); fPHPIni.doFillIntoGrid(settingsComposite, 3); ((GridData) fPHPIni.getTextControl(settingsComposite).getLayoutData()).widthHint = pixelConverter .convertWidthInCharsToPixels(50); fLoadDefaultPHPIni = new Button(settingsComposite, SWT.CHECK); fLoadDefaultPHPIni.setText(PHPDebugUIMessages.addPHPexeDialog_loadDefaultPHPIni); GridData loadDefaultPHPIniData = new GridData(GridData.FILL); loadDefaultPHPIniData.horizontalSpan = 3; fLoadDefaultPHPIni.setLayoutData(loadDefaultPHPIniData); fSapiTypesLabel = new Label(settingsComposite, SWT.LEFT | SWT.WRAP); fSapiTypesLabel.setFont(settingsComposite.getFont()); fSapiTypesLabel.setText(PHPDebugUIMessages.PHPExeCompositeFragment_1); GridData data = new GridData(); data.horizontalSpan = 1; fSapiTypesLabel.setLayoutData(data); fSapiTypes = new Combo(settingsComposite, SWT.DROP_DOWN | SWT.READ_ONLY); data = new GridData(); data.horizontalSpan = 2; data.grabExcessHorizontalSpace = true; fSapiTypes.setLayoutData(data); fSapiTypes.add(PHPexeItem.SAPI_CLI); fSapiTypes.add(PHPexeItem.SAPI_CGI); Label versionLabel = new Label(settingsComposite, SWT.LEFT | SWT.WRAP); versionLabel.setFont(settingsComposite.getFont()); versionLabel.setText("Version: "); data = new GridData(); data.horizontalSpan = 1; versionLabel.setLayoutData(data); fVersionLabel = new Label(settingsComposite, SWT.LEFT | SWT.WRAP); data = new GridData(); data.horizontalSpan = 2; data.widthHint = 100; data.grabExcessHorizontalSpace = true; fVersionLabel.setLayoutData(data); fVersionLabel.setText(""); init(); createFieldListeners(); Dialog.applyDialogFont(this); } protected void createFieldListeners() { fPHPexeName.setDialogFieldListener(new IDialogFieldListener() { public void dialogFieldChanged(DialogField field) { updateItem(); } }); fPHPExePath.setDialogFieldListener(new IDialogFieldListener() { public void dialogFieldChanged(DialogField field) { String newPath = fPHPExePath.getText(); if (newPath != null && newPath.trim().length() > 0) { if (!isIniFileSet || (fPHPIni.getText() == null || fPHPIni.getText().trim().length() == 0)) { IPath path = new Path(newPath); path = path.removeLastSegments(1); path = path.append(PHP_INI); if (path.toFile().exists()) { fPHPIni.setTextWithoutUpdate(path.toOSString()); } } File executable = new File(newPath); PHPExeInfo phpExecInfo = getPHPInfo(executable); if (phpExecInfo != null) { if (fPHPexeName.getText().isEmpty() && phpExecInfo.getName() != null) fPHPexeName.setTextWithoutUpdate(phpExecInfo.getName()); if (phpExecInfo.getSapiType() != null) fSapiTypes.setText(phpExecInfo.getSapiType()); if (phpExecInfo.getVersion() != null) fVersionLabel.setText(phpExecInfo.getVersion()); } else { fSapiTypes.deselectAll(); fVersionLabel.setText(""); //$NON-NLS-1$ } } updateItem(); } }); fPHPIni.setDialogFieldListener(new IDialogFieldListener() { public void dialogFieldChanged(DialogField field) { updateItem(); } }); fLoadDefaultPHPIni.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { updateItem(); } public void widgetDefaultSelected(SelectionEvent e) { updateItem(); } }); fSapiTypes.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { updateItem(); } public void widgetSelected(SelectionEvent e) { updateItem(); } }); } protected void init() { PHPexeItem phpExeItem = getPHPExeItem(); if (phpExeItem == null || phpExeItem.getName() == null) { fPHPexeName.setTextWithoutUpdate(""); //$NON-NLS-1$ fPHPExePath.setTextWithoutUpdate(""); //$NON-NLS-1$ fPHPIni.setTextWithoutUpdate(""); //$NON-NLS-1$ } else { initialName = phpExeItem.getName(); fPHPexeName.setTextWithoutUpdate(phpExeItem.getName()); fPHPexeName.setEnabled(phpExeItem.isEditable()); fPHPExePath.setTextWithoutUpdate(phpExeItem.getExecutable().getAbsolutePath()); fPHPExePath.setEnabled(phpExeItem.isEditable()); if (phpExeItem.getINILocation() != null) { fPHPIni.setTextWithoutUpdate(phpExeItem.getINILocation().toString()); } fPHPIni.setEnabled(phpExeItem.isEditable()); fLoadDefaultPHPIni.setEnabled(phpExeItem.isEditable()); fLoadDefaultPHPIni.setSelection(phpExeItem.isLoadDefaultINI()); String sapiType = phpExeItem.getSapiType(); if (sapiType != null) { fSapiTypes.setText(sapiType); } fSapiTypes.setEnabled(phpExeItem.isEditable()); fSapiTypesLabel.setEnabled(phpExeItem.isEditable()); fVersionLabel.setText(phpExeItem.getVersion()); } updateItem(); } public void setExistingItems(PHPexeItem[] existingItems) { this.existingItems = existingItems; } public void setData(Object data) { if (data != null && !(data instanceof PHPexeItem)) { throw new IllegalArgumentException(PHPDebugUIMessages.PHPExeCompositeFragment_3); } super.setData(data); init(); fPHPExePath.getChangeControl(null).setFocus(); } public void validate() { PHPexeItem phpExeItem = getPHPExeItem(); // Let's reset previous state setComplete(true); setMessage(PHPDebugUIMessages.PHPExeCompositeFragment_0, IMessageProvider.INFORMATION); /* MESSAGES */ // Check if PHP executable location is empty if (phpExeItem.getExecutable() == null || phpExeItem.getExecutable().getPath().length() == 0) { setMessage(PHPDebugUIMessages.addPHPexeDialog_enterLocation, IMessageProvider.INFORMATION); setComplete(false); return; } // Check if name is empty if (phpExeItem.getName().isEmpty()) { setMessage(PHPDebugUIMessages.addPHPexeDialog_enterName, IMessageProvider.INFORMATION); setComplete(false); return; } /* ERRORS */ // Check PHP executable if (phpExeItem.getExecutable() == null) { setMessage(PHPDebugUIMessages.PHPExeCompositeFragment_13, IMessageProvider.ERROR); return; } if (!phpExeItem.getExecutable().exists()) { setMessage(PHPDebugUIMessages.addPHPexeDialog_locationNotExists, IMessageProvider.ERROR); return; } PHPExeInfo phpExecInfo = getPHPInfo(phpExeItem.getExecutable()); if (phpExecInfo == null) { setMessage(PHPDebugUIMessages.PHPExeCompositeFragment_13, IMessageProvider.ERROR); return; } // Check whether the name already exists: if (existingItems != null) { for (PHPexeItem item : existingItems) { if (!item.getName().equals(initialName) && item.getName().equals(phpExeItem.getName())) { setMessage(PHPDebugUIMessages.addPHPexeDialog_duplicateName, IMessageProvider.ERROR); return; } } } // Check if SAPI type is provided if (phpExeItem.getSapiType().isEmpty()) { setMessage(PHPDebugUIMessages.PHPExeCompositeFragment_15, IMessageProvider.ERROR); return; } if (phpExecInfo.getSapiType() != null && !phpExeItem.getSapiType().equals(phpExecInfo.getSapiType())) { setMessage( MessageFormat.format(PHPDebugUIMessages.addPHPexeDialog_wrongSAPItype, phpExecInfo.getSapiType()), IMessageProvider.ERROR); return; } // Check INI file location if (phpExeItem.getINILocation() != null) { String iniLocationName = phpExeItem.getINILocation().getPath(); File iniFile = null; if (iniLocationName.trim().length() > 0) { iniFile = new File(iniLocationName); if (!iniFile.exists()) { setMessage(PHPDebugUIMessages.addPHPexeDialog_iniLocationNotExists, IMessageProvider.ERROR); return; } } } // Update control handler controlHandler.update(); } public boolean performOk() { return true; } public PHPexeItem getPHPExeItem() { return (PHPexeItem) super.getData(); } /** * @param executable * @return PHP executable info or <code>null</code> if provided executable * is invalid */ private PHPExeInfo getPHPInfo(File executable) { try { return PHPExeUtil.getPHPInfo(executable, false); } catch (PHPExeException e) { return null; } } private void updateItem() { PHPexeItem phpExeItem = getPHPExeItem(); if (phpExeItem == null) return; // Check whether we can edit this item if (phpExeItem != null && !phpExeItem.isEditable()) { setMessage(PHPDebugUIMessages.addPHPexeDialog_readOnlyPHPExe, IMessageProvider.INFORMATION); setComplete(false); // If it is not editable it doesn't mean that it is correct validate(); return; } // Set up PHP exe item. phpExeItem.setLoadDefaultINI(fLoadDefaultPHPIni.getSelection()); phpExeItem.setExecutable(fPHPExePath.getText().isEmpty() ? null : new File(fPHPExePath.getText())); phpExeItem.setName(fPHPexeName.getText()); phpExeItem.setINILocation(fPHPIni.getText().isEmpty() ? null : new File(fPHPIni.getText())); phpExeItem.setSapiType(fSapiTypes.getText()); PHPExeInfo phpExeInfo = getPHPInfo(phpExeItem.getExecutable()); if (phpExeInfo != null) { // Set up PHP exe item version phpExeItem.setVersion(phpExeInfo.getVersion()); } // Validate all validate(); } }