package com.xnx3;

import java.awt.AWTException;
import java.awt.CardLayout;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.Window.Type;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.InputStream;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import org.jvnet.substance.SubstanceLookAndFeel;
import org.jvnet.substance.skin.BusinessBlackSteelSkin;
import org.jvnet.substance.skin.SubstanceOfficeBlue2007LookAndFeel;
import org.jvnet.substance.utils.SubstanceConstants.ImageWatermarkKind;
import org.jvnet.substance.watermark.SubstanceImageWatermark;
import com.xnx3.file.FileUtil;


/**
 * UI界面方面
 * @author 管雷鸣
 *
 */
public class UI {
	/**
	 * confirm弹出提示框-选择了是
	 */
	public final static int CONFIRM_YES=0;
	
	/**
	 * confirm弹出提示框-选择了否
	 */
	public final static int CONFIRM_NO=1;
	
	/**
	 * confirm弹出提示框-选择了取消
	 */
	public final static int CONFIRM_CENCEL=2;

	
	/**
	 * 鼠标跟随提示信息的显示界面
	 */
	static JFrame jframeMessageForMouse;
	static JLabel jlabelMessageForMouse;
	static{
		jframeMessageForMouse=new JFrame();
		jframeMessageForMouse.setUndecorated(true);
		jframeMessageForMouse.setType(Type.POPUP);
		jframeMessageForMouse.setAlwaysOnTop(true);
		JPanel jp = new JPanel();
		jp.setBorder(new LineBorder(java.awt.Color.RED, 1, true));
		jframeMessageForMouse.setContentPane(jp);
		jp.setLayout(new CardLayout(0, 0));
		
		jlabelMessageForMouse = new JLabel("New label");
		jlabelMessageForMouse.setVerticalAlignment(SwingConstants.TOP);
		jlabelMessageForMouse.setHorizontalAlignment(SwingConstants.LEFT);
		jlabelMessageForMouse.setHorizontalTextPosition(SwingConstants.LEFT);
		jlabelMessageForMouse.setAutoscrolls(true);
		jlabelMessageForMouse.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				jframeMessageForMouse.setVisible(false);
			}
		});
		jlabelMessageForMouse.setBorder(new EmptyBorder(10, 10, 10, 10));
		jp.add(jlabelMessageForMouse, "name_24011468992203");
	}
	

	/**
	 * 使用第三方外观包,同时设置背景图。 {@link UI#UseLookAndFeelBySubstance()}
	 * <li>需导入substance.jar
	 * <li>设置主题 SubstanceLookAndFeel.setCurrentTheme(new SubstanceCremeTheme());
	 * <li>设置按钮外观 SubstanceLookAndFeel.setCurrentButtonShaper(new StandardButtonShaper());
	 * <li>设置边框 SubstanceLookAndFeel.setCurrentBorderPainter(new StandardBorderPainter());
	 * <li>设置渐变渲染 SubstanceLookAndFeel.setCurrentGradientPainter(new StandardGradientPainter());  
	 * <li>设置标题 SubstanceLookAndFeel.setCurrentTitlePainter(new MatteHeaderPainter()); 
	 * <li>设置水印 SubstanceOfficeBlue2007LookAndFeel.setCurrentWatermark(new SubstanceMarbleVeinWatermark());
	 * @param watermarkBackgroundImage 水印背景图片 ,传入如:MainEntry.class.getResourceAsStream("res/bg.jpg") 使用当前目录下res内的bg.jpg作为水印图
	 * @param watermarkOpacity 水印图片的透明度,取值范围0.1~1之间,越接近1越真实,数字越小越模糊
	 * @return SubstanceOfficeBlue2007LookAndFeel外观包操作对象,可继续扩展
	 */
	public SubstanceOfficeBlue2007LookAndFeel UseLookAndFeelBySubstance(final InputStream watermarkBackgroundImage,final float watermarkOpacity){
		SubstanceOfficeBlue2007LookAndFeel substance = null;
		try {
			//外观设置
			substance=new SubstanceOfficeBlue2007LookAndFeel();
			UIManager.setLookAndFeel(substance);
//			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			JFrame.setDefaultLookAndFeelDecorated(true);
			JDialog.setDefaultLookAndFeelDecorated(true);
			if(watermarkBackgroundImage!=null){
				class mySkin extends BusinessBlackSteelSkin{
					public mySkin(){
						super();
						//新建一个图片水印,路径可以自己该,使用自己喜欢的图片来做应用程序的水印图片、  
						SubstanceImageWatermark watermark =  new SubstanceImageWatermark(watermarkBackgroundImage);
						watermark.setOpacity(watermarkOpacity);
				        watermark.setKind(ImageWatermarkKind.APP_CENTER);
				        this.watermark=watermark;
					}
				}
				SubstanceLookAndFeel.setSkin(new mySkin());
			}
		} catch (Exception e) {
			new Log().debug("com.xnx3.UI", "UseLookAndFeelBySubstance()", e.getMessage());
		}
		
		return substance;
	}
	

	/**
	 * 使用第三方外观包
	 * <br/>需在Jframe创建之前调用
	 * <li>需导入substance.jar
	 * <li>设置主题 SubstanceLookAndFeel.setCurrentTheme(new SubstanceCremeTheme());
	 * <li>设置按钮外观 SubstanceLookAndFeel.setCurrentButtonShaper(new StandardButtonShaper());
	 * <li>设置边框 SubstanceLookAndFeel.setCurrentBorderPainter(new StandardBorderPainter());
	 * <li>设置渐变渲染 SubstanceLookAndFeel.setCurrentGradientPainter(new StandardGradientPainter());  
	 * <li>设置标题 SubstanceLookAndFeel.setCurrentTitlePainter(new MatteHeaderPainter()); 
	 * <li>设置水印 SubstanceOfficeBlue2007LookAndFeel.setCurrentWatermark(new SubstanceMarbleVeinWatermark());
	 * @return SubstanceOfficeBlue2007LookAndFeel 外观包操作对象,可继续扩展
	 * @see UI#UseLookAndFeelBySubstance(InputStream, float)
	 */
	public SubstanceOfficeBlue2007LookAndFeel UseLookAndFeelBySubstance(){
		return UseLookAndFeelBySubstance(null, 0);
	}
	

	/**
	 * 在当前屏幕上显示一段信息提示,配合{@link UI#hiddenMessageForMouse()} 使用
	 * @param x 信息显示框的左上角在屏幕的x坐标
	 * @param y 信息显示框的左上角在屏幕的y坐标
	 * @param width 显示的提示框宽度
	 * @param height 显示的提示框高度
	 * @param html 显示的文字,支持html格式
	 * @return 显示文字的组件JLabel,可对此组件进行调整
	 * @see UI#showMessageForMouse(MouseEvent, int, int, String)
	 */
	public static JLabel showMessageForMouse(int x,int y,int width,int height,String html){
		jlabelMessageForMouse.setText("<html>"+html);
		jframeMessageForMouse.setBounds(x+10, y+10, width, height);
		jframeMessageForMouse.setVisible(true);
		
		return jlabelMessageForMouse;
	}
	
	
	/**
	 * 隐藏鼠标跟随的信息提示 配合 {@link UI#showMessageForMouse(MouseEvent, int, int, String)} 使用
	 */
	public static void hiddenMessageForMouse(){
		jframeMessageForMouse.setVisible(false);
	}
	
	/**
	 * 显示鼠标跟随的信息提示,配合{@link UI#hiddenMessageForMouse()} 使用
	 * @param mouseEvent 添加鼠标监听后,传入鼠标的监听对象 java.awt.event.MouseEvent
	 * @param width 显示的提示框宽度
	 * @param height 显示的提示框高度
	 * @param html 显示的文字,支持html格式
	 * @return 显示文字的组件JLabel,可对此组件进行调整
	 * @see UI#showMessageForMouse(int, int, int, int, String)
	 */
	public static JLabel showMessageForMouse(MouseEvent mouseEvent,int width,int height,String html){
		int x=0;
		int y=0;
		if(mouseEvent!=null){
			x=mouseEvent.getXOnScreen();
			y=mouseEvent.getYOnScreen();
		}
		
		return showMessageForMouse(x, y, width, height, html);
	}
	

	/**
	 * 弹出提示框,
	 * @param message 要显示的信息,支持HTML
	 */
	public static void showMessageDialog(String message){
		JOptionPane.showMessageDialog(null, "<html>"+message);
	}
	
	/**
	 * 弹出选择、确认框 
	 * @param message 要显示的信息 ,支持HTML
	 * @return int {@link #CONFIRM_YES} {@link #CONFIRM_NO} {@link #CONFIRM_CENCEL}
	 */
	public static int showConfirmDialog(String message){
		return JOptionPane.showConfirmDialog(null,"<html>"+message);
	}
	

	/** 
     * 创建此程序的系统托盘,本程序的托盘创建、以及使用返回的对象进行托盘弹出信息提示等
     * <li>MyEclipse编辑时一般菜单会出现中文乱码,不用在意。打包出去后会正常。
     * <li>简单使用:<pre>SystemUtil.createTray(MyClassName.class.getResource("res/icon.png"), "显示文字", null)</pre>
     * <li>高级使用:<a href="http://www.xnx3.com/doc/j2se_util/20150307/131.html">http://www.xnx3.com/doc/j2se_util/20150307/131.html</a>
     * @param imageIcon 托盘的图标所在路径。若图片过大会不显示!建议尺寸15*15的png图片。 如 <pre>new ImageIcon(MyClassName.class.getResource("res/icon.png"))</pre> 其中trayico.png在当前的目录下的res文件夹内,MyClassName为当前生成次托盘的类名
     * @param title 鼠标放到托盘图标上时显示的文字
     * @param popupMenu 托盘右键点击后弹出的菜单项。若不想有菜单项或者不需要,可传入null
     * @return {@link TrayIcon} 对象。若是返回null,则创建失败
     */  
    public static TrayIcon createTray(ImageIcon imageIcon,String title,PopupMenu popupMenu) {  
    	TrayIcon trayIcon=null;
    	SystemTray sysTray= SystemTray.getSystemTray();// 获得当前操作系统的托盘对象  
    	
        trayIcon=new TrayIcon(imageIcon.getImage(), title, popupMenu);
        
        try {
			sysTray.add(trayIcon);		//将托盘添加到操作系统的托盘  
			return trayIcon;
		} catch (AWTException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
			return null;
		}
    }  
    
    /**
     * 读取文件内容,通过用户自己打开文件选择框的方式
     * @param encode 以什么编码读取文件,如:{@link FileUtil#UTF8}
     * @return 文件的内容,若用户没有打开或者打开失败,返回null
     */
    public static String readFileByJFileChooser(String encode){
    	String xnx3_content = null;
    	JFileChooser jfc=new JFileChooser(".");
		jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
		int result=jfc.showOpenDialog(jfc);
		if(result==0){	//用户选择了打开
			try{
				File file=jfc.getSelectedFile();
				FileUtil f = new FileUtil();
				xnx3_content = f.read(file, encode);
				file=null;
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		jfc=null;
		return xnx3_content;
    }
    
}