protected CTabFolder bindNestedComplexUnionProperties( final FormToolkit toolkit, Composite parent, final IMessageManager mmng, final Object id, String labelText, String tooltip, ComplexUnionPropertyDescriptor complexProperty) { Class<?> basePropertyType = complexProperty.getPropertyType(); // final CTabFolder bar = new CTabFolder(parent, SWT.TITLE | SWT.BORDER); final CTabFolder bar = new CTabFolder(parent, SWT.BORDER); // section.setTitle(labelText); bar.setToolTipText(tooltip); final UnionTypeValue[] valueTypes = complexProperty.getValueTypes(); final Object[] values = new Object[valueTypes.length]; bar.addSelectionListener( new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { int idx = bar.getSelectionIndex(); if (idx >= 0 && idx < valueTypes.length) { // lets update the model with the value for this tab node.setPropertyValue(id, values[idx]); } } @Override public void widgetDefaultSelected(SelectionEvent e) {} }); Object value = node.getPropertyValue(id); int selectIdx = -1; int idx = 0; for (UnionTypeValue valueType : valueTypes) { Composite composite = new Composite(bar, SWT.NONE); composite.setLayout(new GridLayout(2, false)); CTabItem item = new CTabItem(bar, SWT.BORDER); item.setText(valueType.getId()); item.setControl(composite); Class<?> complexType = valueType.getValueType(); Object tabValue; if (complexType.isInstance(value)) { selectIdx = idx; tabValue = value; } else { tabValue = ObjectHelper.newInstance(complexType); } values[idx++] = tabValue; bindNestedComplexProperties(toolkit, mmng, complexProperty, complexType, composite, tabValue); composite.layout(true, true); } if (selectIdx >= 0) { bar.setSelection(selectIdx); } bar.layout(true, true); return bar; }