package com.dubture.composer.ui.wizard;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.dltk.core.environment.EnvironmentManager;
import org.eclipse.dltk.core.environment.IEnvironment;
import org.eclipse.dltk.core.internal.environment.LocalEnvironment;
import org.eclipse.dltk.internal.ui.wizards.NewWizardMessages;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.ComboDialogField;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.IStringButtonAdapter;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.SelectionButtonDialogField;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.StringButtonDialogField;
import org.eclipse.dltk.ui.DLTKUIPlugin;
import org.eclipse.dltk.ui.environment.IEnvironmentUI;
import org.eclipse.php.internal.server.core.Server;
import org.eclipse.php.internal.server.core.manager.ServersManager;
import org.eclipse.php.internal.ui.PHPUIMessages;
import org.eclipse.php.internal.ui.wizards.NameGroup;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
/**
* Based on {@link LocationGroup}
* @author Robert Gruendler <r.gruendler@gmail.com>
*
*/
@SuppressWarnings("restriction")
public class LocationGroup extends Observable implements Observer, IStringButtonAdapter, IDialogFieldListener {
protected SelectionButtonDialogField fWorkspaceRadio;
protected SelectionButtonDialogField fExternalRadio;
protected StringButtonDialogField fLocation;
protected IEnvironment[] environments;
protected String fPreviousExternalLocation;
protected int localEnv;
protected SelectionButtonDialogField fLocalServerRadio;
protected ComboDialogField fSeverLocationList;
protected String[] docRootArray;
protected NameGroup fNameGroup;
protected Shell shell;
private static final String DIALOGSTORE_LAST_EXTERNAL_LOC = DLTKUIPlugin.PLUGIN_ID + ".last.external.project"; //$NON-NLS-1$
public LocationGroup(Composite composite, NameGroup nameGroup, Shell shell) {
this.fNameGroup = nameGroup;
this.shell = shell;
createContents(composite, nameGroup, shell);
}
protected void createContents(Composite composite, NameGroup nameGroup, Shell shell) {
final int numColumns = 3;
final Group group = new Group(composite, SWT.None);
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
group.setLayout(new GridLayout(numColumns, false));
group.setText(NewWizardMessages.ScriptProjectWizardFirstPage_LocationGroup_title);
fWorkspaceRadio = new SelectionButtonDialogField(SWT.RADIO);
fWorkspaceRadio.setLabelText(NewWizardMessages.ScriptProjectWizardFirstPage_LocationGroup_workspace_desc);
fWorkspaceRadio.doFillIntoGrid(group, numColumns);
createExternalLocation(group, numColumns);
environments = EnvironmentManager.getEnvironments();
String[] items = new String[environments.length];
localEnv = 0;
for (int i = 0; i < items.length; i++) {
items[i] = environments[i].getName();
if (environments[i].isLocal()) {
localEnv = i;
}
}
fWorkspaceRadio.setDialogFieldListener(this);
fWorkspaceRadio.setSelection(true);
createLocalServersGroup(group, numColumns);
}
protected void createExternalLocation(Group group, int numColumns) {
fExternalRadio = new SelectionButtonDialogField(SWT.RADIO);
fExternalRadio.setDialogFieldListener(this);
fExternalRadio.setLabelText(NewWizardMessages.ScriptProjectWizardFirstPage_LocationGroup_external_desc);
fExternalRadio.setSelection(false);
fLocation = new StringButtonDialogField(this);
fLocation.setDialogFieldListener(this);
fLocation.setLabelText(NewWizardMessages.ScriptProjectWizardFirstPage_LocationGroup_locationLabel_desc);
fLocation.setButtonLabel(NewWizardMessages.ScriptProjectWizardFirstPage_LocationGroup_browseButton_desc);
fPreviousExternalLocation = ""; //$NON-NLS-1$
fExternalRadio.doFillIntoGrid(group, numColumns);
fLocation.doFillIntoGrid(group, numColumns);
LayoutUtil.setHorizontalGrabbing(fLocation.getTextControl(null));
fExternalRadio.attachDialogFields(new DialogField[] { fLocation });
}
public boolean isExistingLocation() {
return fExternalRadio.isSelected();
}
/**
* check if any of the server can provide local doc root.
*
* @param group
* @param numColumns
*/
protected void createLocalServersGroup(final Group group, final int numColumns) {
Server[] servers = ServersManager.getServers();
Server defaultServer = ServersManager.getDefaultServer(null);
List<String> docRoots = new ArrayList<String>();
int selection = 0;
for (int i = 0; i < servers.length; i++) {
String docRoot = servers[i].getDocumentRoot();
if (docRoot != null && !"".equals(docRoot.trim())) { //$NON-NLS-1$
docRoots.add(docRoot);
if (defaultServer != null && servers[i].getDocumentRoot().equals(defaultServer.getDocumentRoot())) {
selection = i;
}
}
}
if (docRoots.size() > 0) {
fLocalServerRadio = new SelectionButtonDialogField(SWT.RADIO);
fLocalServerRadio.setDialogFieldListener(this);
fLocalServerRadio.setLabelText(PHPUIMessages.PHPProjectWizardFirstPage_localServerLabel); //$NON-NLS-1$
fLocalServerRadio.setSelection(false);
fLocalServerRadio.doFillIntoGrid(group, numColumns);
fSeverLocationList = new ComboDialogField(SWT.READ_ONLY);
fSeverLocationList.setLabelText(NewWizardMessages.ScriptProjectWizardFirstPage_LocationGroup_locationLabel_desc);
fSeverLocationList.doFillIntoGrid(group, numColumns);
fSeverLocationList.setEnabled(false);
docRootArray = new String[docRoots.size()];
docRoots.toArray(docRootArray);
fSeverLocationList.setItems(docRootArray);
fSeverLocationList.selectItem(selection);
fLocalServerRadio.attachDialogField(fSeverLocationList);
fWorkspaceRadio.setSelection(false);
fLocalServerRadio.setSelection(true);
} else {
createNoLocalServersFound(group, numColumns);
}
}
/**
* add proper GUI if there's no preconfigured local server
*
* @param group
* @param numColumns
*/
protected void createNoLocalServersFound(Group group, int numColumns) {
// empty
}
public boolean isInLocalServer() {
return fLocalServerRadio != null && fLocalServerRadio.isSelected();
}
protected void fireEvent() {
setChanged();
notifyObservers();
}
protected String getDefaultPath(String name) {
IEnvironment environment = this.getEnvironment();
if (environment != null && environment.isLocal()) {
final IPath path = Platform.getLocation().append(name);
return path.toOSString();
} else {
return ""; //$NON-NLS-1$
}
}
/*
* (non-Javadoc)
*
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
*/
public void update(Observable o, Object arg) {
if (isInWorkspace()) {
fLocation.setText(getDefaultPath(fNameGroup.getName()));
}
if (docRootArray != null && docRootArray.length > 0) {
int index = fSeverLocationList.getSelectionIndex();
String[] items = getDocItems(docRootArray);
fSeverLocationList.setItems(items);
fSeverLocationList.selectItem(index);
}
fireEvent();
}
protected String[] getDocItems(String[] docRootArray) {
String[] items = new String[docRootArray.length];
for (int i = 0; i < docRootArray.length; i++) {
items[i] = docRootArray[i] + File.separator + fNameGroup.getName(); //$NON-NLS-1$
}
return items;
}
public IPath getLocation() {
if (isInWorkspace()) {
return Platform.getLocation();
}
if (isInLocalServer()) {
return new Path(fSeverLocationList.getText());
}
return new Path(fLocation.getText().trim());
}
public boolean isInWorkspace() {
return fWorkspaceRadio.isSelected();
}
public IEnvironment getEnvironment() {
if (fWorkspaceRadio.isSelected()) {
return EnvironmentManager
.getEnvironmentById(LocalEnvironment.ENVIRONMENT_ID);
}
// return environments[fEnvironment.getSelectionIndex()];
return environments[localEnv];
}
public void changeControlPressed(DialogField field) {
IEnvironment environment = getEnvironment();
IEnvironmentUI environmentUI = (IEnvironmentUI) environment
.getAdapter(IEnvironmentUI.class);
if (environmentUI != null) {
String selectedDirectory = environmentUI.selectFolder(shell);
if (selectedDirectory != null) {
fLocation.setText(selectedDirectory);
DLTKUIPlugin.getDefault().getDialogSettings()
.put(DIALOGSTORE_LAST_EXTERNAL_LOC, selectedDirectory);
}
}
}
public void dialogFieldChanged(DialogField field) {
if (field == fWorkspaceRadio) {
final boolean checked = fWorkspaceRadio.isSelected();
if (checked) {
fPreviousExternalLocation = fLocation.getText();
fLocation.setText(getDefaultPath(fNameGroup.getName()));
} else {
IEnvironment environment = this.getEnvironment();
if (environment != null && environment.isLocal()) {
fLocation.setText(fPreviousExternalLocation);
} else {
fLocation.setText(""); //$NON-NLS-1$
}
}
}
fireEvent();
}
}