Revision history [back]

click to hide/show revision 1
initial version

answered 2011-04-25 11:29:54 +0800

jimmyshiau gravatar image jimmyshiau

http://www.zkoss.org/ ZK Team

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>
Support Options
  • Email Support
  • Training
  • Consulting
  • Outsourcing
Learn More