summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets
diff options
context:
space:
mode:
authorCarolyn MacLeod <carolyn>2011-03-28 14:51:04 +0000
committerCarolyn MacLeod <carolyn>2011-03-28 14:51:04 +0000
commit11a7d3da4b2f66319fb91ac195eafac222b3fcd8 (patch)
tree4cbdb9b1031e0f1ff60fbdc6b24b7011bd308041 /bundles/org.eclipse.swt/Eclipse SWT Custom Widgets
parentff35a05283a0c867005ad79952c6e97097108422 (diff)
downloadeclipse.platform.swt-11a7d3da4b2f66319fb91ac195eafac222b3fcd8.tar.gz
eclipse.platform.swt-11a7d3da4b2f66319fb91ac195eafac222b3fcd8.tar.xz
eclipse.platform.swt-11a7d3da4b2f66319fb91ac195eafac222b3fcd8.zip
Bug 231465 - CTabFolder should share selectionHighlightGradientColorsCache across instances
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT Custom Widgets')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderRenderer.java55
1 files changed, 44 insertions, 11 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderRenderer.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderRenderer.java
index 1a05182d94..b081a3f780 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderRenderer.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderRenderer.java
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.swt.custom;
+import java.util.Hashtable;
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;
@@ -52,6 +53,7 @@ public class CTabFolderRenderer {
* We have to recompute the colors if the border color changes
*/
Color lastBorderColor = null;
+ static Hashtable ColorCache = new Hashtable ();
//TOP_LEFT_CORNER_HILITE is laid out in reverse (ie. top to bottom)
//so can fade in same direction as right swoop curve
@@ -124,6 +126,35 @@ public class CTabFolderRenderer {
this.parent = parent;
}
+ static Color getColor(Display display, RGB rgb) {
+ Color color;
+ Object [] colorData = (Object []) ColorCache.get(rgb);
+ if (colorData != null) {
+ color = (Color) colorData[0];
+ int refcount = ((Integer) colorData[1]).intValue();
+ colorData[1] = new Integer(refcount + 1);
+ } else {
+ color = new Color(display, rgb);
+ ColorCache.put(rgb, new Object[] {color, new Integer(1)});
+ }
+ return color;
+ }
+
+ static void releaseColor(Color color) {
+ RGB rgb = color.getRGB();
+ Object [] colorData = (Object []) ColorCache.get(rgb);
+ if (colorData != null) {
+ int refcount = ((Integer) colorData[1]).intValue();
+ refcount--;
+ if (refcount == 0) {
+ ColorCache.remove(rgb);
+ color.dispose();
+ } else {
+ colorData[1] = new Integer(refcount);
+ }
+ }
+ }
+
void antialias (int[] shape, Color innerColor, Color outerColor, GC gc){
// Don't perform anti-aliasing on Mac and WPF because the platform
// already does it. The simple style also does not require anti-aliasing.
@@ -374,7 +405,8 @@ public class CTabFolderRenderer {
void createAntialiasColors() {
disposeAntialiasColors();
- lastBorderColor = parent.getDisplay().getSystemColor(BORDER1_COLOR);
+ Display display = parent.getDisplay();
+ lastBorderColor = display.getSystemColor(BORDER1_COLOR);
RGB lineRGB = lastBorderColor.getRGB();
/* compute the selected color */
RGB innerRGB = parent.selectionBackground.getRGB();
@@ -392,7 +424,7 @@ public class CTabFolderRenderer {
int red = from.red + 2*(to.red - from.red)/3;
int green = from.green + 2*(to.green - from.green)/3;
int blue = from.blue + 2*(to.blue - from.blue)/3;
- selectedOuterColor = new Color(parent.getDisplay(), red, green, blue);
+ selectedOuterColor = getColor(display, new RGB(red, green, blue));
}
if (innerRGB != null) {
RGB from = lineRGB;
@@ -400,7 +432,7 @@ public class CTabFolderRenderer {
int red = from.red + 2*(to.red - from.red)/3;
int green = from.green + 2*(to.green - from.green)/3;
int blue = from.blue + 2*(to.blue - from.blue)/3;
- selectedInnerColor = new Color(parent.getDisplay(), red, green, blue);
+ selectedInnerColor = getColor(display, new RGB(red, green, blue));
}
/* compute the tabArea color */
outerRGB = parent.getParent().getBackground().getRGB();
@@ -410,7 +442,7 @@ public class CTabFolderRenderer {
int red = from.red + 2*(to.red - from.red)/3;
int green = from.green + 2*(to.green - from.green)/3;
int blue = from.blue + 2*(to.blue - from.blue)/3;
- tabAreaColor = new Color(parent.getDisplay(), red, green, blue);
+ tabAreaColor = getColor(display, new RGB(red, green, blue));
}
}
@@ -436,13 +468,14 @@ public class CTabFolderRenderer {
selectionHighlightGradientColorsCache = new Color[fadeGradientSize];
int denom = fadeGradientSize - 1;
+ Display display = parent.getDisplay();
for (int i = 0; i < fadeGradientSize; i++) {
int propFrom = denom - i;
int propTo = i;
int red = (to.red * propTo + from.red * propFrom) / denom;
int green = (to.green * propTo + from.green * propFrom) / denom;
int blue = (to.blue * propTo + from.blue * propFrom) / denom;
- selectionHighlightGradientColorsCache[i] = new Color(parent.getDisplay(), red, green, blue);
+ selectionHighlightGradientColorsCache[i] = getColor(display, new RGB(red, green, blue));
}
}
@@ -457,15 +490,15 @@ public class CTabFolderRenderer {
disposeAntialiasColors();
disposeSelectionHighlightGradientColors();
if (fillColor != null) {
- fillColor.dispose();
+ releaseColor(fillColor);
fillColor = null;
}
}
void disposeAntialiasColors() {
- if (tabAreaColor != null) tabAreaColor.dispose();
- if (selectedInnerColor != null) selectedInnerColor.dispose();
- if (selectedOuterColor != null) selectedOuterColor.dispose();
+ if (tabAreaColor != null) releaseColor(tabAreaColor);
+ if (selectedInnerColor != null) releaseColor(selectedInnerColor);
+ if (selectedOuterColor != null) releaseColor(selectedOuterColor);
tabAreaColor = selectedInnerColor = selectedOuterColor = null;
}
@@ -473,7 +506,7 @@ public class CTabFolderRenderer {
if(selectionHighlightGradientColorsCache == null)
return;
for (int i = 0; i < selectionHighlightGradientColorsCache.length; i++) {
- selectionHighlightGradientColorsCache[i].dispose();
+ releaseColor(selectionHighlightGradientColorsCache[i]);
}
selectionHighlightGradientColorsCache = null;
}
@@ -1624,7 +1657,7 @@ public class CTabFolderRenderer {
Color getFillColor() {
if (fillColor == null) {
- fillColor = new Color(parent.getDisplay(), CLOSE_FILL);
+ fillColor = getColor(parent.getDisplay(), CLOSE_FILL);
}
return fillColor;
}