Bug 507856 - [Scaling] Aggregate size looses rounded up pixels
Change-Id: Iad36bf84ace374cb4397b32f5339b761d82a006a
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/SizeConfigScalingTest.java b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfigScalingTest.java
index 2711cec..0e38e1a 100644
--- a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfigScalingTest.java
+++ b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfigScalingTest.java
@@ -149,14 +149,15 @@
sc.setSize(2, 75);
assertEquals(525, sc.getAggregateSize(5));
sc.setDefaultSize(75);
- assertEquals(450, sc.getAggregateSize(5));
+ assertEquals(451, sc.getAggregateSize(5));
sc.setSize(2, 100);
- assertEquals(476, sc.getAggregateSize(5));
+ assertEquals(477, sc.getAggregateSize(5));
}
@Test
public void testRounding() {
- final SizeConfig sc = new SizeConfig(100);
+ // results in 128 upscaled because of rounding
+ final SizeConfig sc = new SizeConfig(102);
sc.setDpiConverter(new AbstractDpiConverter() {
@Override
@@ -169,6 +170,59 @@
assertEquals(178, sc.downScale(222));
assertEquals(223, sc.upScale(178));
+
+ assertEquals(128, sc.getSize(0));
+ assertEquals(128, sc.getSize(1));
+ assertEquals(128, sc.getSize(2));
+
+ assertEquals(384, sc.getAggregateSize(3));
+ }
+
+ @Test
+ public void testRoundingAllCustomSize() {
+ final SizeConfig sc = new SizeConfig(100);
+ sc.setDpiConverter(new AbstractDpiConverter() {
+
+ @Override
+ protected void readDpiFromDisplay() {
+ // use dpi of 120 which will result in a dpi factor of 1.25
+ this.dpi = 120;
+ }
+
+ });
+
+ sc.setSize(0, 127);
+ sc.setSize(1, 127);
+ sc.setSize(2, 127);
+
+ assertEquals(128, sc.getSize(0));
+ assertEquals(128, sc.getSize(1));
+ assertEquals(128, sc.getSize(2));
+
+ assertEquals(384, sc.getAggregateSize(3));
+ }
+
+ @Test
+ public void testRoundingMixedSize() {
+ final SizeConfig sc = new SizeConfig(102);
+ sc.setDpiConverter(new AbstractDpiConverter() {
+
+ @Override
+ protected void readDpiFromDisplay() {
+ // use dpi of 120 which will result in a dpi factor of 1.25
+ this.dpi = 120;
+ }
+
+ });
+
+ // results because of scaling in 223
+ sc.setSize(1, 222);
+
+ assertEquals(128, sc.getSize(0));
+ assertEquals(223, sc.getSize(1));
+ assertEquals(128, sc.getSize(2));
+
+ assertEquals(479, sc.getAggregateSize(3));
}
@Test
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 4ccfde8..5a03fcd 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
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2012, 2013, 2014 Original authors and others.
+ * Copyright (c) 2012, 2016 Original authors and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -237,7 +237,7 @@
// if percentage sizing is used, the sizes in defaultSize are used
// as percentage values and not as pixel values, therefore another
// value needs to be considered
- return upScale(position * this.defaultSize);
+ return position * upScale(this.defaultSize);
} else {
// See if the cache is valid, if not clear it.
if (!this.isAggregatedSizeCacheValid) {
@@ -724,7 +724,8 @@
for (Integer resizedPosition : mapToUse.keySet()) {
if (resizedPosition.intValue() < position) {
resizedColumns++;
- resizeAggregate += mapToUse.get(resizedPosition);
+ int size = mapToUse.get(resizedPosition);
+ resizeAggregate += isPercentageSizing() ? size : upScale(size);
} else {
break;
}
@@ -735,15 +736,17 @@
if (defaultPosition.intValue() < position) {
if (!mapToUse.containsKey(defaultPosition)) {
resizedColumns++;
- resizeAggregate += this.defaultSizeMap.get(defaultPosition).intValue();
+ int size = this.defaultSizeMap.get(defaultPosition);
+ resizeAggregate += isPercentageSizing() ? size : upScale(size);
}
} else {
break;
}
}
- int result = (position * this.defaultSize) + resizeAggregate - (resizedColumns * this.defaultSize);
- return isPercentageSizing() ? result : upScale(result);
+ int result = (position - resizedColumns) * (isPercentageSizing() ? this.defaultSize : upScale(this.defaultSize));
+ result += resizeAggregate;
+ return result;
}
/**