001: package org.osbl.client.wings.form;
002:
003: import org.osbl.client.wings.form.NestedObjectForm;
004: import org.osbl.client.wings.XButton;
005:
006: import java.util.*;
007:
008: public class NodeForm extends NestedObjectForm {
009: private Map<Class, Class<? extends ObjectForm>> formClasses = new HashMap<Class, Class<? extends ObjectForm>>();
010: private Map<String, ObjectForm> nodeForms = new HashMap<String, ObjectForm>();
011: GenericObjectTreeNode node;
012:
013: protected void setNode(
014: GenericObjectTreeEditor genericObjectTreeEditor,
015: GenericObjectTreeNode node) {
016: if (node == null)
017: return;
018:
019: if (nestedForm != null)
020: nestedForm.getEnvironment().setActive(false);
021:
022: String key = node.getObjectType().getSimpleName();
023: nestedForm = nodeForms.get(key);
024:
025: if (nestedForm == null) {
026: Class<? extends ObjectForm> formClass = findForm(node
027: .getObjectType());
028: if (formClass == null)
029: throw new UnsupportedOperationException(
030: "There's no ObjectForm defined for this node type: "
031: + key);
032:
033: try {
034: nestedForm = formClass.newInstance();
035: if (nestedForm instanceof ObjectContextAware)
036: ((ObjectContextAware) nestedForm)
037: .setContext(getContext());
038:
039: nestedForm.getEnvironment().setDelegate(
040: nestedEnvironment);
041: for (Class childType : node.getChildTypes()) {
042: nestedForm.getEnvironment().addControl(
043: new XButton(genericObjectTreeEditor
044: .getAddChildAction(childType)));
045: }
046: } catch (Exception e) {
047: throw new RuntimeException(e);
048: }
049: nodeForms.put(key, nestedForm);
050: }
051:
052: nestedForm.getEnvironment().setActive(true);
053: }
054:
055: public void addFormClass(Class type,
056: Class<? extends GenericObjectForm> formClass) {
057: formClasses.put(type, formClass);
058: }
059:
060: private Class<? extends ObjectForm> findForm(Class type) {
061: return formClasses.get(type);
062: }
063:
064: @Override
065: public void setObject(Object object) {
066: super .setObject(object);
067: if (object == null)
068: return;
069:
070: if (object instanceof GenericObjectTreeNode) {
071: node = (GenericObjectTreeNode) object;
072: if (nestedForm instanceof ObjectContextAware) {
073: node.buildContext(context);
074: ((ObjectContextAware) nestedForm)
075: .setContext(getContext());
076: }
077:
078: if (nestedForm instanceof HierarchicalContextAware)
079: ((HierarchicalContextAware) nestedForm).setNode(node);
080:
081: Object nodeObject = node.getObject();
082: if (nodeObject != null)
083: nodeObject = node.loadObject();
084:
085: nestedForm.setObject(nodeObject);
086: if (nodeObject == null) {
087: node.setObject(nestedForm.getObject());
088: }
089: }
090: }
091:
092: public Object getObject() {
093: node.setObject(nestedForm.getObject());
094: return node;
095: }
096:
097: public ChangeStatus getChangeStatus() {
098: return ((GenericObjectForm) nestedForm).getChangeStatus();
099: }
100:
101: public ValidationStatus getValidationStatus() {
102: GenericObjectForm genericObjectForm = (GenericObjectForm) nestedForm;
103: return genericObjectForm.getValidationStatus();
104: }
105: }
|