package com.tibco.as.spacebar.ui.wizards.space.def; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.PojoObservables; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.databinding.viewers.ViewersObservables; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Text; import com.tibco.as.util.Property; import com.tibco.as.spacebar.ui.SpaceBarPlugin; import com.tibco.as.spacebar.ui.model.Space; public class SpaceDefEditor extends Composite { private DataBindingContext bindingContext; private Space space; public SpaceDefEditor(Composite parent, int style, Space newSpace) { super(parent, style); space = newSpace; bindingContext = new DataBindingContext(); setLayout(new GridLayout()); TabFolder folder = new TabFolder(this, SWT.NONE); Map<Property, List<Property>> properties = SpaceBarPlugin.getDefault() .getSpaceDefProperties(); for (Entry<Property, List<Property>> entry : properties.entrySet()) { Property label = entry.getKey(); if ("LabelGeneral".equals(label.getId())) { continue; } String displayName = label.getDisplayName().getValue(); Composite composite = createTab(folder, displayName); for (Property property : entry.getValue()) { createControl(composite, property); } } } private void createControl(Composite parent, Property property) { IObservableValue observeValue = PojoObservables.observeValue(space, getPropertyName(property.getId())); IObservableValue observeWidget = getObserveWidget(parent, property); bindingContext.bindValue(observeWidget, observeValue, null, null); } private String getPropertyName(String id) { if ("TTL".equals(id)) { return id; } return Character.toLowerCase(id.charAt(0)) + id.substring(1); } private IObservableValue getObserveWidget(Composite parent, Property property) { String type = property.getDataType().getValue(); String displayName = property.getDisplayName().getValue(); if ("boolean".equals(type)) { Button button = createButton(parent, displayName); return SWTObservables.observeSelection(button); } else { createLabel(parent, displayName); if ("string".equals(type) || "long".equals(type) || "integer".equals(type)) { Text text = createText(parent); return SWTObservables.observeText(text, SWT.Modify); } else if ("enumeration".equals(type)) { Class<?> enumType = getEnumType(property .getEnumerationJavaClass().getValue()); if (enumType != null) { ComboViewer viewer = createCombo(parent, enumType); return ViewersObservables.observeSingleSelection(viewer); } } } return null; } private Class<?> getEnumType(String value) { int pos = value.lastIndexOf("."); try { return Class.forName(value.substring(0, pos) + "$" + value.substring(pos + 1)); } catch (ClassNotFoundException e) { SpaceBarPlugin.logException(e); return null; } } private Button createButton(Composite group, String text) { Button button = new Button(group, SWT.CHECK | SWT.LEFT); button.setText(text); GridDataFactory.defaultsFor(button).span(2, 1).applyTo(button); return button; } private ComboViewer createCombo(Composite group, Class<?> type) { ComboViewer viewer = new ComboViewer(group, SWT.READ_ONLY); viewer.setContentProvider(ArrayContentProvider.getInstance()); viewer.setInput(type.getEnumConstants()); Combo combo = viewer.getCombo(); GridDataFactory.defaultsFor(combo).applyTo(combo); return viewer; } private void createLabel(Composite group, String text) { new Label(group, SWT.NONE).setText(text); } private Text createText(Composite group) { Text text = new Text(group, SWT.BORDER | SWT.SINGLE); GridDataFactory.defaultsFor(text).applyTo(text); return text; } private Composite createTab(TabFolder folder, String text) { TabItem item = new TabItem(folder, SWT.NONE); item.setText(text); Composite composite = new Composite(folder, SWT.NONE); composite.setLayout(new GridLayout(2, false)); item.setControl(composite); return composite; } }