@Override public void onAfterRecordChanged(OMultiValueChangeEvent<K, V> event) { if (ownerDoc.get() == null) return; if (nestedEvent == null) { nestedEvent = new ONestedMultiValueChangeEvent(currentCollecion, currentCollecion); ownerCollection.fireCollectionChangedEvent(nestedEvent); } OMultiValueChangeTimeLine timeline = nestedEvent.getTimeLine(); if (timeline == null) { timeline = new OMultiValueChangeTimeLine(); nestedEvent.setTimeLine(timeline); } timeline.addCollectionChangeEvent(event); }
private void checkTimelineTrackable(OMultiValueChangeTimeLine<Object, Object> timeLine, OTrackedMultiValue origin) { List<OMultiValueChangeEvent<Object, Object>> events = timeLine.getMultiValueChangeEvents(); for (OMultiValueChangeEvent<Object, Object> event : events) { Object value = event.getValue(); if (event.getChangeType() == OMultiValueChangeEvent.OChangeType.ADD && !(value instanceof OTrackedMultiValue)) { if (value instanceof Collection) { Collection<Object> newCollection = value instanceof List ? new OTrackedList<>(this) : new OTrackedSet<>(this); fillTrackedCollection(newCollection, (Collection<Object>) value); origin.replace(event, newCollection); } else if (value instanceof Map) { Map<Object, Object> newMap = new OTrackedMap<>(this); fillTrackedMap(newMap, (Map<Object, Object>) value); origin.replace(event, newMap); } } else if (event.getChangeType() == OMultiValueChangeEvent.OChangeType.NESTED) { OMultiValueChangeTimeLine nestedTimeline = ((ONestedMultiValueChangeEvent) event).getTimeLine(); if (nestedTimeline != null) checkTimelineTrackable(nestedTimeline, (OTrackedMultiValue) value); } } }