package org.nightlabs.jfire.dynamictrade.admin.ui.editor; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; 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.Display; import org.eclipse.ui.forms.IMessageManager; import org.eclipse.ui.forms.editor.IFormPage; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.nightlabs.base.ui.action.InheritanceAction; import org.nightlabs.base.ui.editor.ToolBarSectionPart; import org.nightlabs.base.ui.entity.editor.EntityEditorUtil; import org.nightlabs.inheritance.FieldMetaData; import org.nightlabs.jfire.base.ui.prop.ValidationUtil; import org.nightlabs.jfire.base.ui.prop.edit.ValidationResultHandler; import org.nightlabs.jfire.base.ui.prop.edit.blockbased.BlockBasedEditor; import org.nightlabs.jfire.base.ui.prop.edit.blockbased.DataBlockEditorChangedEvent; import org.nightlabs.jfire.base.ui.prop.edit.blockbased.DataBlockEditorChangedListener; import org.nightlabs.jfire.base.ui.prop.edit.blockbased.DataBlockGroupEditorChangedEvent; import org.nightlabs.jfire.base.ui.prop.edit.blockbased.IDataBlockGroupEditorChangedListener; import org.nightlabs.jfire.dynamictrade.store.DynamicProductType; import org.nightlabs.jfire.prop.PropertySet; import org.nightlabs.jfire.prop.validation.ValidationResult; /** * Section part utilised by {@link DynamicProductTypePropertySetPage} including action for inheritance of properties. * @author Frederik Loeser <!-- frederik [AT] nightlabs [DOT] de --> */ public class DynamicProductTypePropertiesSection extends ToolBarSectionPart { private static String VALIDATION_RESULT_MESSAGE_KEY = "validationResultMessageKey"; //$NON-NLS-1$ private BlockBasedEditor blockBasedEditor; private Control blockBasedEditorControl; private InheritanceAction inheritanceAction; private DynamicProductType productType; /** * Create an instance of SimpleProductTypePropertiesSection. * @param page * @param parent The parent for this section. * @param sectionType * @param sectionDescriptionText */ public DynamicProductTypePropertiesSection(final IFormPage page, final Composite parent, final int sectionType, final String sectionDescriptionText) { super(page, parent, sectionType, "Title"); //$NON-NLS-1$ inheritanceAction = new InheritanceAction(){ @Override public void run() { inheritPressed(); } }; inheritanceAction.setEnabled(true); getToolBarManager().add(inheritanceAction); updateToolBarManager(); createClient(getSection(), page.getEditor().getToolkit(), sectionDescriptionText); } private void inheritPressed() { FieldMetaData fieldMetaData = productType.getFieldMetaData(DynamicProductType.FieldName.propertySet); fieldMetaData.setValueInherited(inheritanceAction.isChecked()); if (fieldMetaData.isValueInherited()) { // TODO Asynchronously obtain the extended product type and copy the data here to have a preview! } markDirty(); } void setSimpleProductType(final DynamicProductType simpleProductType) { this.productType = simpleProductType; FieldMetaData fieldMetaData = this.productType.getFieldMetaData(DynamicProductType.FieldName.propertySet); inheritanceAction.setChecked(fieldMetaData.isValueInherited() ? true : false); } /* (non-Javadoc) * @see org.eclipse.ui.forms.AbstractFormPart#commit(boolean) */ @Override public void commit(final boolean onSave) { super.commit(onSave); blockBasedEditor.updatePropertySet(); if (blockBasedEditor.getPropertySet() != productType.getPropertySet()) { productType.setPropertySet(blockBasedEditor.getPropertySet()); } } private BlockBasedEditor createBlockBasedEditor() { return new BlockBasedEditor(true); } /** * Create the content for this section. * @param section The section to fill. * @param toolkit The toolkit to use. * @param sectionDescriptionText */ private void createClient(final Section section, final FormToolkit toolkit, final String sectionDescriptionText) { section.setLayout(new GridLayout()); section.setLayoutData(new GridData(GridData.FILL_BOTH)); setSectionDescriptionText(section, sectionDescriptionText); Composite container = EntityEditorUtil.createCompositeClient(toolkit, section, 1); blockBasedEditor = createBlockBasedEditor(); blockBasedEditor.setValidationResultHandler(new ValidationResultHandler() { /** * Used to cache the validation result because MessageManager * updates UI every time which is quite expensive. Marc */ private ValidationResult lastValidationResult = null; private boolean needUpdate(ValidationResult validationResult) { if((lastValidationResult == null && validationResult != null) || (lastValidationResult != null && !lastValidationResult.equals(validationResult))) { lastValidationResult = validationResult; return true; } return false; } @Override public void handleValidationResult(ValidationResult validationResult) { if(!needUpdate(validationResult)) return; IMessageManager messageManager = getManagedForm().getMessageManager(); if (validationResult == null) { messageManager.removeMessage(VALIDATION_RESULT_MESSAGE_KEY); } else { int type = ValidationUtil.getIMessageProviderType(validationResult.getType()); messageManager.addMessage(VALIDATION_RESULT_MESSAGE_KEY, validationResult.getMessage(), null, type); } } }); blockBasedEditorControl = blockBasedEditor.createControl(container, false); blockBasedEditorControl.setLayoutData(new GridData(GridData.FILL_BOTH)); blockBasedEditor.addChangeListener(new DataBlockEditorChangedListener() { public void dataBlockEditorChanged(DataBlockEditorChangedEvent changedEvent) { markDirty(); } }); blockBasedEditor.addAdditionalDataChangedListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { markDirty(); } }); blockBasedEditor.addBlockGroupChangeListener(new IDataBlockGroupEditorChangedListener() { @Override public void dataBlockGroupEditorChanged( DataBlockGroupEditorChangedEvent dataBlockEditorGroupChangedEvent) { markDirty(); } }); } public void setPropertySet(final PropertySet property) { Display.getDefault().asyncExec(new Runnable() { public void run() { if(property == null) return; blockBasedEditor.setPropertySet(property, true); } }); } private void setSectionDescriptionText(final Section section, final String sectionDescriptionText) { if (sectionDescriptionText == null || "".equals(sectionDescriptionText)) //$NON-NLS-1$ return; section.setText(sectionDescriptionText); } }