Hi folks!
We got an strange behavior on ListGrid. The ListGrid make two http request with same response any time I make a refresh or initial load. But, some times the first response comes blank and the grid doesn't show de records.
Version: smartgwt-power-5.0-p20150828.jar
This is the grid
This is the request. There are two request at the same time.
We need a way to make only one request, but I don't know if this is a SmartGWT bug or it's a poor implementation. By the way, I made various tests with diferente ListGrid configurations but doesn't work properly.
Take a look at the code
Grid View
http://www.4shared.com/file/UtKfO6Z9...storyView.html
Grid Presenter
http://www.4shared.com/file/ooeTLYn9...Presenter.html
Implementation of ListGrid
http://www.4shared.com/file/vcMkdlLe...eListGrid.html
Best regards
We got an strange behavior on ListGrid. The ListGrid make two http request with same response any time I make a refresh or initial load. But, some times the first response comes blank and the grid doesn't show de records.
Version: smartgwt-power-5.0-p20150828.jar
This is the grid
This is the request. There are two request at the same time.
We need a way to make only one request, but I don't know if this is a SmartGWT bug or it's a poor implementation. By the way, I made various tests with diferente ListGrid configurations but doesn't work properly.
Take a look at the code
Grid View
Code:
private BaseListGrid createGrid() { BaseListGrid grid = new BaseListGrid(false, 1) { @Override public Boolean willFetchData(Criteria newCriteria) { return true; } }; grid.setHeaderHeight(DesignConstants.GRID_HEADER_HEIGHT); grid.setCellHeight(32); grid.setDataFetchMode(FetchMode.PAGED); grid.setFilterButtonPrompt(CONSTANTS.filter()); grid.setFetchDelay(500); grid.setHoverCustomizer(new VehiclePlateHoverCustomizer(HistoryEntryFieldsConstants.FIELD_VEHICLE_NAME, HistoryEntryFieldsConstants.FIELD_VEHICLE_LICENSE_PLATE)); grid.setCanSort(false); grid.setSortField(HistoryEntryFieldsConstants.FIELD_PERSISTED_DATE); grid.setSortDirection(SortDirection.DESCENDING); grid.setReportHeaderProvider(new ReportHeaderProvider() { @Override public Canvas getReportHeader() { return ReportHeaderBuilder.build(SessionData.getInstance(), getPrintingTitle(), startDate, finalDate); } }); grid.setCanPrint(true); grid.setCanExport(true); grid.setExportFilename(CONSTANTS.vehicleHistoryTitle()); grid.setExportClientSide(false); grid.setAutoFitFieldWidths(true); grid.setAutoFitFieldsFillViewport(true); grid.setAutoFitWidthApproach(AutoFitWidthApproach.TITLE); grid.setAutoFetchData(false); grid.setFilterOnKeypress(true); setGridDataSource(grid); setGridActions(grid); setGridFields(grid); configureFilter(grid); return grid; } private void setGridDataSource(final BaseListGrid grid) { DataSource vehicleHistoryDS = PortalOrionDataSource.getDataSource(HistoryEntryFieldsConstants.DATASOURCE_ID); grid.setDataSource(vehicleHistoryDS); vehicleHistoryDS.addHandleErrorHandler(new HandleErrorHandler() { @Override public void onHandleError(ErrorEvent event) { String error = event.getResponse().getAttribute("Error"); Message message = null; switch (ErrorType.getByCode(error)) { case INVALID_CLIENT_PERMISSION: message = new Message(MessageType.WARNING, MESSAGES.warningLandmarkDiferentClient()); break; default: break; } if (message != null) { CommonEventBus.getInstance().fireEvent(new MessageIssueEvent(message)); } grid.discardAllEdits(); event.cancel(); } }); } @Override public void refreshFilter(Date startDate, Date finalDate, Long vehicleId, String vehicleName) { this.startDate = startDate; this.finalDate = finalDate; this.vehicleId = vehicleId; if (vehicleName != null && vehicleName.equals(CONSTANTS.select())) { this.vehicleName = CONSTANTS.allVehicles(); } else { this.vehicleName = vehicleName; } criteria = createGridCriteria(vehicleId, startDate, finalDate); ShowVehicleHistoryTitleEvent event = new ShowVehicleHistoryTitleEvent(vehicleName, startDate, finalDate); CommonEventBus.getInstance().fireEvent(event); Portlet portletHistory = Dashboard.getInstance().getPortletByName(Dashboard.HISTORY_PORTLET_NAME); if (!portletHistory.isVisible()) { portletHistory.show(); } portletHistory.bringToFront(); refreshGrid(); } @Override public void refreshGrid() { vehicleHistoryGrid.setCriteria(criteria); vehicleHistoryGrid.fetchData(criteria); vehicleHistoryGrid.invalidateCache(); } private AdvancedCriteria createGridCriteria(Long vehicleId, Date start, Date end) { Criterion clientCriteria = new Criterion(HistoryEntryFieldsConstants.FIELD_PK_OWNER_ID, OperatorId.EQUALS, session.getClient().getId()); Criterion vehicleCriteria = new Criterion(HistoryEntryFieldsConstants.FIELD_VEHICLE_ID, OperatorId.EQUALS, vehicleId); Criterion permissionCriteria = new Criterion(HistoryEntryFieldsConstants.FIELD_PERMISSION_CODE, OperatorId.IN_SET, session.getPermissions()); Criterion persistedDateCriteria = new Criterion(HistoryEntryFieldsConstants.FIELD_PERSISTED_DATE, OperatorId.BETWEEN_INCLUSIVE, start, end); // Com ou sem filtro de veículo AdvancedCriteria advancedCriteria; if (vehicleId != null) { advancedCriteria = new AdvancedCriteria(OperatorId.AND, new Criterion[] { clientCriteria, vehicleCriteria, permissionCriteria, persistedDateCriteria }); } else { // se o usuário é gestor, pesquisa pelo cliente apenas if (session.isMasterContext()) { advancedCriteria = new AdvancedCriteria(OperatorId.AND, new Criterion[] { clientCriteria, permissionCriteria, persistedDateCriteria }); } else { // se o usuário é comum, é necessário passar a lista de veículo associados a ele List<VehicleDTO> userVehicles = session.getUser().getVehicleDTOs(); List<String> userVehicleIdList = new ArrayList<String>(); for (VehicleDTO vehicleDTO : userVehicles) { userVehicleIdList.add(vehicleDTO.getId().toString()); } String[] arrayUserVehicleId = (String[]) userVehicleIdList.toArray(); Criterion userVehicleCriteria = new Criterion(HistoryEntryFieldsConstants.FIELD_VEHICLE_ID, OperatorId.IN_SET, arrayUserVehicleId); advancedCriteria = new AdvancedCriteria(OperatorId.AND, new Criterion[] { clientCriteria, userVehicleCriteria, permissionCriteria, persistedDateCriteria }); } } return advancedCriteria; } private void configureFilter(BaseListGrid grid) { grid.addFilterEditorSubmitHandler(new FilterEditorSubmitHandler() { @Override public void onFilterEditorSubmit(FilterEditorSubmitEvent event) { if (criteria == null) { // evita que seja feito o fecth sem criteria event.cancel(); return; } } }); }
Grid Presenter
Code:
public void bind() { CommonEventBus.getInstance().addHandler(ClientChangedInContextEvent.TYPE, new ClientChangedInContextEventHandler() { @Override public void onClientChangedInContext(ClientChangedInContextEvent event) { if (Dashboard.getInstance().isVisible()) { view.clientChanged(); bindGridActions(); bindPdfButton(); CommonEventBus.getInstance().fireEvent(new ResetVehicleHistoryTitleEvent()); } } }); bindGridActions(); bindPdfButton(); // Handler para tratamento do retorno de pontos do grupo de histórico CommonEventBus.getInstance().addHandler(ResponsePointsByGroupMapEvent.TYPE, new ResponsePointsByGroupMapEventHandler() { @Override public void onResponse(ResponsePointsByGroupMapEvent event) { validateGridAndMapPoints(event.getResult(), event.getToken()); } }); // Handler para filtrar por veículo quando for solicitado pelo grid Situação Atual CommonEventBus.getInstance().addHandler(ShowVehicleHistoryEvent.TYPE, new ShowVehicleHistoryEventHandler() { @Override public void onShowVehicleHistory(ShowVehicleHistoryEvent event) { VehicleDTO vehicle = event.getVehicle(); Date finalDate = event.getFinalDate(); Date startDate = event.getFinalDate(); refreshGrid(startDate, finalDate, vehicle.getId(), vehicle.getVehicleNamePlate()); } }); CommonEventBus.getInstance().addHandler(VehicleHistoryFilterEvent.TYPE, new VehicleHistoryFilterEventHandler() { @Override public void onNewFilter(Date startDate, Date finalDate, Long vehicleId, String vehicleName) { refreshGrid(startDate, finalDate, vehicleId, vehicleName); } }); CommonEventBus.getInstance().addHandler(ShowVehicleHistoryTitleEvent.TYPE, new ShowVehicleHistoryTitleEventHandler() { @Override public void onShowVehicleTitleHistory(ShowVehicleHistoryTitleEvent event) { Canvas reportHeader = ReportHeaderBuilder.build(SessionData.getInstance(), uiConstants.vehicleHistoryTitle(), event.getStartDate(), event.getEndDate()); view.resetPrintHeader(reportHeader); } }); CommonEventBus.getInstance().addHandler(ResetVehicleHistoryTitleEvent.TYPE, new ResetVehicleHistoryTitleEventHandler() { @Override public void onResetVehicleTitleHistory(ResetVehicleHistoryTitleEvent event) { Canvas reportHeader = ReportHeaderBuilder.build(SessionData.getInstance(), uiConstants.vehicleHistoryTitle()); view.resetPrintHeader(reportHeader); } }); } private void refreshGrid(Date startDate, Date finalDate, Long vehicleId, String vehicleName) { if (finalDate == null) { finalDate = new Date(); } finalDate = getEndOfDay(finalDate); if (startDate == null) { startDate = getStartDate(finalDate); } startDate = getBeginOfDay(startDate); view.refreshFilter(startDate, finalDate, vehicleId, vehicleName); lastStartPeriodDate = startDate; lastEndPeriodDate = finalDate; lastSelectedVehicle = vehicleId; // Envia Hit de pageview ao Google Analytics GoogleAnalytics.sendPageViewHit("VehicleHistory", "Histórico de eventos"); }
Implementation of ListGrid
Code:
public class BaseListGrid extends ListGrid { // Definição das seções da barra de ferramentas do grid // Seção de ações básicas (Ex.: Adicionar) public static final int BASIC_ACTIONS = 0; // Seção de ações customizadas (Ex.: Botão ajuda) public static final int CUSTOM_ACTIONS = 1; // Seção de ações extras (Ex.: Exportar) public static final int EXTRA_ACTIONS = 2; // Interface para os métodos de criação da barra de ferramentas private interface ToolbarBuilder { void create(); }; // Construtor da seção de ações básicas public class CreateBasicActions implements ToolbarBuilder { @Override public void create() { createBasicActions(); } } // Construtor da seção de ações customizadas public class CreateCustomActions implements ToolbarBuilder { @Override public void create() { createCustomActions(); } } // Construtor da seção de ações extras public class CreateExtraActions implements ToolbarBuilder { @Override public void create() { createExtraActions(); } } private static final UserInterfaceConstants CONSTANTS = GWT.create(UserInterfaceConstants.class); private static final UserInterfaceMessages MESSAGES = GWT.create(UserInterfaceMessages.class); private static final String HAS_DETAIL_ATTRIBUTE = "BaseListGrid.hasDetail"; private static final String CAN_SELECT_ATTRIBUTE = "BaseListGrid.canSelect"; private static final String CAN_PRINT_ATTRIBUTE = "BaseListGrid.canPrint"; private static final String CAN_EXPORT_ATTRIBUTE = "BaseListGrid.canExport"; private static final String CAN_ADD_ATTRIBUTE = "BaseListGrid.canAdd"; private static final String CAN_UPDATE_ATTRIBUTE = "BaseListGrid.canUpdate"; private static final String CAN_UPDATE_CELL_ATTRIBUTE = "BaseListGrid.canUpdateCell"; private static final String CAN_REMOVE_ATTRIBUTE = "BaseListGrid.canRemove"; private static final String CAN_MOVE_ATTRIBUTE = "BaseListGrid.canMove"; private static final Logger logger = Logger.getLogger(BaseListGrid.class.getName()); private static final String PRINT_HEADER_ATTRIBUTE = "BaseListGrid.printHeader"; private static final String EXPORT_FILENAME_ATTRIBUTE = "BaseListGrid.exportFilename"; private static final String EXPORT_CLIENT_SIDE_ATTRIBUTE = "BaseListGrid.exportClientSide"; public static final String ACTIONS_FIELD = "BaseListGrid_actionsField"; private ToolStrip tools; private List<Canvas> customToolbarMembers = null; private ToolbarBuilder createFirstGroupActions = null; private ToolbarBuilder createSecondGroupActions = null; private ToolbarBuilder createThirdGroupActions = null; private Layout rollOver = null; private int countActions = 0; private int actionsColumnPosition = -1; private boolean editConfigDone = false; private CanDoActionRecordRuler hasDetailRecordRuler = null; private CanDoActionRecordRuler canUpdateRecordRuler = null; private CanDoActionRecordRuler canRemoveRecordRuler = null; private ConfirmActionHandler confirmDetailHandler = null; private ConfirmActionHandler confirmAddHandler = null; private ConfirmActionHandler confirmUpdateHandler = null; private ConfirmActionHandler confirmRemoveHandler = null; private RecordValidator recordAddValidator = null; private RecordValidator recordUpdateValidator = null; private Collection<ActionDoneHandler> recordAddedHandlers = new LinkedList<ActionDoneHandler>(); private Collection<ActionDoneHandler> recordUpdatedHandlers = new LinkedList<ActionDoneHandler>(); private Collection<ActionDoneHandler> recordRemovedHandlers = new LinkedList<ActionDoneHandler>(); private CustomListGridRecordAction detailAction = null; private CustomListGridRecordAction updateAction = null; private CustomListGridRecordAction removeAction = null; private CustomListGridRecordAction upAction = null; private CustomListGridRecordAction downAction = null; private List<CustomListGridRecordAction> customActions = null; private Map<Integer, CustomListGridRecordAction> updateActionMap = new HashMap<Integer, CustomListGridRecordAction>(); private DetailLayoutProvider detailLayoutProvider = null; private HoverCustomizer hoverCustomizer = null; private Map<String, ComponentListGridField> componentFields = new HashMap<String, ComponentListGridField>(); private boolean showToolBar; private HandlerRegistration dataArrivedRegistration; private Canvas printHeader; private ReportHeaderProvider reportHeaderProvider; private ImgButton excelTool; private ImgButton csvTool; private ImgButton pdfTool; private ImgButton printTool; private boolean useDefaultPdfTool = true; private List<String> fieldsToShow = new ArrayList<String>(); // TODO [helenov] avaliar tratamento de inserção de novo registro // private ListGridRecord addedRecord; public static BaseListGrid getOrCreateRef(JavaScriptObject jsObj) { if (jsObj == null) return null; BaseWidget obj = BaseWidget.getRef(jsObj); if (obj != null) { return (BaseListGrid) obj; } else { return new BaseListGrid(jsObj); } } public BaseListGrid(JavaScriptObject jsObj) { super(jsObj); } public BaseListGrid(int firstGroupType, int secondGroupType, int thirdGroupType) { this.useDefaultPdfTool = false; createFirstGroupActions = makeToolbarBuilder(firstGroupType); createSecondGroupActions = makeToolbarBuilder(secondGroupType); createThirdGroupActions = makeToolbarBuilder(thirdGroupType); initBaseListGrid(); } private ToolbarBuilder makeToolbarBuilder(int groupType) { ToolbarBuilder toolbarBuilder = null; if (groupType == BASIC_ACTIONS) { toolbarBuilder = new CreateBasicActions(); } else if (groupType == CUSTOM_ACTIONS) { toolbarBuilder = new CreateCustomActions(); } else if (groupType == EXTRA_ACTIONS) { toolbarBuilder = new CreateExtraActions(); } return toolbarBuilder; } public BaseListGrid() { this(true); } public BaseListGrid(boolean useDefaultPdfTool) { this.useDefaultPdfTool = useDefaultPdfTool; // Define a ordem padrão de criação das seções da barra de ferramentas. this.createFirstGroupActions = new CreateBasicActions(); this.createSecondGroupActions = new CreateCustomActions(); this.createThirdGroupActions = new CreateExtraActions(); initBaseListGrid(); } public BaseListGrid(boolean useDefaultPdfTool, int actionsColumnPos) { this.useDefaultPdfTool = useDefaultPdfTool; // Define a ordem padrão de criação das seções da barra de ferramentas. this.createFirstGroupActions = new CreateBasicActions(); this.createSecondGroupActions = new CreateCustomActions(); this.createThirdGroupActions = new CreateExtraActions(); actionsColumnPosition = actionsColumnPos; initBaseListGrid(); } private void initBaseListGrid() { // Evita que após a edição de uma linha do grid, a mesma seja eliminada do cache. ResultSet resultSetProperties = new ResultSet(); resultSetProperties.setNeverDropUpdatedRows(true); setDataProperties(resultSetProperties); // configuração padrão de ações this.setCanSelect(false); this.setCanAdd(false); this.setCanUpdate(false); this.setCanRemove(false); this.setWarnOnRemoval(true); this.setWarnOnRemovalMessage(MESSAGES.confirmRemove()); // configuração geral this.setBooleanTrueImage(DesignConstants.CHECKED_ICON); this.setShowRecordComponents(true); this.setShowRecordComponentsByCell(true); this.setWrapCells(true); this.setShowAlternate(true, 1); this.setExportAll(false); // configuração de scroll this.setLeaveScrollbarGap(true); this.setBodyOverflow(Overflow.AUTO); this.setFixedRecordHeights(false); this.setVirtualScrolling(true); // configuração do rollover this.setShowRollOver(true); // configuração da consulta this.setAutoFetchData(true); this.setDataFetchMode(FetchMode.PAGED); // [TODO] Parametrizar tamanho das páginas this.setDataPageSize(30); this.setFetchDelay(500); this.setLoadingMessage(CONSTANTS.loading()); this.setDrawAheadRatio(4.0f); // configuração do cabeçalho this.setShowHeader(true); // configuração do filtro this.setShowFilter(true); // configuração dos componentes this.setGridComponents(new Object[] { createToolbar(), ListGridComponent.HEADER, ListGridComponent.FILTER_EDITOR, ListGridComponent.BODY }); this.addFilterEditorSubmitHandler(new FilterEditorSubmitHandler() { @Override public void onFilterEditorSubmit(FilterEditorSubmitEvent event) { invalidateCache(); } }); this.addDrawHandler(new DrawHandler() { @Override public void onDraw(DrawEvent event) { if (showToolBar) { tools.show(); } else { tools.hide(); } } }); addFetchDataHandler(new FetchDataHandler() { public void onFilterData(FetchDataEvent event) { putTimeZoneParameter(event.getRequestProperties()); } }); } public void setShowAlternate(boolean showAlternate) { this.setShowAlternate(showAlternate, 1); } public void enableEditUnsavedRecord() { if (getCanAdd()) { this.addCellClickHandler(new CellClickHandler() { @Override public void onCellClick(CellClickEvent event) { ListGridRecord record = event.getRecord(); if (record == null) { setEditEvent(ListGridEditEvent.CLICK); } else { setEditEvent(ListGridEditEvent.NONE); } } }); } } public void setShowAlternate(boolean showAlternate, int frequency) { this.setAlternateRecordStyles(showAlternate); this.setAlternateRecordFrequency(frequency); } public void setShowHeader(Boolean showHeader) { super.setShowHeader(showHeader); this.setShowHeaderContextMenu(false); this.setShowHeaderMenuButton(false); this.setCanAddSummaryFields(false); } public void setShowFilter(Boolean showFilter) { this.setShowFilterEditor(showFilter); this.setFilterButtonPrompt(CONSTANTS.filter()); this.setFilterOnKeypress(true); } public void setFields(List<ListGridField> fields) { this.setFields(fields.toArray(new ListGridField[fields.size()])); } @Override public void setFields(ListGridField... fields) { super.setFields(getFieldsWithActions(fields)); this.setExportFields(getExportableFields(fields)); // define fields que poderão ser exportados } private ListGridField[] getFieldsWithActions(ListGridField... fields) { countActions = countActions(); if (countActions > 0) { // copia fields originais ArrayList<ListGridField> fieldsList = new ArrayList<ListGridField>(fields.length + countActions); for (ListGridField field : fields) { fieldsList.add(field); if (hoverCustomizer != null && field.getShowHover() != null && !field.getShowHover()) { field.setShowHover(true); field.setHoverCustomizer(hoverCustomizer); } } // acrescenta coluna de ações if (actionsColumnPosition == -1) { fieldsList.add(createActionsField(countActions)); } else { fieldsList.add(actionsColumnPosition, createActionsField(countActions)); } // reconverte lista em array fields = fieldsList.toArray(fields); } // faz configurações de campos customizados for (ListGridField field : fields) { if (field instanceof CustomListGridField) { CustomListGridField customField = (CustomListGridField) field; configCustomField(customField); } if (field instanceof ComponentListGridField) { ComponentListGridField compField = (ComponentListGridField) field; configComponentField(compField); } } return fields; } @Override public void setDataSource(DataSource ds, ListGridField... fields) { if (!isCreated()) { super.setDataSource(ds, fields); } else { super.setDataSource(ds, getFieldsWithActions(fields)); } } private void configCustomField(CustomListGridField field) { // configura refresh automático de detalhes if (field.getRefreshDetailOnChanged()) { field.addChangedHandler(new ChangedHandler() { @Override public void onChanged(ChangedEvent event) { int rowNum = event.getRowNum(); ListGridRecord record = (ListGridRecord) getEditedRecord(rowNum); if (isDetailExpanded(record)) { DynamicForm form = getDetailForm(record); form.markForRedraw(); // força reavaliar showIfConditions } } }); } // configura refresh automático de campos do registro final String[] refreshFields = field.getRefreshFieldOnChanged(); if (refreshFields != null) { field.addChangedHandler(new ChangedHandler() { @Override public void onChanged(ChangedEvent event) { int rowNum = event.getRowNum(); refreshCells(rowNum, refreshFields); } }); } } private void configComponentField(final ComponentListGridField compField) { componentFields.put(compField.getName(), compField); this.addRecordRemovedHandler(new ActionDoneHandler() { @Override public void onActionDone(ListGridRecord record) { compField.removeComponent(record); } }); if (compField instanceof AssociationListGridField) { final AssociationListGridField assocField = (AssociationListGridField) compField; assocField.addAssociationRefreshHandler(new AssociationRefreshHandler() { @Override public void onAssociationRefresh(String id, boolean associated) { // atualiza valor do field de associação String fieldId = assocField.getIdField(); Record record = getRecordList().find(fieldId, id); record.setAttribute(assocField.getName(), associated); // atualiza células dependes final String[] refreshFields = assocField.getRefreshFieldOnChanged(); if (refreshFields != null) { int rowNum = getRecordIndex(record); refreshCells(rowNum, refreshFields); } } }); } } public void refreshCells(int rowNum, String[] fields) { for (String fieldName : fields) { int colNum = getFieldNum(fieldName); refreshCell(rowNum, colNum); } } @Override public void refreshCell(int rowNum, int colNum) { super.refreshCell(rowNum, colNum); this.refreshRecordComponent(rowNum, colNum); } private int countActions() { int actions = 0; if (this.getHasDetail()) { actions += 1; } if (this.getCanUpdate()) { actions += 1; } if (customActions != null) { actions += customActions.size(); } if (this.getCanRemove()) { actions += 1; } if (this.getCanMove()) { actions += 2; } return actions; } private ListGridField createActionsField(int actions) { ListGridField actionsField = new ListGridField(ACTIONS_FIELD, CONSTANTS.actions()); actionsField.setCanFilter(false); actionsField.setCanEdit(false); actionsField.setCanSort(false); actionsField.setShouldPrint(false); actionsField.setCanExport(false); actionsField.setAlign(Alignment.CENTER); int width = (DesignConstants.ACTION_ICON_SIZE + 3) * actions; actionsField.setWidth(width); if (actions <= 1) { actionsField.setTitle(" "); } return actionsField; } @Override protected Canvas createRecordComponent(ListGridRecord record, Integer colNum) { HStack panel = null; String field = this.getFieldName(colNum); // TODO [helenov] fazer do action field um component field if (field.equals(ACTIONS_FIELD)) { // FIXME: [ERROR] [Main] - TMR8:WARN:Log:Specified ID: isc_Canvas_15 collides with the ID for // an existing SmartGWT component or object. The existing object will be destroyed and the ID bound to the // new object. panel = new HStack(); panel.setHeight(DesignConstants.ACTION_ICON_SIZE); panel.setMembersMargin(3); this.addDetailAction(record, panel); this.addUpdateAction(record, panel); this.addCustomActions(record, panel); this.addRemoveAction(record, panel); this.addUpAction(record, panel); this.addDownAction(record, panel); } if (componentFields.containsKey(field)) { ComponentListGridField compField = componentFields.get(field); int rowNum = getRecordIndex(record); return compField.createComponent(record, rowNum); } return panel; } @Deprecated public void setCustomActions(CustomListGridRecordAction... actions) { setCustomAction(Arrays.asList(actions)); } public void setCustomAction(List<CustomListGridRecordAction> actions) { customActions = actions; } public void setCustomToolbarMembers(Canvas... customToolbarMembers) { setCustomToolbarMembers(Arrays.asList(customToolbarMembers)); } public void setCustomToolbarMembers(List<Canvas> customToolbarMembers) { this.customToolbarMembers = customToolbarMembers; this.resetToolbar(); } private ToolStrip createToolbar() { tools = new ToolStrip(); tools.setHeight(DesignConstants.ACTION_ICON_SIZE + 4); tools.setMembersMargin(3); this.resetToolbar(); return tools; } private void resetToolbar() { if (tools != null) { tools.removeMembers(tools.getMembers()); showToolBar = false; createFirstGroupActions.create(); createSecondGroupActions.create(); createThirdGroupActions.create(); } } private void createBasicActions() { if (this.addAddAction()) { showToolBar = true; } } private void createCustomActions() { // ações customizadas if (customToolbarMembers != null) { showToolBar = true; for (Canvas action : customToolbarMembers) { if (action instanceof ToolStripButton) { tools.addButton((ToolStripButton) action); } else { tools.addMember(action); } } } } private void createExtraActions() { // ações build-in auxiliares boolean haveExport = this.addExportAction(); boolean havePrint = this.addPrintAction(); if (haveExport || havePrint) { showToolBar = true; } } private ImgButton createGridAction(String icon, String prompt) { ImgButton action = new ImgButton(); action.setSrc(icon); action.setShowDown(false); action.setSize(DesignConstants.ACTION_ICON_SIZE); action.setPrompt(prompt); return action; } // Suporte a seleção de registros do grid. // ///////////////////////////////////////////////////////////////////////////// public Boolean getCanSelect() { Boolean canSelect = getAttributeAsBoolean(CAN_SELECT_ATTRIBUTE); return canSelect != null ? canSelect : false; } public void setCanSelect(Boolean canSelect) { this.setAttribute(CAN_SELECT_ATTRIBUTE, canSelect, true); if (canSelect) { this.setSelectionType(SelectionStyle.SIMPLE); this.setSelectionAppearance(SelectionAppearance.CHECKBOX); this.setCanSelectAll(true); this.setCheckboxFieldTrueImage(DesignConstants.CHECKBOX_CHECKED); this.setCheckboxFieldFalseImage(DesignConstants.CHECKBOX_UNCHECKED); this.addRecordClickHandler(new RecordClickHandler() { @Override public void onRecordClick(RecordClickEvent event) { if (!event.getField().getName().equals("_checkboxField")) { // Ignora o click no checkbox para não // fazer 2x ListGridRecord record = getRecord(event.getRecordNum()); boolean newState = !isSelected(record); selectRecord(record, newState); } } }); } else { this.setSelectionType(SelectionStyle.NONE); } } // [helenov] TODO verificar pq não funcionou // private ListGridField getSelectionField() { // return ListGridField.getOrCreateRef(getAttributeAsJavaScriptObject("checkboxField")); // } // Suporte a exibição de detalhes dos registros no grid. // ///////////////////////////////////////////////////////////////////////////// public Boolean getHasDetail() { Boolean hasDetail = getAttributeAsBoolean(HAS_DETAIL_ATTRIBUTE); return hasDetail != null ? hasDetail : false; } private boolean getHasDetail(ListGridRecord record) { boolean hasDetail = false; if (getHasDetail()) { hasDetail = getDetailAction().getCanDoAction(record); } return hasDetail; } public void setHasDetail(Boolean hasDetail) { this.setAttribute(HAS_DETAIL_ATTRIBUTE, hasDetail, true); if (hasDetail) { this.setExpansionMode(ExpansionMode.EDITOR); } } public CanDoActionRecordRuler getHasDetailRecordRuler() { return hasDetailRecordRuler; } public void setHasDetailRecordRuler(CanDoActionRecordRuler ruler) { hasDetailRecordRuler = ruler; if (detailAction != null) { detailAction.setCanDoActionRecordRuler(ruler); } } public ConfirmActionHandler getConfirmDetailHandler() { return confirmDetailHandler; } public void setConfirmDetailHandler(ConfirmActionHandler handler) { confirmDetailHandler = handler; if (detailAction != null) { detailAction.setConfirmActionHandler(handler); } } public DetailLayoutProvider getDetailLayoutProvider() { return detailLayoutProvider; } public void setDetailLayoutProvider(DetailLayoutProvider provider) { this.detailLayoutProvider = provider; } @Override public void setHoverCustomizer(HoverCustomizer hoverCustomizer) { this.hoverCustomizer = hoverCustomizer; } private void addDetailAction(ListGridRecord record, Layout panel) { if (getHasDetail()) { CustomListGridRecordAction action = getDetailAction(); panel.addMember(action.getActionIcon(record)); } } private CustomListGridRecordAction getDetailAction() { if (detailAction == null) { detailAction = createDetailAction(); } return detailAction; } private CustomListGridRecordAction createDetailAction() { CustomListGridRecordAction action = new CustomListGridRecordAction(DesignConstants.VIEW_RECORD_IMAGE, CONSTANTS.view()); action.setCanDoActionRecordRuler(hasDetailRecordRuler); action.setConfirmActionHandler(confirmDetailHandler); action.setExecuteActionHandler(new ExecuteActionHandler() { @Override public void execute(ListGridRecord record) { // se está editando já está aberto e não deve fechar if (!isEditing(record)) { toggleDetail(record); } } }); return action; } private void toggleDetail(ListGridRecord record) { if (getHasDetail(record)) { if (!isDetailExpanded(record)) { this.expandRecord(record); } else { this.collapseRecord(record); } } } public void expandRecord(ListGridRecord record) { this.collapseRecord(record); super.expandRecord(record); } @Override protected Canvas getExpansionComponent(ListGridRecord record) { Canvas canvas; if (detailLayoutProvider != null) { boolean canEdit = isEditing(record); canvas = this.getDetailLayout(record, canEdit); } else { canvas = super.getExpansionComponent(record); } return canvas; } private Layout getDetailLayout(final ListGridRecord record, boolean canEdit) { final DynamicForm form = detailLayoutProvider.getDetailLayout(record, canEdit); form.setWidth100(); form.setHeight100(); form.setCanEdit(canEdit); form.setDataSource(this.getDataSource()); form.addDrawHandler(new DrawHandler() { public void onDraw(DrawEvent event) { form.editRecord(record); } }); form.setCanSubmit(false); if (canEdit) { form.setSaveOnEnter(true); form.addSubmitValuesHandler(new SubmitValuesHandler() { @Override public void onSubmitValues(SubmitValuesEvent event) { endEditing(); } }); } Layout layout = new VLayout(); layout.setWidth100(); layout.setHeight100(); layout.addMember(form); return layout; } @SuppressWarnings({ "rawtypes", "unchecked" }) private ListGridRecord completeRecord(int rowNum, ListGridRecord record) { // valores do registro Map values = this.getEditValues(record); // acrescenta valores do form de detalhes DynamicForm form = getDetailForm(record); FormItem[] itens = form.getFields(); for (FormItem item : itens) { String itemName = item.getName(); Object itemValue = form.getValue(itemName); values.put(itemName, itemValue); } this.setEditValues(rowNum, values); return getEditedRecord(record); } public boolean isDetailExpanded(ListGridRecord record) { Canvas expansion = this.getCurrentExpansionComponent(record); return expansion != null; } public DynamicForm getDetailForm(ListGridRecord record) { Layout expansion = (Layout) this.getCurrentExpansionComponent(record); return (DynamicForm) expansion.getMember(0); } // Suporte a impressão da grid. // ///////////////////////////////////////////////////////////////////////////// public Boolean getCanPrint() { Boolean canPrint = getAttributeAsBoolean(CAN_PRINT_ATTRIBUTE); return canPrint != null ? canPrint : false; } public void setCanPrint(Boolean canPrint) { this.setAttribute(CAN_PRINT_ATTRIBUTE, canPrint, true); this.resetToolbar(); } public void setReportHeaderProvider(ReportHeaderProvider reportHeaderProvider) { this.reportHeaderProvider = reportHeaderProvider; } public Canvas getPrintHeader() { return printHeader; } public void setPrintHeader(Canvas printHeader) { this.printHeader = printHeader; } private boolean addPrintAction() { boolean show = false; if (this.getCanPrint()) { show = true; printTool = createGridAction(DesignConstants.PRINT_IMAGE, CONSTANTS.print()); printTool.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { disableButtons(); endEditing(); startPrinting(); } }); tools.addMember(printTool); } return show; } private void setResultSetFetchModePostCreate(FetchMode fetchMode) { getOriginalResultSet().setAttribute("fetchMode", fetchMode.getValue(), true); } private static native void downloadAsPDF(String html, DSRequest requestProperties) ; private Canvas[] getPrintView() { if (reportHeaderProvider != null) { Canvas printHeader = reportHeaderProvider.getReportHeader(); return new Canvas[] { printHeader, this }; } else { return new Canvas[] { this }; } } private String generateReportFileName() { String title = getExportFilename(); if (title == null) { title = "Relatório"; } DateTimeFormat dateTimeFormatter = DateTimeFormat.getFormat(CONSTANTS.patternDateTimeSeconds()); String timestamp = dateTimeFormatter.format(new Date()); String fileName = title + " " + timestamp; return fileName.replaceAll("[/: ]", "_"); } protected void startExportingPdf() { CommonEventBus.getInstance().fireEvent( new MessageIssueEvent(new Message(MessageType.INFO, MESSAGES.infoExportWaiting()))); expandGroups(); runAfterFullFetch(new Runnable() { @Override public void run() { Canvas.getPrintHTML(getPrintView(), new PrintProperties(), new PrintHTMLCallback() { @Override public void setHTML(final String html) { logger.info("callback getPrintHTML"); DSRequest requestProperties = new DSRequest(); requestProperties.setAttribute("skinName", "Linker"); requestProperties.setAttribute("pdfName", generateReportFileName()); requestProperties.setExportDisplay(ExportDisplay.DOWNLOAD); downloadAsPDF(html, requestProperties); logger.info("after exportContent"); enableButtons(); // Reabilita os botões enablePrintFetch(); } }); } }); } protected void startPrinting() { expandGroups(); runAfterFullFetch(new Runnable() { @Override public void run() { Canvas.showPrintPreview(getPrintView(), new PrintProperties(), null, new PrintPreviewCallback() { @Override public void execute(PrintCanvas printCanvas, PrintWindow printWindow) { logger.info("callback showPrintPreview"); enableButtons(); enablePrintFetch(); } }); } }); } private void expandGroups() { Tree groupTree = getGroupTree(); if (groupTree != null) { groupTree.openAll(); } } private boolean fetchDisabledByPrint = false; private boolean fetchDisabledByEdition = false; private boolean delayFetch = false; private void runAfterFullFetch(final Runnable runnable) { if (getOriginalResultSet() == null) { logger.info("resultSet is null!"); runnable.run(); return; } dataArrivedRegistration = addDataArrivedHandler(new DataArrivedHandler() { @Override public void onDataArrived(DataArrivedEvent event) { logger.info("data arrived!"); removeDataArrivedRegistration(); fetchDisabledByPrint = true; runnable.run(); } }); // Configura o grid para buscar todos os registros setResultSetFetchModePostCreate(FetchMode.BASIC); // Força refetch invalidateCache(); } private void enablePrintFetch() { fetchDisabledByPrint = false; // logger.info("Retorna grid para modo PAGED"); setResultSetFetchModePostCreate(FetchMode.PAGED); // Força refetch invalidateCache(); // logger.info("done"); } @Override public void invalidateCache() { logger.info("invalidateCache called"); if (fetchDisabledByPrint) { logger.info("invalidateCache skiped!"); return; } super.invalidateCache(); } private void removeDataArrivedRegistration() { if (dataArrivedRegistration != null) { dataArrivedRegistration.removeHandler(); } dataArrivedRegistration = null; } // Suporte a exportação da grid. // ///////////////////////////////////////////////////////////////////////////// public Boolean getCanExport() { Boolean canExport = getAttributeAsBoolean(CAN_EXPORT_ATTRIBUTE); return canExport != null ? canExport : false; } public void setCanExport(Boolean canExport) { this.setAttribute(CAN_EXPORT_ATTRIBUTE, canExport, true); this.resetToolbar(); } public Boolean getExportClientSide() { Boolean exportClient = getAttributeAsBoolean(EXPORT_CLIENT_SIDE_ATTRIBUTE); if (exportClient == null) { exportClient = true; } return exportClient; } public void setExportClientSide(Boolean exportClient) { this.setAttribute(EXPORT_CLIENT_SIDE_ATTRIBUTE, exportClient, true); } public String getExportFilename() { return getAttribute(EXPORT_FILENAME_ATTRIBUTE); } public void setExportFilename(String filename) { filename = StringUtilsClient.filterHtmlEntities(filename); this.setAttribute(EXPORT_FILENAME_ATTRIBUTE, filename, true); } public void addFieldToExport(String field) { fieldsToShow.add(field); } private void export(ExportFormat format) { disableButtons(); endEditing(); for (String field : fieldsToShow) { showField(field); } startExporting(format); for (String field : fieldsToShow) { hideField(field); } } private boolean addExportAction() { boolean show = false; if (this.getCanExport()) { show = true; excelTool = createGridAction(DesignConstants.EXPORT_EXCEL_IMAGE, CONSTANTS.exportExcel()); excelTool.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { export(ExportFormat.XLS); } }); tools.addMember(excelTool); csvTool = createGridAction(DesignConstants.EXPORT_CSV_IMAGE, CONSTANTS.exportCsv()); csvTool.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { export(ExportFormat.CSV); } }); tools.addMember(csvTool); pdfTool = createGridAction(DesignConstants.EXPORT_PDF_IMAGE, CONSTANTS.exportPdf()); if (useDefaultPdfTool) { pdfTool.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { disableButtons(); endEditing(); startExportingPdf(); } }); } tools.addMember(pdfTool); } return show; } public ImgButton getPdfTool() { return pdfTool; } private void disableButtons() { excelTool.disable(); csvTool.disable(); pdfTool.disable(); if (printTool != null) { printTool.disable(); } } private void enableButtons() { excelTool.enable(); csvTool.enable(); pdfTool.enable(); if (printTool != null) { printTool.enable(); } } private void startExporting(ExportFormat format) { if (!this.getDataAsRecordList().isEmpty()) { DSRequest dsRequestProps = new DSRequest(); dsRequestProps.setExportAs(format); dsRequestProps.setExportDisplay(ExportDisplay.DOWNLOAD); dsRequestProps.setExportDelimiter(";"); // coloca o TimeZone putTimeZoneParameter(dsRequestProps); dsRequestProps.setExportFilename(generateReportFileName()); if (!this.getExportClientSide()) { prepareDataSourceTitles(); this.exportData(dsRequestProps); } else { this.exportClientData(dsRequestProps); } } else { CommonEventBus.getInstance().fireEvent( new MessageIssueEvent(new Message(MessageType.INFO, MESSAGES.infoNoRecordToExport()))); } // Reabilita os botões de exportação enableButtons(); } private void putTimeZoneParameter(DSRequest dsRequestProps) { // pega o TimeZone do client Date today = new Date(); String timeZone = DateTimeFormat.getFormat("v").format(today); // coloca o parametro TimeZone no DSrequest Map<String, String> param = new HashMap<String, String>(); param.put("timeZone", timeZone); dsRequestProps.setParams(param); } private void prepareDataSourceTitles() { Date date = new Date(); DataSource ds = this.getDataSource(); ListGridField[] fields = this.getAllFields(); for (ListGridField field : fields) { String title = null; if (fieldIsExportable(field)) { title = StringUtilsClient.filterHtmlEntities(field.getTitle()); if (ListGridFieldType.DATETIME.equals(field.getType())) { title = title + " (" + DateTimeFormat.getFormat("ZZZZ").format(date) + ")"; } } DataSourceField dsField = ds.getField(field.getName()); if (dsField != null && title != null) { dsField.setTitle(title); } } } protected String[] getExportableFields(ListGridField... fields) { List<String> exportFields = new ArrayList<String>(fields.length); for (ListGridField field : fields) { if (fieldIsExportable(field)) { exportFields.add(field.getName()); } } return exportFields.toArray(new String[exportFields.size()]); } private boolean fieldIsVisible(ListGridField field) { String showIf = field.getAttribute("showIf"); return showIf == null || "true".equals(showIf); } protected boolean fieldIsExportable(ListGridField field) { Object canExportString = field.getAttributeAsObject("canExport"); if (canExportString == null) { return fieldIsVisible(field); } else { return (Boolean) canExportString; } } // Suporte a inclusão de registros no grid. // ///////////////////////////////////////////////////////////////////////////// public Boolean getCanAdd() { Boolean canAdd = getAttributeAsBoolean(CAN_ADD_ATTRIBUTE); return canAdd != null ? canAdd : false; } public void setCanAdd(Boolean canAdd) { this.setAttribute(CAN_ADD_ATTRIBUTE, canAdd, true); this.resetToolbar(); this.setCanEdit(); } public ConfirmActionHandler getConfirmAddHandler() { return confirmAddHandler; } public void setConfirmAddHandler(ConfirmActionHandler handler) { confirmAddHandler = handler; } public RecordValidator getRecordAddValidator() { return recordAddValidator; } public void setRecordAddValidator(RecordValidator validator) { recordAddValidator = validator; } public synchronized void addRecordAddedHandler(ActionDoneHandler handler) { recordAddedHandlers.add(handler); } private boolean addAddAction() { boolean show = false; if (this.getCanAdd()) { show = true; ImgButton addTool = createGridAction(DesignConstants.ADD_LINE_IMAGE, CONSTANTS.add()); addTool.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { boolean confirm = confirmAdding(); if (confirm) { startAdding(); } } }); tools.addMember(addTool); } return show; } private boolean confirmAdding() { boolean confirm = true; if (confirmAddHandler != null) { confirm = confirmAddHandler.confirm(null, new BooleanCallback() { @Override public void execute(Boolean confirm) { if (confirm) { startAdding(); } } }); } return confirm; } private void startAdding() { this.startEditingNew(); } private boolean validateAdd(ListGridRecord record) { boolean valid = true; if (recordAddValidator != null) { valid = recordAddValidator.validate(record); } return valid; } private synchronized void notifyRecordAdded(ListGridRecord record) { for (ActionDoneHandler handler : recordAddedHandlers) { handler.onActionDone(record); } } // Suporte a edição de registros no grid. // ///////////////////////////////////////////////////////////////////////////// public Boolean getCanUpdate() { Boolean canUpdate = getAttributeAsBoolean(CAN_UPDATE_ATTRIBUTE); return canUpdate != null ? canUpdate : false; } public void setCanUpdate(Boolean canUpdate) { this.setAttribute(CAN_UPDATE_ATTRIBUTE, canUpdate, true); this.setCanEdit(); } public CanDoActionRecordRuler getCanUpdateRecordRuler() { return canUpdateRecordRuler; } public void setCanUpdateRecordRuler(CanDoActionRecordRuler ruler) { canUpdateRecordRuler = ruler; if (updateAction != null) { updateAction.setCanDoActionRecordRuler(ruler); } if (!updateActionMap.isEmpty()) { for (CustomListGridRecordAction action : updateActionMap.values()) { action.setCanDoActionRecordRuler(ruler); } } } public ConfirmActionHandler getConfirmUpdateHandler() { return confirmUpdateHandler; } public void setConfirmUpdateHandler(ConfirmActionHandler handler) { confirmUpdateHandler = handler; if (updateAction != null) { updateAction.setConfirmActionHandler(handler); } if (!updateActionMap.isEmpty()) { for (CustomListGridRecordAction action : updateActionMap.values()) { action.setConfirmActionHandler(handler); } } } public RecordValidator getRecordUpdateValidator() { return recordUpdateValidator; } public void setRecordUpdateValidator(RecordValidator validator) { recordUpdateValidator = validator; } public synchronized void addRecordUpdatedHandler(ActionDoneHandler handler) { recordUpdatedHandlers.add(handler); } private void addUpdateAction(ListGridRecord record, Layout panel) { if (getCanUpdate()) { CustomListGridRecordAction action = getUpdateAction(); panel.addMember(action.getActionIcon(record)); if (!action.getCanDoAction(record)) { record.setAttribute(getRecordEditProperty(), false); } } } private CustomListGridRecordAction getUpdateAction() { if (updateAction == null) { updateAction = createUpdateAction(); } return updateAction; } private CustomListGridRecordAction createUpdateAction() { CustomListGridRecordAction action = new CustomListGridRecordAction(DesignConstants.CHANGE_RECORD_IMAGE, CONSTANTS.edit()); action.setCanDoActionRecordRuler(canUpdateRecordRuler); action.setConfirmActionHandler(confirmUpdateHandler); action.setExecuteActionHandler(new ExecuteActionHandler() { @Override public void execute(ListGridRecord record) { startUpdating(record, null); CommonEventBus.getInstance().fireEvent(new MessageClearEvent()); } }); return action; } private void startUpdating(ListGridRecord record, Integer colNum) { // se já está editando, já está aberto e não deve mudar if (!isEditing(record)) { int rowNum = this.getRecordIndex(record); if (colNum == null) { colNum = this.getFirstEditableColumn(rowNum); } if (startEditing(rowNum, colNum, false)) { if (getHasDetail(record)) { expandRecord(record); } } } } private boolean validateUpdate(ListGridRecord record) { boolean valid = true; if (recordUpdateValidator != null) { valid = recordUpdateValidator.validate(record); } return valid; } private synchronized void notifyRecordUpdated(ListGridRecord record) { for (ActionDoneHandler handler : recordUpdatedHandlers) { handler.onActionDone(record); } } public Boolean getCanUpdateCell() { Boolean canUpdate = getAttributeAsBoolean(CAN_UPDATE_CELL_ATTRIBUTE); return canUpdate != null ? canUpdate : false; } public void setCanUpdateCell(Boolean canUpdate) { this.setAttribute(CAN_UPDATE_CELL_ATTRIBUTE, canUpdate, true); this.setCanEdit(); this.setEditByCell(canUpdate); this.setShowRollOverCanvas(canUpdate); this.setUseCellRollOvers(canUpdate); } @Override protected Canvas getRollOverCanvas(Integer rowNum, Integer colNum) { if (isEditing()) { return null; } Layout layout = null; if (CustomListGridField.getCanUpdateCell(getField(colNum))) { CustomListGridRecordAction action = getUpdateCellAction(colNum); ListGridRecord record = (ListGridRecord) this.getEditedRecord(rowNum); if (action.getCanDoAction(record)) { layout = createRollOverCanvas(record, colNum); layout.addMember(action.getActionIcon(record)); } } return layout; } private Layout createRollOverCanvas(ListGridRecord record, Integer colNum) { if (rollOver == null) { rollOver = new HLayout(2); rollOver.setSnapTo("TR"); rollOver.setWidth(22); rollOver.setHeight(22); } else { rollOver.removeMembers(rollOver.getMembers()); } return rollOver; } private CustomListGridRecordAction getUpdateCellAction(int colNum) { CustomListGridRecordAction action = updateActionMap.get(colNum); if (action == null) { action = createUpdateAction(colNum); } return action; } private CustomListGridRecordAction createUpdateAction(final int colNum) { CustomListGridRecordAction action = new CustomListGridRecordAction(DesignConstants.CHANGE_RECORD_IMAGE, CONSTANTS.edit()); action.setCanDoActionRecordRuler(canUpdateRecordRuler); action.setConfirmActionHandler(confirmUpdateHandler); action.setExecuteActionHandler(new ExecuteActionHandler() { @Override public void execute(ListGridRecord record) { startUpdating(record, colNum); CommonEventBus.getInstance().fireEvent(new MessageClearEvent()); } }); return action; } public Boolean getCanRemove() { Boolean canRemove = getAttributeAsBoolean(CAN_REMOVE_ATTRIBUTE); return canRemove != null ? canRemove : false; } public void setCanRemove(Boolean canRemove) { this.setAttribute(CAN_REMOVE_ATTRIBUTE, canRemove, true); } public CanDoActionRecordRuler getCanRemoveRecordRuler() { return canRemoveRecordRuler; } public void setCanRemoveRecordRuler(CanDoActionRecordRuler ruler) { canRemoveRecordRuler = ruler; if (removeAction != null) { removeAction.setCanDoActionRecordRuler(ruler); } } public ConfirmActionHandler getConfirmRemoveHandler() { return confirmRemoveHandler; } public void setConfirmRemoveHandler(ConfirmActionHandler handler) { confirmRemoveHandler = handler; if (removeAction != null) { removeAction.setConfirmActionHandler(handler); } } public synchronized void addRecordRemovedHandler(ActionDoneHandler removeRecordListener) { recordRemovedHandlers.add(removeRecordListener); } private void addRemoveAction(ListGridRecord record, Layout panel) { if (getCanRemove()) { CustomListGridRecordAction action = getRemoveAction(); panel.addMember(action.getActionIcon(record)); } } private CustomListGridRecordAction getRemoveAction() { if (removeAction == null) { removeAction = createRemoveAction(); } return removeAction; } private CustomListGridRecordAction createRemoveAction() { CustomListGridRecordAction action = new CustomListGridRecordAction(DesignConstants.DELETE_RECORD_IMAGE, CONSTANTS.delete()); action.setCanDoActionRecordRuler(canRemoveRecordRuler); action.setConfirmActionHandler(confirmRemoveHandler); action.setExecuteActionHandler(new ExecuteActionHandler() { @Override public void execute(ListGridRecord record) { startRemoving(record); } }); return action; } private void startRemoving(final ListGridRecord record) { if (this.getWarnOnRemoval()) { this.warnRemove(record); } else { this.doRemove(record); } } private void warnRemove(final ListGridRecord record) { Dialog dialog = new Dialog(); dialog.setBodyColor("#EDEDED"); SC.ask(CONSTANTS.warning(), this.getWarnOnRemovalMessage(), new BooleanCallback() { @Override public void execute(Boolean ok) { if (ok) { doRemove(record); } } }, dialog); } private void doRemove(final ListGridRecord record) { removeData(record, new DSCallback() { @Override public void execute(DSResponse response, Object rawData, DSRequest request) { if (response.getStatus() == DSResponse.STATUS_SUCCESS) { notifyRecordRemoved(record); } } }); } private synchronized void notifyRecordRemoved(ListGridRecord record) { for (ActionDoneHandler handler : recordRemovedHandlers) { handler.onActionDone(record); } } private void addUpAction(ListGridRecord record, Layout panel) { if (getCanMove()) { CustomListGridRecordAction action = getUpAction(); panel.addMember(action.getActionIcon(record)); } } private void addDownAction(ListGridRecord record, Layout panel) { if (getCanMove()) { CustomListGridRecordAction action = getDownAction(); panel.addMember(action.getActionIcon(record)); } } private CustomListGridRecordAction getUpAction() { if (upAction == null) { upAction = createUpAction(); } return upAction; } private CustomListGridRecordAction getDownAction() { if (downAction == null) { downAction = createDownAction(); } return downAction; } private CustomListGridRecordAction createUpAction() { CustomListGridRecordAction upAction = new CustomListGridRecordAction(DesignConstants.MOVE_UP_RECORD_IMAGE, CONSTANTS.moveUp()); upAction.setExecuteActionHandler(new ExecuteActionHandler() { @Override public void execute(ListGridRecord record) { RecordList rs = getRecordList(); int index = getRecordIndex(record); if (index > 0) { rs.removeAt(index); rs.addAt(record, index - 1); } } }); return upAction; } private CustomListGridRecordAction createDownAction() { CustomListGridRecordAction downAction = new CustomListGridRecordAction(DesignConstants.MOVE_DOWN_RECORD_IMAGE, CONSTANTS.moveDown()); downAction.setExecuteActionHandler(new ExecuteActionHandler() { @Override public void execute(ListGridRecord record) { RecordList rs = getRecordList(); int index = getRecordIndex(record); int numRecords = rs.getLength(); if (index < numRecords - 1) { rs.removeAt(index); rs.addAt(record, index + 1); } } }); return downAction; } public Boolean getCanMove() { Boolean canMove = getAttributeAsBoolean(CAN_MOVE_ATTRIBUTE); return canMove != null ? canMove : false; } public void setCanMove(Boolean canMove) { this.setAttribute(CAN_MOVE_ATTRIBUTE, canMove, true); } private void addCustomActions(ListGridRecord record, Layout panel) { if (customActions != null) { for (CustomListGridRecordAction action : customActions) { panel.addMember(action.getActionIcon(record)); } } } private void setCanEdit() { boolean canEdit = this.getCanAdd() || this.getCanUpdate() || this.getCanUpdateCell(); setCanEdit(canEdit); } public void setCanEdit(Boolean canEdit) { super.setCanEdit(canEdit); configEdit(); } private void configEdit() { if (getCanEdit() && !editConfigDone) { editConfigDone = true; this.setEditEvent(ListGridEditEvent.NONE); this.setAutoSaveEdits(true); this.setSelectOnEdit(false); this.setModalEditing(false); this.setConfirmCancelEditing(false); this.setConfirmDiscardEdits(false); bindEditHandlers(); } } private void bindEditHandlers() { this.addRecordClickHandler(new RecordClickHandler() { @Override public void onRecordClick(RecordClickEvent event) { int editingRow = getEditRow(); int clickedRow = event.getRecordNum(); if (editingRow >= 0 && editingRow != clickedRow) { endEditing(); } } }); // salva registro quando usuario clica em coluna não editável do mesmo registro this.addCellClickHandler(new CellClickHandler() { @Override public void onCellClick(CellClickEvent event) { if (getCanUpdateCell()) { int editingRow = getEditRow(); int clickedRow = event.getRowNum(); if (editingRow >= 0 && editingRow == clickedRow) { int editingCol = getEditCol(); int clickedCol = event.getColNum(); if (editingCol >= 0 && editingCol != clickedCol) { endEditing(); } } } } }); // inclui detalhes, se houver, nos dados a serem salvos this.addRowEditorExitHandler(new RowEditorExitHandler() { @Override public void onRowEditorExit(RowEditorExitEvent event) { int editingRow = getEditRow(); ListGridRecord record = (ListGridRecord) getEditedRecord(editingRow); if (event.getEditCompletionEvent() != EditCompletionEvent.ESCAPE_KEYPRESS) { if (isEditing(record) && isDetailExpanded(record)) { record = completeRecord(editingRow, record); } if (!validateEdit(record)) { event.cancel(); } } else { // fecha os detalhes collapseRecord(record); } } }); this.addEditCompleteHandler(new EditCompleteHandler() { @Override public void onEditComplete(EditCompleteEvent event) { final ListGridRecord record = getEditedRecord(event); if (record != null) { collapseRecord(record); notifyRecordEdited(event, record); } } }); } private void notifyRecordEdited(EditCompleteEvent event, final ListGridRecord record) { if (event.getOldValues() == null) { // na inserção, se tem detalhes, emenda uma edição if (getHasDetail(record)) { startUpdating(record, null); } notifyRecordAdded(record); } else { notifyRecordUpdated(record); } } // TODO [helenov] avaliar tratamento de inserção de novo registro // private void bindChangedHandler() { // ResultSet rs = this.getResultSet(); // rs.addDataChangedHandler( new DataChangedHandler() { // @Override // public void onDataChanged(DataChangedEvent event) { // // TODO implementar destaque do registro editado // if ( addedRecord != null ) { // addedRecord = null; // redraw(); // scrollToRow(getRecordIndex(addedRecord)); // // selectRecord(record); // } // } // }); // } private boolean validateEdit(ListGridRecord record) { if (record.getAttribute("id") == null) { return validateAdd(record); } else { return validateUpdate(record); } } @Override public boolean canEditCell(int rowNum, int colNum) { CustomListGridField customField = new CustomListGridField(this.getField(colNum)); CanDoActionRecordRuler ruler = customField.getCanEditCellRuler(); if (ruler != null) { ListGridRecord record = (ListGridRecord) this.getEditedRecord(rowNum); return ruler.getCanDoAction(record); } return super.canEditCell(rowNum, colNum); } public boolean isEditing() { return this.getEditRow() != -1; } public boolean isEditing(ListGridRecord record) { int editRow = this.getEditRow(); int recordRow = this.getRecordIndex(record); boolean canEdit = false; // registro está sendo editado if (editRow != -1 && editRow == recordRow) { canEdit = true; } return canEdit; } public Record getEditedRecord(int rowNum) { return ListGridRecord.getOrCreateRef(super.getEditedRecord(rowNum).getJsObj()); } public ListGridRecord getEditedRecord(Record record) { int rowNum = getRecordIndex(record); return (ListGridRecord) getEditedRecord(rowNum); } private ListGridRecord getEditedRecord(EditCompleteEvent event) { ListGridRecord edited = null; String pkField = getDataSource().getPrimaryKeyFieldName(); Record[] response = event.getDsResponse().getData(); // TODO [helenov] verificar porque às vezes response vem vazio. if (response.length > 0) { String pkValue = response[0].getAttribute(pkField); Record record = getRecordList().find(pkField, pkValue); edited = ListGridRecord.getOrCreateRef(record.getJsObj()); } return edited; } private int getFirstEditableColumn(int rowNum) { ListGridField[] fields = this.getFields(); for (int i = 0; i < fields.length; i++) { if (canEditCell(rowNum, i)) { return i; } } return 0; } public String getFilterState() { JSONEncoder encoder = new JSONEncoder(); return encoder.encode(this.getFilterEditorCriteria().getJsObj()); } public void setFilterState(String state) { AdvancedCriteria criteria = new AdvancedCriteria(JSONEncoder.decode(state)); this.setCriteria(criteria); } public void setActionsColumnPosition(int actionsColumnPosition) { this.actionsColumnPosition = actionsColumnPosition; } public void setCustomAction(Canvas customAction, int position) { tools.addMember(customAction, position); }
Best regards
Comment