Bug 547848 - Add performance row grouping

Fixed issue when columns/rows were hidden via local loadState()

Change-Id: Id605eb7714b03a53e7a8d019f5424aaa75e2ba9b
Signed-off-by: Dirk Fauth <dirk.fauth@googlemail.com>
diff --git a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/group/performance/ColumnGroupHeaderLayerTest.java b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/group/performance/ColumnGroupHeaderLayerTest.java
index 8bbf35e..b4be8d3 100644
--- a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/group/performance/ColumnGroupHeaderLayerTest.java
+++ b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/group/performance/ColumnGroupHeaderLayerTest.java
@@ -12321,4 +12321,34 @@
         assertEquals(3, group1.getOriginalSpan());
         assertEquals(3, group1.getVisibleSpan());
     }
+
+    @Test
+    public void shouldShowGroupHiddenByLoadState() {
+        this.columnGroupHeaderLayer.removeGroup(0);
+
+        this.columnGroupHeaderLayer.addGroup("Person", 1, 1);
+
+        Group group = this.columnGroupHeaderLayer.getGroupByPosition(1);
+
+        Properties properties = new Properties();
+        properties.put("test" +
+                ColumnHideShowLayer.PERSISTENCE_KEY_HIDDEN_COLUMN_INDEXES, "1");
+        this.columnGroupHeaderLayer.getPositionLayer().loadState("test", properties);
+
+        // state after refresh without details via loadState
+        assertEquals(-1, group.getStartIndex());
+        assertEquals(-1, group.getVisibleStartIndex());
+        assertEquals(-1, group.getVisibleStartPosition());
+        assertEquals(1, group.getOriginalSpan());
+        assertEquals(0, group.getVisibleSpan());
+
+        // show all again
+        this.gridLayer.doCommand(new ShowAllColumnsCommand());
+
+        assertEquals(1, group.getStartIndex());
+        assertEquals(1, group.getVisibleStartIndex());
+        assertEquals(1, group.getVisibleStartPosition());
+        assertEquals(1, group.getOriginalSpan());
+        assertEquals(1, group.getVisibleSpan());
+    }
 }
diff --git a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/group/performance/RowGroupHeaderLayerTest.java b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/group/performance/RowGroupHeaderLayerTest.java
index dfb3ae3..ee9db65 100644
--- a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/group/performance/RowGroupHeaderLayerTest.java
+++ b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/group/performance/RowGroupHeaderLayerTest.java
@@ -12317,4 +12317,34 @@
         assertEquals(3, group1.getOriginalSpan());
         assertEquals(3, group1.getVisibleSpan());
     }
+
+    @Test
+    public void shouldShowGroupHiddenByLoadState() {
+        this.rowGroupHeaderLayer.removeGroup(0);
+
+        this.rowGroupHeaderLayer.addGroup("Person", 1, 1);
+
+        Group group = this.rowGroupHeaderLayer.getGroupByPosition(1);
+
+        Properties properties = new Properties();
+        properties.put("test" +
+                RowHideShowLayer.PERSISTENCE_KEY_HIDDEN_ROW_INDEXES, "1");
+        this.rowGroupHeaderLayer.getPositionLayer().loadState("test", properties);
+
+        // state after refresh without details via loadState
+        assertEquals(-1, group.getStartIndex());
+        assertEquals(-1, group.getVisibleStartIndex());
+        assertEquals(-1, group.getVisibleStartPosition());
+        assertEquals(1, group.getOriginalSpan());
+        assertEquals(0, group.getVisibleSpan());
+
+        // show all again
+        this.gridLayer.doCommand(new ShowAllRowsCommand());
+
+        assertEquals(1, group.getStartIndex());
+        assertEquals(1, group.getVisibleStartIndex());
+        assertEquals(1, group.getVisibleStartPosition());
+        assertEquals(1, group.getOriginalSpan());
+        assertEquals(1, group.getVisibleSpan());
+    }
 }
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/performance/GroupModel.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/performance/GroupModel.java
index d7a5ee2..7ef63ac 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/performance/GroupModel.java
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/performance/GroupModel.java
@@ -1171,7 +1171,7 @@
             }
             this.visibleStartPosition = getPositionByIndex(this.visibleStartIndex);
 
-            if (this.visibleStartPosition == -1 && this.visibleSpan > 0) {
+            if (this.visibleStartPosition == -1) {
                 // if a multi hide command was triggered for non-contiguous
                 // column ranges, where one range is at the end, the group could
                 // be in an inconsistent state which needs to be corrected.
@@ -1209,7 +1209,8 @@
             setVisibleSpan(this.originalSpan - hidden);
 
             int smallestIndex = getIndexByPosition(smallestPosition);
-            if (updateStartIndex) {
+            if (updateStartIndex
+                    || (this.startIndex < 0 && smallestIndex >= 0)) {
                 setStartIndex(smallestIndex);
             }
             setVisibleStartIndex(smallestIndex);