/* * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package org.flexdock.plaf.icons; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import org.flexdock.plaf.Configurator; import org.flexdock.plaf.PropertySet; import org.flexdock.plaf.XMLConstants; /** * @author Christopher Butler * */ public class IconResourceFactory implements XMLConstants { public static final String ICON_RESOURCE_KEY = "icon-resource"; public static final String ICON_MAP_KEY = "icon-map"; public static final String ACTION_KEY = "action"; public static final String DEFAULT = "default"; public static final String DISABLED = "disabled"; public static final String HOVER = "hover"; public static final String ACTIVE = "active"; public static final String ACTIVE_HOVER = "active.hover"; public static final String ACTIVE_DISABLED = "active.disabled"; public static final String PRESSED = "pressed"; public static final String DEFAULT_SELECTED = "default.selected"; public static final String HOVER_SELECTED = "hover.selected"; public static final String DISABLED_SELECTED = "disabled.selected"; public static final String ACTIVE_SELECTED = "active.selected"; public static final String ACTIVE_SELECTED_HOVER = "active.armed.selected"; public static final String ACTIVE_DISABLED_SELECTED = "active.disabled.selected"; public static final String PRESSED_SELECTED = "pressed.selected"; public static final String TOOLTIP = "tooltip"; public static final String TOOLTIP_SELECTED = "tooltip.selected"; private static final HashMap RESOURCE_CACHE = new HashMap(); private static final HashMap RESOURCE_MAP_CACHE = new HashMap(); private static final HashSet BAD_RESOURCE_NAMES = new HashSet(); public static IconMap getIconMap(String name) { if(Configurator.isNull(name) || BAD_RESOURCE_NAMES.contains(name)) { return null; } IconMap map = (IconMap)RESOURCE_MAP_CACHE.get(name); if(map==null) { map = loadIconMap(name); if(map==null) { synchronized(BAD_RESOURCE_NAMES) { BAD_RESOURCE_NAMES.add(name); } } else { synchronized(RESOURCE_MAP_CACHE) { RESOURCE_MAP_CACHE.put(name, map); } } } return map; } public static IconResource getResource(String name) { if(Configurator.isNull(name)) { return null; } IconResource icons = getCachedResource(name); if(icons==null) { icons = loadIcons(name); cacheResource(name, icons); } return icons; } private static IconResource getCachedResource(String name) { return (IconResource)RESOURCE_CACHE.get(name); } private static void cacheResources(IconMap map) { if(map!=null) { for(Iterator it=map.keySet().iterator(); it.hasNext();) { String key = (String)it.next(); IconResource resource = map.getIcons(key); cacheResource(key, resource); } } } private static void cacheResource(String name, IconResource icons) { if(icons!=null) { synchronized(RESOURCE_CACHE) { RESOURCE_CACHE.put(name, icons); } } } private static IconResource loadIcons(String name) { PropertySet properties = Configurator.getProperties(name, ICON_RESOURCE_KEY); return createResource(properties); } private static IconResource createResource(PropertySet properties) { IconResource icons = new IconResource(); icons.setIcon(properties.getIcon(DEFAULT)); icons.setIconHover(properties.getIcon(HOVER)); icons.setIconDisabled(properties.getIcon(DISABLED)); icons.setIconActive(properties.getIcon(ACTIVE)); icons.setIconActiveHover(properties.getIcon(ACTIVE_HOVER)); icons.setIconActiveDisabled(properties.getIcon(ACTIVE_DISABLED)); icons.setIconPressed(properties.getIcon(PRESSED)); icons.setIconSelected(properties.getIcon(DEFAULT_SELECTED)); icons.setIconSelectedDisabled(properties.getIcon(DISABLED_SELECTED)); icons.setIconSelectedHover(properties.getIcon(HOVER_SELECTED)); icons.setIconSelectedActive(properties.getIcon(ACTIVE_SELECTED)); icons.setIconSelectedActiveHover(properties.getIcon(ACTIVE_SELECTED_HOVER)); icons.setIconSelectedActiveDisabled(properties.getIcon(ACTIVE_DISABLED_SELECTED)); icons.setIconSelectedPressed(properties.getIcon(PRESSED_SELECTED)); icons.setAction(properties.getAction(ACTION_KEY)); icons.setTooltip(properties.getString(TOOLTIP)); icons.setTooltipSelected(properties.getString(TOOLTIP_SELECTED)); return icons; } private static IconMap loadIconMap(String iconMapName) { PropertySet iconMapProperties = Configurator.getProperties(iconMapName, ICON_MAP_KEY); IconMap iconMap = new IconMap(); ArrayList notCached = new ArrayList(); for(Iterator it=iconMapProperties.keys(); it.hasNext();) { String fakeName = (String)it.next(); String realName = iconMapProperties.getString(fakeName); // load all the cached icon resources IconResource iconResource = getCachedResource(realName); if(iconResource==null) { // track the non-cached icons notCached.add(fakeName); } else { iconMap.addIcons(fakeName, iconResource); } } // if all our resources were already cached, then we can return immediately if(notCached.isEmpty()) { return iconMap; } // otherwise, we need to load resources and put them in the cache. String[] fakeNames = (String[])notCached.toArray(new String[0]); String[] realNames = iconMapProperties.getStrings(fakeNames); // load the resources into memory HashMap resourceMap = loadIconResources(realNames); // now loop through and cache for(int i=0; i<fakeNames.length; i++) { String realName = iconMapProperties.getString(fakeNames[i]); IconResource iconResource = (IconResource)resourceMap.get(realName); // cache the resource for future use cacheResource(realName, iconResource); // add to the immediate icon map iconMap.addIcons(fakeNames[i], iconResource); } return iconMap; } private static HashMap loadIconResources(String[] iconNames) { PropertySet[] iconResources = Configurator.getProperties(iconNames, ICON_RESOURCE_KEY); HashMap map = new HashMap(iconResources.length); for(int i=0; i<iconResources.length; i++) { IconResource resource = createResource(iconResources[i]); map.put(iconResources[i].getName(), resource); } return map; } }