1 package autotest.tko; 2 3 import com.google.gwt.event.dom.client.ClickEvent; 4 import com.google.gwt.event.dom.client.ClickHandler; 5 import com.google.gwt.user.client.ui.Anchor; 6 import com.google.gwt.user.client.ui.Composite; 7 import com.google.gwt.user.client.ui.HorizontalPanel; 8 import com.google.gwt.user.client.ui.Panel; 9 import com.google.gwt.user.client.ui.VerticalPanel; 10 import com.google.gwt.user.client.ui.Widget; 11 12 import java.util.ArrayList; 13 import java.util.Collections; 14 import java.util.List; 15 16 17 class WidgetList<T extends Widget> extends Composite implements ClickHandler { 18 public interface ListWidgetFactory<S extends Widget> { 19 public List<String> getWidgetTypes(); 20 public S getNewWidget(String type); 21 } 22 23 private ListWidgetFactory<T> factory; 24 private List<T> widgets = new ArrayList<T>(); 25 private Panel widgetPanel = new VerticalPanel(); 26 private HorizontalPanel addLinksPanel = new HorizontalPanel(); 27 28 public WidgetList(ListWidgetFactory<T> factory) { 29 this.factory = factory; 30 31 addLinksPanel.setSpacing(10); 32 for (String type : factory.getWidgetTypes()) { 33 Anchor addLink = new Anchor(type); 34 addLink.addClickHandler(this); 35 addLinksPanel.add(addLink); 36 } 37 38 Panel outerPanel = new VerticalPanel(); 39 outerPanel.add(widgetPanel); 40 outerPanel.add(addLinksPanel); 41 initWidget(outerPanel); 42 } 43 44 public void addWidget(T widget) { 45 widgets.add(widget); 46 widgetPanel.add(widget); 47 } 48 49 public void deleteWidget(T widget) { 50 widgets.remove(widget); 51 widgetPanel.remove(widget); 52 } 53 54 public void onClick(ClickEvent event) { 55 assert (event.getSource() instanceof Anchor); 56 57 Anchor addLink = (Anchor) event.getSource(); 58 T widget = factory.getNewWidget(addLink.getText()); 59 addWidget(widget); 60 } 61 62 public List<T> getWidgets() { 63 return Collections.unmodifiableList(widgets); 64 } 65 66 public void clear() { 67 widgets.clear(); 68 widgetPanel.clear(); 69 } 70 } 71