/* * Created on Nov 10, 2011 * Created by Paul Gardner * * Copyright 2011 Vuze, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License only. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ package com.aelitis.azureus.ui.swt.utils; import java.util.HashMap; import java.util.Map; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.RGB; import org.gudy.azureus2.core3.util.Debug; public class ColorCache2 { private static Map<RGB,CachedColorManaged> color_map = new HashMap<RGB, CachedColorManaged>(); public static CachedColor getColor( Color c ) { return( new CachedColorUnmanaged( c )); } public static CachedColor getColor( Device device, RGB rgb ) { synchronized( color_map ){ CachedColorManaged entry = color_map.get( rgb ); if ( entry == null ){ entry = new CachedColorManaged( new Color( device, rgb )); color_map.put( rgb, entry ); }else{ entry.addRef(); } return( new CachedColorManagedFacade( entry )); } } private static class CachedColorManaged { private Color color; private int ref_count; private CachedColorManaged( Color _color ) { color = _color; ref_count = 1; } public Color getColor() { return( color ); } private void addRef() { ref_count++; //System.out.println( "cc ++: color=" + color + ", refs=" + ref_count ); } private void dispose() { ref_count--; //System.out.println( "cc --: color=" + color + ", refs=" + ref_count ); if ( ref_count == 0 ){ color_map.remove( color.getRGB()); color.dispose(); }else if ( ref_count < 0 ){ Debug.out( "already disposed" ); } } } private static class CachedColorManagedFacade implements CachedColor { private CachedColorManaged delegate; private boolean disposed; private CachedColorManagedFacade( CachedColorManaged _delegate ) { delegate = _delegate; } public Color getColor() { return( delegate.getColor()); } public boolean isDisposed() { synchronized( color_map ){ return( disposed ); } } public void dispose() { synchronized( color_map ){ if ( !disposed ){ disposed = true; delegate.dispose(); } } } } private static class CachedColorUnmanaged implements CachedColor { private Color color; private CachedColorUnmanaged( Color _color ) { color = _color; } public Color getColor() { return( color ); } public boolean isDisposed() { return( color.isDisposed()); } public void dispose() { color.dispose(); } } public interface CachedColor { public Color getColor(); public boolean isDisposed(); public void dispose(); } }