package test.order; import java.util.ArrayList; import java.util.List; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.DropEvent; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zk.ui.util.GenericAutowireComposer; import org.zkoss.zul.Button; import org.zkoss.zul.Column; import org.zkoss.zul.Columns; import org.zkoss.zul.Grid; import org.zkoss.zul.Intbox; public class TableViewerComposer extends GenericAutowireComposer /* extends AbstractSASViewerComposer */ { // protected static Logger logger = Logger.getLogger(TableViewerComposer.class); private Grid tableViewerGrid; private ScrollingListModel model; private List colInfos; private ArrayList columnOrder; private final int FIXED_COL_SIZE = 1; private Intbox gdRowIntbox; private Button gdLastRowBtn; private Button gdFirstRowBtn; public void doBeforeComposeChildren(Component comp) throws Exception { super.doBeforeComposeChildren(comp); // comp.setAttribute("model", model); // comp.setAttribute("renderer", new TableViewerRowRenderer()); } public void doAfterCompose(Component win) throws Exception { super.doAfterCompose(win); model = new ScrollingListModel(); this.colInfos = model.getColInfos(); this.columnOrder = new ArrayList(colInfos.size() - FIXED_COL_SIZE); final Columns cols = tableViewerGrid.getColumns(); // Column for row position Column posCol = new Column(); posCol.setHflex("min"); //String rowNumLabel = t(colInfo.get(0).getLabel()); // �bersetzen. // TODO String rowNumLabel = "Lfd.Nr."; posCol.setLabel(rowNumLabel); posCol.setParent(cols); // Data cols for (int i = 0; i < colInfos.size(); i++) { ColumnDescriptor colInfo = (ColumnDescriptor) colInfos.get(i); final Column col = new Column(); columnOrder.add(i); // Drag & Drop col.setDraggable("" + i); col.setDroppable("true"); col.addEventListener(Events.ON_DROP, new EventListener() { public void onEvent(Event event) throws Exception { DropEvent dropEvent = (DropEvent) event; Component dragged = dropEvent.getDragged(); int from = cols.getChildren().indexOf(dragged); int to = cols.getChildren().indexOf(col); Component toObject = (Component) cols.getChildren().get(to); dragged.setParent(null); if (to > from) { cols.insertBefore(dragged, toObject.getNextSibling()); } else { cols.insertBefore(dragged, toObject); } resetColumnOrder(); model.setColOrder(columnOrder); tableViewerGrid.setModel(model); // tableViewerGrid.invalidate(); } }); col.setHflex("min"); col.setLabel(colInfo.getLabel()); cols.appendChild(col); } model.setColOrder(columnOrder); tableViewerGrid.setModel(model); tableViewerGrid.setRowRenderer(new TableViewerRowRenderer()); /* Events */ gdRowIntbox.addEventListener(Events.ON_OK, new EventListener() { public void onEvent(Event event) throws Exception { Clients.evalJavaScript("scrollGridInto('" + tableViewerGrid.getUuid() + "'," + getGridTopPosition(gdRowIntbox.getValue() - 1) + ")"); } }); gdFirstRowBtn.addEventListener(Events.ON_CLICK, new EventListener() { public void onEvent(Event event) throws Exception { Clients.evalJavaScript("scrollGridInto('" + tableViewerGrid.getUuid() + "'," + getGridTopPosition(0) + ")"); } }); gdLastRowBtn.addEventListener(Events.ON_CLICK, new EventListener() { public void onEvent(Event event) throws Exception { Clients.evalJavaScript("scrollGridInto('" + tableViewerGrid.getUuid() + "'," + getGridTopPosition(model.getSize() - 1) + ")"); } }); } private int getGridTopPosition(int rowIndex) { return rowIndex * 22;//assume row height is 22px; } private void resetColumnOrder() { @SuppressWarnings("unchecked") List cols = tableViewerGrid.getColumns().getChildren(); columnOrder = new ArrayList(); for (Component c : cols) { Column col = (Column)c; if (col.getDraggable().equals("false")) { // fixe Spalte } else { columnOrder.add(Integer.parseInt(col.getDraggable())); } } } }