Creating a State Policy aware dialog
Creating a State Policy aware dialog
Make sure that you have Creating a State Policy extension point in the plugin.
For a Commerce Manager dialog to be State Policies aware, it must extend AbstractPolicyAwareDialog and implement ObjectGuidReceiver.
The dialog must also have a zero-parameter constructor and must be able to perform all persistence operations (retrieve, update, save, etc.) by itself.
The following methods must be implemented:
- getTargetIdentifier
- setObjectGuid
- createDialogContent
- getOkButtonPolicyActionContainer
- refreshLayout
getTargetIdentifier must return the unique identifier that will be used to map Creating a State Policy Contribution to this object.
com.elasticpath.cmclient.catalog/src/main/java/com/elasticpath/cmclient/catalog/dialogs/catalog/VirtualCatalogDialog.java public String getTargetIdentifier() { if (this.virtualCatalog.isPersisted()) { return "virtualCatalogDialogTarget"; //$NON-NLS-1$ } return "virualCatalogDialogEditableTarget"; //$NON-NLS-1$ }
setObjectGuid must be implemented to retrieve the dialog's dependent object from its GUID.
com.elasticpath.cmclient.catalog/src/main/java/com/elasticpath/cmclient/catalog/dialogs/catalog/VirtualCatalogDialog.java public void setObjectGuid(final String objectGuid) { if (objectGuid == null) { virtualCatalog = getBeanFactory().getBean(ContextIdNames.CATALOG); virtualCatalog.setMaster(false); } else { virtualCatalog = catalogService.findByCode(objectGuid); if (virtualCatalog == null) { throw new IllegalArgumentException( NLS.bind(CoreMessages.Given_Object_Not_Exist, new String[] {"Virtual Catalog", objectGuid})); //$NON-NLS-1$ } } }
createDialogContent is responsible for creating and laying out the dialog's UI controls. The first step is usually to add a Policy Action Container. Then use the IPolicyTargetLayoutComposite's add methods to add UI controls. These methods take the PolicyActionContainer object as their final argument. This ensures that a StateChangeTarget is added to the PolicyActionContainer for each UI control that is added to the dialog.
com.elasticpath.cmclient.catalog/src/main/java/com/elasticpath/cmclient/catalog/dialogs/catalog/VirtualCatalogDialog.java protected void createDialogContent(final IPolicyTargetLayoutComposite dialogComposite) { // This name does not need to match anything necessarily readOnlyVirtualCatalogPolicyContainer = addPolicyActionContainer("readOnlyVirtualCatalogDialog"); //$NON-NLS-1$ editableVirtualCatalogPolicyContainer = addPolicyActionContainer("virtualCatalogDialog"); //$NON-NLS-1$ mainPolicyComposite = dialogComposite .addGridLayoutComposite(2, false, dialogComposite .createLayoutData(IEpLayoutData.FILL, IEpLayoutData.BEGINNING, true, false), editableVirtualCatalogPolicyContainer); final IEpLayoutData mainCompositeFieldData = mainPolicyComposite .createLayoutData(IEpLayoutData.FILL, IEpLayoutData.BEGINNING, true, true); final IEpLayoutData mainCompositeLabelData = mainPolicyComposite .createLayoutData(IEpLayoutData.BEGINNING, IEpLayoutData.BEGINNING, false, true); if (isVirtualCatalogPersistent()) { mainPolicyComposite.addLabelBold(CatalogMessages.CatalogSummarySection_CatalogCode, mainCompositeLabelData, readOnlyVirtualCatalogPolicyContainer); this.catalogCode = mainPolicyComposite.addTextField(mainCompositeFieldData, readOnlyVirtualCatalogPolicyContainer); } else { mainPolicyComposite.addLabelBoldRequired(CatalogMessages.CatalogSummarySection_CatalogCode, mainCompositeLabelData, editableVirtualCatalogPolicyContainer); this.catalogCode = mainPolicyComposite.addTextField(mainCompositeFieldData, editableVirtualCatalogPolicyContainer); }
getOkButtonPolicyActionContainer returns the Policy Action Container that will control the state of the dialog's OK or Save button.
com.elasticpath.cmclient.catalog/src/main/java/com/elasticpath/cmclient/catalog/dialogs/catalog/VirtualCatalogDialog.java protected PolicyActionContainer getOkButtonPolicyActionContainer() { return this.editableVirtualCatalogPolicyContainer; }
refreshLayout can be implemented to refresh the layout of parent composites if required.
com.elasticpath.cmclient.catalog/src/main/java/com/elasticpath/cmclient/catalog/dialogs/catalog/VirtualCatalogDialog.java protected void refreshLayout() { if (mainPolicyComposite != null) { mainPolicyComposite.getSwtComposite().layout(); mainPolicyComposite.getSwtComposite().getParent().layout(); } }
Registering the dialog for Change Sets
In order to edit an object from within a Change Sets editor, its dialog must be registered as a Change Set supported component. To do this, edit the plugin's plugin.xml and add a supportedComponents extension point (if one doesn't already exist). Inside the extension point, add a dialog element with a class attribute set to the name of your dialog class and an objectType attribute containing a display name for the dialog. The following example shows the registration for com.elasticpath.cmclient.catalog.dialogs.catalog.VirtualCatalogDialog.
<extension point="com.elasticpath.cmclient.changeset.supportedComponents"> ... <dialog class="com.elasticpath.cmclient.catalog.dialogs.catalog.VirtualCatalogDialog" objectType="Catalog"> </dialog> </extension>