From b0aee7155facaa47c6f5f3c53f3a8bd08caf25d0 Mon Sep 17 00:00:00 2001 From: pkupczyk <pkupczyk> Date: Fri, 27 Jan 2012 16:01:09 +0000 Subject: [PATCH] LMS-2711 - Columns order is sometimes lost SVN: 24297 --- .../framework/DisplaySettingsManager.java | 94 ++++++++++++++++++- .../ui/ColumnSettingsConfigurer.java | 41 ++++++-- 2 files changed, 125 insertions(+), 10 deletions(-) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java index 057b79dd0fd..451674ad4f3 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java @@ -352,6 +352,25 @@ public class DisplaySettingsManager refreshNeeded = true; } } + } else + { + // LMS-2711 + // For columns that are saved in the settings but are not found in the model + // create a column with a ColumnConfig object basing on a ColumnSetting object. + // Hide this column now but save the information whether it was originally hidden + // and had a filter in a style name. This information will be used for storing the + // settings back in the DB (see createColumnsSettings() method). + + ColumnStyle columnStyle = new ColumnStyle(); + columnStyle.setHidden(columnSetting.isHidden()); + columnStyle.setHasFilter(columnSetting.hasFilter()); + + columnConfig = new ColumnConfig(); + columnConfig.setColumnStyleName(ColumnStyle.format(columnStyle)); + columnConfig.setId(columnSetting.getColumnID()); + columnConfig.setWidth(columnSetting.getWidth()); + columnConfig.setHidden(true); + newColumnConfigList.add(columnConfig); } } // add columns for which no settings were stored at the end @@ -425,10 +444,19 @@ public class DisplaySettingsManager ColumnConfig columnConfig = columnModel.getColumn(i); ColumnSetting columnSetting = new ColumnSetting(); columnSetting.setColumnID(columnConfig.getId()); - columnSetting.setHidden(columnConfig.isHidden()); columnSetting.setWidth(columnConfig.getWidth()); - boolean hasFilter = filteredColumnIds.contains(columnConfig.getId()); - columnSetting.setHasFilter(hasFilter); + + ColumnStyle columnStyle = ColumnStyle.parse(columnConfig.getColumnStyleName()); + if (columnStyle != null) + { + columnSetting.setHidden(columnStyle.isHidden()); + columnSetting.setHasFilter(columnStyle.isHasFilter()); + } else + { + columnSetting.setHidden(columnConfig.isHidden()); + columnSetting.setHasFilter(filteredColumnIds.contains(columnConfig.getId())); + } + if (sortInfo != null && sortInfo.getSortField() != null && columnSetting.getColumnID().equals(sortInfo.getSortField())) { @@ -613,4 +641,64 @@ public class DisplaySettingsManager { return displaySettings.getPortletConfigurations(); } + + private static class ColumnStyle + { + + private static final String SEPARATOR = "&&"; + + private boolean hidden; + + private boolean hasFilter; + + public boolean isHidden() + { + return hidden; + } + + public void setHidden(boolean hidden) + { + this.hidden = hidden; + } + + public boolean isHasFilter() + { + return hasFilter; + } + + public void setHasFilter(boolean hasFilter) + { + this.hasFilter = hasFilter; + } + + public static String format(ColumnStyle styleObject) + { + if (styleObject == null) + { + return null; + } + return styleObject.isHidden() + SEPARATOR + styleObject.isHasFilter(); + } + + public static ColumnStyle parse(String styleString) + { + if (styleString == null) + { + return null; + } + String[] parts = styleString.split(SEPARATOR); + if (parts.length == 2) + { + ColumnStyle styleObject = new ColumnStyle(); + styleObject.setHidden(Boolean.valueOf(parts[0])); + styleObject.setHasFilter(Boolean.valueOf(parts[1])); + return styleObject; + } else + { + return null; + } + } + + } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ColumnSettingsConfigurer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ColumnSettingsConfigurer.java index d754eccd8bf..1b5a5158e13 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ColumnSettingsConfigurer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ColumnSettingsConfigurer.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -177,12 +178,16 @@ public class ColumnSettingsConfigurer<T extends Serializable> */ private ColumnModel createNewColumnModel(List<ColumnDataModel> newColumnDataModels) { - Map<String, ColumnConfig> oldColumns = getOldColumns(); - List<ColumnConfig> columns = new ArrayList<ColumnConfig>(); + List<ColumnConfig> oldColumnsList = getOldColumnsList(); + Map<String, ColumnConfig> oldColumnsMap = getOldColumnsMap(); + + List<ColumnConfig> columnsList = new LinkedList<ColumnConfig>(); + Map<String, ColumnConfig> columnsMap = new HashMap<String, ColumnConfig>(); + for (ColumnDataModel columnDataModel : newColumnDataModels) { String columnID = columnDataModel.getColumnID(); - ColumnConfig column = oldColumns.get(columnID); + ColumnConfig column = oldColumnsMap.get(columnID); if (column == null) { String header = columnDataModel.getHeader(); @@ -191,14 +196,36 @@ public class ColumnSettingsConfigurer<T extends Serializable> ColumnSettingsConfigurer.DEFAULT_COLUMN_WIDTH); } column.setHidden(columnDataModel.isVisible() == false); - columns.add(column); + columnsList.add(column); + columnsMap.put(column.getId(), column); + } + + // LMS-2711 + // Do not loose columns that are not available in a model of the grid but are in the + // settings. We have to remember their position for other views that may use the same + // settings but have a different model structure. + + int index = 0; + for (ColumnConfig oldColumn : oldColumnsList) + { + if (!columnsMap.containsKey(oldColumn.getId())) + { + columnsList.add(index, oldColumn); + } + index++; } - return new ColumnModel(columns); + + return new ColumnModel(columnsList); + } + + private List<ColumnConfig> getOldColumnsList() + { + return browserGrid.getFullColumnModel().getColumns(); } - private Map<String, ColumnConfig> getOldColumns() + private Map<String, ColumnConfig> getOldColumnsMap() { - List<ColumnConfig> columns = browserGrid.getFullColumnModel().getColumns(); + List<ColumnConfig> columns = getOldColumnsList(); HashMap<String, ColumnConfig> map = new HashMap<String, ColumnConfig>(); for (ColumnConfig columnConfig : columns) { -- GitLab