package org.zkoss.support.bivision; import java.util.Arrays; import java.util.Comparator; import java.util.List; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.MouseEvent; import org.zkoss.zk.ui.event.SelectEvent; import org.zkoss.zk.ui.select.SelectorComposer; import org.zkoss.zk.ui.select.annotation.Listen; import org.zkoss.zk.ui.select.annotation.Wire; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zkmax.zul.Biglistbox; import org.zkoss.zkmax.zul.MatrixComparatorProvider; import org.zkoss.zkmax.zul.MatrixRenderer; import org.zkoss.zul.Div; import org.zkoss.zul.Textbox; import org.zkoss.zul.Window; /** * A demo of Big listbox to handle 1 trillion data. * @author jumperchen */ public class DemoWindowComposer extends SelectorComposer { @Wire private Biglistbox myComp; @Wire private Div tip; @Wire private Textbox content; // images marks private String[] images = { "aim", "amazon", "android", "apple", "bebo", "bing", "blogger", "delicious", "digg", "facebook", "flickr", "friendfeed", "google", "linkedin", "netvibes", "newsvine", "reggit", "rss", "sharethis", "stumbleupon", "technorati", "twitter", "utorrent", "vimeo", "vkontakte", "wikipedia", "windows", "yahoo" }; public void doAfterCompose(Window comp) throws Exception { super.doAfterCompose(comp); // specify a trillion faker model myComp.setModel(new FakerMatrixModel(1000 * 1000, 1000 * 1000)); myComp.setColWidth("130px"); myComp.setMatrixRenderer(new MatrixRenderer>() { public String renderCell(Component owner, List data, int rowIndex, int colIndex) throws Exception { String d = data.get(colIndex); d = d.replace("ZK", "ZK") .replace("Hello", "Hello"); return "
" + d + "
"; } public String renderHeader(Component owner, List data, int rowIndex, int colIndex) throws Exception { return "
" + data.get(colIndex) + "
"; } }); myComp.setSortAscending(new MyMatrixComparatorProvider>(true)); myComp.setSortDescending(new MyMatrixComparatorProvider>(false)); } @Listen("onClick=#myComp; onSort=#myComp") public void onClick() { tip.setVisible(true); // reset first, if the tip is shown at client only. tip.setVisible(false); } @SuppressWarnings("unchecked") @Listen("onCellClick=#myComp") public void onCellClick(MouseEvent evt) { Integer[] axis = (Integer[]) evt.getData(); // shift some pixels to make it look better tip.setStyle("left: " + (evt.getPageX() - 30) + "px; top:" + (evt.getPageY() + 20) + "px"); tip.setVisible(true); FakerMatrixModel fmm = (FakerMatrixModel) myComp.getModel(); content.setValue(String.valueOf(fmm.getCellAt( fmm.getElementAt(axis[1]), axis[0]))); content.setAttribute("axis", axis); // store the change for update Clients.evalJavaScript("doPosition()"); // resync the tooltip position } @Listen("onClick=#update; onOK=#content") public void onClick$update() { Integer[] axis = (Integer[]) content.getAttribute("axis"); FakerMatrixModel fmm = (FakerMatrixModel) myComp.getModel(); fmm.update(axis, content.getValue()); tip.setVisible(false); myComp.focus(); // pass focus to the big listbox } @Listen("onSelect=#myComp") public void onSelect(SelectEvent evt) { System.out.println("You listen onSelect: " + Arrays.asList(((Integer[]) evt.getData()))); } // Matrix comparator provider private class MyMatrixComparatorProvider implements MatrixComparatorProvider> { private int _x = -1; private boolean _acs; private MyComparator _cmpr; public MyMatrixComparatorProvider(boolean asc) { _acs = asc; _cmpr = new MyComparator(this); } public Comparator> getColumnComparator(int columnIndex) { this._x = columnIndex; return _cmpr; } // a real String comparator private class MyComparator implements Comparator> { private MyMatrixComparatorProvider _mmc; public MyComparator(MyMatrixComparatorProvider mmc) { _mmc = mmc; } public int compare(List o1, List o2) { return o1.get(_mmc._x).compareTo(o2.get(_mmc._x)) * (_acs ? 1 : -1); } } } }