modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java | 261 +++++----- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java | 119 +++- 2 files changed, 225 insertions(+), 155 deletions(-)
New commits: commit 2d314c765251509e6a0cf4f075a2f9fad4b8b3bd Author: Ian Springer ian.springer@redhat.com Date: Fri Oct 22 23:07:25 2010 -0400
add support for dynamic/open maps to group config editor; inform user that viewing/editing of list properties is not currently supported for group configs
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java index 163ff47..a46b8bb 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java @@ -128,7 +128,6 @@ import org.rhq.core.domain.configuration.definition.constraint.IntegerRangeConst import org.rhq.core.domain.configuration.definition.constraint.RegexConstraint; import org.rhq.core.domain.resource.ResourceType; import org.rhq.enterprise.gui.coregui.client.CoreGUI; -import org.rhq.enterprise.gui.coregui.client.components.table.PropertyGrid; import org.rhq.enterprise.gui.coregui.client.gwt.ConfigurationGWTServiceAsync; import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository; @@ -406,7 +405,7 @@ public class ConfigurationEditor extends LocatableVLayout { protected VLayout buildStructuredPane() {
LocatableVLayout layout = new LocatableVLayout(extendLocatorId("Structured")); - List<PropertyGroupDefinition> definitions = configurationDefinition.getGroupDefinitions(); + List<PropertyGroupDefinition> groupDefinitions = configurationDefinition.getGroupDefinitions();
final SectionStack sectionStack = new LocatableSectionStack(layout.extendLocatorId("Sections")); sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE); @@ -415,11 +414,11 @@ public class ConfigurationEditor extends LocatableVLayout { sectionStack.setScrollSectionIntoView(true); sectionStack.setOverflow(Overflow.AUTO);
- if (configurationDefinition.getNonGroupedProperties().size() > 0) { + if (!configurationDefinition.getNonGroupedProperties().isEmpty()) { sectionStack.addSection(buildGroupSection(layout.extendLocatorId("NoGroup"), null)); }
- for (PropertyGroupDefinition definition : definitions) { + for (PropertyGroupDefinition definition : groupDefinitions) { // com.allen_sauer.gwt.log.client.Log.info("building: " + definition.getDisplayName()); sectionStack.addSection(buildGroupSection(layout.extendLocatorId(definition.getName()), definition)); } @@ -527,15 +526,14 @@ public class ConfigurationEditor extends LocatableVLayout { form.setColWidths(190, 28, 210);
List<FormItem> fields = new ArrayList<FormItem>(); - addItemsForPropertiesRecursively(locatorId, propertyDefinitions, propertyMap, fields, firePropertyChangedEvents); + addItemsForPropertiesRecursively(locatorId, propertyDefinitions, propertyMap, fields); form.setFields(fields.toArray(new FormItem[fields.size()]));
return form; }
private void addItemsForPropertiesRecursively(String locatorId, Collection<PropertyDefinition> propertyDefinitions, - AbstractPropertyMap propertyMap, List<FormItem> fields, - boolean firePropertyChangedEvents) { + AbstractPropertyMap propertyMap, List<FormItem> fields) { boolean odd = true; List<PropertyDefinition> sortedPropertyDefinitions = new ArrayList<PropertyDefinition>(propertyDefinitions); Collections.sort(sortedPropertyDefinitions, new PropertyDefinitionComparator()); @@ -548,7 +546,7 @@ public class ConfigurationEditor extends LocatableVLayout { } } addItemsForPropertyRecursively(locatorId + "_" + propertyDefinition.getName(), propertyDefinition, property, - odd, fields, firePropertyChangedEvents); + odd, fields); odd = !odd; } } @@ -556,7 +554,7 @@ public class ConfigurationEditor extends LocatableVLayout { public void addItemsForPropertyRecursively(String locatorId, PropertyDefinition propertyDefinition, Property property, boolean oddRow, - List<FormItem> fields, final boolean firePropertyChangedEvents) { + List<FormItem> fields) { List<FormItem> fieldsForThisProperty;
if (propertyDefinition instanceof PropertyDefinitionSimple) { @@ -640,8 +638,8 @@ public class ConfigurationEditor extends LocatableVLayout { SpacerItem unsetItem = new SpacerItem(); fields.add(unsetItem);
- CanvasItem listOfSimplesItem = buildListOfSimplesField(locatorId, propertyDefinitionList, propertyList, - oddRow); + CanvasItem listOfSimplesItem = buildListOfSimplesField(locatorId, propertyDefinitionList, propertyList + ); fields.add(listOfSimplesItem);
StaticTextItem descriptionItem = buildDescriptionField(propertyDefinition); @@ -674,7 +672,7 @@ public class ConfigurationEditor extends LocatableVLayout { return fields; }
- private StaticTextItem buildNameItem(PropertyDefinition propertyDefinition) { + protected StaticTextItem buildNameItem(PropertyDefinition propertyDefinition) { StaticTextItem nameItem = new StaticTextItem(); nameItem.setStartRow(true); String title = "<b>" @@ -693,9 +691,9 @@ public class ConfigurationEditor extends LocatableVLayout { return descriptionItem; }
- private void firePropertyChangedEvent(Property property, - PropertyDefinition propertyDefinition, - boolean isValid) { + protected void firePropertyChangedEvent(Property property, + PropertyDefinition propertyDefinition, + boolean isValid) { boolean wasValidBefore = this.invalidPropertyNames.isEmpty(); Property topLevelProperty = getTopLevelProperty(property); if (isValid) { @@ -719,76 +717,31 @@ public class ConfigurationEditor extends LocatableVLayout {
private FormItem buildMapField(String parentLocatorId, PropertyDefinitionMap propertyDefinitionMap, final PropertyMap propertyMap) { - Canvas canvas; - Map<String, PropertyDefinition> memberPropertyDefinitions = propertyDefinitionMap.getPropertyDefinitions(); String locatorId = parentLocatorId + "_" + propertyDefinitionMap.getName(); - if (memberPropertyDefinitions == null || memberPropertyDefinitions.isEmpty()) { - canvas = buildDynamicMapField(locatorId, propertyDefinitionMap, propertyMap); - } else { - canvas = buildStaticMapField(locatorId, propertyDefinitionMap, propertyMap); + boolean isDynamic = isDynamic(propertyDefinitionMap); + if (isDynamic) { + PropertyDefinitionMap propertyDefinitionMapClone = new PropertyDefinitionMap(propertyDefinitionMap.getName(), + propertyDefinitionMap.getDescription(), propertyDefinitionMap.isRequired()); + propertyDefinitionMapClone.setConfigurationDefinition(propertyDefinitionMap.getConfigurationDefinition()); + addMemberPropertyDefinitionsToDynamicPropertyMap(propertyDefinitionMapClone, propertyMap); + propertyDefinitionMap = propertyDefinitionMapClone; } - CanvasItem canvasItem = buildComplexPropertyField(canvas); - canvasItem.setColSpan(3); - canvasItem.setEndRow(true); - - return canvasItem; - } - - private CanvasItem buildComplexPropertyField(Canvas canvas) { - CanvasItem canvasItem = new CanvasItem(); - canvasItem.setCanvas(canvas); - canvasItem.setShowTitle(false); - return canvasItem; - } - - private Canvas buildDynamicMapField(String parentLocatorId, PropertyDefinitionMap propertyDefinitionMap, - final PropertyMap propertyMap) { - Log.debug("Building dynamic map field for " + propertyMap + "..."); - - // create the property grid - final PropertyGrid propertyGrid = new PropertyGrid(); - propertyGrid.getNameField().setName("Name"); - propertyGrid.getValuesField().setName("Value"); - - // create the editors - Map<String, FormItem> editorsMap = new HashMap<String, FormItem>(); - TextItem textEditor = new TextItem(); - editorsMap.put("simpleText", textEditor); - - // set the editors and attribute name where to find the record type - propertyGrid.setEditorsMap("fieldType", editorsMap); + VLayout layout = new VLayout();
- ListGridRecord[] records = new ListGridRecord[propertyMap.getMap().size()]; - int i = 0; - for (Property prop : propertyMap.getMap().values()) { - if (!(prop instanceof PropertySimple)) { - Log.warn("Unsupported Configuration permutation: PropertyMap " + propertyMap - + " contains non-simple member Property " + prop + " - skipping..."); - continue; - } - PropertySimple propSimple = (PropertySimple)prop; - ListGridRecord record = new ListGridRecord(); - String propertyName = prop.getName(); - record.setAttribute("Name", propertyName); - String value = propSimple.getStringValue(); - record.setAttribute("Value", value); - record.setAttribute("fieldType", "simpleText"); - records[i++] = record; - } - propertyGrid.setData(records); - - VLayout canvas = new VLayout(); - canvas.addMember(propertyGrid); + final PropertyDefinitionMap propertyDefinitionMapFinal = propertyDefinitionMap; + Canvas valuesCanvas = buildPropertiesForm(parentLocatorId, propertyDefinitionMapFinal.getPropertyDefinitions().values(), + propertyMap, true); + layout.addMember(valuesCanvas);
- if (!isReadOnly(propertyDefinitionMap, propertyMap)) { + if (isDynamic && !isReadOnly(propertyDefinitionMap, propertyMap)) { // Map is not read-only - add footer with New and Delete buttons to allow user to add or remove members. - ToolStrip footer = new ToolStrip(); - footer.setPadding(5); - footer.setWidth100(); - footer.setMembersMargin(15); - canvas.addMember(footer); + ToolStrip buttonBar = new ToolStrip(); + buttonBar.setPadding(5); + buttonBar.setWidth100(); + buttonBar.setMembersMargin(15); + layout.addMember(buttonBar);
- final IButton deleteButton = new LocatableIButton(extendLocatorId(propertyMap.getName()), "Delete"); + /*final IButton deleteButton = new LocatableIButton(extendLocatorId(propertyMap.getName()), "Delete"); deleteButton.setDisabled(true); deleteButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() { public void onClick(ClickEvent clickEvent) { @@ -815,7 +768,7 @@ public class ConfigurationEditor extends LocatableVLayout { int count = propertyGrid.getSelection().length; deleteButton.setDisabled(count < 1); } - }); + });*/
final IButton newButton = new LocatableIButton(extendLocatorId(propertyMap.getName()), "New"); newButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() { @@ -829,16 +782,11 @@ public class ConfigurationEditor extends LocatableVLayout { + "', because the set already contains a property with that name.", Message.Severity.Error, EnumSet.of(Message.Option.Transient))); } else { - propertyMap.put(new PropertySimple(propertyName, null)); - - ListGridRecord record = new ListGridRecord(); - record.setAttribute("Name", propertyName); - record.setAttribute("Value", ""); - record.setAttribute("fieldType", "simpleText"); + PropertySimple memberPropertySimple = new PropertySimple(propertyName, null); + addPropertyToDynamicMap(memberPropertySimple, propertyMap); + firePropertyChangedEvent(propertyMap, propertyDefinitionMapFinal, true);
- propertyGrid.addData(record); - propertyGrid.focus(); - propertyGrid.enableSpecificEditor(record); + reload();
CoreGUI.getMessageCenter().notify(new Message("Added property to the set.", EnumSet.of( Message.Option.Transient))); @@ -847,33 +795,103 @@ public class ConfigurationEditor extends LocatableVLayout { }); } }); - footer.addMember(newButton); - } + buttonBar.addMember(newButton); + + DynamicForm deleteForm = new DynamicForm(); + deleteForm.setNumCols(3); + buttonBar.addMember(deleteForm); + + final SelectItem selectItem = new SelectItem(); + selectItem.setValueMap(propertyDefinitionMap.getPropertyDefinitions().keySet().toArray( + new String[propertyDefinitionMap.getPropertyDefinitions().size()])); + selectItem.setMultiple(true); + selectItem.setMultipleAppearance(MultipleAppearance.GRID); + selectItem.setTitle("Delete"); + + final ButtonItem okButtonItem = new ButtonItem(); + okButtonItem.setTitle("OK"); + okButtonItem.setDisabled(true); + okButtonItem.setEndRow(true); + okButtonItem.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() { + public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent clickEvent) { + SC.confirm("Are you sure you want to delete the selected properties from the set?", new BooleanCallback() { + @Override + public void execute(Boolean confirmed) { + if (confirmed) { + Object value = selectItem.getValue(); + if (value != null) { + String stringValue = value.toString(); + String[] memberPropertyNames = stringValue.split(","); + for (final String memberPropertyName : memberPropertyNames) { + PropertySimple memberPropertySimple = propertyMap.getSimple(memberPropertyName); + removePropertyFromDynamicMap(memberPropertySimple); + firePropertyChangedEvent(propertyMap, propertyDefinitionMapFinal, true); + } + }
- propertyGrid.addCellSavedHandler(new CellSavedHandler() { - @Override - public void onCellSaved(CellSavedEvent cellSavedEvent) { - Record record = cellSavedEvent.getRecord(); - String propertyName = record.getAttribute("Name"); - PropertySimple prop = propertyMap.getSimple(propertyName); - if (prop == null) { - prop = new PropertySimple(propertyName, null); - propertyMap.put(prop); + reload(); + CoreGUI.getMessageCenter().notify(new Message("Removed properties from the set.", EnumSet.of( + Message.Option.Transient))); + } + } + }); } - String value = record.getAttribute("Value"); - prop.setStringValue(value); - } - }); + });
- return canvas; + selectItem.addChangedHandler(new ChangedHandler() { + @Override + public void onChanged(ChangedEvent changedEvent) { + Object value = changedEvent.getValue(); + if (value != null) { + String stringValue = value.toString(); + String[] memberPropertyNames = stringValue.split(","); + okButtonItem.setDisabled(memberPropertyNames.length == 0); + } + } + }); + + deleteForm.setFields(selectItem, okButtonItem); + } + + CanvasItem canvasItem = buildComplexPropertyField(layout); + canvasItem.setColSpan(3); + canvasItem.setEndRow(true); + + return canvasItem; }
- private Canvas buildStaticMapField(String parentLocatorId, PropertyDefinitionMap propertyDefinitionMap, - PropertyMap propertyMap) { - Log.debug("Building static map field for " + propertyMap + "..."); + protected void addPropertyToDynamicMap(PropertySimple memberPropertySimple, PropertyMap propertyMap) { + memberPropertySimple.setOverride(true); + propertyMap.put(memberPropertySimple); + }
- return buildPropertiesForm(parentLocatorId, propertyDefinitionMap.getPropertyDefinitions().values(), - propertyMap, true); + protected void removePropertyFromDynamicMap(PropertySimple propertySimple) { + PropertyMap parentMap = propertySimple.getParentMap(); + parentMap.getMap().remove(propertySimple.getName()); + } + + private boolean isDynamic(PropertyDefinitionMap propertyDefinitionMap) { + Map<String, PropertyDefinition> memberPropertyDefinitions = propertyDefinitionMap.getPropertyDefinitions(); + return memberPropertyDefinitions == null || memberPropertyDefinitions.isEmpty(); + } + + private void addMemberPropertyDefinitionsToDynamicPropertyMap(PropertyDefinitionMap propertyDefinitionMap, + PropertyMap propertyMap) { + for (String propertyName : propertyMap.getMap().keySet()) { + PropertySimple memberPropertySimple = propertyMap.getSimple(propertyName); + if (memberPropertySimple != null) { + PropertyDefinitionSimple memberPropertyDefinitionSimple = new PropertyDefinitionSimple(propertyName, + null, false, PropertySimpleType.STRING); + propertyDefinitionMap.put(memberPropertyDefinitionSimple); + } + } + } + + private CanvasItem buildComplexPropertyField(Canvas canvas) { + CanvasItem canvasItem = new CanvasItem(); + canvasItem.setCanvas(canvas); + canvasItem.setShowTitle(false); + return canvasItem; }
private CanvasItem buildListOfMapsField(final String locatorId, @@ -1064,7 +1082,7 @@ public class ConfigurationEditor extends LocatableVLayout { }
private CanvasItem buildListOfSimplesField(String locatorId, final PropertyDefinitionList propertyDefinitionList, - final PropertyList propertyList, boolean oddRow) { + final PropertyList propertyList) { Log.debug("Building list-of-simples field for " + propertyList + "...");
LocatableVLayout vLayout = new LocatableVLayout(locatorId); @@ -1369,14 +1387,14 @@ public class ConfigurationEditor extends LocatableVLayout { return currentProperty; }
- protected FormItem buildUnsetItem(PropertyDefinitionSimple propertyDefinition, final PropertySimple property, + protected FormItem buildUnsetItem(final PropertyDefinitionSimple propertyDefinitionSimple, final PropertySimple propertySimple, final FormItem valueItem) { FormItem item; - if (!propertyDefinition.isRequired()) { + if (!propertyDefinitionSimple.isRequired()) { final CheckboxItem unsetItem = new CheckboxItem(); - boolean unset = isUnset(propertyDefinition, property); + boolean unset = isUnset(propertyDefinitionSimple, propertySimple); unsetItem.setValue(unset); - unsetItem.setDisabled(isReadOnly(propertyDefinition, property)); + unsetItem.setDisabled(isReadOnly(propertyDefinitionSimple, propertySimple)); unsetItem.setShowLabel(false); unsetItem.setShowTitle(false); unsetItem.setLabelAsTitle(false); @@ -1387,27 +1405,20 @@ public class ConfigurationEditor extends LocatableVLayout { Boolean isUnset = (Boolean) changeEvent.getValue(); valueItem.setDisabled(isUnset); if (isUnset) { + updatePropertySimpleValue(null, propertySimple, propertyDefinitionSimple); setValue(valueItem, null); } else { valueItem.focusInItem(); } valueItem.redraw(); - property.setValue(valueItem.getValue()); - } - }); - -/* - valueItem.addChangeHandler(new ChangeHandler() { - public void onChange(ChangeEvent changeEvent) { - Object value = changeEvent.getValue(); - unsetItem.setDisabled(value == null); + propertySimple.setValue(valueItem.getValue()); } }); -*/
item = unsetItem; } else { item = new SpacerItem(); + item.setShowTitle(false); } return item; } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java index c2e2eb7..f544ac6 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java @@ -53,6 +53,7 @@ import org.rhq.core.domain.configuration.PropertyMap; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; import org.rhq.core.domain.configuration.definition.PropertyDefinition; +import org.rhq.core.domain.configuration.definition.PropertyDefinitionList; import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -113,6 +114,26 @@ public class GroupConfigurationEditor extends ConfigurationEditor { }
@Override + protected List<FormItem> buildFieldsForPropertyList(String locatorId, PropertyDefinition propertyDefinition, + boolean oddRow, PropertyDefinitionList propertyDefinitionList, + PropertyDefinition memberDefinition, + PropertyList propertyList) { + List<FormItem> fields = new ArrayList<FormItem>(); + + StaticTextItem nameItem = buildNameItem(propertyDefinition); + fields.add(nameItem); + + StaticTextItem staticTextItem = new StaticTextItem(); + staticTextItem.setShowTitle(false); + staticTextItem.setValue("List properties are not currently supported for group configurations."); + staticTextItem.setColSpan(3); + staticTextItem.setEndRow(true); + fields.add(staticTextItem); + + return fields; + } + + @Override protected FormItem buildSimpleField(final PropertyDefinitionSimple propertyDefinitionSimple, final PropertySimple propertySimple) { final FormItem item = super.buildSimpleField(propertyDefinitionSimple, propertySimple); @@ -138,6 +159,7 @@ public class GroupConfigurationEditor extends ConfigurationEditor { return item; }
+ private FormItemIcon buildEditMemberValuesIcon(final PropertyDefinitionSimple propertyDefinitionSimple, final PropertySimple propertySimple, final FormItem dynamicItem) { FormItemIcon icon = new FormItemIcon(); @@ -161,10 +183,9 @@ public class GroupConfigurationEditor extends ConfigurationEditor { private void updateMemberProperties(PropertyDefinitionSimple propertyDefinitionSimple, PropertySimple propertySimple, Object value ) { - for (GroupMemberConfiguration memberConfiguration : memberConfigurations) { + for (GroupMemberConfiguration memberConfiguration : this.memberConfigurations) { Configuration configuration = memberConfiguration.getConfiguration(); - PropertySimple memberPropertySimple = - getPropertySimple(configuration, propertyDefinitionSimple, null); + PropertySimple memberPropertySimple = (PropertySimple)getProperty(configuration, propertySimple, null); memberPropertySimple.setValue(value); } } @@ -173,7 +194,7 @@ public class GroupConfigurationEditor extends ConfigurationEditor { protected FormItem buildUnsetItem(final PropertyDefinitionSimple propertyDefinitionSimple, final PropertySimple propertySimple, final FormItem valueItem) { final FormItem unsetItem = super.buildUnsetItem(propertyDefinitionSimple, propertySimple, valueItem); - if (!isHomogeneous(propertySimple) && isAggregateProperty(propertySimple)) { + if (unsetItem instanceof CheckboxItem && !isHomogeneous(propertySimple) && isAggregateProperty(propertySimple)) { // non-homogeneous aggregate property (i.e. members have mixed values) unsetItem.setValue(false); unsetItem.setDisabled(true); @@ -287,7 +308,8 @@ public class GroupConfigurationEditor extends ConfigurationEditor { memberItem.setDefaultValue(memberName); items.add(memberItem); Configuration configuration = memberConfiguration.getConfiguration(); - PropertySimple memberPropertySimple = getPropertySimple(configuration, propertyDefinitionSimple, index); + PropertySimple memberPropertySimple = + (PropertySimple)getProperty(configuration, aggregatePropertySimple, index); FormItem valueItem = buildSimpleField(propertyDefinitionSimple, memberPropertySimple); valueItems.add(valueItem); valueItemNameToPropertySimpleMap.put(valueItem.getName(), memberPropertySimple); @@ -303,12 +325,15 @@ public class GroupConfigurationEditor extends ConfigurationEditor { okButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() { public void onClick(ClickEvent clickEvent) { boolean valuesHomogeneous = true; + boolean isValid = true; + Object firstValue = valueItems.get(0).getValue(); for (FormItem valueItem : valueItems) { Object value = valueItem.getValue(); if ((value != null && !value.equals(firstValue)) || (value == null && firstValue != null)) { valuesHomogeneous = false; } + isValid = isValid && valueItem.validate(); PropertySimple memberPropertySimple = valueItemNameToPropertySimpleMap.get(valueItem.getName()); memberPropertySimple.setValue(value); memberPropertySimple.setErrorMessage(null); @@ -332,7 +357,6 @@ public class GroupConfigurationEditor extends ConfigurationEditor { aggregateValueItem.setDisabled(false);
aggregateStaticItem.hide(); - } else { aggregatePropertySimple.setValue(null); aggregatePropertySimple.setOverride(false); @@ -342,6 +366,8 @@ public class GroupConfigurationEditor extends ConfigurationEditor { aggregateStaticItem.show(); }
+ firePropertyChangedEvent(aggregatePropertySimple, propertyDefinitionSimple, isValid); + membersForm.markForRedraw(); popup.destroy(); } @@ -406,46 +432,79 @@ public class GroupConfigurationEditor extends ConfigurationEditor { // Update all the member properties. for (GroupMemberConfiguration memberConfiguration : this.memberConfigurations) { Configuration configuration = memberConfiguration.getConfiguration(); - PropertySimple memberPropertySimple = - getPropertySimple(configuration, propertyDefinitionSimple, null); + PropertySimple memberPropertySimple = (PropertySimple)getProperty(configuration, propertySimple, null); memberPropertySimple.setErrorMessage(null); memberPropertySimple.setValue(value); } }
- private PropertySimple getPropertySimple(Configuration configuration, - PropertyDefinitionSimple propertyDefinitionSimple, - Integer index) { - LinkedList<PropertyDefinition> propertyDefinitionHierarchy = new LinkedList<PropertyDefinition>(); - PropertyDefinition currentPropertyDefinition = propertyDefinitionSimple; - propertyDefinitionHierarchy.add(currentPropertyDefinition); + @Override + protected void removePropertyFromDynamicMap(PropertySimple propertySimple) { + // Remove the aggregate property. + super.removePropertyFromDynamicMap(propertySimple); + + // Remove the member properties. + for (GroupMemberConfiguration memberConfiguration : this.memberConfigurations) { + Configuration configuration = memberConfiguration.getConfiguration(); + PropertySimple memberPropertySimple = (PropertySimple)getProperty(configuration, propertySimple, null); + PropertyMap parentMap = memberPropertySimple.getParentMap(); + parentMap.getMap().remove(memberPropertySimple.getName()); + } + } + + @Override + protected void addPropertyToDynamicMap(PropertySimple propertySimple, PropertyMap propertyMap) { + // Add the aggregate property. + super.addPropertyToDynamicMap(propertySimple, propertyMap); + + // Add the member properties. + for (GroupMemberConfiguration memberConfiguration : this.memberConfigurations) { + Configuration configuration = memberConfiguration.getConfiguration(); + // The below call will create the member property and add it to the appropriate parent property in the member config. + PropertySimple memberPropertySimple = (PropertySimple)getProperty(configuration, propertySimple, null); + } + } + + private Property getProperty(Configuration configuration, + Property referenceProperty, + Integer index) { + LinkedList<Property> propertyHierarchy = new LinkedList<Property>(); + Property currentProperty = referenceProperty; + propertyHierarchy.add(currentProperty); do { - if (currentPropertyDefinition.getParentPropertyMapDefinition() != null) { - currentPropertyDefinition = currentPropertyDefinition.getParentPropertyMapDefinition(); - } else if (currentPropertyDefinition.getParentPropertyListDefinition() != null) { - currentPropertyDefinition = currentPropertyDefinition.getParentPropertyListDefinition(); - } else if (currentPropertyDefinition.getConfigurationDefinition() == null) { - throw new IllegalStateException(currentPropertyDefinition + " has no parent."); + if (currentProperty.getParentMap() != null) { + currentProperty = currentProperty.getParentMap(); + } else if (currentProperty.getParentList() != null) { + currentProperty = currentProperty.getParentList(); + } else if (currentProperty.getConfiguration() == null) { + throw new IllegalStateException(currentProperty + " has no parent."); } - propertyDefinitionHierarchy.addFirst(currentPropertyDefinition); + propertyHierarchy.addFirst(currentProperty); } - while (currentPropertyDefinition.getConfigurationDefinition() == null); + while (currentProperty.getConfiguration() == null);
- Property property = configuration.get(propertyDefinitionHierarchy.get(0).getName()); - for (int i = 1, propertyDefinitionHierarchySize = propertyDefinitionHierarchy.size(); - i < propertyDefinitionHierarchySize; i++) { - PropertyDefinition propertyDefinition = propertyDefinitionHierarchy.get(i); + Property property = configuration.get(propertyHierarchy.get(0).getName()); + for (int i = 1, propertyHierarchySize = propertyHierarchy.size(); i < propertyHierarchySize; i++) { + String childPropertyName = propertyHierarchy.get(i).getName(); if (property instanceof PropertyMap) { PropertyMap propertyMap = (PropertyMap)property; - property = propertyMap.get(propertyDefinition.getName()); + property = propertyMap.get(childPropertyName); + if (property == null) { + property = new PropertySimple(childPropertyName, null); + propertyMap.put(property); + } } else if (property instanceof PropertyList) { PropertyList propertyList = (PropertyList)property; - property = propertyList.getList().get(index); + if (index < propertyList.getList().size()) { + property = propertyList.getList().get(index); + } else { + property = new PropertySimple(childPropertyName, null); + propertyList.add(property); + } } }
- PropertySimple propertySimple = (PropertySimple)property; - return propertySimple; + return property; }
private boolean isAggregateProperty(PropertySimple propertySimple) {