blob: 7cccb3ad2d92e784b9865229c613e7be3a4c9698 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Peter Friese <peter.friese@gentleware.com> - bug 199431
*******************************************************************************/
package org.eclipse.pde.internal.ui.editor.plugin;
import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.osgi.util.ManifestElement;
import org.eclipse.pde.core.plugin.*;
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.dialogs.PluginSelectionDialog;
import org.eclipse.pde.internal.ui.editor.FormEntryAdapter;
import org.eclipse.pde.internal.ui.editor.PDEFormPage;
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.ComboPart;
import org.eclipse.pde.internal.ui.parts.FormEntry;
import org.eclipse.pde.internal.ui.util.SWTUtil;
import org.eclipse.pde.internal.ui.wizards.plugin.NewPluginProjectWizard;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
public class FragmentGeneralInfoSection extends GeneralInfoSection {
private FormEntry fPluginIdEntry;
private FormEntry fPluginMinVersionEntry;
private FormEntry fPluginMaxVersionEntry;
private ComboPart fPluginMinVersionBound;
private ComboPart fPluginMaxVersionBound;
private ComboPart fMatchCombo;
private TextValidator fPluginIdValidator;
private TextValidator fPluginMinVersionValidator;
private TextValidator fPluginMaxVersionValidator;
public FragmentGeneralInfoSection(PDEFormPage page, Composite parent) {
super(page, parent);
}
@Override
protected String getSectionDescription() {
return PDEUIMessages.ManifestEditor_PluginSpecSection_fdesc;
}
@Override
protected void createSpecificControls(Composite parent, FormToolkit toolkit, IActionBars actionBars) {
createPluginIdEntry(parent, toolkit, actionBars);
createPluginVersionEntry(parent, toolkit, actionBars);
if (!isBundle())
createMatchCombo(parent, toolkit, actionBars);
createSingleton(parent, toolkit, actionBars, PDEUIMessages.FragmentGeneralInfoSection_singleton);
}
private void createPluginIdEntry(Composite parent, FormToolkit toolkit, IActionBars actionBars) {
fPluginIdEntry = new FormEntry(parent, toolkit, PDEUIMessages.GeneralInfoSection_pluginId, PDEUIMessages.GeneralInfoSection_browse, //
isEditable());
fPluginIdEntry.setFormEntryListener(new FormEntryAdapter(this, actionBars) {
@Override
public void textValueChanged(FormEntry entry) {
try {
((IFragment) getPluginBase()).setPluginId(fPluginIdEntry.getValue());
} catch (CoreException e1) {
PDEPlugin.logException(e1);
}
}
@Override
public void linkActivated(HyperlinkEvent e) {
String plugin = fPluginIdEntry.getValue();
if (!(PluginRegistry.findModel(plugin) instanceof IPluginModel)) {
createFragmentPlugin();
}
ManifestEditor.openPluginEditor(fPluginIdEntry.getValue());
}
@Override
public void browseButtonSelected(FormEntry entry) {
handleOpenDialog();
}
private void createFragmentPlugin() {
NewPluginProjectWizard wizard = new NewPluginProjectWizard("Equinox"); //$NON-NLS-1$
wizard.init(PDEPlugin.getActiveWorkbenchWindow().getWorkbench(), new StructuredSelection());
WizardDialog dialog = new WizardDialog(PDEPlugin.getActiveWorkbenchShell(), wizard);
dialog.create();
SWTUtil.setDialogSize(dialog, 400, 500);
if (dialog.open() == Window.OK) {
String plugin = wizard.getPluginId();
try {
((IFragment) getPluginBase()).setPluginId(plugin);
fPluginIdEntry.setValue(plugin, false);
} catch (CoreException ce) {
PDEPlugin.logException(ce);
}
}
}
});
fPluginIdEntry.setEditable(isEditable());
// Create validator
fPluginIdValidator = new TextValidator(getManagedForm(), fPluginIdEntry.getText(), getProject(), true) {
@Override
protected boolean validateControl() {
return validatePluginId();
}
};
}
private boolean validatePluginId() {
// Validate host plugin
return ControlValidationUtility.validateFragmentHostPluginField(fPluginIdEntry.getText().getText(), fPluginIdValidator, getProject());
}
protected void handleOpenDialog() {
PluginSelectionDialog dialog = new PluginSelectionDialog(getSection().getShell(), false, false);
dialog.create();
if (dialog.open() == Window.OK) {
IPluginModel model = (IPluginModel) dialog.getFirstResult();
IPlugin plugin = model.getPlugin();
try {
((IFragment) getPluginBase()).setPluginId(plugin.getId());
fPluginMinVersionEntry.setValue(plugin.getVersion());
((IFragment) getPluginBase()).setPluginVersion(getVersion());
} catch (CoreException e) {
}
}
}
private void createPluginVersionEntry(Composite client, FormToolkit toolkit, IActionBars actionBars) {
if (isBundle()) {
createBundlePluginVersionEntry(client, toolkit, actionBars);
} else {
createNonBundlePluginVersionEntry(client, toolkit, actionBars);
}
}
private void createBundlePluginVersionEntry(Composite client, FormToolkit toolkit, IActionBars actionBars) {
FormEntryAdapter textListener = new FormEntryAdapter(this, actionBars) {
@Override
public void textValueChanged(FormEntry entry) {
try {
((IFragment) getPluginBase()).setPluginVersion(getVersion());
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}
@Override
public void textDirty(FormEntry entry) {
setFieldsEnabled();
super.textDirty(entry);
}
};
String[] items = new String[] {PDEUIMessages.DependencyPropertiesDialog_comboInclusive, PDEUIMessages.DependencyPropertiesDialog_comboExclusive};
fPluginMinVersionEntry = new FormEntry(client, toolkit, PDEUIMessages.GeneralInfoSection_hostMinVersionRange, 0, 1);
fPluginMinVersionEntry.setFormEntryListener(textListener);
fPluginMinVersionEntry.setEditable(isEditable());
// Create validator
fPluginMinVersionValidator = new TextValidator(getManagedForm(), fPluginMinVersionEntry.getText(), getProject(), true) {
@Override
protected boolean validateControl() {
return validatePluginMinVersion();
}
};
SelectionListener comboListener = widgetSelectedAdapter(event -> {
try {
((IFragment) getPluginBase()).setPluginVersion(getVersion());
} catch (CoreException e) {
PDEPlugin.logException(e);
}
});
fPluginMinVersionBound = new ComboPart();
fPluginMinVersionBound.createControl(client, toolkit, SWT.READ_ONLY);
fPluginMinVersionBound.getControl().setLayoutData(new TableWrapData(TableWrapData.FILL));
fPluginMinVersionBound.setItems(items);
fPluginMinVersionBound.getControl().setEnabled(isEditable());
fPluginMinVersionBound.addSelectionListener(comboListener);
fPluginMaxVersionEntry = new FormEntry(client, toolkit, PDEUIMessages.GeneralInfoSection_hostMaxVersionRange, 0, 1);
fPluginMaxVersionEntry.setFormEntryListener(textListener);
fPluginMaxVersionEntry.setEditable(isEditable());
// Create validator
fPluginMaxVersionValidator = new TextValidator(getManagedForm(), fPluginMaxVersionEntry.getText(), getProject(), true) {
@Override
protected boolean validateControl() {
return validatePluginMaxVersion();
}
};
fPluginMaxVersionBound = new ComboPart();
fPluginMaxVersionBound.createControl(client, toolkit, SWT.READ_ONLY);
fPluginMaxVersionBound.getControl().setLayoutData(new TableWrapData(TableWrapData.FILL));
fPluginMaxVersionBound.setItems(items);
fPluginMaxVersionBound.getControl().setEnabled(isEditable());
fPluginMaxVersionBound.addSelectionListener(comboListener);
}
private boolean validatePluginMaxVersion() {
// No validation required for an optional field
if (fPluginMaxVersionEntry.getText().getText().length() == 0) {
return true;
}
// Value must be a valid version
return ControlValidationUtility.validateVersionField(fPluginMaxVersionEntry.getText().getText(), fPluginMaxVersionValidator);
}
private boolean validatePluginMinVersion() {
// No validation required for an optional field
if (fPluginMinVersionEntry.getText().getText().length() == 0) {
return true;
}
// Value must be a valid version
return ControlValidationUtility.validateVersionField(fPluginMinVersionEntry.getText().getText(), fPluginMinVersionValidator);
}
private void createNonBundlePluginVersionEntry(Composite client, FormToolkit toolkit, IActionBars actionBars) {
fPluginMinVersionEntry = new FormEntry(client, toolkit, PDEUIMessages.GeneralInfoSection_pluginVersion, null, false);
fPluginMinVersionEntry.setFormEntryListener(new FormEntryAdapter(this, actionBars) {
@Override
public void textValueChanged(FormEntry entry) {
try {
((IFragment) getPluginBase()).setPluginVersion(entry.getValue());
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}
});
fPluginMinVersionEntry.setEditable(isEditable());
}
private void createMatchCombo(Composite client, FormToolkit toolkit, IActionBars actionBars) {
Label matchLabel = toolkit.createLabel(client, PDEUIMessages.ManifestEditor_PluginSpecSection_versionMatch);
matchLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
TableWrapData td = new TableWrapData();
td.valign = TableWrapData.MIDDLE;
matchLabel.setLayoutData(td);
fMatchCombo = new ComboPart();
fMatchCombo.createControl(client, toolkit, SWT.READ_ONLY);
td = new TableWrapData(TableWrapData.FILL);
td.colspan = 2;
td.valign = TableWrapData.MIDDLE;
fMatchCombo.getControl().setLayoutData(td);
String[] items = new String[] {"", //$NON-NLS-1$
PDEUIMessages.ManifestEditor_MatchSection_equivalent, PDEUIMessages.ManifestEditor_MatchSection_compatible, PDEUIMessages.ManifestEditor_MatchSection_perfect, PDEUIMessages.ManifestEditor_MatchSection_greater};
fMatchCombo.setItems(items);
fMatchCombo.addSelectionListener(widgetSelectedAdapter(event -> {
int match = fMatchCombo.getSelectionIndex();
try {
((IFragment) getPluginBase()).setRule(match);
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}));
fMatchCombo.getControl().setEnabled(isEditable());
}
@Override
public void commit(boolean onSave) {
fPluginIdEntry.commit();
fPluginMinVersionEntry.commit();
fPluginMaxVersionEntry.commit();
super.commit(onSave);
}
@Override
public void cancelEdit() {
fPluginIdEntry.cancelEdit();
fPluginMinVersionEntry.cancelEdit();
fPluginMaxVersionEntry.cancelEdit();
super.cancelEdit();
}
@Override
public void refresh() {
IPluginModelBase model = (IPluginModelBase) getPage().getModel();
IFragment fragment = (IFragment) model.getPluginBase();
fPluginIdEntry.setValue(fragment.getPluginId(), true);
if (isBundle()) {
refreshVersion();
} else {
fPluginMinVersionEntry.setValue(fragment.getPluginVersion(), true);
}
if (fMatchCombo != null)
fMatchCombo.select(fragment.getRule());
super.refresh();
}
protected String getAttribute(String header, String attribute) {
IBundle bundle = getBundle();
if (bundle == null)
return null;
String value = bundle.getHeader(header);
if (value == null)
return null;
try {
ManifestElement[] elements = ManifestElement.parseHeader(header, value);
if (elements.length > 0)
return elements[0].getAttribute(attribute);
} catch (BundleException e) {
}
return null;
}
private void setFieldsEnabled() {
boolean singleVersion = fPluginMaxVersionEntry.getText().getText().trim().length() == 0;
boolean enabled = fPluginMinVersionEntry.getText().getText().trim().length() != 0;
fPluginMaxVersionEntry.getText().setEnabled(enabled);
fPluginMaxVersionBound.getControl().setEnabled(!singleVersion && enabled && isEditable());
fPluginMinVersionBound.getControl().setEnabled(!singleVersion && isEditable());
}
private String getVersion() {
if (isBundle()) {
if (!fPluginMinVersionEntry.getValue().equals(fPluginMaxVersionEntry.getValue()) && fPluginMaxVersionEntry.getText().getEnabled()) {
if (fPluginMaxVersionEntry.getValue().length() == 0)
return fPluginMinVersionEntry.getValue();
String version;
if (fPluginMinVersionBound.getSelectionIndex() == 0)
version = "["; //$NON-NLS-1$
else
version = "("; //$NON-NLS-1$
version += fPluginMinVersionEntry.getValue() + "," + fPluginMaxVersionEntry.getValue(); //$NON-NLS-1$
if (fPluginMaxVersionBound.getSelectionIndex() == 0)
version += "]"; //$NON-NLS-1$
else
version += ")"; //$NON-NLS-1$
return version;
}
}
return fPluginMinVersionEntry.getValue();
}
private void refreshVersion() {
String version = getAttribute(Constants.FRAGMENT_HOST, Constants.BUNDLE_VERSION_ATTRIBUTE);
if (version == null) {
setVersionFields("", true, "", false); //$NON-NLS-1$ //$NON-NLS-2$
setFieldsEnabled();
return;
}
version = version.trim();
int comInd = version.indexOf(',');
int lastPos = version.length() - 1;
char first = version.charAt(0);
char last = version.charAt(lastPos);
if (comInd == -1) {
setVersionFields(version, true, "", false); //$NON-NLS-1$
} else if ((first == '[' || first == '(') && (last == ']' || last == ')')) {
version = version.substring(1, lastPos);
setVersionFields(version.substring(0, comInd - 1), first == '[', version.substring(comInd), last == ']');
}
setFieldsEnabled();
}
private void setVersionFields(String minVersion, boolean minInclusive, String maxVersion, boolean maxInclusive) {
fPluginMinVersionEntry.setValue(minVersion, true);
fPluginMinVersionBound.select(minInclusive ? 0 : 1);
fPluginMaxVersionEntry.setValue(maxVersion, true);
fPluginMaxVersionBound.select(maxInclusive ? 0 : 1);
}
// added for bug 172675
@Override
protected void addListeners() {
if (isBundle()) {
IBundleModel model = getBundle().getModel();
if (model != null)
model.addModelChangedListener(this);
}
super.addListeners();
}
@Override
protected void removeListeners() {
if (isBundle()) {
IBundleModel model = getBundle().getModel();
if (model != null)
model.removeModelChangedListener(this);
}
super.removeListeners();
}
}