/*
 * Copyright
 *   2007 axYus - www.axyus.com
 *   2005 C.Marchand - christophe.marchand@axyus.com
 *
 * This file is part of XEMELIOS.
 *
 * XEMELIOS 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.
 *
 * XEMELIOS 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 XEMELIOS; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package fr.gouv.finances.cp.xemelios;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JWindow;

import fr.gouv.finances.cp.utils.ui.IhmFactory;
import fr.gouv.finances.cp.utils.ui.UiUtils;
import fr.gouv.finances.cp.xemelios.common.Constants;
import fr.gouv.finances.cp.xemelios.common.listeners.StartListener;
import fr.gouv.finances.cp.xemelios.ui.ImageResources;
import fr.gouv.finances.cp.xemelios.ui.MainWindow;

/**
 * @author chm
 */
public class Splash extends JWindow implements StartListener {
	/**
	 * Comment for <code>serialVersionUID</code>
	 */
	private static final long serialVersionUID = 3257570598480654904L;
	private static final int MAX_PROGRESS=46;
	public static Splash instance = null;
	private JProgressBar progress;
	private int requiredProgress=0;
	
	static {
		if("true".equals(System.getProperty(Constants.SYS_PROP_DEBUG_UI))) {
			//RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager());
		}
	}
	
	public Splash() {
		super();
		initialize();
		instance = this;
		/**
		 * Si activ�, emp�che d'avoir le focus dans le champs password sous windows.
		 */
//		setAlwaysOnTop(true);
	}
	
	protected void initialize() {
    	JFrame.setDefaultLookAndFeelDecorated(true);
		IhmFactory iF = IhmFactory.newInstance();
		ImageIcon ii = iF.getIconFromResource(ImageResources.SPLASH);
		JPanel pane = new JPanel(new BorderLayout());
		pane.add(new JLabel(ii),BorderLayout.CENTER);
		pane.add(progress=new JProgressBar(JProgressBar.HORIZONTAL,0,MAX_PROGRESS),BorderLayout.SOUTH);
		getContentPane().add(pane);
		pack();
		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
		setLocation((int)(screen.getWidth()-getWidth())/2, (int)(screen.getHeight()-getHeight())/2);
		addFocusListener(new java.awt.event.FocusListener() {
			public void focusGained(java.awt.event.FocusEvent e) {
				toFront();
			}
			public void focusLost(java.awt.event.FocusEvent e) {
				toFront();
			}
		});
	}
	public void pushProgress() {
		final Thread runner = new Thread() {
			@Override
			public void run() {
				int p = requiredProgress;
				p++;
				if(p<MAX_PROGRESS) { 
					progress.setValue(p);
					
				} else if(p==MAX_PROGRESS) {
					progress.setValue(MAX_PROGRESS);
					
				} else {
					System.out.println("MAX_PROGRESS trop petit: "+p);
				}
				requiredProgress = p;
			}
		};
		UiUtils.invokeInEDT(runner,true);
	}
	public void completeProgress() {
		final Thread runner = new Thread() {
			@Override
			public void run() {
				progress.setValue(MAX_PROGRESS);
			}
		};
		UiUtils.invokeInEDT(runner,true);
	}
	/**
	 * @see fr.gouv.finances.cp.xemelios.common.listeners.StartListener#notifyMessage(java.lang.String)
	 */
	public void notifyMessage(String msg) {
		// les messages ne sont pas g�r�s pour le moment
	}
	/**
	 * @see fr.gouv.finances.cp.xemelios.common.listeners.StartListener#notifyProgress(int)
	 */
	public void notifyProgress(int progress) {
		if(progress>=0 && progress<=100) this.progress.setValue(progress); 

	}
	public static void main(final String[] args) {
	    //for(String arg:args) System.out.println(arg);
		Splash splash = null;
		final Displayer displayer = new Displayer();
		UiUtils.invokeInEDT(displayer,true);
		splash = displayer.getSplash();
		Starter starter = new Starter(args,splash);
		starter.run();
	}
	private static final class Displayer extends Thread {
		private Splash splash = null;
		@Override
		public void run() {
			splash = new Splash();
			splash.setVisible(true);
		}
		public Splash getSplash() { return splash; }
	}
	private static final class Starter implements Runnable {
		Splash sl;
		String[] args = null;
		public Starter(String[] args,Splash sl) {
			super();
			this.args = args;
			this.sl=sl;
		}
		
		public void run(){
		  try { 
		  	Thread.sleep(100);  
		  } catch(Throwable t) {}
		  sl.pushProgress();
//		  for(String arg:args) System.out.println(arg);
		  final Thread runner = new Thread() {
			  @Override
			public void run() {
				  new MainWindow(Constants.NOM_APP,sl,args);
			  }
		  };
//		  if(SwingUtilities.isEventDispatchThread()) {
//			  runner.run();
//		  } else {
//			  try {
//					SwingUtilities.invokeLater(runner);
//			  } catch(Throwable t) {};
//		  }
		  UiUtils.invokeInEDT(runner,true);
		  try { 
		  	Thread.sleep(1000);  
		  } catch(Throwable t) {}
		  sl.setVisible(false);
		  sl.dispose();
		}
	}
}
