Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.preferences / src / net / mograsim / preferences / SimpleColorManager.java
index 74f74dc..60b5311 100644 (file)
@@ -2,39 +2,54 @@ package net.mograsim.preferences;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Device;
+import org.eclipse.swt.widgets.Display;
 
 import net.mograsim.preferences.ColorDefinition.BuiltInColor;
 
 public class SimpleColorManager extends ColorManager
 {
-       private static final Map<BuiltInColor, Color> systemColors = new HashMap<>();
-       private static final Map<Color, BuiltInColor> systemColorConstants = new HashMap<>();
+       private static final Map<ColorDefinition, Color> systemColors = new HashMap<>();
+
+       private final Device device;
+       private final Map<ColorDefinition, Color> cachedColors;
+
+       public SimpleColorManager()
+       {
+               this.device = Display.getCurrent();
+               this.cachedColors = new HashMap<>(systemColors);
+       }
 
        @Override
-       public Color toColor(Device device, ColorDefinition col)
+       public Color toColor(ColorDefinition col)
        {
-               Color systemColor = systemColors.get(col.builtInColor);
-               if (systemColor != null)
-                       return systemColor;
+               if (col == null)
+                       return null;
+               Color cachedColor = cachedColors.get(col);
+               if (cachedColor != null)
+                       return cachedColor;
                if (col.builtInColor != null)
                {
-                       systemColor = device.getSystemColor(toSWTColorConstant(col.builtInColor));
-                       systemColors.put(col.builtInColor, systemColor);
-                       systemColorConstants.put(systemColor, col.builtInColor);
+                       Color systemColor = device.getSystemColor(toSWTColorConstant(col.builtInColor));
+                       systemColors.put(col, systemColor);
+                       cachedColors.put(col, systemColor);
                        return systemColor;
                }
-               return new Color(device, col.r, col.g, col.b);
+               Color nonSystemColor = new Color(device, col.r, col.g, col.b);
+               cachedColors.put(col, nonSystemColor);
+               return nonSystemColor;
        }
 
        @Override
-       public void dispose(Color col)
+       public void clearCache()
        {
-               if (!systemColorConstants.containsKey(col))
-                       col.dispose();
+               cachedColors.entrySet().stream().filter(e -> !systemColors.containsKey(e.getKey())).map(Entry::getValue).forEach(Color::dispose);
+               cachedColors.clear();
+               cachedColors.putAll(systemColors);
        }
 
        public static int toSWTColorConstant(BuiltInColor col)