package com.dubture.symfony.ui.preferences;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Path;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.SelectionButtonDialogField;
import org.eclipse.php.internal.ui.preferences.IStatusChangeListener;
import org.eclipse.php.internal.ui.util.StatusInfo;
import org.eclipse.php.internal.ui.wizards.fields.DialogField;
import org.eclipse.php.internal.ui.wizards.fields.IStringButtonAdapter;
import org.eclipse.php.internal.ui.wizards.fields.StringButtonDialogField;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
import org.pdtextensions.core.ui.preferences.launcher.LauncherConfigurationBlock;
import org.pdtextensions.core.ui.preferences.launcher.LauncherKeyBag;
import com.dubture.symfony.core.SymfonyCorePlugin;
@SuppressWarnings("restriction")
public class SymfonyLauncherConfigurationBlock extends LauncherConfigurationBlock {
private SelectionButtonDialogField customConsole;
public SymfonyLauncherConfigurationBlock(IStatusChangeListener context, IProject project,
IWorkbenchPreferenceContainer container, LauncherKeyBag keyBag) {
super(context, project, container, keyBag);
}
@Override
protected String getPluginId() {
return SymfonyCorePlugin.ID;
}
@Override
protected void afterSave() {
// TODO Auto-generated method stub
}
@Override
protected void beforeSave() {
// TODO Auto-generated method stub
}
@Override
protected void createScriptGroup(Composite result) {
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.minimumHeight = 60;
gd.heightHint = 60;
scriptGroup = new Group(result, SWT.NONE);
scriptGroup.setLayout(new GridLayout(3, false));
scriptGroup.setLayoutData(gd);
scriptGroup.setText(getScriptLabel());
customConsole = new SelectionButtonDialogField(SWT.CHECK);
customConsole.setLabelText("Use custom console location");
customConsole.doFillIntoGrid(scriptGroup, 3);
customConsole.setDialogFieldListener(new org.eclipse.dltk.internal.ui.wizards.dialogfields.IDialogFieldListener() {
@Override
public void dialogFieldChanged(org.eclipse.dltk.internal.ui.wizards.dialogfields.DialogField field) {
scriptField.setEnabled(customConsole.isSelected());
}
});
scriptField = new StringButtonDialogField(new IStringButtonAdapter() {
@Override
public void changeControlPressed(DialogField field) {
FileDialog dialog = new FileDialog(getShell());
String path = dialog.open();
if (path != null) {
scriptField.setText(path);
}
}
});
scriptField.setButtonLabel("Browse");
boolean useProjectPhar = getBooleanValue(useScriptInsideProject);
if (useProjectPhar) {
customConsole.setSelection(true);
} else {
scriptField.setEnabled(false);
customConsole.setSelection(false);
}
scriptField.setDialogFieldListener(this);
scriptField.setLabelText(getScriptFieldLabel());
scriptField.doFillIntoGrid(scriptGroup, 3);
scriptField.getTextControl(null).addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (!validateScript(scriptField.getText())) {
StatusInfo info = new StatusInfo(StatusInfo.WARNING, "The selected file is no valid symfony console script.");
fContext.statusChanged(info);
}
}
});
}
protected boolean doUseScriptInsideProject() {
return customConsole.isSelected();
}
@Override
protected String getHeaderLabel() {
return "Select the PHP executable to be used for running the symfony console.";
}
@Override
protected String getProjectChoiceLabel() {
return "1";
}
@Override
protected String getGlobalChoiceLabel() {
return "2";
}
@Override
protected String getScriptLabel() {
return "Console script";
}
@Override
protected String getButtonGroupLabel() {
return "4";
}
@Override
protected String getScriptFieldLabel() {
return "";
}
@Override
protected boolean validateScript(String text) {
if (project == null) {
return false;
}
IFile file = project.getFile(new Path(text));
//TODO: validate for an actual console script ;)
return (file != null && file.exists());
}
}