package org.zend.php.zendserver.deployment.ui.editors;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.ScrolledForm;
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.IDescriptorChangeListener;
import org.zend.php.zendserver.deployment.core.descriptor.ProjectType;
import org.zend.php.zendserver.deployment.core.internal.descriptor.Feature;
import org.zend.php.zendserver.deployment.ui.Activator;
import org.zend.php.zendserver.deployment.ui.actions.HelpAction;
import org.zend.php.zendserver.deployment.ui.actions.ToolbarAction;
import org.zend.php.zendserver.deployment.ui.contributions.ITestingSectionContribution;
/**
* Descriptor editor form page, capable of auto-refreshing it's contents and
* handling markers.
*/
public abstract class DescriptorEditorPage extends FormPage {
private static final String TESTING_EXTENSION_POINT = Activator.PLUGIN_ID
+ ".testingSectionContribution"; //$NON-NLS-1$
private FieldsContainer fields = new FieldsContainer();
protected DeploymentDescriptorEditor editor;
public static class FormDecoration {
public String message;
public int severity;
public FormDecoration(String message, int severity) {
this.message = message;
this.severity = severity;
}
}
public DescriptorEditorPage(DeploymentDescriptorEditor editor, String id,
String title) {
super(editor, id, title);
this.editor = editor;
}
@Override
public void setActive(boolean active) {
refresh();
}
public abstract void refresh();
public void showMarkers() {
Map<Feature, FormDecoration> toShow = editor
.getDecorationsForFeatures(fields.keySet());
List<Feature> toRemove = new ArrayList<Feature>(fields.keySet());
toRemove.removeAll(toShow.keySet());
refreshMarkers(toShow, toRemove);
}
private void refreshMarkers(final Map<Feature, FormDecoration> toShow,
final List<Feature> toRemove) {
if ((toShow == null || toShow.size() == 0)
&& (toRemove == null || toRemove.size() == 0)) {
return;
}
getSite().getShell().getDisplay().asyncExec(new Runnable() {
public void run() {
fields.refreshMarkers(toShow, toRemove);
}
});
}
@Override
protected void createFormContent(IManagedForm managedForm) {
super.createFormContent(managedForm);
ScrolledForm form = managedForm.getForm();
managedForm.getToolkit().decorateFormHeading(form.getForm());
form.setText(getTitle());
final IToolBarManager mgr = form.getToolBarManager();
ProjectType type = editor.getModel().getType();
resolveContributions(mgr, type);
mgr.update(true);
editor.getModel().addListener(new IDescriptorChangeListener() {
public void descriptorChanged(ChangeEvent event) {
if (event.feature.equals(DeploymentDescriptorPackage.PKG_TYPE)) {
if (event.newValue != null
&& !event.newValue.equals(event.oldValue)) {
mgr.removeAll();
ProjectType currentType = ProjectType
.byName((String) event.newValue);
resolveContributions(mgr, currentType);
Display.getDefault().asyncExec(new Runnable() {
public void run() {
mgr.update(true);
}
});
}
}
}
});
}
/**
* Override this method to provide help context
*
* @return
*/
protected String getHelpResource() {
return null; // TODO to be assigned
}
protected TextField addField(TextField field) {
return (TextField) fields.add(field);
}
protected ComboField addField(ComboField field) {
return (ComboField) fields.add(field);
}
protected List<ITestingSectionContribution> getTestingContributions() {
IConfigurationElement[] elements = Platform.getExtensionRegistry()
.getConfigurationElementsFor(TESTING_EXTENSION_POINT);
List<ITestingSectionContribution> result = new ArrayList<ITestingSectionContribution>();
for (IConfigurationElement element : elements) {
if ("contribution".equals(element.getName())) { //$NON-NLS-1$
try {
Object listener = element
.createExecutableExtension("class"); //$NON-NLS-1$
if (listener instanceof ITestingSectionContribution) {
result.add((ITestingSectionContribution) listener);
}
} catch (CoreException e) {
Activator.log(e);
}
}
}
return result;
}
private void resolveContributions(final IToolBarManager mgr,
ProjectType currentType) {
if (currentType == ProjectType.UNKNOWN) {
currentType = ProjectType.APPLICATION;
}
List<ITestingSectionContribution> contributions = getTestingContributions();
for (ITestingSectionContribution c : contributions) {
if (c.getType() == currentType) {
Action action = new ToolbarAction(c.getCommand(), c.getMode(),
c.getLabel(), c.getIcon());
mgr.add(action);
}
}
final String helpContextID = getHelpResource();
if (helpContextID != null) {
mgr.add(new HelpAction(helpContextID));
}
}
}