@Override protected synchronized void onNodeChanged(AbstractNode node) { if (form != null && !form.isDisposed()) { try { form.dispose(); } catch (Exception e) { // ignore any expose exceptions } } form = null; if (parent.isDisposed()) return; parent.setLayout(new GridLayout()); // parent.setLayout(new GridLayout(1, false)); parent.setLayoutData(new GridData(GridData.FILL_BOTH)); form = toolkit.createForm(parent); form.setLayoutData(new GridData(GridData.FILL_BOTH)); form.setText(EditorMessages.propertiesDetailsTitle); toolkit.decorateFormHeading(form); form.getBody().setLayout(new GridLayout(2, false)); Composite sbody = form.getBody(); if (node != null) { final IMessageManager mmng = form.getMessageManager(); form.setText(node.getPatternName()); IPropertyDescriptor idDescriptor = null; IPropertyDescriptor descriptionDescriptor = null; IPropertyDescriptor[] propertyDescriptors = node.getPropertyDescriptors(); for (int i = 0; i < 2; i++) { for (IPropertyDescriptor descriptor : propertyDescriptors) { final Object id = descriptor.getId(); if ("AbstractNode.Id".equals(id)) { idDescriptor = descriptor; } else if (NODE_DESCRIPTION.equals(id)) { descriptionDescriptor = descriptor; } else { String propertyName = getPropertyName(id); boolean mandatory = descriptor instanceof ExpressionPropertyDescriptor || isMandatory(node, propertyName); if ((mandatory && i == 0) || (!mandatory && i == 1)) { createDecoratedTextField(descriptor, toolkit, sbody, mmng); } } } } if (idDescriptor != null || descriptionDescriptor != null) { if (idDescriptor != null) { createDecoratedTextField(idDescriptor, toolkit, sbody, mmng); } if (descriptionDescriptor != null) { createDecoratedTextField(descriptionDescriptor, toolkit, sbody, mmng); } } // ref ECLIPSE-1012: unsaved nodes may be disposed // mmng.update(); } else { form.setText(EditorMessages.propertiesDetailsTitle); } layoutForm(); }