package com.googlecode.tawus.ajaxdemo.pages; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.tapestry5.ValueEncoder; import org.apache.tapestry5.annotations.InjectComponent; import org.apache.tapestry5.annotations.Persist; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.corelib.components.Zone; import com.googlecode.tawus.ajaxdemo.Foo; /** * AjaxFormLoop with ajax updates. */ public class LoopWithAjaxUpdates { @Persist @Property private List<Foo> foos; @Property private Foo foo; @InjectComponent private Zone zone; void onActivate() { if(foos == null) { foos = new ArrayList<Foo>(); } } public String getUniqueZoneId() { return "zone_" + foos.indexOf(foo); } public int getId() { return foos.indexOf(foo); } public ValueEncoder<Foo> getEncoder() { return new ValueEncoder<Foo>() { public String toClient(Foo foo) { return String.valueOf(foos.indexOf(foo)); } public Foo toValue(String clientValue) { return foos.get(Integer.parseInt(clientValue)); } }; } Object onAddRow() { Foo newFoo = new Foo(); foos.add(newFoo); return newFoo; } void onRemoveRow(Foo newFoo) { foos.set(foos.indexOf(newFoo), null); } void onSuccess() { foos.removeAll(Collections.singleton(null)); } Object onZoneUpdate(int index) { foo = foos.get(index); return zone.getBody(); } }