blob: 3299c43ee23b6f9700dce9f814c12f74bd4ca861 [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2009, 2012 SpringSource, a division of VMware, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.virgo.ide.ui.editors;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.pde.core.IBaseModel;
import org.eclipse.pde.core.IModelChangeProvider;
import org.eclipse.pde.core.IModelChangedEvent;
import org.eclipse.pde.core.plugin.IPluginBase;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.eclipse.pde.internal.core.ibundle.IBundle;
import org.eclipse.pde.internal.core.ibundle.IBundleModel;
import org.eclipse.pde.internal.ui.PDEPlugin;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.editor.FormEntryAdapter;
import org.eclipse.pde.internal.ui.editor.FormLayoutFactory;
import org.eclipse.pde.internal.ui.editor.PDEFormPage;
import org.eclipse.pde.internal.ui.editor.PDESection;
import org.eclipse.pde.internal.ui.editor.context.InputContextManager;
import org.eclipse.pde.internal.ui.editor.plugin.BundleInputContext;
import org.eclipse.pde.internal.ui.editor.plugin.ManifestEditor;
import org.eclipse.pde.internal.ui.editor.validation.ControlValidationUtility;
import org.eclipse.pde.internal.ui.editor.validation.TextValidator;
import org.eclipse.pde.internal.ui.parts.FormEntry;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
/**
* This abstract class is essentially a copy of GeneralInfoSection from PDE with visibility increased to "protected" as
* required to re-use this code without unnecessary copying into subclasses. This class should not be further modified
* to keep the separation between PDE and non-PDE code.
*
* @author Christian Dupuis
*/
public abstract class AbstractPdeGeneralInfoSection extends PDESection {
private static String PLATFORM_FILTER = "Eclipse-PlatformFilter"; //$NON-NLS-1$
protected FormEntry fIdEntry;
protected FormEntry fVersionEntry;
protected FormEntry fNameEntry;
protected FormEntry fProviderEntry;
protected FormEntry fPlatformFilterEntry;
protected TextValidator fIdEntryValidator;
protected TextValidator fVersionEntryValidator;
protected TextValidator fNameEntryValidator;
protected TextValidator fProviderEntryValidator;
protected TextValidator fPlatformEntryValidator;
private IPluginModelBase fModel;
public AbstractPdeGeneralInfoSection(PDEFormPage page, Composite parent) {
super(page, parent, Section.DESCRIPTION);
createClient(getSection(), page.getEditor().getToolkit());
}
/*
* (non-Javadoc)
*
* @see org.eclipse.pde.internal.ui.neweditor.PDESection#createClient(org.eclipse.ui.forms.widgets.Section,
* org.eclipse.ui.forms.widgets.FormToolkit)
*/
@Override
protected void createClient(Section section, FormToolkit toolkit) {
section.setText(PDEUIMessages.ManifestEditor_PluginSpecSection_title);
section.setLayout(FormLayoutFactory.createClearTableWrapLayout(false, 1));
TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
section.setLayoutData(data);
section.setDescription(getSectionDescription());
Composite client = toolkit.createComposite(section);
client.setLayout(FormLayoutFactory.createSectionClientTableWrapLayout(false, 3));
section.setClient(client);
IActionBars actionBars = getPage().getPDEEditor().getEditorSite().getActionBars();
createIDEntry(client, toolkit, actionBars);
createVersionEntry(client, toolkit, actionBars);
createNameEntry(client, toolkit, actionBars);
createProviderEntry(client, toolkit, actionBars);
if (isBundle() && ((ManifestEditor) getPage().getEditor()).isEquinox()) {
createPlatformFilterEntry(client, toolkit, actionBars);
}
createSpecificControls(client, toolkit, actionBars);
toolkit.paintBordersFor(client);
addListeners();
}
protected abstract String getSectionDescription();
protected abstract void createSpecificControls(Composite parent, FormToolkit toolkit, IActionBars actionBars);
protected IPluginBase getPluginBase() {
IBaseModel model = getPage().getPDEEditor().getAggregateModel();
return ((IPluginModelBase) model).getPluginBase();
}
/**
* Not using the aggregate model from the form editor because it is a different model instance from the one used by
* the bundle error reporter. Things get out of sync between the form validator and source validator
*
* @return
*/
protected IPluginModelBase getModelBase() {
// Find the model only on the first call
if (this.fModel == null) {
this.fModel = PluginRegistry.findModel(getProject());
}
return this.fModel;
}
protected boolean isBundle() {
return getBundleContext() != null;
}
private BundleInputContext getBundleContext() {
InputContextManager manager = getPage().getPDEEditor().getContextManager();
return (BundleInputContext) manager.findContext(BundleInputContext.CONTEXT_ID);
}
protected IBundle getBundle() {
BundleInputContext context = getBundleContext();
if (context != null) {
IBundleModel model = (IBundleModel) context.getModel();
return model.getBundle();
}
return null;
}
protected void createIDEntry(Composite client, FormToolkit toolkit, IActionBars actionBars) {
this.fIdEntry = new FormEntry(client, toolkit, PDEUIMessages.GeneralInfoSection_id, null, false);
this.fIdEntry.setFormEntryListener(new FormEntryAdapter(this, actionBars) {
@Override
public void textValueChanged(FormEntry entry) {
try {
getPluginBase().setId(entry.getValue());
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}
});
this.fIdEntry.setEditable(isEditable());
// Create validator
this.fIdEntryValidator = new TextValidator(getManagedForm(), this.fIdEntry.getText(), getProject(), true) {
@Override
protected boolean validateControl() {
return validateIdEntry();
}
};
}
/**
* @return
*/
private boolean validateIdEntry() {
// Value must be specified
return ControlValidationUtility.validateRequiredField(this.fIdEntry.getText().getText(), this.fIdEntryValidator, IMessageProvider.ERROR);
}
protected void createVersionEntry(Composite client, FormToolkit toolkit, IActionBars actionBars) {
this.fVersionEntry = new FormEntry(client, toolkit, PDEUIMessages.GeneralInfoSection_version, null, false);
this.fVersionEntry.setFormEntryListener(new FormEntryAdapter(this, actionBars) {
@Override
public void textValueChanged(FormEntry entry) {
try {
getPluginBase().setVersion(entry.getValue());
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}
});
this.fVersionEntry.setEditable(isEditable());
// Create validator
this.fVersionEntryValidator = new TextValidator(getManagedForm(), this.fVersionEntry.getText(), getProject(), true) {
@Override
protected boolean validateControl() {
return validateVersionEntry();
}
};
}
/**
* @return
*/
private boolean validateVersionEntry() {
// Value must be specified
if (ControlValidationUtility.validateRequiredField(this.fVersionEntry.getText().getText(), this.fVersionEntryValidator,
IMessageProvider.ERROR) == false) {
return false;
}
// Value must be a valid version
return ControlValidationUtility.validateVersionField(this.fVersionEntry.getText().getText(), this.fVersionEntryValidator);
}
protected void createNameEntry(Composite client, FormToolkit toolkit, IActionBars actionBars) {
this.fNameEntry = new FormEntry(client, toolkit, PDEUIMessages.GeneralInfoSection_name, null, false);
this.fNameEntry.setFormEntryListener(new FormEntryAdapter(this, actionBars) {
@Override
public void textValueChanged(FormEntry entry) {
try {
getPluginBase().setName(entry.getValue());
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}
});
this.fNameEntry.setEditable(isEditable());
// Create validator
this.fNameEntryValidator = new TextValidator(getManagedForm(), this.fNameEntry.getText(), getProject(), true) {
@Override
protected boolean validateControl() {
return validateNameEntry();
}
};
}
/**
* @return
*/
private boolean validateNameEntry() {
// Value must be specified
if (ControlValidationUtility.validateRequiredField(this.fNameEntry.getText().getText(), this.fNameEntryValidator,
IMessageProvider.ERROR) == false) {
return false;
}
// Value must be externalized
return ControlValidationUtility.validateTranslatableField(this.fNameEntry.getText().getText(), this.fNameEntryValidator, getModelBase(),
getProject());
}
protected void createProviderEntry(Composite client, FormToolkit toolkit, IActionBars actionBars) {
this.fProviderEntry = new FormEntry(client, toolkit, PDEUIMessages.GeneralInfoSection_provider, null, false);
this.fProviderEntry.setFormEntryListener(new FormEntryAdapter(this, actionBars) {
@Override
public void textValueChanged(FormEntry entry) {
try {
getPluginBase().setProviderName(entry.getValue());
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}
});
this.fProviderEntry.setEditable(isEditable());
// Create validator
this.fProviderEntryValidator = new TextValidator(getManagedForm(), this.fProviderEntry.getText(), getProject(), true) {
@Override
protected boolean validateControl() {
return validateProviderEntry();
}
};
}
/**
* @return
*/
private boolean validateProviderEntry() {
// No validation required for an optional field
if (this.fProviderEntry.getText().getText().length() == 0) {
return true;
}
// Value must be externalized
return ControlValidationUtility.validateTranslatableField(this.fProviderEntry.getText().getText(), this.fProviderEntryValidator,
getModelBase(), getProject());
}
private void createPlatformFilterEntry(Composite client, FormToolkit toolkit, IActionBars actionBars) {
this.fPlatformFilterEntry = new FormEntry(client, toolkit, PDEUIMessages.GeneralInfoSection_platformFilter, null, false);
this.fPlatformFilterEntry.setFormEntryListener(new FormEntryAdapter(this, actionBars) {
@Override
public void textValueChanged(FormEntry entry) {
getBundle().setHeader(PLATFORM_FILTER, AbstractPdeGeneralInfoSection.this.fPlatformFilterEntry.getValue());
}
});
this.fPlatformFilterEntry.setEditable(isEditable());
// Create validator
this.fPlatformEntryValidator = new TextValidator(getManagedForm(), this.fPlatformFilterEntry.getText(), getProject(), true) {
@Override
protected boolean validateControl() {
return validatePlatformEntry();
}
};
}
/**
* @return
*/
private boolean validatePlatformEntry() {
// No validation required for an optional field
if (this.fPlatformFilterEntry.getText().getText().length() == 0) {
return true;
}
// Value must match the current environment and contain valid syntax
return ControlValidationUtility.validatePlatformFilterField(this.fPlatformFilterEntry.getText().getText(), this.fPlatformEntryValidator);
}
@Override
public void commit(boolean onSave) {
this.fIdEntry.commit();
this.fVersionEntry.commit();
this.fNameEntry.commit();
this.fProviderEntry.commit();
if (this.fPlatformFilterEntry != null) {
this.fPlatformFilterEntry.commit();
}
super.commit(onSave);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.pde.internal.ui.editor.PDESection#modelChanged(org.eclipse.pde.core.IModelChangedEvent)
*/
@Override
public void modelChanged(IModelChangedEvent e) {
if (e.getChangeType() == IModelChangedEvent.WORLD_CHANGED) {
markStale();
return;
}
refresh();
if (e.getChangeType() == IModelChangedEvent.CHANGE) {
Object obj = e.getChangedObjects()[0];
if (obj instanceof IPluginBase) {
String property = e.getChangedProperty();
if (property != null && property.equals(getPage().getPDEEditor().getTitleProperty())) {
getPage().getPDEEditor().updateTitle();
}
}
}
}
@Override
public void refresh() {
IPluginModelBase model = (IPluginModelBase) getPage().getPDEEditor().getContextManager().getAggregateModel();
IPluginBase pluginBase = model.getPluginBase();
this.fIdEntry.setValue(pluginBase.getId(), true);
this.fNameEntry.setValue(pluginBase.getName(), true);
this.fVersionEntry.setValue(pluginBase.getVersion(), true);
this.fProviderEntry.setValue(pluginBase.getProviderName(), true);
if (this.fPlatformFilterEntry != null) {
IBundle bundle = getBundle();
if (bundle != null) {
this.fPlatformFilterEntry.setValue(bundle.getHeader(PLATFORM_FILTER), true);
}
}
getPage().getPDEEditor().updateTitle();
super.refresh();
}
@Override
public void cancelEdit() {
this.fIdEntry.cancelEdit();
this.fNameEntry.cancelEdit();
this.fVersionEntry.cancelEdit();
this.fProviderEntry.cancelEdit();
if (this.fPlatformFilterEntry != null) {
this.fPlatformFilterEntry.cancelEdit();
}
super.cancelEdit();
}
@Override
public void dispose() {
removeListeners();
super.dispose();
}
protected void removeListeners() {
IBaseModel model = getPage().getModel();
if (model instanceof IModelChangeProvider) {
((IModelChangeProvider) model).removeModelChangedListener(this);
}
}
protected void addListeners() {
IBaseModel model = getPage().getModel();
if (model instanceof IModelChangeProvider) {
((IModelChangeProvider) model).addModelChangedListener(this);
}
}
@Override
public boolean canPaste(Clipboard clipboard) {
Display d = getSection().getDisplay();
return d.getFocusControl() instanceof Text;
}
}