diff options
author | Carolyn MacLeod <carolyn> | 2011-03-28 14:51:04 +0000 |
---|---|---|
committer | Carolyn MacLeod <carolyn> | 2011-03-28 14:51:04 +0000 |
commit | 11a7d3da4b2f66319fb91ac195eafac222b3fcd8 (patch) | |
tree | 4cbdb9b1031e0f1ff60fbdc6b24b7011bd308041 /bundles/org.eclipse.swt/Eclipse SWT Custom Widgets | |
parent | ff35a05283a0c867005ad79952c6e97097108422 (diff) | |
download | eclipse.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.java | 55 |
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; } |