content: /*
   * @(#)UIComponentContext.java
   *
   * Copyright 2002 EGANTT LLP LLP. All rights reserved.
   * PROPRIETARY/QPL. Use is subject to license terms.
   */
  
  package com.egantt.swing.component.context;
  
  import java.util.Enumeration;
  import java.util.Iterator;
  
  import javax.swing.UIManager;
  
  import com.egantt.swing.component.ComponentContext;
  
  /**
   *  Uses the UIManager, provides a simple way to get the values from the UI
   *  into a ComponentContext
   */
  public class UIComponentContext implements ComponentContext
  {
  	private static final String [] prefixes = {"cell"};
  	protected final String type;
  	
  	public UIComponentContext(String type)
  	{
  		this.type = type + ".";
  	}
  	
  	// __________________________________________________________________________
  	
  	public Object get(Object key)
  	{
  		Object value = UIManager.get(type + key.toString().toLowerCase());
  		if (value != null)
  			return value;
  		
  		for (int i=0; i < prefixes.length && value == null; i++)
  			value = UIManager.get(type + prefixes[i] + key);
  		return value;
  	}
  
  	// _________________________________________________________________________
  	
  	public Iterator keys()
  	{
  		return new KeyedIterator(type, UIManager.getDefaults().keys());
  	}
  	
  	// _________________________________________________________________________
  	
  	protected static class KeyedIterator implements Iterator
  	{
  		protected final String key;
  		protected final Enumeration enumerator;
  		
  		protected Object position;
  		
  		public KeyedIterator(String key, Enumeration enumerator)
  		{
  			this.enumerator = enumerator;
  			this.key = key;
  			
  			next(); // move the first element
  		}
  		
  		// _____________________________________________________________________
  		
  		public boolean hasNext()
  		{
  			return position != null;
  		}
  		
  		// _____________________________________________________________________
  		
  		public Object next()
  		{
  			Object value = position;
  			while (enumerator.hasMoreElements())
  			{
  				Object o = enumerator.nextElement();
  				if (!(o instanceof String s))
  					continue;
  
  				int i = s.indexOf(key);
  				if (i < 0)
  					continue;
  				
  				this.position = enumerator.nextElement();
  			}
  			return value;
  		}
  		
  		// _____________________________________________________________________
  		
  		public void remove()
  		{
  		}
  	}
   }
  