package bndtools.editor.workspace; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Table; import bndtools.Plugin; public class PluginClassSelectionPage extends WizardPage { private final PropertyChangeSupport propSupport = new PropertyChangeSupport(this); private Table table; private TableViewer viewer; // private ScrolledFormText txtDescription; private IConfigurationElement selectedElement; private boolean programmaticChange = false; public PluginClassSelectionPage() { super("pluginClassSelection"); } public void createControl(Composite parent) { setTitle("Plug-in Type"); setDescription("Select from one of the following known plug-in types."); // Create controls Composite composite = new Composite(parent, SWT.NONE); table = new Table(composite, SWT.FULL_SELECTION | SWT.BORDER); viewer = new TableViewer(table); viewer.setContentProvider(ArrayContentProvider.getInstance()); viewer.setSorter(new PluginClassSorter()); viewer.setLabelProvider(new PluginDeclarationLabelProvider()); // txtDescription = new ScrolledFormText(composite, true); // Load data IConfigurationElement[] elements = Platform.getExtensionRegistry().getConfigurationElementsFor(Plugin.PLUGIN_ID, "bndPlugins"); viewer.setInput(elements); // Listeners viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if (!programmaticChange) { try { programmaticChange = true; IStructuredSelection sel = (IStructuredSelection) viewer.getSelection(); setSelectedElement((IConfigurationElement) sel.getFirstElement()); } finally { programmaticChange = false; } } } }); viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { getContainer().showPage(getNextPage()); } }); // Layout GridLayout layout; GridData gd; layout = new GridLayout(1, false); composite.setLayout(layout); gd = new GridData(SWT.FILL, SWT.FILL, true, true); table.setLayoutData(gd); gd = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1); gd.heightHint = 150; // txtDescription.setLayoutData(gd); setControl(composite); } public IConfigurationElement getSelectedElement() { return selectedElement; } public void setSelectedElement(IConfigurationElement selectedElement) { IConfigurationElement old = this.selectedElement; this.selectedElement = selectedElement; if (Display.getCurrent() != null && table != null && !table.isDisposed()) { if (!programmaticChange) { try { programmaticChange = true; if (selectedElement == null) viewer.setSelection(StructuredSelection.EMPTY); else viewer.setSelection(new StructuredSelection(selectedElement), true); } finally { programmaticChange = false; } } // updateDescription(); validate(); getContainer().updateButtons(); } propSupport.firePropertyChange("selectedElement", old, selectedElement); } // private void updateDescription() { // String description = null; // if (selectedElement != null) // description = selectedElement.getValue(); // // if (description == null) // description = ""; // txtDescription.setText(description); // } private void validate() { String warning = null; if (selectedElement != null) { String deprecationMsg = selectedElement.getAttribute("deprecated"); if (deprecationMsg != null) warning = "Plugin is deprecated: " + deprecationMsg; } setMessage(warning, IMessageProvider.WARNING); } @Override public boolean isPageComplete() { return selectedElement != null; } public void addPropertyChangeListener(PropertyChangeListener listener) { propSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propSupport.removePropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propSupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propSupport.removePropertyChangeListener(propertyName, listener); } }