/*******************************************************************************
* Copyright (c) 2009 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
*******************************************************************************/
package org.eclipse.php.internal.server.ui.launching;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.php.internal.core.documentModel.provisional.contenttype.ContentTypeIdForPHP;
import org.eclipse.php.internal.core.project.PHPNature;
import org.eclipse.php.internal.debug.ui.Logger;
import org.eclipse.php.internal.debug.ui.launching.LaunchUtilities;
import org.eclipse.php.internal.server.PHPServerUIMessages;
import org.eclipse.php.internal.server.core.Server;
import org.eclipse.php.internal.server.core.manager.ServersManager;
import org.eclipse.php.internal.server.ui.ServersPluginImages;
import org.eclipse.php.internal.ui.IPHPHelpContextIds;
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.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.PlatformUI;
/**
*
* Dialog for instant launch of PHP Web Page projects
*/
public class PHPWebPageLaunchDialog extends TitleAreaDialog {
private final Server server;
private final IScriptProject project;
private Text fFile;
private Button fileButton;
private final String mode;
private Button breakOnFirstLine;
private Button autoGeneratedURL;
private Label fURLLabel;
private Text fURLHost;
private Text fURLPath;
private WidgetListener fListener = new WidgetListener();
private boolean isBreakAtFirstLine;
private String pathString;
private String fileName;
public PHPWebPageLaunchDialog(String mode, IScriptProject obj) {
super(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
this.mode = mode;
this.project = obj;
this.server = ServersManager.getDefaultServer(obj.getProject());
}
/**
* Create a drop-down list for the URL.
*/
protected Control createDialogArea(Composite parent) {
parent = (Composite) super.createDialogArea(parent);
setDialogTitle(this.mode);
setTitle(getActionTitle(this.mode));
setMessage(getActionMessage(this.mode));
setTitleImage(ServersPluginImages.DESC_WIZ_SERVER.createImage());
Composite content = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
GridData gd = new GridData(GridData.FILL_BOTH);
content.setLayout(layout);
content.setLayoutData(gd);
createFileComponent(content);
createBreakControl(content);
createURLControl(content);
initializeURLControl();
PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IPHPHelpContextIds.DEBUGGING);
return parent;
}
@Override
protected Control createContents(Composite parent) {
final Control createContents = super.createContents(parent);
disableOkButton();
return createContents;
}
private void disableOkButton() {
getButton(IDialogConstants.OK_ID).setEnabled(false);
}
private void enableOkButton() {
getButton(IDialogConstants.OK_ID).setEnabled(true);
}
private String getActionMessage(String mode) {
if (ILaunchManager.DEBUG_MODE.equals(mode)) {
return PHPServerUIMessages.getString("PHPWebPageLaunchDialog.0"); //$NON-NLS-1$
} else if (ILaunchManager.RUN_MODE.equals(mode)) {
return PHPServerUIMessages.getString("PHPWebPageLaunchDialog.1"); //$NON-NLS-1$
} else if (ILaunchManager.PROFILE_MODE.equals(mode)) {
return PHPServerUIMessages.getString("PHPWebPageLaunchDialog.2"); //$NON-NLS-1$
}
throw new IllegalArgumentException();
}
private String getActionTitle(String mode) {
if (ILaunchManager.DEBUG_MODE.equals(mode)) {
return PHPServerUIMessages.getString("PHPWebPageLaunchDialog.3"); //$NON-NLS-1$
} else if (ILaunchManager.RUN_MODE.equals(mode)) {
return PHPServerUIMessages.getString("PHPWebPageLaunchDialog.4"); //$NON-NLS-1$
} else if (ILaunchManager.PROFILE_MODE.equals(mode)) {
return PHPServerUIMessages.getString("PHPWebPageLaunchDialog.5"); //$NON-NLS-1$
}
throw new IllegalArgumentException();
}
private void setDialogTitle(String mode) {
if (ILaunchManager.DEBUG_MODE.equals(mode)) {
getShell().setText(PHPServerUIMessages.getString("PHPWebPageLaunchDialog.3")); //$NON-NLS-1$
} else if (ILaunchManager.RUN_MODE.equals(mode)) {
getShell().setText(PHPServerUIMessages.getString("PHPWebPageLaunchDialog.4")); //$NON-NLS-1$
} else if (ILaunchManager.PROFILE_MODE.equals(mode)) {
getShell().setText(PHPServerUIMessages.getString("PHPWebPageLaunchDialog.5")); //$NON-NLS-1$
}
}
// In case this is a debug mode, display 'Break on first line' attribute
// checkbox.
protected void createBreakControl(Composite parent) {
if (!ILaunchManager.DEBUG_MODE.equals(this.mode)) {
return;
}
Group group = new Group(parent, SWT.NONE);
group.setText(PHPServerUIMessages.getString("PHPWebPageLaunchDialog.6")); //$NON-NLS-1$
GridLayout layout = new GridLayout();
layout.numColumns = 1;
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
group.setLayout(layout);
group.setLayoutData(gridData);
breakOnFirstLine = createCheckButton(group, PHPServerUIMessages.getString("PHPWebPageLaunchDialog.7")); //$NON-NLS-1$
breakOnFirstLine.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
PHPWebPageLaunchDialog.this.isBreakAtFirstLine = breakOnFirstLine.getSelection();
// updateLaunchConfigurationDialog();
}
});
}
private Button createCheckButton(Group group, String string) {
return SWTFactory.createCheckButton(group, string, null, false, 1);
}
protected void createFileComponent(Composite parent) {
Group group = new Group(parent, SWT.NONE);
String projectLabel = PHPServerUIMessages.getString("ServerTab.file_project"); //$NON-NLS-1$
group.setText(projectLabel);
GridLayout layout = new GridLayout(3, false);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
group.setLayout(layout);
group.setLayoutData(gd);
fFile = new Text(group, SWT.SINGLE | SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
// gridData = new GridData();
// gridData.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
fFile.setLayoutData(gd);
fFile.addModifyListener(fListener);
fileButton = createPushButton(group, PHPServerUIMessages.getString("ServerTab.browse")); //$NON-NLS-1$
gd = (GridData) fileButton.getLayoutData();
gd.horizontalSpan = 1;
fileButton.addSelectionListener(fListener);
}
public void createURLControl(Composite composite) {
Group group = new Group(composite, SWT.NONE);
String projectLabel = PHPServerUIMessages.getString("ServerTab.url"); //$NON-NLS-1$
group.setText(projectLabel);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
group.setLayout(layout);
group.setLayoutData(gridData);
autoGeneratedURL = new Button(group, SWT.CHECK);
autoGeneratedURL.setText(PHPServerUIMessages.getString("ServerTab.autoGenerate")); //$NON-NLS-1$
autoGeneratedURL.setSelection(true);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 2;
autoGeneratedURL.setLayoutData(gridData);
autoGeneratedURL.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
initializeURLControl();
// updateLaunchConfigurationDialog();
}
});
fURLLabel = new Label(group, SWT.NONE);
fURLLabel.setText(PHPServerUIMessages.getString("ServerTab.urlLabel")); //$NON-NLS-1$
gridData = new GridData();
gridData.horizontalIndent = 20;
gridData.horizontalSpan = 1;
fURLLabel.setLayoutData(gridData);
Composite urlComposite = new Composite(group, SWT.NONE);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
urlComposite.setLayout(gridLayout);
gridData = new GridData(GridData.FILL_HORIZONTAL);
urlComposite.setLayoutData(gridData);
fURLHost = new Text(urlComposite, SWT.SINGLE | SWT.BORDER);
gridData = new GridData(GridData.FILL_HORIZONTAL);
fURLHost.setLayoutData(gridData);
fURLHost.setEnabled(false);
fURLPath = new Text(urlComposite, SWT.SINGLE | SWT.BORDER);
gridData = new GridData(GridData.FILL_HORIZONTAL);
fURLPath.setLayoutData(gridData);
fURLPath.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
// updateLaunchConfigurationDialog();
}
});
}
private Button createPushButton(Group group, String string) {
return SWTFactory.createPushButton(group, string, null);
}
/**
* Override the okPressed to save the URL to the URLs history for this PHP
* IDE session. Also, add the URL to the launch configuration attributes.
*/
protected void buttonPressed(int buttonId) {
if (buttonId == OK) {
}
super.buttonPressed(buttonId);
}
public Server getServer() {
return this.server;
}
public String getPHPPathString() {
return this.pathString;
}
protected class WidgetListener extends SelectionAdapter implements ModifyListener {
public void modifyText(ModifyEvent e) {
initializeURLControl();
validate();
}
public void widgetSelected(SelectionEvent e) {
Object source = e.getSource();
if (source == fileButton) {
handleFileButtonSelected();
}
validate();
}
}
protected void handleFileButtonSelected() {
IResource file = null;
file = getFileFromDialog(this.project.getProject());
if (file == null)
return;
String fName = file.getFullPath().toString();
fFile.setText(fName);
if (autoGeneratedURL.getSelection()) {
updateURLComponents(computeURL(formatFileName(fName)));
}
}
private IResource getFileFromDialog(IProject project) {
final String contenttypeidPhp = ContentTypeIdForPHP.ContentTypeID_PHP;
final IContentType contentType = Platform.getContentTypeManager().getContentType(contenttypeidPhp);
final String[] fileSpecs = contentType.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
return LaunchUtilities.getFileFromDialog(project, getShell(), fileSpecs, new String[] { PHPNature.ID }, false);
}
protected void initializeURLControl() {
if (fFile == null || fURLPath == null || fURLHost == null) {
return;
}
String file;
file = autoGeneratedURL.getSelection() ? formatFileName(fFile.getText()) : fURLPath.getText();
fURLPath.setEnabled(!autoGeneratedURL.getSelection());
updateURLComponents(computeURL(file));
}
/**
* Constructs the URL string according to the given context root and the
* file name.
*
* @param fileName
* @return
*/
protected String computeURL(String fileName) {
if (server == null) {
return ""; //$NON-NLS-1$
}
String urlString = server.getBaseURL();
if (urlString.equals("")) { //$NON-NLS-1$
urlString = "http://localhost"; //$NON-NLS-1$
}
StringBuilder url = new StringBuilder(urlString);
if (!fileName.equals("")) { //$NON-NLS-1$
url.append(fileName);
}
return url.toString();
}
private String formatFileName(String fileName) {
String formatFile = null;
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IResource resource = root.findMember(fileName);
if (resource == null) {
return fileName;
}
int type = resource.getType();
if (type == IResource.FILE || type == IResource.FOLDER) {
formatFile = resource.getFullPath().toString();
} else {
formatFile = "/"; //$NON-NLS-1$
}
if (!formatFile.startsWith("/")) { //$NON-NLS-1$
formatFile = "/" + formatFile; //$NON-NLS-1$
}
return formatFile;
}
protected void updateURLComponents(String urlStr) {
try {
URL url = new URL(urlStr);
String port = url.getPort() == -1 ? "" : ":" + url.getPort(); //$NON-NLS-1$ //$NON-NLS-2$
fURLHost.setText(url.getProtocol() + "://" + url.getHost() + port + "/"); //$NON-NLS-1$ //$NON-NLS-2$
if (url.getQuery() != null) {
fURLPath.setText(url.getPath() + "?" + url.getQuery()); //$NON-NLS-1$
} else {
fURLPath.setText(url.getPath());
}
} catch (MalformedURLException e) {
Logger.logException(e);
}
}
public boolean isBreakAtFirstLine() {
return isBreakAtFirstLine;
}
private boolean validate() {
String fileName = this.fFile.getText();
if (fileName == null || fileName.length() == 0) {
return false;
}
IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(fileName);
if (!(resource instanceof IFile)) {
setErrorMessage(PHPServerUIMessages.getString("ServerTab.file_project_doesNotExist")); //$NON-NLS-1$
return false;
}
setErrorMessage(null);
return true;
}
@Override
public void setErrorMessage(String newErrorMessage) {
if (newErrorMessage != null) {
disableOkButton();
} else {
enableOkButton();
}
super.setErrorMessage(newErrorMessage);
}
@Override
protected void okPressed() {
String urlPath = fURLPath.getText().replace('\\', '/');
if (urlPath.startsWith("/")) { //$NON-NLS-1$
urlPath = urlPath.substring(1);
}
this.pathString = this.fURLHost.getText() + urlPath;
this.fileName = this.fFile.getText();
super.okPressed();
}
public String getFilename() {
return this.fileName;
}
}