package junkutil.gui;

import java.awt.Component;
import java.awt.Font;
import java.util.Iterator;
import java.util.Set;

import javax.swing.LookAndFeel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

/**
 * LookAndFeelの設定
 * @author Hiroyuki Shiota
 */
public class LzLookAndFeel {

    public static final String CLASSNAME_METAL = "javax.swing.plaf.metal.MetalLookAndFeel";
    public static final String CLASSNAME_MOTIF = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
    public static final String CLASSNAME_WINDOWS = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
    
    /**
     * コンストラクタ
     */
    private LzLookAndFeel() {
	}
    
    /**
     * システムのLaFに変える
     * @return
     */
    public static boolean toSystem() {
    	try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			return true;
		} catch (Exception e) {
			return false;
		}
    }
    
    /**
     * クロスプラットフォームのLaFに変える
     * @return
     */
    public static boolean toCrossPlatform() {
    	try {
			UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
			return true;
		} catch (Exception e) {
			return false;
		}
    }
    
    /**
     * メタルのLaFに変える
     * @return
     */
    public static boolean toMetal() {
    	try {
			UIManager.setLookAndFeel(CLASSNAME_METAL);
			return true;
		} catch (Exception e) {
			return false;
		}
    }
    
    /**
     * モチーフのLaFに変える
     * @return
     */
    public static boolean toMotif() {
    	try {
			UIManager.setLookAndFeel(CLASSNAME_MOTIF);
			return true;
		} catch (Exception e) {
			return false;
		}
    }
    
    /**
     * WindowsのLaFに変える
     * @return
     */
    public static boolean toWindows() {
    	try {
			UIManager.setLookAndFeel(CLASSNAME_WINDOWS);
			return true;
		} catch (Exception e) {
			return false;
		}
    }
    
    /**
     * アップデート
     * @param c
     */
    public static void update(Component c) {
    	if (c == null) return;
    	SwingUtilities.updateComponentTreeUI(c);
    }
    
    /**
     * システムLaFが使えるかテストする
     * @return
     */
    public static boolean isAvailableSystem() {
    	return isAvailableLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    
    /**
     * クラスプラットフォームLaFが使えるかテストする
     * @return
     */
    public static boolean isAvailableCrossPlatform() {
    	return isAvailableLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
    }
    
    /**
     * メタルプラットフォームLaFが使えるかテストする
     * @return
     */
    public static boolean isAvailableMetal() {
    	return isAvailableLookAndFeel(CLASSNAME_METAL);
    }
    
    /**
     * モチーフプラットフォームLaFが使えるかテストする
     * @return
     */
    public static boolean isAvailableMotif() {
    	return isAvailableLookAndFeel(CLASSNAME_MOTIF);
    }
    
    /**
     * WindowsプラットフォームLaFが使えるかテストする
     * @return
     */
    public static boolean isAvailableWindows() {
    	return isAvailableLookAndFeel(CLASSNAME_WINDOWS);
    }
    
    /**
     * LaFが使えるかテストする
     * @param lafName
     * @return
     */
    public static boolean isAvailableLookAndFeel(String lafName) {
        try {
            Class lnfClass = Class.forName(lafName);
            LookAndFeel laf = (LookAndFeel)(lnfClass.newInstance());
            return laf.isSupportedLookAndFeel();
        } catch (Exception e) {
            return false;
        }
    }
    
    /**
     * フォントを設定する
     * @param font
     */
    public static void setFont(Font font) {
		LookAndFeel laf = UIManager.getLookAndFeel();
		Set keys = laf.getDefaults().keySet();
		for (Iterator it = keys.iterator(); it.hasNext();) {
			String key=it.next().toString();
			if (key.toLowerCase().indexOf("font") != -1) {
				UIManager.put(key, font);
			}
		}
	}
}
