From 4bad2e4a779d2ab963f4e9656835fe67674842cf Mon Sep 17 00:00:00 2001 From: Silvano Trinchero Date: Tue, 25 Sep 2018 12:23:19 +0200 Subject: [PATCH] Fix display errors with non-displayed columns --- .../WInfoWindowListItemRenderer.java | 45 ++++++++----------- .../org/adempiere/webui/info/InfoWindow.java | 17 +++++-- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/WInfoWindowListItemRenderer.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/WInfoWindowListItemRenderer.java index 94121d2159..799344fe50 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/WInfoWindowListItemRenderer.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/WInfoWindowListItemRenderer.java @@ -28,6 +28,7 @@ import org.adempiere.webui.editor.WebEditorFactory; import org.adempiere.webui.event.ValueChangeEvent; import org.adempiere.webui.event.ValueChangeListener; import org.adempiere.webui.info.InfoWindow; +import org.compiere.minigrid.ColumnInfo; import org.compiere.minigrid.IDColumn; import org.compiere.model.GridField; import org.compiere.model.MInfoColumn; @@ -36,58 +37,50 @@ import org.zkoss.zul.Listcell; public class WInfoWindowListItemRenderer extends WListItemRenderer { - private MInfoColumn[] infoColumns; - private GridField[] gridFields; - private int gridFieldsOffset = -1; // There are added columns in front of the first real gridField, instead of a fixed +1 we use an offset - private InfoWindow infoWindow; + private MInfoColumn[] gridDisplayedInfoColumns = null; + private ColumnInfo[] gridDisplayedColumnInfos = null; + private InfoWindow infoWindow = null; - public WInfoWindowListItemRenderer(InfoWindow infoWindow, MInfoColumn[] infoColumns, List gridFields) + public WInfoWindowListItemRenderer(InfoWindow infoWindow) { - this.infoColumns = infoColumns; - this.gridFields = gridFields.toArray(new GridField[infoColumns.length]); this.infoWindow = infoWindow; } - public WInfoWindowListItemRenderer(InfoWindow infoWindow, MInfoColumn[] infoColumns, List gridFields, List columnNames) + public WInfoWindowListItemRenderer(InfoWindow infoWindow, List columnNames) { super(columnNames); - this.infoColumns = infoColumns; - this.gridFields = gridFields.toArray(new GridField[infoColumns.length]); this.infoWindow = infoWindow; } - private void calculateFieldOffest() + public void setGridDisplaydInfoColumns(MInfoColumn[] infoColumns, ColumnInfo[] columnInfos) { - int colCount = getTableColumns().size(); + this.gridDisplayedInfoColumns = infoColumns; + this.gridDisplayedColumnInfos = columnInfos; + } - if(colCount > infoColumns.length) // Added columns: selecetion - gridFieldsOffset = colCount - infoColumns.length; - } - @Override protected Listcell getCellComponent(WListbox table, Object field, final int rowIndex, final int columnIndex) { - if(gridFieldsOffset < 0) // Just do it once, this assumes this rendered is not shared between grids - calculateFieldOffest(); - + if(gridDisplayedInfoColumns == null || gridDisplayedColumnInfos == null) + { + return super.getCellComponent(table, field, rowIndex, columnIndex); + } + Listcell listcell = null; ListModelTable model = table.getModel(); Object obj = model.get(rowIndex); - int effectiveFieldIndex = columnIndex - gridFieldsOffset; - - if(effectiveFieldIndex >= 0 - && model.isSelected(obj) ) + MInfoColumn infoColumn = gridDisplayedInfoColumns[columnIndex]; + + if(model.isSelected(obj) && infoColumn != null) // First index may be null { - MInfoColumn infoColumn = infoColumns[effectiveFieldIndex]; - if(infoColumn.isReadOnly() == false && columnIndex > 0) { ListCell listCell = new ListCell(); - final GridField gridField = gridFields[effectiveFieldIndex]; + final GridField gridField = gridDisplayedColumnInfos[columnIndex].getGridField(); final WEditor editor = WebEditorFactory.getEditor(gridField, false); // Set editor value diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java index ff8afc7823..0a26400341 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java @@ -157,7 +157,8 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL private boolean hasEditable = false; private Map> cacheOriginalValues = new HashMap<>(); - private Map> temporarySelectedData = new HashMap<>(); + private Map> temporarySelectedData = new HashMap<>(); + private WInfoWindowListItemRenderer infoWindowListItemRenderer = null; // F3P: export @@ -630,10 +631,10 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL if(hasEditable) { - WInfoWindowListItemRenderer renderer = new WInfoWindowListItemRenderer(this, infoColumns, gridFields); - contentPanel.setItemRenderer(renderer); + infoWindowListItemRenderer = new WInfoWindowListItemRenderer(this); + contentPanel.setItemRenderer(infoWindowListItemRenderer); contentPanel.setAllowIDColumnForReadWrite(true); - renderer.addTableValueChangeListener(contentPanel); // Replicated from WListbox constructor + infoWindowListItemRenderer.addTableValueChangeListener(contentPanel); // Replicated from WListbox constructor } } @@ -766,6 +767,9 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL String keySelectClause = keyTableAlias+"."+p_keyColumn; list.add(new ColumnInfo(" ", keySelectClause, IDColumn.class, true, false, null, p_keyColumn)); + List gridDisplayedIC = new ArrayList<>(); + gridDisplayedIC.add(null); // First column does not have any matching info column + boolean haveNotProcess = !haveProcess; // A field is editabile only if is not readonly and theres a process int i = 0; @@ -809,6 +813,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL columnInfo.setGridField(gridFields.get(i)); columnInfo.setColumnName(infoColumn.getColumnName()); list.add(columnInfo); + gridDisplayedIC.add(infoColumn); if (keyColumnOfView == infoColumn){ if (columnInfo.getColClass().equals(IDColumn.class)) @@ -824,6 +829,10 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL } columnInfos = list.toArray(new ColumnInfo[0]); + MInfoColumn gridDisplayedInfoColumns[] = gridDisplayedIC.toArray(new MInfoColumn[gridDisplayedIC.size()]); + + if(infoWindowListItemRenderer != null) + infoWindowListItemRenderer.setGridDisplaydInfoColumns(gridDisplayedInfoColumns,columnInfos); prepareTable(columnInfos, infoWindow.getFromClause(), p_whereClause, infoWindow.getOrderByClause()); }