package org.zend.php.zendserver.deployment.ui.editors;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
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 org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.IMessageManager;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.zend.php.zendserver.deployment.core.descriptor.ChangeEvent;
import org.zend.php.zendserver.deployment.core.descriptor.DeploymentDescriptorPackage;
import org.zend.php.zendserver.deployment.core.descriptor.IDeploymentDescriptor;
import org.zend.php.zendserver.deployment.core.descriptor.IDescriptorChangeListener;
import org.zend.php.zendserver.deployment.core.descriptor.IDescriptorContainer;
import org.zend.php.zendserver.deployment.core.descriptor.ProjectType;
import org.zend.php.zendserver.deployment.ui.Activator;
import org.zend.php.zendserver.deployment.ui.HelpContextIds;
import org.zend.php.zendserver.deployment.ui.Messages;
import org.zend.php.zendserver.deployment.ui.actions.ExportApplicationAction;
import org.zend.php.zendserver.deployment.ui.contributions.ITestingSectionContribution;
public class OverviewPage extends DescriptorEditorPage {
private static final String VIEW = "view:"; //$NON-NLS-1$
private static final String LINK_EXPORT = "export"; //$NON-NLS-1$
private TextField name;
private ComboField type;
private TextField summary;
private TextField description;
private TextField releaseVersion;
private TextField apiVersion;
private TextField healthcheck;
private TextField license;
private TextField icon;
private TextField docRoot;
private TextField appDir;
private TextField libDir;
private TextField updateUrl;
private ResourceListSection persistent;
private IDescriptorContainer fModel;
public OverviewPage(DeploymentDescriptorEditor editor,
IDescriptorContainer model) {
super(editor, "overview", Messages.OverviewPage_Overview); //$NON-NLS-1$
this.fModel = model;
}
@Override
protected void createFormContent(IManagedForm managedForm) {
super.createFormContent(managedForm);
ScrolledForm form = managedForm.getForm();
form.getBody().setLayout(
FormLayoutFactory.createFormTableWrapLayout(true, 2));
final FormToolkit toolkit = managedForm.getToolkit();
final Composite body = managedForm.getForm().getBody();
Composite left = toolkit.createComposite(body);
left.setLayout(FormLayoutFactory
.createFormPaneTableWrapLayout(false, 1));
left.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
createGeneralInformationSection(managedForm, left);
createPersistentResourcesSection(managedForm, left);
Composite right = toolkit.createComposite(body);
right.setLayout(FormLayoutFactory.createFormPaneTableWrapLayout(false,
1));
right.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
createTestingSection(managedForm, right);
createExportingSection(managedForm, right);
form.reflow(true);
showMarkers();
}
private void createPersistentResourcesSection(IManagedForm managedForm,
Composite left) {
persistent = new ResourceListSection(editor, managedForm,
Messages.OverviewPage_PersistentResources,
Messages.OverviewPage_PersistentResourcesDescription, left) {
@Override
public Object[] getElements(Object input) {
List<String> list = editor.getModel().getPersistentResources();
return list.toArray();
}
@Override
protected void addPath() {
Shell shell = editor.getSite().getShell();
IProject root = editor.getProject();
String[] newPaths = OpenFileDialog.openAny(shell, root,
Messages.OverviewPage_AddPath,
Messages.OverviewPage_SelectPath,
Messages.OverviewPage_2, null);
if (newPaths == null) {
return;
}
for (int i = 0; i < newPaths.length; i++) {
String newPath = getPersistentResourcePath(newPaths[i]);
editor.getModel().getPersistentResources().add(newPath);
}
}
@Override
protected void editPath(Object element) {
String currPath = (String) element;
String resourcePath = getResourcePath(currPath);
Shell shell = editor.getSite().getShell();
IProject root = editor.getProject();
String newPath = OpenFileDialog.open(shell, root,
Messages.OverviewPage_ChangePath,
Messages.OverviewPage_SelectPath, resourcePath);
if (newPath == null) {
return;
}
editor.getModel().getPersistentResources().remove(currPath);
newPath = getPersistentResourcePath(newPath);
editor.getModel().getPersistentResources().add(newPath);
}
@Override
protected void removePath(Object element) {
String path = (String) element;
editor.getModel().getPersistentResources().remove(path);
upadateEnablement();
}
};
}
private void createExportingSection(final IManagedForm managedForm, Composite body) {
FormToolkit toolkit = managedForm.getToolkit();
Section section = createStaticSection(toolkit, body,
Messages.OverviewPage_Exporting);
Composite container = createStaticSectionClient(toolkit, section);
String content = Messages.OverviewPage_PackageAndExport;
if (fModel.getDescriptorModel().getType() == ProjectType.LIBRARY) {
content = Messages.OverviewPage_PackageAndExportLibrary;
}
final FormText text = createClient(container, content, toolkit,
new HyperlinkAdapter() {
public void linkActivated(HyperlinkEvent e) {
handleLinkClick(e.data);
}
});
fModel.getDescriptorModel().addListener(
new IDescriptorChangeListener() {
public void descriptorChanged(final ChangeEvent event) {
if (text == null || text.isDisposed()) {
return;
}
Display.getDefault().asyncExec(new Runnable() {
public void run() {
switch (fModel.getDescriptorModel().getType()) {
case LIBRARY:
text.setText(
Messages.OverviewPage_PackageAndExportLibrary,
true, false);
break;
default:
text.setText(
Messages.OverviewPage_PackageAndExport,
true, false);
break;
}
managedForm.reflow(true);
}
});
}
});
section.setClient(container);
}
/**
* @param toolkit
* @param parent
* @return
*/
protected Composite createStaticSectionClient(FormToolkit toolkit,
Composite parent) {
Composite container = toolkit.createComposite(parent, SWT.NONE);
container.setLayout(FormLayoutFactory
.createSectionClientTableWrapLayout(false, 1));
TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
container.setLayoutData(data);
return container;
}
protected final Section createStaticSection(FormToolkit toolkit,
Composite parent, String text) {
Section section = toolkit.createSection(parent,
ExpandableComposite.TITLE_BAR);
section.clientVerticalSpacing = FormLayoutFactory.SECTION_HEADER_VERTICAL_SPACING;
section.setText(text);
section.setLayout(FormLayoutFactory
.createClearTableWrapLayout(false, 1));
TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
section.setLayoutData(data);
return section;
}
protected final FormText createClient(Composite section, String content,
FormToolkit toolkit, IHyperlinkListener hyperLink) {
FormText text = toolkit.createFormText(section, true);
try {
text.setText(content, true, false);
} catch (SWTException e) {
text.setText(e.getMessage(), false, false);
}
text.addHyperlinkListener(hyperLink);
return text;
}
private void createTestingSection(final IManagedForm managedForm, Composite body) {
FormToolkit toolkit = managedForm.getToolkit();
Section section = toolkit.createSection(body, Section.TITLE_BAR
| Section.EXPANDED);
section.setText(Messages.OverviewPage_Testing);
TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
section.setLayoutData(data);
final Composite sectionClient = toolkit.createComposite(section);
FormText formText = toolkit.createFormText(sectionClient, true);
formText.setText(Messages.OverviewPage_TestingDescr, true, true);
formText.setLayoutData(new GridData(GridData.FILL_BOTH));
formText.addHyperlinkListener(new HyperlinkAdapter() {
public void linkActivated(HyperlinkEvent e) {
Object obj = e.getHref();
String href = (String) obj;
if (href.startsWith(VIEW)) {
String viewId = href.substring(VIEW.length());
try {
getSite().getPage().showView(viewId);
} catch (PartInitException ex) {
Activator.log(ex);
}
}
}
});
section.setClient(sectionClient);
sectionClient.setLayout(new GridLayout(1, false));
ProjectType type = fModel.getDescriptorModel().getType();
resolveContributions(sectionClient, type);
fModel.getDescriptorModel().addListener(
new IDescriptorChangeListener() {
public void descriptorChanged(final ChangeEvent event) {
if (sectionClient == null || sectionClient.isDisposed()) {
return;
}
Display.getDefault().asyncExec(new Runnable() {
public void run() {
Control[] children = sectionClient
.getChildren();
if (event.feature
.equals(DeploymentDescriptorPackage.PKG_TYPE)) {
if (event.newValue != null
&& !event.newValue
.equals(event.oldValue)) {
ProjectType currentType = ProjectType
.byName((String) event.newValue);
for (Control child : children) {
if (child instanceof ImageHyperlink) {
ProjectType linkType = (ProjectType) child.getData();
setControlVisibility(child, linkType == currentType);
}
}
managedForm.reflow(true);
}
}
}
});
}
});
}
protected void updateTestingActions(Composite parent,
IContributionItem[] items) {
for (IContributionItem item : items) {
item.fill(parent);
}
}
private void createGeneralInformationSection(IManagedForm managedForm,
Composite body) {
IDeploymentDescriptor descr = editor.getModel();
IMessageManager mmng = managedForm.getMessageManager();
name = addField(new TextField(descr,
DeploymentDescriptorPackage.PKG_NAME,
Messages.OverviewPage_Name, mmng));
type = addField(new ComboField(descr,
DeploymentDescriptorPackage.PKG_TYPE,
Messages.OverviewPage_ProjectType, SWT.READ_ONLY,
ProjectType.APPLICATION.getName()));
type.setItems(new String[] { ProjectType.APPLICATION.getName(),
ProjectType.LIBRARY.getName() });
summary = addField(new TextField(descr,
DeploymentDescriptorPackage.SUMMARY,
Messages.OverviewPage_Summary, mmng));
description = addField(new TextField(descr,
DeploymentDescriptorPackage.PKG_DESCRIPTION,
Messages.OverviewPage_Description, SWT.MULTI | SWT.WRAP
| SWT.V_SCROLL | SWT.RESIZE, false, mmng));
releaseVersion = addField(new TextField(descr,
DeploymentDescriptorPackage.VERSION_RELEASE,
Messages.OverviewPage_0, mmng));
apiVersion = addField(new TextField(descr,
DeploymentDescriptorPackage.VERSION_API,
Messages.OverviewPage_1, mmng));
healthcheck = addField(new TextField(descr,
DeploymentDescriptorPackage.HEALTHCHECK, Messages.OverviewPage_3, mmng));
license = addField(new FileField(descr,
DeploymentDescriptorPackage.EULA,
Messages.OverviewPage_4, editor.getProject(), mmng));
icon = addField(new FileField(descr, DeploymentDescriptorPackage.ICON,
Messages.OverviewPage_Icon, editor.getProject(), mmng));
docRoot = addField(new FolderField(fModel,
DeploymentDescriptorPackage.DOCROOT,
Messages.OverviewPage_Docroot, editor.getProject(), mmng));
libDir = addField(new TextField(descr,
DeploymentDescriptorPackage.LIBDIR,
Messages.OverviewPage_Libdir, mmng));
updateUrl = addField(new TextField(descr,
DeploymentDescriptorPackage.UPDATE_URL,
Messages.OverviewPage_UpdateUrl, mmng));
appDir = addField(new TextField(descr,
DeploymentDescriptorPackage.APPDIR,
Messages.OverviewPage_Appdir, mmng));
FormToolkit toolkit = managedForm.getToolkit();
final Section section = toolkit.createSection(body, Section.DESCRIPTION
| Section.TITLE_BAR | Section.EXPANDED);
section.setText(Messages.OverviewPage_GeneralInfo);
fModel.getDescriptorModel().addListener(
new IDescriptorChangeListener() {
public void descriptorChanged(final ChangeEvent event) {
if (section == null || section.isDisposed()) {
return;
}
Display.getDefault().asyncExec(new Runnable() {
public void run() {
boolean libEnabled = false;
switch (fModel.getDescriptorModel().getType()) {
case LIBRARY:
section.setDescription(Messages.OverviewPage_GeneralInfoDescrLibrary);
libEnabled = true;
break;
default:
section.setDescription(Messages.OverviewPage_GeneralInfoDescr);
break;
}
appDir.setEnabled(!libEnabled);
docRoot.setEnabled(!libEnabled);
healthcheck.setEnabled(!libEnabled);
libDir.setEnabled(libEnabled);
updateUrl.setEnabled(libEnabled);
}
});
}
});
Composite sectionClient = toolkit.createComposite(section);
section.setClient(sectionClient);
sectionClient.setLayout(new GridLayout(3, false));
TableWrapData td = new TableWrapData();
td.grabHorizontal = true;
td.rowspan = 2;
section.setLayoutData(td);
name.create(sectionClient, toolkit);
type.create(sectionClient, toolkit);
summary.create(sectionClient, toolkit);
description.create(sectionClient, toolkit);
((GridData) description.getText().getLayoutData()).heightHint = 50;
((GridData) description.getText().getLayoutData()).widthHint = 50;
releaseVersion.create(sectionClient, toolkit);
apiVersion.create(sectionClient, toolkit);
healthcheck.create(sectionClient, toolkit);
libDir.create(sectionClient, toolkit);
updateUrl.create(sectionClient, toolkit);
appDir.create(sectionClient, toolkit);
docRoot.create(sectionClient, toolkit);
license.create(sectionClient, toolkit);
icon.create(sectionClient, toolkit);
switch (fModel.getDescriptorModel().getType()) {
case LIBRARY:
appDir.setEnabled(false);
docRoot.setEnabled(false);
healthcheck.setEnabled(false);
section.setDescription(Messages.OverviewPage_GeneralInfoDescrLibrary);
break;
default:
libDir.setEnabled(false);
updateUrl.setEnabled(false);
section.setDescription(Messages.OverviewPage_GeneralInfoDescr);
break;
}
toolkit.paintBordersFor(sectionClient);
}
protected void handleLinkClick(Object href) {
if (LINK_EXPORT.equals(href)) {
new ExportApplicationAction(editor.getProject()).run();
} else if (href instanceof String) {
editor.setActivePage((String) href);
}
}
@Override
public void setActive(boolean active) {
super.setActive(active);
if (active) {
refresh();
}
}
@Override
public void setFocus() {
name.setFocus();
}
public void refresh() {
name.refresh();
type.refresh();
summary.refresh();
description.refresh();
releaseVersion.refresh();
apiVersion.refresh();
healthcheck.refresh();
license.refresh();
icon.refresh();
docRoot.refresh();
libDir.refresh();
updateUrl.refresh();
appDir.refresh();
persistent.refresh();
}
@Override
protected String getHelpResource() {
return HelpContextIds.OVERVIEW_TAB;
}
private void resolveContributions(final Composite sectionClient,
ProjectType currentType) {
if (currentType == ProjectType.UNKNOWN) {
currentType = ProjectType.APPLICATION;
}
List<ITestingSectionContribution> contributions = getTestingContributions();
for (ITestingSectionContribution c : contributions) {
ContributionControl control = new ContributionControl(
c.getCommand(), c.getMode(), c.getLabel(), c.getIcon(), c.getType());
Control link = control.createControl(sectionClient);
setControlVisibility(link, c.getType() == currentType);
}
}
private void setControlVisibility(Control control, boolean show) {
control.setVisible(show);
GridData data = (GridData) control.getLayoutData();
if (data == null) {
data = new GridData();
control.setLayoutData(data);
}
data.exclude = !show;
}
private String getPersistentResourcePath(String resourcePath) {
String applicationDir = editor.getModel().getApplicationDir();
return applicationDir.concat(String.valueOf(IPath.SEPARATOR)).concat(resourcePath);
}
private String getResourcePath(String persistentResourcePath) {
String applicationDir = editor.getModel().getApplicationDir();
if(applicationDir == null)
return persistentResourcePath;
IPath path = new Path(persistentResourcePath);
String firstSegment = path.segment(0);
if(applicationDir.equalsIgnoreCase(firstSegment))
return path.removeFirstSegments(1).toString();
return persistentResourcePath;
}
}