package org.vaadin.smartgwt.client.core; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.Paintable; import com.vaadin.terminal.gwt.client.UIDL; public class PaintableList implements PaintableProperty { private final String name; private final List<Paintable> references = new ArrayList<Paintable>(); private final Set<PaintableListListener> listeners = new HashSet<PaintableListListener>(); public PaintableList(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { for (Iterator<Object> iterator = uidl.getChildIterator(); iterator.hasNext();) { final UIDL elementUIDL = (UIDL) iterator.next(); if ("add".equals(elementUIDL.getTag())) { final Integer index = elementUIDL.hasAttribute("index") ? elementUIDL.getIntAttribute("index") : null; final Paintable element = elementUIDL.hasAttribute("element") ? elementUIDL.getPaintableAttribute("element", client) : null; if (element != null) { if (index == null) { references.add(element); } else { references.add(index, element); } fireOnAdd(index, element); } } else if ("remove".equals(elementUIDL.getTag())) { final Integer index = elementUIDL.hasAttribute("index") ? elementUIDL.getIntAttribute("index") : null; final Paintable element = elementUIDL.hasAttribute("element") ? elementUIDL.getPaintableAttribute("element", client) : null; if (element != null) { if (index == null) { references.remove(element); } else { references.remove(index.intValue()); } fireOnRemove(index, element); } } else { client.getPaintable(elementUIDL).updateFromUIDL(elementUIDL, client); } } } public void addPaintableListListener(PaintableListListener listener) { listeners.add(listener); } private void fireOnAdd(Integer index, Paintable element) { for (PaintableListListener listener : listeners) { listener.onAdd(references.toArray(new Paintable[0]), index, element); } } private void fireOnRemove(Integer index, Paintable element) { for (PaintableListListener listener : listeners) { listener.onRemove(references.toArray(new Paintable[0]), index, element); } } }