/* * Copyright 2012 The Solmix Project * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.gnu.org/licenses/ * or see the FSF site: http://www.fsf.org. */ package org.solmix.sgt.client.pagebar; import org.solmix.sgt.client.advanceds.JSCallBack; import org.solmix.sgt.client.advanceds.Roperation; import org.solmix.sgt.client.advanceds.SlxRPC; import org.solmix.sgt.client.advanceds.SlxRPCManager; import com.smartgwt.client.data.Criteria; import com.smartgwt.client.data.DSCallback; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.types.DSOperationType; import com.smartgwt.client.types.ExportDisplay; import com.smartgwt.client.types.ExportFormat; import com.smartgwt.client.types.ListGridComponent; import com.smartgwt.client.types.VerticalAlignment; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.IButton; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.ComboBoxItem; import com.smartgwt.client.widgets.form.fields.TextItem; import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator; import com.smartgwt.client.widgets.form.validator.IsIntegerValidator; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridRecord; import com.smartgwt.client.widgets.menu.IconMenuButton; import com.smartgwt.client.widgets.menu.Menu; import com.smartgwt.client.widgets.menu.MenuItem; import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; import com.smartgwt.client.widgets.toolbar.ToolStrip; import com.smartgwt.client.widgets.toolbar.ToolStripButton; /** * * @author Administrator * @version 110035 2012-12-17 */ public class PagedListGrid extends ListGrid { public static final int DEFAULT_PAGE_SIZE = 75; private boolean usePageBar; ModalWindow mask; TopImgButton first = new TopImgButton(16, 16, "[SKIN]actions/first.png", "[SKIN]actions/first-disabled.png"); // 上一页 TopImgButton forward = new TopImgButton(16, 16, "[SKIN]actions/next.png", "[SKIN]actions/next-disabled.png"); // 下一页 TopImgButton backward = new TopImgButton(16, 16, "[SKIN]actions/prev.png", "[SKIN]actions/prev-disabled.png"); // 末页 TopImgButton last = new TopImgButton(16, 16, "[SKIN]actions/last.png", "[SKIN]actions/last-disabled.png"); IntegerRangeValidator v = new IntegerRangeValidator(); // 输入框form DynamicForm pageForm; ToolStrip gridPageControls; // 页码输入框 protected TextItem pageText; // 总页数 protected Label totalLabel; // 总页数 protected Label totalRow; int pageSize; /** * 当前页 */ private int pageNum = -1; /** * 总页数 */ private int totalPage = -1; /** * 数据记录条数 */ private int totalRowNum = -1; /** * @return the usePageBar */ public boolean isUsePageBar() { return usePageBar; } /** * @param usePageBar the usePageBar to set */ public void setUsePageBar(boolean usePageBar) { this.usePageBar = usePageBar; } /** * @return the pageSize */ public int getPageSize() { return pageSize; } /** * @param pageSize the pageSize to set */ public void setPageSize(int pageSize) { this.pageSize = pageSize; } /** * @return the maskMessage */ public String getMaskMessage() { return maskMessage; } /** * @param maskMessage the maskMessage to set */ public void setMaskMessage(String maskMessage) { this.maskMessage = maskMessage; } public PagedListGrid(int pageSize) { this(null, pageSize, true); } public PagedListGrid(boolean showPageBar) { this(null, DEFAULT_PAGE_SIZE, showPageBar); } public PagedListGrid(int pageSize, boolean showPageBar) { this(null, pageSize, showPageBar); } private String maskMessage; private final Canvas maskCanvas; private final ListGrid owner; public PagedListGrid(Canvas maskCanvas, int pageSize, boolean usePageBar) { this.maskCanvas = maskCanvas; this.usePageBar = usePageBar; this.pageSize = pageSize; this.owner = this; this.setWidth100(); this.setHeight100(); gridPageControls = new ToolStrip(); gridPageControls.setWidth100(); gridPageControls.setHeight(24); gridPageControls.setDefaultLayoutAlign(VerticalAlignment.CENTER); pageText = new TextItem(); pageText.setWidth(50); pageText.setHeight(20); pageText.setShowTitle(false); pageText.setTextAlign(Alignment.RIGHT); // IntegerRangeValidator pageText.setValidators(v, new IsIntegerValidator()); pageText.setValidateOnChange(true); pageText.addChangedHandler(new ChangedHandler() { @Override public void onChanged(ChangedEvent event) { try { goToPage((Integer.valueOf(pageText.getValueAsString()).intValue())); } catch (Exception e) { SC.say(pageText.getValueAsString() + "不是整数"); } } }); totalRow = new Label(); totalRow.setWrap(false); totalRow.setWidth(40); totalRow.setContents("没有数据"); totalLabel = new Label(); totalLabel.setWrap(false); totalLabel.setWidth(50); pageForm = new DynamicForm(); pageForm.setNumCols(1); pageForm.setWidth(45); pageForm.setItems(pageText); // 转到按钮 IButton go = new IButton("转到"); go.setWidth(40); go.setHeight(20); Label ye = new Label("第"); ye.setWidth(4); gridPageControls.setHeight(20); // gridPageControls.setStyleName("normal"); first.setTitle("首页"); first.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { goToPage(1); } }); forward.setTitle("下一页"); forward.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { goToPage(pageNum + 1); } }); last.setTitle("最后一页"); last.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { goToPage(totalPage); } }); backward.setTitle("上一页"); backward.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { goToPage(pageNum - 1); } }); gridPageControls.addSpacer(6); gridPageControls.addMember(first); gridPageControls.addSpacer(6); gridPageControls.addMember(backward); gridPageControls.addSpacer(6); // gridPageControls.addMember(go); gridPageControls.addMember(ye); gridPageControls.addMember(pageForm); gridPageControls.addMember(totalLabel); gridPageControls.addSpacer(6); gridPageControls.addMember(forward); gridPageControls.addSpacer(6); gridPageControls.addMember(last); gridPageControls.addSeparator(); DynamicForm f = new DynamicForm(); ComboBoxItem pagSize = new ComboBoxItem(); pagSize.setValue(getPageSize()); pagSize.setWidth(60); pagSize.setTitle("每页"); pagSize.setType("comboBox"); pagSize.setValueMap("75条", "150条", "250条", "500条", "全部"); pagSize.addChangedHandler(new ChangedHandler() { @Override public void onChanged(ChangedEvent event) { Object v = event.getValue(); if ("75条".equals(v)) { setPageSize(75); } else if ("150条".equals(v)) { setPageSize(150); } else if ("250条".equals(v)) { setPageSize(250); } else if ("500条".equals(v)) { setPageSize(500); } else if ("全部".equals(v)) { setPageSize(-1); setShowAllRecords(true); } firstCall = true; pagedFetchData(_criteria, _callback, _request); } }); f.setItems(pagSize); gridPageControls.addMember(f); ToolStripButton print = new ToolStripButton(); print.setIcon("[SKIN]actions/print.png"); print.setTitle("打印"); print.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { Canvas.showPrintPreview(owner); } }); gridPageControls.addSeparator(); gridPageControls.addMember(print); gridPageControls.addSeparator(); Menu menu = new Menu(); MenuItem csv = new MenuItem("Excel导出(CSV)"); // excel.setIcon("silk/check.png"); csv.setChecked(true); csv.addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() { @Override public void onClick(MenuItemClickEvent event) { exportFunction(ExportFormat.CSV); } }); menu.addItem(csv); MenuItem excel = new MenuItem("Excel导出"); // excel.setIcon("silk/check.png"); excel.addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() { @Override public void onClick(MenuItemClickEvent event) { exportFunction(ExportFormat.XLS); } }); menu.addItem(excel); MenuItem xml = new MenuItem("XML导出"); xml.addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() { @Override public void onClick(MenuItemClickEvent event) { exportFunction(ExportFormat.XML); } }); menu.addItem(xml); MenuItem json = new MenuItem("JSON导出"); json.addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() { @Override public void onClick(MenuItemClickEvent event) { exportFunction(ExportFormat.JSON); } }); menu.addItem(json); IconMenuButton moreExp = new IconMenuButton(); moreExp.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() { @Override public void onClick(ClickEvent event) { exportFunction(ExportFormat.CSV); } }); moreExp.setTitle("导出"); moreExp.setIcon("[SKIN]actions/export.png"); moreExp.setShowMenuIcon(true); moreExp.setMenu(menu); gridPageControls.addMember(moreExp); gridPageControls.addFill(); gridPageControls.addMember(totalRow); gridPageControls.setAlign(Alignment.LEFT); gridPageControls.hide(); this.setGridComponents(new Object[] { ListGridComponent.HEADER, ListGridComponent.FILTER_EDITOR, ListGridComponent.BODY, gridPageControls }); } public void exportFunction(ExportFormat format) { if(pageSize>100000){ SC.warn("记录条数大于10万条,请联系管理员!"); } Roperation operation = new Roperation(); SlxRPC.transform(_request, _criteria, operation); //export all rows. operation.setStartRow(-1); operation.setEndRow(0); operation.setExportResults(true); switch (format) { case XLS: if(this.pageSize>65534){ SC.warn("记录条数大于65535条,请选择CSV格式导出"); return; } operation.setExportFilename("tmp1.xls"); break; case XML: operation.setExportFilename("tmp1.XML"); break; case JSON: operation.setExportFilename("tmp1.JS"); break; case CSV: operation.setExportFilename("tmp1.CSV"); break; default: operation.setExportFilename("tmp1.XML"); } operation.setExportAs(format); operation.setExportDisplay(ExportDisplay.DOWNLOAD); SlxRPC.send(operation); } private Criteria _criteria; private DSRequest _request; private DSCallback _callback; private boolean firstCall; /** * 在smartgwt中 DSRequest中的 operationId 在提交了fetch,add 等操作后,就会从绑定组件上自动生成一个ID,用于区分不同的请求,这里由于是分页每次都应该提交同一个请求。 */ private String operationId; protected void pagedFetchData(Criteria criteria, DSCallback dsCallback, DSRequest request) { pagedFetchData(criteria, dsCallback, request, 1); } public void pagedFetchData(Criteria criteria, DSRequest request) { pagedFetchData(criteria, null, request, 1); } protected void pagedFetchData(Criteria criteria, DSCallback dsCallback) { pagedFetchData(criteria, dsCallback, null); } public void pagedFetchData(Criteria criteria) { pagedFetchData(criteria, null, null); } public void pagedFetchData() { pagedFetchData(null); } public void pagedFetchData(Criteria criteria, DSCallback dsCallback, DSRequest request, int pageNum) { final ListGrid grid = this; this.pageNum = pageNum; if (criteria == null) criteria = this.getCriteria(); final String OperationID = request != null ? request.getOperationId() : null; this._criteria =criteria!=null? new Criteria(criteria.getJsObj()):new Criteria(); if (dsCallback == null) { firstCall = true; dsCallback = new DSCallback() { @Override public void execute(DSResponse response, Object rawData, DSRequest request) { // hold this request.and criteria. _request = request; _request.setCriteria(_criteria); _request.setOperationId(OperationID); if (response.getStatus() == DSResponse.STATUS_SUCCESS) { grid.setData(response.getDataAsRecordList()); if (firstCall) initPageBar(response); else updatePageBar(response); } else if (response.getStatus() == DSResponse.STATUS_VALIDATION_ERROR) { } else { SC.warn(response.getDataAsString()); } firstCall = false; } }; } this._callback = dsCallback; if (request == null) { request = new DSRequest(); } if(_request!=null) _request.setCriteria(criteria); if(pageSize>0){ int startNum = (pageNum - 1) * pageSize; request.setStartRow(startNum); request.setEndRow(pageNum * pageSize); }else{ request.setStartRow(-1); request.setEndRow(0); } grid.fetchData(criteria, _callback, _request); } private void updatePageBar(DSResponse response) { int startNum = response.getStartRow() + 1; int endNum = response.getEndRow(); totalRow.setContents("| " + startNum + "-" + endNum + "条 | 共" + totalRowNum + "条"); pageText.setValue(pageNum); if (pageNum >= totalPage) { forward.disable(); last.disable(); } if (pageNum > 0 && pageNum < totalPage) { forward.enable(); last.enable(); } if (pageNum > 1) { first.enable(); backward.enable(); } if (pageNum == 1) { first.disable(); backward.disable(); } } private void initPageBar(DSResponse response) { totalRowNum = response.getTotalRows(); int startNum = response.getStartRow() + 1; int endNum = response.getEndRow(); if (startNum > endNum) startNum = endNum; if (!gridPageControls.isVisible()) gridPageControls.show(); totalRow.setContents("| " + startNum + "-" + endNum + "条 | 共" + totalRowNum + "条"); totalPage = ((totalRowNum % pageSize) == 0) ? totalRowNum / pageSize : totalRowNum / pageSize + 1; totalLabel.setContents("页,共" + totalPage + "页"); pageNum = 1; pageText.setValue(pageNum); first.disable(); backward.disable(); if (totalRowNum > pageSize) { forward.enable(); last.enable(); } else { forward.disable(); last.disable(); } v.setMax(totalPage); v.setMin(1); } /** * 转到指定页,获取分页数据并装载, 获取数据过程中,加模态遮罩 * * @param pageNum */ public void goToPage(int pageNum) { if (pageNum > totalPage) pageNum = totalPage; if (pageNum < 1) pageNum = 1; if (pageNum == this.pageNum) { return; } pagedFetchData(this._criteria, this._callback, this._request, pageNum); } public void removeSelectedData(JSCallBack callBack ){ ListGridRecord[] records = getSelectedRecords(); String dsID = getDataSource().getID(); Roperation[] opers; if (records != null) { opers = new Roperation[records.length]; for (int i = 0; i < records.length; i++) { Roperation oper = new Roperation(); oper.setDataSource(dsID); oper.setOperationType(DSOperationType.REMOVE); Criteria c = new Criteria(); String[] atrrs = records[i].getAttributes(); for (String atr : atrrs) { c.addCriteria(atr, records[i].getAttribute(atr)); } oper.setCriteria(c); opers[i] = oper; } SlxRPCManager.send(opers, callBack); } } }