content: // This file is part of AceWiki.
  // Copyright 2008-2013, AceWiki developers.
  // 
  // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
  // Lesser General Public License as published by the Free Software Foundation, either version 3 of
  // the License, or (at your option) any later version.
  // 
  // AceWiki 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
  // Lesser General Public License for more details.
  // 
  // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
  // not, see http://www.gnu.org/licenses/.
  
  package ch.uzh.ifi.attempto.echocomp;
  
  import java.util.HashMap;
  
  import nextapp.echo.app.Color;
  import nextapp.echo.app.Font;
  import nextapp.echo.app.ResourceImageReference;
  import nextapp.echo.app.StyleSheet;
  import nextapp.echo.app.serial.SerialException;
  import nextapp.echo.app.serial.StyleSheetLoader;
  
  /**
   * This class defines some style attributes that are used by the components of this package.
   * 
   * @author Tobias Kuhn
   */
  public class Style {
  	
  	private Style() {}  // no instances allowed
  	
  	private static final HashMap<String, ResourceImageReference> images =
  		new HashMap<String, ResourceImageReference>();
  	
  	static {
  		try {
  			styleSheet = StyleSheetLoader.load(
  					"ch/uzh/ifi/attempto/echocomp/style/Default.stylesheet.xml",
  					Thread.currentThread().getContextClassLoader()
  				);
  		} catch (SerialException ex) {
  			throw new RuntimeException(ex);
  		}
  	}
  	
  	/**
  	 * The style sheet containing the shadows for internal windows.
  	 */
  	public static StyleSheet styleSheet;
  	
  	/**
  	 * The light background color.
  	 */
  	public static Color lightBackground = new Color(190, 190, 255);
  
  	/**
  	 * The medium background color.
  	 */
  	public static Color mediumBackground = new Color(160, 160, 255);
  
  	/**
  	 * The dark background color.
  	 */
  	public static Color darkBackground = new Color(60, 60, 220);
  	
  	/**
  	 * The color for shaded background areas.
  	 */
  	public static Color shadedBackground = new Color(240, 240, 240);
  	
  	/**
  	 * The light foreground color.
  	 */
  	public static Color lightForeground = new Color(255, 255, 255);
  	
  	/**
  	 * The medium foreground color.
  	 */
  	public static Color mediumForeground = new Color(60, 60, 220);
  	
  	/**
  	 * The dark foreground color.
  	 */
  	public static Color darkForeground = new Color(0, 0, 0);
  
  	/**
  	 * Foreground color for special elements.
  	 */
  	public static Color specialForeground = new Color(102, 153, 0);
  
  	/**
  	 * The light color for disabled components
  	 */
  	public static Color lightDisabled = new Color(220, 220, 220);
  	
  	/**
  	 * The dark color for disabled components
  	 */
  	public static Color darkDisabled = new Color(100, 100, 100);
  	
  	/**
  	 * The color for the title background of internal windows.
  	 */
  	public static Color windowTitleBackground = new Color(110, 110, 210);
  	
  	/**
  	 * The font typeface.
  	 */
  	public static Font.Typeface fontTypeface = Font.VERDANA;
  	
  	/**
  	 * This method is used to modify a given color by keeping its brightness and saturation. A
  	 * shift value of 120, for example, means a shift by 120 "degrees" towards violet. A shift of
  	 * 360 is a full rotation and result in the original color.
  	 * 
  	 * @param c The original color.
  	 * @param colorShift The color shift value.
  	 * @return The modified color.
  	 */
  	public static Color shiftColor(Color c, int colorShift) {
  		if (colorShift >= 240) {
  			c = new Color(c.getGreen(), c.getBlue(), c.getRed());
  		} else if (colorShift >= 120) {
  			c = new Color(c.getBlue(), c.getRed(), c.getGreen());
  		}
  		double s = (colorShift % 120) / 120.0;
  		Color color = new Color(
  				(int) (s * c.getBlue() + (1-s) * c.getRed()),
  				(int) (s * c.getRed() + (1-s) * c.getGreen()),
  				(int) (s * c.getGreen() + (1-s) * c.getBlue())
  			);
  		return color;
  	}
  	
  	/**
  	 * Returns an image reference for the given file. The same reference is returned when
  	 * this method is called twice for the same file.
  	 * 
  	 * @param file Path and file name of an image file.
  	 * @return An image reference for the given file.
  	 */
  	public static ResourceImageReference getImage(String file) {
  		ResourceImageReference i = images.get(file);
  		if (i != null) {
  			return i;
  		} else {
  			i = new ResourceImageReference(file);
  			images.put(file, i);
  			return i;
  		}
  	}
  
  }
  