private static void copyJSOProperties( JavaScriptObject newJso, JavaScriptObject oldJso, boolean deep) { for (Map.Entry<String, Object> entry : JavaScriptObjects.entrySet(oldJso)) { if (JsoProperties.PARENT_NODE_FIELD.equals(entry.getKey())) { // Nothing to do : new cloned node does not have any parent } else if (JsoProperties.STYLE_OBJECT_FIELD.equals(entry.getKey())) { setupStyle(newJso, (Style) entry.getValue()); } else if (JsoProperties.NODE_LIST_FIELD.equals(entry.getKey())) { Node newNode = newJso.cast(); Node oldNode = oldJso.cast(); setupChildNodes(newNode, oldNode, deep); } else if (JsoProperties.ELEM_PROPERTIES.equals(entry.getKey())) { PropertyContainer newPc = JavaScriptObjects.getObject(newJso, JsoProperties.ELEM_PROPERTIES); PropertyContainer oldPc = JavaScriptObjects.getObject(oldJso, JsoProperties.ELEM_PROPERTIES); for (Map.Entry<String, Object> entry2 : oldPc.entrySet()) { newPc.put(entry2.getKey(), entry2.getValue()); } } else if (JavaScriptObject.class.isInstance(entry.getValue())) { JavaScriptObject oldChildJso = (JavaScriptObject) entry.getValue(); JavaScriptObject newChildJso = JavaScriptObjects.newObject(oldChildJso.getClass()); copyJSOProperties(newChildJso, oldChildJso, deep); JavaScriptObjects.setProperty(newJso, entry.getKey(), newChildJso); } else { // copy the property, which should be a String or a primitive type (or // corresponding wrapper object) JavaScriptObjects.setProperty(newJso, entry.getKey(), entry.getValue()); } } }
private static void setupStyle(JavaScriptObject newNode, Style oldStyle) { Style newStyle = JavaScriptObjects.getObject(newNode, JsoProperties.STYLE_OBJECT_FIELD); for (Map.Entry<String, Object> entry : JavaScriptObjects.entrySet(oldStyle)) { if (!JsoProperties.STYLE_TARGET_ELEMENT.equals(entry.getKey())) { JavaScriptObjects.setProperty(newStyle, entry.getKey(), entry.getValue()); } } }
static Node insertAtIndex(Node parent, Node newChild, int index) { List<Node> list = getChildNodeList(parent); // First, remove from old parent Node oldParent = newChild.getParentNode(); if (oldParent != null) { oldParent.removeChild(newChild); } // Then, check parent doesn't contain newChild and remove it if necessary list.remove(newChild); // Finally, add if (index == -1 || index >= list.size()) { list.add(newChild); } else { list.add(index, newChild); } // Manage getParentNode() JavaScriptObjects.setProperty(newChild, JsoProperties.PARENT_NODE_FIELD, parent); return newChild; }