package org.bndtools.core.ui.wizards.shared; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import org.bndtools.templating.Template; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.jface.preference.JFacePreferences; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.osgi.service.metatype.AttributeDefinition; import org.osgi.service.metatype.ObjectClassDefinition; import bndtools.Plugin; public class TemplateParamsWizardPage extends WizardPage implements ISkippableWizardPage { private final Set<String> fixedAttribs = new HashSet<>(); private Template template; private Composite container; private Control currentPanel; private boolean skip = false; private final Map<String,String> values = new HashMap<>(); private ObjectClassDefinition ocd; public TemplateParamsWizardPage(String[] fixedAttribs) { super("templateParams"); for (String attrib : fixedAttribs) { this.fixedAttribs.add(attrib); } } @Override public void createControl(Composite parent) { setTitle("Template Parameters"); setImageDescriptor(Plugin.imageDescriptorFromPlugin("icons/bndtools-wizban.png")); //$NON-NLS-1$ container = new Composite(parent, SWT.NONE); setControl(container); container.setLayout(new GridLayout(1, false)); updateUI(); } public void setTemplate(Template template) { this.template = template; this.values.clear(); if (container != null && !container.isDisposed()) updateUI(); } void updateUI() { if (currentPanel != null && !currentPanel.isDisposed()) { currentPanel.dispose(); currentPanel = null; } Composite panel = new Composite(container, SWT.NONE); panel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); skip = true; if (template == null) { setErrorMessage(null); setMessage("No template is loaded", WARNING); } else { GridLayout layout = new GridLayout(2, false); layout.horizontalSpacing = 15; panel.setLayout(layout); List<Control> fieldControls = new LinkedList<>(); try { ocd = template.getMetadata(); int count = 0; Set<String> requiredIds = new HashSet<>(); for (AttributeDefinition ad : ocd.getAttributeDefinitions(ObjectClassDefinition.REQUIRED)) { requiredIds.add(ad.getID()); } AttributeDefinition[] ads = ocd.getAttributeDefinitions(ObjectClassDefinition.ALL); for (AttributeDefinition ad : ads) { String attrib = ad.getID(); if (!fixedAttribs.contains(attrib)) { Label label = new Label(panel, SWT.NONE); String labelText = ad.getID(); if (requiredIds.contains(ad.getID())) { label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT)); } label.setText(labelText); Control fieldControl = createFieldControl(panel, ad); fieldControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); fieldControls.add(fieldControl); skip = false; count++; } } if (count == 0) { setMessage("No editable parameters for template: " + ocd.getName(), INFORMATION); } else { setMessage("Edit parameters for template: " + ocd.getDescription(), INFORMATION); } setErrorMessage(null); } catch (Exception e) { setErrorMessage("Error loading template metadata: " + e.getMessage()); for (Control fieldControl : fieldControls) { fieldControl.setEnabled(false); } } } currentPanel = panel; container.layout(true, true); updateValidation(); } private void updateValidation() { boolean complete = true; // Check required attribs AttributeDefinition[] ads = ocd != null ? ocd.getAttributeDefinitions(ObjectClassDefinition.REQUIRED) : new AttributeDefinition[0]; for (AttributeDefinition ad : ads) { // Skip attribs provided the wizard if (fixedAttribs.contains(ad.getID())) continue; String value = values.get(ad.getID()); if (value == null || value.trim().isEmpty()) { complete = false; break; } } // Validate values // TODO setPageComplete(complete); } private Control createFieldControl(Composite parent, final AttributeDefinition ad) { switch (ad.getType()) { case AttributeDefinition.STRING : case AttributeDefinition.INTEGER : final Text text = new Text(parent, SWT.BORDER); if (ad.getName() != null) text.setMessage(ad.getName()); if (ad.getDescription() != null) { ControlDecoration decor = new ControlDecoration(text, SWT.LEFT, parent); decor.setImage(FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION).getImage()); decor.setShowHover(true); decor.setDescriptionText(ad.getDescription()); decor.setMarginWidth(5); } String[] defaultValue = ad.getDefaultValue(); if (defaultValue != null && defaultValue.length == 1) { text.setText(defaultValue[0]); values.put(ad.getID(), defaultValue[0]); } text.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent ev) { values.put(ad.getID(), text.getText()); updateValidation(); } }); return text; default : Label label = new Label(parent, SWT.NONE); label.setText("<Unknown Attribute Type>"); label.setFont(JFaceResources.getFontRegistry().getItalic(JFaceResources.DEFAULT_FONT)); label.setForeground(JFaceResources.getColorRegistry().get(JFacePreferences.ERROR_COLOR)); return label; } } @Override public boolean shouldSkip() { return skip; } public Map<String,String> getValues() { return values; } }