package bndtools.editor.workspace; import java.text.MessageFormat; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import aQute.bnd.header.Attrs; import aQute.bnd.osgi.Constants; public class PluginPropertiesPage extends WizardPage { private IConfigurationElement configElement; private Attrs properties = new Attrs(); private boolean changed = false; private Composite mainComposite; private Composite fieldContainer; private Text txtPath; public PluginPropertiesPage() { super("pluginProperties"); } public void createControl(Composite parent) { setTitle("Plug-in Configuration"); setDescription("Set configuration properties for the plug-in."); // Create controls mainComposite = new Composite(parent, SWT.NONE); Group group = new Group(mainComposite, SWT.NONE); group.setText("Properties"); group.setLayout(new FillLayout()); ScrolledComposite scroller = new ScrolledComposite(group, SWT.V_SCROLL); fieldContainer = new Composite(scroller, SWT.NONE); scroller.setMinSize(200, 200); scroller.setExpandVertical(true); scroller.setExpandHorizontal(true); scroller.setContent(fieldContainer); Label separator = new Label(mainComposite, SWT.SEPARATOR | SWT.HORIZONTAL); Composite classpathComposite = new Composite(mainComposite, SWT.NONE); new Label(classpathComposite, SWT.NONE).setText("Classpath:"); txtPath = new Text(classpathComposite, SWT.BORDER); resetPropertyFields(); String path = properties.get(Constants.PATH_DIRECTIVE); if (path != null) txtPath.setText(path); txtPath.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { String path = txtPath.getText(); if (path == null || path.length() == 0) properties.remove(Constants.PATH_DIRECTIVE); else properties.put(Constants.PATH_DIRECTIVE, path); changed = true; } }); // Layout GridLayout layout; GridData gd; layout = new GridLayout(1, false); mainComposite.setLayout(layout); gd = new GridData(SWT.FILL, SWT.FILL, true, true); group.setLayoutData(gd); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); separator.setLayoutData(gd); gd = new GridData(SWT.FILL, SWT.FILL, true, false); classpathComposite.setLayoutData(gd); layout = new GridLayout(2, false); layout.verticalSpacing = 10; layout.horizontalSpacing = 10; fieldContainer.setLayout(layout); layout = new GridLayout(2, false); classpathComposite.setLayout(layout); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); txtPath.setLayoutData(gd); setControl(mainComposite); } void resetPropertyFields() { // Remove existing controls Control[] children = fieldContainer.getChildren(); for (Control child : children) child.dispose(); // Add new ones if (configElement != null) { IConfigurationElement[] propertyElements = configElement.getChildren("property"); String path = configElement.getAttribute("path"); String className = configElement.getAttribute("class"); String summaryMessage = MessageFormat.format("Found {0,choice,0#no properties|1#one property|1<{0} properties} for plug-in class {1}.", propertyElements.length, className); if (path != null) { properties.put(Constants.PATH_DIRECTIVE, path); txtPath.setText(path); } for (IConfigurationElement propertyElement : propertyElements) { final String name = propertyElement.getAttribute("name"); String value = properties.get(name); String propertyType = propertyElement.getAttribute("type"); String defaultStr = propertyElement.getAttribute("default"); if (value == null && defaultStr != null) { value = defaultStr; properties.put(name, defaultStr); } Label label = new Label(fieldContainer, SWT.NONE); label.setText(name); if ("boolean".equals(propertyType)) { final Button button = new Button(fieldContainer, SWT.CHECK); button.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false)); button.setSelection("true".equalsIgnoreCase(value)); button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { properties.put(name, button.getSelection() ? "true" : "false"); changed = true; } }); } else { final Text text = new Text(fieldContainer, SWT.BORDER); text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); if (value != null) text.setText(value); text.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { String value = text.getText(); if (value == null || value.length() == 0) properties.remove(name); else properties.put(name, value); changed = true; } }); } String description = propertyElement.getAttribute("description"); if (description != null) { ControlDecoration decoration = new ControlDecoration(label, SWT.RIGHT | SWT.CENTER); decoration.setShowHover(true); decoration.setDescriptionText(description); decoration.setImage(FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION).getImage()); } String deprecation = propertyElement.getAttribute("deprecated"); if (deprecation != null) { ControlDecoration decoration = new ControlDecoration(label, SWT.LEFT | SWT.CENTER); decoration.setShowHover(true); decoration.setDescriptionText("Property deprecated: " + deprecation); decoration.setImage(FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_WARNING).getImage()); } } Label summaryLabel = new Label(fieldContainer, SWT.NONE); summaryLabel.setText(summaryMessage); summaryLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); } mainComposite.layout(true, true); } public IConfigurationElement getConfigElement() { return configElement; } public void setConfigElement(IConfigurationElement configElement) { this.configElement = configElement; if (Display.getCurrent() != null && fieldContainer != null && !fieldContainer.isDisposed()) { resetPropertyFields(); } } public void setProperties(Attrs properties) { this.properties = properties; if (Display.getCurrent() != null && fieldContainer != null && !fieldContainer.isDisposed()) { resetPropertyFields(); } } public Attrs getProperties() { return properties; } public boolean isChanged() { return changed; } }