package com.dubture.composer.ui.wizard;
import java.io.File;
import java.net.URI;
import java.util.Observable;
import java.util.Observer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.dltk.core.environment.IEnvironment;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.php.internal.core.PHPVersion;
import org.eclipse.php.internal.ui.wizards.CompositeData;
import org.eclipse.php.internal.ui.wizards.IPHPProjectCreateWizardPage;
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.Control;
import com.dubture.composer.ui.converter.String2KeywordsConverter;
import com.dubture.composer.ui.wizard.project.BasicSettingsGroup;
import com.dubture.composer.ui.wizard.project.VersionGroup;
import com.dubture.getcomposer.core.ComposerPackage;
/**
* Base implementation for the first page of a new Composer project wizard.
*
* @author Robert Gruendler <r.gruendler@gmail.com>
*
*/
@SuppressWarnings("restriction")
abstract public class AbstractWizardFirstPage extends WizardPage implements IPHPProjectCreateWizardPage, Observer {
public NameGroup nameGroup;
public LocationGroup PHPLocationGroup;
public AbstractVersionGroup versionGroup;
protected String initialName;
protected Composite composite;
protected AbstractValidator validator;
protected DetectGroup detectGroup;
protected ComposerPackage composerPackage;
protected String2KeywordsConverter keywordConverter;
protected AbstractWizardFirstPage(String pageName) {
super(pageName);
}
@Override
public void createControl(Composite parent) {
composite = new Composite(parent, SWT.NULL);
composite.setFont(parent.getFont());
composite.setLayout(initGridLayout(new GridLayout(1, false), false));
composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
initialName = "";
// create UI elements
nameGroup = new NameGroup(composite, initialName, getShell());
nameGroup.addObserver(this);
validator = getValidator();
beforeLocationGroup();
PHPLocationGroup = new LocationGroup(composite, nameGroup, getShell());
CompositeData data = new CompositeData();
data.setParetnt(composite);
data.setSettings(getDialogSettings());
data.setObserver(PHPLocationGroup);
versionGroup = new VersionGroup(this, composite);
detectGroup = new DetectGroup(composite, PHPLocationGroup, nameGroup);
nameGroup.addObserver(PHPLocationGroup);
PHPLocationGroup.addObserver(detectGroup);
// initialize all elements
nameGroup.notifyObservers();
// create and connect validator
nameGroup.addObserver(validator);
PHPLocationGroup.addObserver(validator);
Dialog.applyDialogFont(composite);
afterLocationGroup();
setControl(composite);
composerPackage = new ComposerPackage();
keywordConverter = new String2KeywordsConverter(composerPackage);
finishControlSetup();
setHelpContext(composite);
}
public void performFinish(IProgressMonitor monitor) {
}
abstract protected void finishControlSetup();
abstract protected void beforeLocationGroup();
abstract protected void afterLocationGroup();
abstract protected AbstractValidator getValidator();
abstract public void update(Observable o, Object arg);
abstract public void initPage();
abstract protected void setHelpContext(Control container);
public GridLayout initGridLayout(GridLayout layout, boolean margins) {
layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
if (margins) {
layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
} else {
layout.marginWidth = 0;
layout.marginHeight = 0;
}
return layout;
}
public IProject getProjectHandle() {
return ResourcesPlugin.getWorkspace().getRoot().getProject(nameGroup.getName());
}
public IEnvironment getEnvironment() {
return PHPLocationGroup.getEnvironment();
}
public boolean isInWorkspace() {
return PHPLocationGroup.isInWorkspace();
}
public boolean isInLocalServer() {
return PHPLocationGroup.isInLocalServer();
}
public boolean canCreate(File file) {
while (!file.exists()) {
file = file.getParentFile();
if (file == null)
return false;
}
return file.canWrite();
}
public URI getLocationURI() {
IEnvironment environment = getEnvironment();
return environment.getURI(PHPLocationGroup.getLocation());
}
public IPath getPath() {
return PHPLocationGroup.getLocation();
}
public boolean getDetect() {
return detectGroup.mustDetect();
}
public boolean hasPhpSourceFolder() {
return true;
}
public boolean isDefaultVersionSelected() {
return false;
}
public boolean getUseAspTagsValue() {
return versionGroup != null && versionGroup.fConfigurationBlock.getUseAspTagsValue();
}
public PHPVersion getPHPVersionValue() {
if (versionGroup != null) {
return versionGroup.fConfigurationBlock.getPHPVersionValue();
}
return null;
}
public ComposerPackage getPackage() {
return composerPackage;
}
public void updatePackageFromSettingsGroup(BasicSettingsGroup settingsGroup) {
if (settingsGroup.getVendor() != null && nameGroup.getName() != null) {
composerPackage.setName(String.format("%s/%s", settingsGroup.getVendor(), nameGroup.getName()));
}
if (settingsGroup.getDescription().length() > 0) {
composerPackage.setDescription(settingsGroup.getDescription());
}
if (settingsGroup.getLicense().length() > 0) {
composerPackage.getLicense().clear();
composerPackage.getLicense().add(settingsGroup.getLicense());
}
if (settingsGroup.getType().length() > 0) {
composerPackage.setType(settingsGroup.getType());
}
if (settingsGroup.getKeywords().length() > 0) {
keywordConverter.convert(settingsGroup.getKeywords());
}
}
}