package com.akjava.gwt.lib.client.experimental; import java.util.ArrayList; import java.util.List; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; /* sample css .widgetList{ padding:4px; background: #ccc; } .widgetList-default{ margin:4px; border: 2px solid #fff; background: #fff; } .widgetList-select{ border: 2px solid #00f; } */ /* sample code List<TestData> tests=Lists.newArrayList(new TestData("hello"),new TestData("world")); WidgetList<TestData> list=new WidgetList<TestData>() { @Override public void onSelect(TestData data) { LogUtils.log(data.getName()); } @Override public FocusPanel createWidget(TestData data) { FocusPanel panel=new FocusPanel(); panel.setSize("200px", "200px"); panel.add(new Label(data.getName())); return panel; } }; RootPanel.get().add(list); list.setData(tests); */ public abstract class WidgetList<T> extends VerticalPanel{ public static final String STYLE_WIDGET_LIST="widgetList"; public static final String STYLE_WIDGET_LIST_DEFAULT="widgetList-default"; public static final String STYLE_WIDGET_LIST_SELECT="widgetList-select"; private Panel container; private List<T> datas; private List<FocusPanel> widgets; public List<FocusPanel> getWidgets() { return widgets; } public WidgetList(){ //horizontal only container=new HorizontalPanel(); add(container); container.setStylePrimaryName(STYLE_WIDGET_LIST); } public void addData(T data){ datas.add(data); updateData(); } public void removeData(T data){ datas.remove(data); updateData(); } public void setData(List<T> datas){ this.datas=datas; updateData(); } public void updateData(){ widgets=new ArrayList<FocusPanel>(); container.clear(); for(final T data:datas){ FocusPanel panel=createWidget(data); widgets.add(panel); panel.setStylePrimaryName(STYLE_WIDGET_LIST_DEFAULT); container.add(panel); panel.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { select(data); } }); } } private T selection; public T getSelection() { return selection; } private Widget getWidget(T data){ if(data==null){ return null; } int index=datas.indexOf(data); if(index!=-1 && index<widgets.size()){ return widgets.get(index); } return null; } public void select(T data){ if(selection!=null){ Widget oldone=getWidget(selection); if(oldone!=null){ oldone.removeStyleName(STYLE_WIDGET_LIST_SELECT); } } selection=data; if(data!=null){ Widget newone=getWidget(data); if(newone!=null){ newone.addStyleName(STYLE_WIDGET_LIST_SELECT); } } onSelect(data); } public void unselect(){ select(null); } public abstract void onSelect(T data); public abstract FocusPanel createWidget(T data); }