Bug 568002 - Column resize in mixed percentage/pixel width configuration
incorrect with display scaling

Change-Id: I093dfc13daedb6661f34a5961153f6a39f9ba78e
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/layer/SizeConfigPercentageTest.java b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfigPercentageTest.java
index 4e3d0d4..b51255a 100644
--- a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfigPercentageTest.java
+++ b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfigPercentageTest.java
@@ -1407,4 +1407,91 @@
         assertEquals(187, scaledSizeConfig.getSize(2));
         assertEquals(563, scaledSizeConfig.getAggregateSize(3));
     }
+
+    @Test
+    public void setSizeMixedScaled() {
+        // use dpi of 144 which will result in a dpi factor of 1.5
+        this.sizeConfigMixedMode.setDpiConverter(new FixedScalingDpiConverter(144));
+        this.sizeConfigMixedMode.calculatePercentages(750, 3);
+
+        assertEquals(150, this.sizeConfigMixedMode.getSize(0));
+        assertEquals(150, this.sizeConfigMixedMode.getSize(1));
+        assertEquals(450, this.sizeConfigMixedMode.getSize(2));
+
+        // resize position 0 to 200
+        this.sizeConfigMixedMode.setSize(0, 200);
+
+        // the position itself needs to be 200
+        assertEquals(300, this.sizeConfigMixedMode.getSize(0));
+        assertEquals(150, this.sizeConfigMixedMode.getSize(1));
+        assertEquals(300, this.sizeConfigMixedMode.getSize(2));
+
+        // as we're in percentage mode, the aggregate size shouldn't have
+        // changed
+        assertEquals(750, this.sizeConfigMixedMode.getAggregateSize(3));
+
+        // resize position 1 to 200
+        this.sizeConfigMixedMode.setSize(1, 200);
+
+        // the position itself needs to be 200
+        assertEquals(300, this.sizeConfigMixedMode.getSize(0));
+        assertEquals(300, this.sizeConfigMixedMode.getSize(1));
+        assertEquals(150, this.sizeConfigMixedMode.getSize(2));
+
+        // as we're in percentage mode, the aggregate size shouldn't have
+        // changed
+        assertEquals(750, this.sizeConfigMixedMode.getAggregateSize(3));
+
+        // resize position 2
+        this.sizeConfigMixedMode.setSize(2, 500);
+
+        // no changes as last column should take remaining space
+        assertEquals(300, this.sizeConfigMixedMode.getSize(0));
+        assertEquals(300, this.sizeConfigMixedMode.getSize(1));
+        assertEquals(150, this.sizeConfigMixedMode.getSize(2));
+
+        // as we're in percentage mode, the aggregate size shouldn't have
+        // changed
+        assertEquals(750, this.sizeConfigMixedMode.getAggregateSize(3));
+    }
+
+    @Test
+    public void setSizeMixedScaled2() {
+        // use dpi of 144 which will result in a dpi factor of 1.5
+        this.sizeConfigMixedMode.setDpiConverter(new FixedScalingDpiConverter(144));
+        this.sizeConfigMixedMode.calculatePercentages(750, 3);
+
+        assertEquals(150, this.sizeConfigMixedMode.getSize(0));
+        assertEquals(150, this.sizeConfigMixedMode.getSize(1));
+        assertEquals(450, this.sizeConfigMixedMode.getSize(2));
+
+        this.sizeConfigMixedMode.setSize(1, 350);
+
+        assertEquals(150, this.sizeConfigMixedMode.getSize(0));
+        assertEquals(525, this.sizeConfigMixedMode.getSize(1));
+        assertEquals(75, this.sizeConfigMixedMode.getSize(2));
+
+        // as we're in percentage mode, the aggregate size shouldn't have
+        // changed
+        assertEquals(750, this.sizeConfigMixedMode.getAggregateSize(3));
+    }
+
+    @Test
+    public void setSizeMixed2() {
+
+        assertEquals(100, this.sizeConfigMixedMode.getSize(0));
+        assertEquals(100, this.sizeConfigMixedMode.getSize(1));
+        assertEquals(300, this.sizeConfigMixedMode.getSize(2));
+
+        this.sizeConfigMixedMode.setSize(1, 350);
+
+        assertEquals(100, this.sizeConfigMixedMode.getSize(0));
+        assertEquals(350, this.sizeConfigMixedMode.getSize(1));
+        assertEquals(50, this.sizeConfigMixedMode.getSize(2));
+
+        // as we're in percentage mode, the aggregate size shouldn't have
+        // changed
+        assertEquals(500, this.sizeConfigMixedMode.getAggregateSize(3));
+    }
+
 }
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfig.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfig.java
index 66bbdba..3592512 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfig.java
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfig.java
@@ -586,7 +586,7 @@
                     fixPercentageValues(percentageSpace);
 
                     // now update the adjacent positions
-                    double diffPercentage = ((double) diff * 100) / percentageSpace;
+                    double diffPercentage = ((double) upScale(diff) * 100) / percentageSpace;
                     updateAdjacent(position, diffPercentage, percentageSpace);
                 }
             } else if (this.availableSpace > 0) {
@@ -1230,7 +1230,7 @@
                 toModify.put(i, this.realSizeMap.get(i));
                 modifySum += positionPercentageValue;
             } else if (!isPercentageSizing(i) && positionValue != -1) {
-                fixedSum += positionValue;
+                fixedSum += upScale(positionValue);
             }
         }