blob: 95bd02d5cd8bedeaf71c2c43c3119336fc49d133 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.ui.editor.feature;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.pde.core.IModelChangedEvent;
import org.eclipse.pde.core.plugin.IPlugin;
import org.eclipse.pde.core.plugin.IPluginModel;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.eclipse.pde.internal.core.feature.FeatureImport;
import org.eclipse.pde.internal.core.ifeature.IFeature;
import org.eclipse.pde.internal.core.ifeature.IFeatureImport;
import org.eclipse.pde.internal.core.ifeature.IFeatureModel;
import org.eclipse.pde.internal.core.ifeature.IFeatureURL;
import org.eclipse.pde.internal.core.ifeature.IFeatureURLElement;
import org.eclipse.pde.internal.core.util.VersionUtil;
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.PDESection;
import org.eclipse.pde.internal.ui.editor.plugin.ManifestEditor;
import org.eclipse.pde.internal.ui.parts.FormEntry;
import org.eclipse.pde.internal.ui.util.SWTUtil;
import org.eclipse.pde.internal.ui.wizards.PluginSelectionDialog;
import org.eclipse.pde.internal.ui.wizards.plugin.NewPluginProjectWizard;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.RTFTransfer;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
public class FeatureSpecSection extends PDESection {
private FormEntry fIdText;
private FormEntry fTitleText;
private FormEntry fVersionText;
private FormEntry fProviderText;
private FormEntry fPluginText;
private FormEntry fUpdateSiteNameText;
private FormEntry fUpdateSiteUrlText;
private FormEntry fPatchedIdText;
private FormEntry fPatchedVersionText;
private boolean fPatch = false;
public FeatureSpecSection(FeatureFormPage page, Composite parent) {
super(page, parent, Section.DESCRIPTION);
getSection().setText(PDEUIMessages.FeatureEditor_SpecSection_title);
createClient(getSection(), page.getManagedForm().getToolkit());
}
public void commit(boolean onSave) {
fTitleText.commit();
fProviderText.commit();
fIdText.commit();
fPluginText.commit();
fVersionText.commit();
if (fPatchedIdText != null) {
fPatchedIdText.commit();
fPatchedVersionText.commit();
}
fUpdateSiteUrlText.commit();
fUpdateSiteNameText.commit();
super.commit(onSave);
}
private void commitSiteUrl(String value) {
IFeatureModel model = (IFeatureModel) getPage().getModel();
IFeature feature = model.getFeature();
IFeatureURL urlElement = feature.getURL();
if (urlElement == null) {
urlElement = model.getFactory().createURL();
try {
feature.setURL(urlElement);
} catch (CoreException e) {
return;
}
}
try {
IFeatureURLElement updateElement = urlElement.getUpdate();
if (value.length() > 0) {
URL siteUrl = new URL(value);
if (updateElement == null) {
// element needed, create it
updateElement = model.getFactory().createURLElement(
urlElement, IFeatureURLElement.UPDATE);
updateElement.setURL(siteUrl);
urlElement.setUpdate(updateElement);
} else {
updateElement.setURL(siteUrl);
}
} else {
if (updateElement == null) {
// do nothing
} else {
if (updateElement.getLabel() != null
&& updateElement.getLabel().length() > 0) {
updateElement.setURL(null);
} else {
// element not needed, remove it
urlElement.setUpdate(null);
}
}
}
} catch (CoreException e) {
PDEPlugin.logException(e);
} catch (MalformedURLException e) {
PDEPlugin.logException(e);
}
}
private void commitSiteName(String value) {
IFeatureModel model = (IFeatureModel) getPage().getModel();
IFeature feature = model.getFeature();
IFeatureURL urlElement = feature.getURL();
if (urlElement == null) {
urlElement = model.getFactory().createURL();
try {
feature.setURL(urlElement);
} catch (CoreException e) {
return;
}
}
try {
IFeatureURLElement updateElement = urlElement.getUpdate();
if (value.length() > 0) {
if (updateElement == null) {
// element needed, create it
updateElement = model.getFactory().createURLElement(
urlElement, IFeatureURLElement.UPDATE);
updateElement.setLabel(value);
// URL not set, so element will be flagged during validation
urlElement.setUpdate(updateElement);
} else {
updateElement.setLabel(value);
}
} else {
if (updateElement == null) {
// do nothing
} else {
if (updateElement.getURL() != null) {
updateElement.setLabel(null);
} else {
// element not needed, remove it
urlElement.setUpdate(null);
}
}
}
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}
/**
* Obtains or creates a feature import with patch="true"
*
* @return
*/
private IFeatureImport getPatchedFeature() {
IFeatureModel model = (IFeatureModel) getPage().getModel();
IFeature feature = model.getFeature();
IFeatureImport[] imports = feature.getImports();
for (int i = 0; i < imports.length; i++) {
if (imports[i].isPatch()) {
return imports[i];
}
}
// need to recreate the import element
FeatureImport fimport = (FeatureImport) model.getFactory()
.createImport();
try {
fimport.setType(IFeatureImport.FEATURE);
fimport.setPatch(true);
feature.addImports(new IFeatureImport[] { fimport });
} catch (CoreException ce) {
PDEPlugin.logException(ce);
}
return null;
}
private boolean isPatch() {
return fPatch;
}
public void createClient(Section section, FormToolkit toolkit) {
section.setLayout(FormLayoutFactory.createClearTableWrapLayout(false, 1));
TableWrapData twd = new TableWrapData();
twd.grabHorizontal = true;
section.setLayoutData(twd);
fPatch = ((FeatureEditor) getPage().getEditor()).isPatchEditor();
final IFeatureModel model = (IFeatureModel) getPage().getModel();
final IFeature feature = model.getFeature();
if(isPatch()){
getSection().setDescription(
PDEUIMessages.FeatureEditor_SpecSection_desc_patch);
}else{
getSection().setDescription(
PDEUIMessages.FeatureEditor_SpecSection_desc);
}
Composite container = toolkit.createComposite(section);
container.setLayout(FormLayoutFactory.createSectionClientGridLayout(false, 3));
container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fIdText = new FormEntry(container, toolkit, PDEUIMessages.FeatureEditor_SpecSection_id, null, false);
fIdText.setFormEntryListener(new FormEntryAdapter(this) {
public void textValueChanged(FormEntry text) {
try {
feature.setId(text.getValue());
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}
});
fVersionText = new FormEntry(container, toolkit, PDEUIMessages.FeatureEditor_SpecSection_version, null, false);
fVersionText.setFormEntryListener(new FormEntryAdapter(this) {
public void textValueChanged(FormEntry text) {
if (verifySetVersion(feature, text.getValue()) == false) {
warnBadVersionFormat(text.getValue());
text.setValue(feature.getVersion());
}
}
});
fTitleText = new FormEntry(container, toolkit, PDEUIMessages.FeatureEditor_SpecSection_name, null, false);
fTitleText.setFormEntryListener(new FormEntryAdapter(this) {
public void textValueChanged(FormEntry text) {
try {
feature.setLabel(text.getValue());
} catch (CoreException e) {
PDEPlugin.logException(e);
}
getPage().getManagedForm().getForm().setText(
model.getResourceString(feature.getLabel()));
((FeatureEditor) getPage().getEditor()).updateTitle();
}
});
fProviderText = new FormEntry(container, toolkit, PDEUIMessages.FeatureEditor_SpecSection_provider, null, false);
fProviderText.setFormEntryListener(new FormEntryAdapter(this) {
public void textValueChanged(FormEntry text) {
try {
String value = text.getValue();
feature
.setProviderName((value.length() > 0 ? value : null));
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}
});
fPluginText = new FormEntry(container, toolkit, PDEUIMessages.FeatureEditor_SpecSection_plugin, PDEUIMessages.GeneralInfoSection_browse,
isEditable());
fPluginText.setFormEntryListener(new FormEntryAdapter(this) {
public void textValueChanged(FormEntry text) {
try {
String value = text.getValue();
feature.setPlugin((value.length() > 0 ? value : null));
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}
public void linkActivated(HyperlinkEvent e) {
String plugin = fPluginText.getValue();
if (PluginRegistry.findModel(plugin) == null) {
createFeaturePlugin();
}
ManifestEditor.openPluginEditor(fPluginText.getValue());
}
public void browseButtonSelected(FormEntry entry) {
handleOpenDialog();
}
private void createFeaturePlugin() {
NewPluginProjectWizard wizard = new NewPluginProjectWizard();
WizardDialog dialog = new WizardDialog(PDEPlugin
.getActiveWorkbenchShell(), wizard);
dialog.create();
SWTUtil.setDialogSize(dialog, 400, 500);
if (dialog.open() == Window.OK) {
String plugin = wizard.getPluginId();
try {
feature.setPlugin(plugin);
fPluginText.setValue(plugin, false);
} catch (CoreException ce) {
PDEPlugin.logException(ce);
}
}
}
});
if (isPatch()) {
fPatchedIdText = new FormEntry(container, toolkit, PDEUIMessages.FeatureEditor_SpecSection_patchedId, null, false);
fPatchedIdText.setFormEntryListener(new FormEntryAdapter(this) {
public void textValueChanged(FormEntry text) {
try {
IFeatureImport patchImport = getPatchedFeature();
if (patchImport != null) {
patchImport.setId(text.getValue());
}
} catch (CoreException e) {
PDEPlugin.logException(e);
}
}
});
fPatchedVersionText = new FormEntry(container, toolkit, PDEUIMessages.FeatureEditor_SpecSection_patchedVersion, null, false);
fPatchedVersionText
.setFormEntryListener(new FormEntryAdapter(this) {
public void textValueChanged(FormEntry text) {
IFeatureImport patchImport = getPatchedFeature();
if (patchImport != null) {
if (verifySetVersion(patchImport, text
.getValue()) == false) {
warnBadVersionFormat(text.getValue());
text.setValue(patchImport.getVersion());
}
}
}
});
}
fUpdateSiteUrlText = new FormEntry(container, toolkit, PDEUIMessages.FeatureEditor_SpecSection_updateUrl, null, false);
fUpdateSiteUrlText.setFormEntryListener(new FormEntryAdapter(this) {
public void textValueChanged(FormEntry text) {
String url = text.getValue() != null ? text.getValue() : ""; //$NON-NLS-1$
if (url.length() > 0 && !verifySiteUrl(feature, url)) {
warnBadUrl(url);
setUpdateSiteUrlText();
} else {
commitSiteUrl(url);
}
}
});
fUpdateSiteNameText = new FormEntry(container, toolkit, PDEUIMessages.FeatureEditor_SpecSection_updateUrlLabel, null, false);
fUpdateSiteNameText.setFormEntryListener(new FormEntryAdapter(this) {
public void textValueChanged(FormEntry text) {
String name = text.getValue() != null ? text.getValue() : ""; //$NON-NLS-1$
commitSiteName(name);
}
});
GridData gd = (GridData) fIdText.getText().getLayoutData();
gd.widthHint = 150;
toolkit.paintBordersFor(container);
section.setClient(container);
initialize();
}
private boolean verifySetVersion(IFeature feature, String value) {
try {
if (VersionUtil.validateVersion(value).isOK())
feature.setVersion(value);
} catch (Exception e) {
return false;
}
return true;
}
private boolean verifySetVersion(IFeatureImport featureImport, String value) {
try {
if (VersionUtil.validateVersion(value).isOK())
featureImport.setVersion(value);
} catch (Exception e) {
return false;
}
return true;
}
private boolean verifySiteUrl(IFeature feature, String value) {
try {
new URL(value);
} catch (MalformedURLException e) {
return false;
}
return true;
}
private void warnBadVersionFormat(String text) {
MessageDialog.openError(PDEPlugin.getActiveWorkbenchShell(), PDEUIMessages.FeatureEditor_SpecSection_badVersionTitle, PDEUIMessages.FeatureEditor_SpecSection_badVersionMessage);
}
private void warnBadUrl(String text) {
MessageDialog.openError(PDEPlugin.getActiveWorkbenchShell(), PDEUIMessages.FeatureEditor_SpecSection_badUrlTitle, PDEUIMessages.FeatureEditor_SpecSection_badUrlMessage);
}
public void dispose() {
IFeatureModel model = (IFeatureModel) getPage().getModel();
if (model != null)
model.removeModelChangedListener(this);
super.dispose();
}
public void initialize() {
IFeatureModel model = (IFeatureModel) getPage().getModel();
refresh();
if (!model.isEditable()) {
fIdText.getText().setEditable(false);
fTitleText.getText().setEditable(false);
fVersionText.getText().setEditable(false);
fProviderText.getText().setEditable(false);
fPluginText.getText().setEditable(false);
if (isPatch()) {
fPatchedIdText.getText().setEditable(false);
fPatchedVersionText.getText().setEditable(false);
}
fUpdateSiteUrlText.getText().setEditable(false);
fUpdateSiteNameText.getText().setEditable(false);
}
model.addModelChangedListener(this);
}
public void modelChanged(IModelChangedEvent e) {
if (e.getChangeType() == IModelChangedEvent.WORLD_CHANGED) {
markStale();
return;
}
if (e.getChangeType() == IModelChangedEvent.CHANGE) {
Object objs[] = e.getChangedObjects();
if (objs.length > 0 && objs[0] instanceof IFeature) {
markStale();
}
}
if (e.getChangeType() == IModelChangedEvent.CHANGE) {
Object objs[] = e.getChangedObjects();
if (objs.length > 0 && objs[0] instanceof IFeatureURL) {
markStale();
}
}
Object objs[] = e.getChangedObjects();
if (objs.length > 0 && objs[0] instanceof IFeatureURLElement) {
markStale();
}
if (isPatch() && objs.length > 0 && objs[0] instanceof IFeatureImport) {
markStale();
}
}
public void setFocus() {
if (fIdText != null)
fIdText.getText().setFocus();
}
private void setIfDefined(FormEntry formText, String value) {
if (value != null) {
formText.setValue(value, true);
}
}
public void refresh() {
IFeatureModel model = (IFeatureModel) getPage().getModel();
IFeature feature = model.getFeature();
setIfDefined(fIdText, feature.getId());
setIfDefined(fTitleText, feature.getLabel());
getPage().getManagedForm().getForm().setText(
model.getResourceString(feature.getLabel()));
setIfDefined(fVersionText, feature.getVersion());
setIfDefined(fProviderText, feature.getProviderName());
setIfDefined(fPluginText, feature.getPlugin());
if (isPatch()) {
IFeatureImport featureImport = getPatchedFeature();
if (featureImport != null) {
fPatchedIdText.setValue(
featureImport.getId() != null ? featureImport.getId()
: "", true); //$NON-NLS-1$
fPatchedVersionText.setValue(
featureImport.getVersion() != null ? featureImport
.getVersion() : "", true); //$NON-NLS-1$
} else {
fPatchedIdText.setValue("", true); //$NON-NLS-1$
fPatchedVersionText.setValue("", true); //$NON-NLS-1$
}
}
setUpdateSiteUrlText();
setUpdateSiteNameText();
super.refresh();
}
private void setUpdateSiteUrlText() {
IFeatureModel model = (IFeatureModel) getPage().getModel();
IFeature feature = model.getFeature();
String updateSiteUrl = ""; //$NON-NLS-1$
IFeatureURL featureUrl = feature.getURL();
if (featureUrl != null) {
IFeatureURLElement urlElement = featureUrl.getUpdate();
if (urlElement != null) {
updateSiteUrl = urlElement.getURL() != null ? urlElement
.getURL().toExternalForm() : null;
}
}
fUpdateSiteUrlText.setValue(updateSiteUrl != null ? updateSiteUrl : "", //$NON-NLS-1$
true);
}
private void setUpdateSiteNameText() {
IFeatureModel model = (IFeatureModel) getPage().getModel();
IFeature feature = model.getFeature();
String updateSiteLabel = ""; //$NON-NLS-1$
IFeatureURL featureUrl = feature.getURL();
if (featureUrl != null) {
IFeatureURLElement urlElement = featureUrl.getUpdate();
if (urlElement != null) {
updateSiteLabel = urlElement.getLabel();
}
}
fUpdateSiteNameText.setValue(updateSiteLabel != null ? updateSiteLabel
: "", true); //$NON-NLS-1$
}
public void cancelEdit() {
fIdText.cancelEdit();
fTitleText.cancelEdit();
fVersionText.cancelEdit();
fProviderText.cancelEdit();
fPluginText.cancelEdit();
if (isPatch()) {
fPatchedIdText.cancelEdit();
fPatchedVersionText.cancelEdit();
}
fUpdateSiteNameText.cancelEdit();
fUpdateSiteUrlText.cancelEdit();
super.cancelEdit();
}
/**
* @see org.eclipse.update.ui.forms.internal.FormSection#canPaste(Clipboard)
*/
public boolean canPaste(Clipboard clipboard) {
TransferData[] types = clipboard.getAvailableTypes();
Transfer[] transfers = new Transfer[] { TextTransfer.getInstance(),
RTFTransfer.getInstance() };
for (int i = 0; i < types.length; i++) {
for (int j = 0; j < transfers.length; j++) {
if (transfers[j].isSupportedType(types[i]))
return true;
}
}
return false;
}
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();
fPluginText.setValue(plugin.getId());
}
}
}