-
FEATURED COMPONENTS
First time here? Check out the FAQ!
1 | initial version | |
Hi EznatiZK, I have created a sample
zul
<zk>
<window apply="MyComposer">
<grid rowRenderer="${renderer}" model="${model}">
<columns>
<column label="Article"/>
<column label="SubArticle"/>
<column label="SubSubArtiicle"/>
</columns>
<rows />
</grid>
</window>
</zk>
MyComposer.java
import java.util.*;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.*;
public class MyComposer extends GenericForwardComposer {
public void doBeforeComposeChildren(Component comp) throws Exception {
super.doBeforeComposeChildren(comp);
comp.setAttribute("model", createModel());
comp.setAttribute("renderer", new MyRowRenderer());
}
private ListModel createModel() {
List data = new ArrayList();
List articleList = MyDAO.getArticle();
for (int i = 0, j = articleList.size(); i < j; i++) {
String article = (String) articleList.get(i);
List subArticleList = MyDAO.getSubArticle(article);
for (int k = 0, l = subArticleList.size(); k < l; k++) {
String subArticle = (String) subArticleList.get(k);
List subSubArticleList = MyDAO.getSubSubArticle(subArticle);
for (int m = 0, n = subSubArticleList.size(); m < n; m++) {
String subSubArticle = (String) subSubArticleList.get(m);
data.add(new String[]{article, subArticle, subSubArticle});
}
}
}
return new ListModelList(data);
}
public static class MyDAO {
public static List getArticle() {
List list = new ArrayList();
for (int i = 0; i < 5; i++)
list.add("Article " + i);
return list;
}
public static List getSubArticle(String article) {
List list = new ArrayList();
for (int i = 0; i < 5; i++)
list.add(article + i);
return list;
}
public static List getSubSubArticle(String SubArticle) {
List list = new ArrayList();
for (int i = 0; i < 5; i++)
list.add(SubArticle + i);
return list;
}
public static int getTotalArticleCount(String article) {
List subArticleList = getSubArticle(article);
int rowSpan = 0;
for (int i = 0, j = subArticleList.size(); i < j; i++) {
String subArticle = (String) subArticleList.get(i);
rowSpan += getSubSubArticle(subArticle).size();
}
return rowSpan;
}
}
public static class MyRowRenderer implements RowRendererExt, RowRenderer {
private int index = 0;
private String template = "./myRow.zul";
private String prevArticle = "", prevSubArticle="";
private String[] curData;
public Row newRow(Grid grid) {
curData = getData(grid.getModel());
boolean isNextArticle = !prevArticle.equals(curData[0]);
boolean isNextSubArticle = !prevSubArticle.equals(curData[1]);
Map arg = new HashMap();
// first row of each SubArticle
if (isNextSubArticle) {
// first row of each article
if (isNextArticle) {
prevArticle = curData[0];
arg.put("field1", prevArticle);
arg.put("rowspan1", MyDAO.getTotalArticleCount(prevArticle));
System.out.println(prevArticle);
}
prevSubArticle = curData[1];
arg.put("field2", prevSubArticle);
arg.put("rowspan2", MyDAO.getSubSubArticle(prevSubArticle).size());
}
return (Row) Executions.createComponents(template, null, arg);
}
private String[] getData(ListModel model) {
if (model != null)
return (String[]) model.getElementAt(index++);
return null;
}
public Component newCell(Row row) {
return new Label(curData[2].toString());
}
public int getControls() {
return 0;
}
public void render(Row row, Object data) throws Exception {
}
}
}
myRow.zul
<zk>
<row>
<cell rowspan="${arg.rowspan1}" unless="${empty arg.field1}">
<label value="${arg.field1}"/>
</cell>
<cell rowspan="${arg.rowspan2}" unless="${empty arg.field2}">
<label value="${arg.field2}"/>
</cell>
</row>
</zk>