/** * This gets called whenever one of the ConfigElements we are editing adds a new property value. */ public void propertyValueAdded(ConfigElementEvent evt) { ConfigElement src = (ConfigElement) evt.getSource(); int idx = evt.getIndex(); PropertyDefinition prop_def = src.getDefinition().getPropertyDefinition(evt.getProperty()); DefaultMutableTreeNode elt_node = getNodeFor(src); // Get the node containing the property description under the source // ConfigElement node for (Enumeration e = elt_node.children(); e.hasMoreElements(); ) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement(); if (node.getUserObject().equals(prop_def)) { // The newly inserted property value must be added as a child to // this node if (prop_def.getType() != ConfigElement.class) { DefaultMutableTreeNode new_child = new DefaultMutableTreeNode(evt.getValue()); insertNodeInto(new_child, node, idx); } else { // Embedded elements are handled specially in that all of their // respective child properties and such also need to be added to // the tree at this time. addEmbeddedElement(node, (ConfigElement) evt.getValue(), idx); } } } }
/** * This gets called whenever one of the ConfigElements we are editing removes a property value. */ public void propertyValueRemoved(ConfigElementEvent evt) { ConfigElement src = (ConfigElement) evt.getSource(); int idx = evt.getIndex(); PropertyDefinition prop_def = src.getDefinition().getPropertyDefinition(evt.getProperty()); DefaultMutableTreeNode elt_node = getNodeFor(src); // Get the node containing the property description under the source // ConfigElement node for (Enumeration e = elt_node.children(); e.hasMoreElements(); ) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement(); if (node.getUserObject().equals(prop_def)) { // The newly removed property value must be a child to this node System.out.println("Removing child " + idx + " from node: " + node.getUserObject()); DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(idx); // If the child is an embedded element, stop listening to it if (child.getUserObject() instanceof ConfigElement) { ConfigElement removed_elt = (ConfigElement) child.getUserObject(); removed_elt.removeConfigElementListener(this); } // Physically remove the child from the tree removeNodeFromParent(child); } } }
/** Gets the value for the given node at the given column. */ public Object getValueAt(Object node, int col) { DefaultMutableTreeNode tree_node = (DefaultMutableTreeNode) node; Object value = tree_node.getUserObject(); switch (col) { // Name case 0: return value; // Value case 1: if (value instanceof ConfigElement) { return null; } else if (value instanceof PropertyDefinition) { // Only provide comma delimited editing for simple types if (((PropertyDefinition) value).getType() != ConfigElement.class) { StringBuffer buffer = new StringBuffer(); for (Enumeration e = tree_node.children(); e.hasMoreElements(); ) { DefaultMutableTreeNode child_node = (DefaultMutableTreeNode) e.nextElement(); buffer.append(child_node.getUserObject()); if (e.hasMoreElements()) { buffer.append(", "); } } return buffer.toString(); } return null; } return value; } return null; }
/** * Gets a list of the nodes in this model that contain an object of the given class starting with * the given node. * * @param cls the class to search for * @param node the node whose subtree will be searched * @return a list of matching DefaultMutableTreeNodes */ public List getNodesOfClass(Class cls, DefaultMutableTreeNode node) { List matches = new ArrayList(); // Check if the current node matches if (cls.isInstance(node.getUserObject())) { matches.add(node); } // Recurse to the children of the current node for (Enumeration e = node.children(); e.hasMoreElements(); ) { DefaultMutableTreeNode child = (DefaultMutableTreeNode) e.nextElement(); matches.addAll(getNodesOfClass(cls, child)); } return matches; }
/** * This gets called whenever one of the ConfigElements we are editing has the values of a * property get reordered. */ public void propertyValueOrderChanged(ConfigElementEvent evt) { ConfigElement src = (ConfigElement) evt.getSource(); int idx = evt.getIndex(); PropertyDefinition prop_def = src.getDefinition().getPropertyDefinition(evt.getProperty()); DefaultMutableTreeNode elt_node = getNodeFor(src); // Get the node containing the property description under the source // ConfigElement node. for (Enumeration e = elt_node.children(); e.hasMoreElements(); ) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement(); if (node.getUserObject().equals(prop_def)) { int start_index = Math.min(evt.getIndex0(), evt.getIndex1()); int end_index = Math.max(evt.getIndex0(), evt.getIndex1()); List removed_children = new ArrayList(); for (int c = start_index; c <= end_index; ++c) { removed_children.add(getChild(node, c)); } for (Iterator c = removed_children.iterator(); c.hasNext(); ) { removeNodeFromParent((MutableTreeNode) c.next()); } String prop_token = prop_def.getToken(); for (int v = start_index; v <= end_index; ++v) { if (prop_def.getType() != ConfigElement.class) { // Create a new node for the reordered property value. DefaultMutableTreeNode new_node = new DefaultMutableTreeNode(src.getProperty(prop_token, v)); // Add the new node into the tree. insertNodeInto(new_node, node, v); } else { // Embedded elements are handled specially in that all of // their respective child properties and such also need to // be added to the tree at this time. ConfigElement cur_value = (ConfigElement) src.getProperty(prop_token, v); addEmbeddedElement(node, cur_value, v); } } } } }
/** Gets the node for the given object */ private DefaultMutableTreeNode getNodeFor(Object obj, DefaultMutableTreeNode node) { // System.out.println("getNodeFor() node: " + node.getUserObject()); // Check if we found a match if (obj.equals(node.getUserObject())) { return node; } // Check all children of the current node for (Enumeration e = node.children(); e.hasMoreElements(); ) { DefaultMutableTreeNode child = (DefaultMutableTreeNode) e.nextElement(); DefaultMutableTreeNode result = getNodeFor(obj, child); if (result != null) { return result; } } // Didn't find anything :( return null; }
/** * This gets called whenever one of the ConfigElements we are editing has one of its property * values change. */ public void propertyValueChanged(ConfigElementEvent evt) { ConfigElement src = (ConfigElement) evt.getSource(); int idx = evt.getIndex(); PropertyDefinition prop_def = src.getDefinition().getPropertyDefinition(evt.getProperty()); DefaultMutableTreeNode elt_node = getNodeFor(src); // Multi-valued properties and embedded elements are treated specially if ((prop_def.getPropertyValueDefinitionCount() > 1) || (prop_def.isVariable()) || (prop_def.getType() == ConfigElement.class)) { // Look for the property definition node for (Enumeration e = elt_node.children(); e.hasMoreElements(); ) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement(); if (node.getUserObject().equals(prop_def)) { DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(idx); fireTreeNodesChanged( this, new Object[] {getPathToRoot(node)}, new int[] {node.getIndex(child)}, new Object[] {child}); } } } // Property value is not an embedded element else { // Take into account the extra two rows at the top of the table if (elt_node == getRoot()) { idx += 2; } fireTreeNodesChanged( this, new Object[] {getPathToRoot(elt_node)}, new int[] {idx}, new Object[] {elt_node.getChildAt(idx)}); } }