/****************************************************************************** * Product: Adempiere ERP & CRM Smart Business Solution * Copyright (C) 2008 Low Heng Sin All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. This program is distributed in the hope * * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * *****************************************************************************/ package org.adempiere.webui.component; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.zkoss.zul.AbstractListModel; import org.zkoss.zul.Listbox; import org.zkoss.zul.Listcell; import org.zkoss.zul.Listitem; import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.ListitemRendererExt; import org.zkoss.zul.event.ListDataEvent; /** * * @author Low Heng Sin * */ public class SimpleListModel extends AbstractListModel implements ListitemRenderer, ListitemRendererExt { /** * */ private static final long serialVersionUID = -572148106182756840L; protected List list; private int[] maxLength; public SimpleListModel() { this(new ArrayList()); } public SimpleListModel(List list) { this.list = list; } public Object getElementAt(int index) { if (index >= 0 && index < list.size()) return list.get(index); else return null; } public int getSize() { return list.size(); } protected StringBuffer truncate(String src, int maxLength) { int j = maxLength; while (j > 0 && Character.isWhitespace(src.charAt(j - 1))) --j; return new StringBuffer(j + 3) .append(src.substring(0, j)).append("..."); } public void render(Listitem item, Object data) throws Exception { if (data instanceof Object[]) { renderArray(item, (Object[])data); } else if (data instanceof Collection) { renderCollection(item, (Collection)data); } else { String value = data != null ? data.toString() : ""; renderCell(0, item, value); } } protected void renderCell(int col, Listitem item, String value) { String tooltip = null; if (maxLength != null && maxLength.length > col && maxLength[col] > 0 && value.length() > maxLength[col]) { tooltip = value; value = truncate(value, maxLength[col]).toString(); } ListCell listCell = new ListCell(value); listCell.setParent(item); if (tooltip != null) listCell.setTooltiptext(tooltip); } private void renderCollection(Listitem item, Collection data) { int i = 0; for (Object col : data) { String value = (col != null ? col.toString() : ""); renderCell(i, item, value); i++; } } private void renderArray(Listitem item, Object[] data) { int i = 0; for (Object col : data) { String value = (col != null ? col.toString() : ""); renderCell(i, item, value); i++; } } public int getControls() { return DETACH_ON_RENDER; } public Listcell newListcell(Listitem item) { return null; } public Listitem newListitem(Listbox listbox) { ListItem item = new ListItem(); item.applyProperties(); return item; } public void setMaxLength(int[] maxLength) { this.maxLength = maxLength; } public void addElement(Object obj) { list.add(obj); int index = list.size() - 1; fireEvent(ListDataEvent.INTERVAL_ADDED, index, index); } public void add(int index, Object obj) { list.add(index, obj); fireEvent(ListDataEvent.INTERVAL_ADDED, index, index); } public void removeAllElements() { list.clear(); fireEvent(ListDataEvent.CONTENTS_CHANGED, -1, -1); } public void removeElement(Object element) { int index = list.indexOf(element); list.remove(element); fireEvent(ListDataEvent.INTERVAL_REMOVED, index, index); } public void setElementAt(Object element, int index) { list.set(index, element); fireEvent(ListDataEvent.CONTENTS_CHANGED, index, index); } public int indexOf(Object value) { return list.indexOf(value); } }