@Override public boolean remove(T child) { E element = valueToElement.remove(child); if (element == null) { return false; } getDocument().deleteNode(element); return true; }
/** * Loads this list from the document. */ private void load() { E entry = DocHelper.getFirstChildElement(getDocument(), parent); while (entry != null) { onElementAdded(entry); entry = DocHelper.getNextSiblingElement(getDocument(), entry); } }
/** * Attempts to find the first known sibling value of the given element. This method looks back, * in hope that if we get notifications late, we get notifications about elements inserted * early first. * * @param added The freshly inserted element. * @return Either an existing list value, or null, if one cannot be found. */ private T getPreviousKnownValue(E added) { E prev = DocHelper.getPreviousSiblingElement(getDocument(), added); while (prev != null) { T value = elementToValue.get(prev); if (value != null) { return value; } prev = DocHelper.getPreviousSiblingElement(getDocument(), prev); } return null; }
@Override public void onElementAdded(E element) { assert getDocument().getParentElement(element).equals(parent) : "Received event for unrelated element"; if (childTag.equals(getDocument().getTagName(element))) { T child = factory.adapt(router, element); T sibling = getPreviousKnownValue(element); orderedValues.add(sibling == null ? 0 : orderedValues.indexOf(sibling) + 1, child); elementToValue.put(element, child); valueToElement.put(child, element); fireElementAdded(child); } }
@Override public T add(I initialState) { Map<String, String> attributes = Initializer.Helper.buildAttributes(initialState, factory); E element = getDocument().createChildElement(parent, childTag, attributes); // As we are using an observable document, that is registered to post us events, we expect // that onElementAdded is called once the child is created. This method in turn creates a // child object for the given element and store it in the elementToValue map. We use this to // return the child for the given element. return elementToValue.get(element); }
@Override public T add(int index, I initialState) { int last = orderedValues.size(); Preconditions.checkPositionIndex(index, last); if (index == last) { return add(initialState); } T childAfter = orderedValues.get(index); E nodeAfter = valueToElement.get(childAfter); Map<String, String> attributes = Initializer.Helper.buildAttributes(initialState, factory); E fresh = createBefore(getDocument(), nodeAfter, attributes); return elementToValue.get(fresh); }