package de.tud.kom.socom.web.client.htmlelements; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import com.google.gwt.core.client.GWT; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiTemplate; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorView; /** a View Widget that displays given ErrorViews as a UL-List * * @author jkonert * */ public class ErrorList extends Composite { @UiTemplate("ErrorListView.ui.xml") interface inf extends UiBinder<Widget, ErrorList> { } private static inf uiBinder = GWT.create(inf.class); private Map<ErrorListItemView, ListItem> mapping = new HashMap<ErrorListItemView, ListItem>(); @UiField UnorderedList errorList; public ErrorList() { initWidget(uiBinder.createAndBindUi(this)); } public void setErrors(List<ErrorListItemView> errors) { clear(); addErrors(errors); } public void removeErrors(List<ErrorListItemView> errors) { if (errors == null) return; for (ErrorListItemView v: errors) { ListItem item = mapping.get(v); if (item != null) { this.errorList.remove(v); } mapping.remove(v); // remove even if not found to clean up inconsistencies.. } checkVisibility(); } public void removeError(ErrorListItemView error) { List<ErrorListItemView> l = new LinkedList<ErrorListItemView>(); l.add(error); removeErrors(l); } /** is aware of formerly given objects and only adds errors not added before * * @param errors */ public void addErrors(List<ErrorListItemView> errors) { if (errors == null) return; for (ErrorListItemView v: errors) { if (!this.mapping.containsKey(v)) { ListItem item = new ListItem(v.asWidget()); //XXX sort? first errors, then infos? if(v instanceof ErrorView) item.addStyleName("error"); else item.addStyleName("info"); this.mapping.put(v, item); this.errorList.add(item); } } checkVisibility(); } public void addError(ErrorListItemView error) { List<ErrorListItemView> l = new LinkedList<ErrorListItemView>(); l.add(error); addErrors(l); } public boolean hasErrors() { return this.errorList.getWidgetCount() > 0; } /** removes all errors and hides * */ public void clear() { while(this.errorList.getWidgetCount() > 0) { this.errorList.remove(0); } this.mapping.clear(); hide(); } /** manually hides the list (adds style class "hidden"). this is managed internally automatically depending on number of errors. * 0 errors = hide, > 0 errors shows. */ public void hide() { this.errorList.addStyleName("hidden"); } /** manually displays the list (removes style class "hidden"). this is managed internally automatically depending on number of errors. * 0 errors = hide, > 0 errors shows. */ public void show() { this.errorList.removeStyleName("hidden"); } private void checkVisibility() { if (hasErrors()) show(); else hide(); } }