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