package com.croftsoft.apps.exemplar;
import java.util.*;
import javax.swing.*;
import com.croftsoft.core.gui.LifecycleWindowListener;
import com.croftsoft.core.lang.lifecycle.CompositeLifecycle;
import com.croftsoft.core.lang.lifecycle.Destroyable;
import com.croftsoft.core.lang.lifecycle.Initializable;
import com.croftsoft.core.lang.lifecycle.Lifecycle;
import com.croftsoft.core.lang.lifecycle.Startable;
import com.croftsoft.core.lang.lifecycle.Stoppable;
import com.croftsoft.core.lang.lifecycle.Updatable;
import com.croftsoft.core.util.loop.EventQueueUpdateLoop;
import com.croftsoft.core.util.loop.Looper;
import com.croftsoft.core.util.loop.NanoTimeLoopGovernor;
/*********************************************************************
* Exemplar main.
*
* Launches the application within a framework.
*
* @version
* $Id: Main.java,v 1.10 2006/06/22 13:46:22 croft Exp $
* @since
* 2006-01-03
* @author
* David Wallace Croft
*********************************************************************/
public final class Main
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
{
public static void main ( final String [ ] args )
//////////////////////////////////////////////////////////////////////
{
final Config config = Config.load ( args );
System.out.println ( "\n" + config.getInfo ( ) );
final Queue requestQueue
= new LinkedList ( );
final Queue eventQueue
= new LinkedList ( );
final Model model = new Model ( config, requestQueue, eventQueue );
final JFrame jFrame = new JFrame ( );
final View view = new View ( config, model, eventQueue, jFrame );
final Controller controller
= new Controller ( config, requestQueue );
view.addMouseListener ( controller );
final Updatable [ ] updatables = new Updatable [ ] {
model,
view,
controller };
final Looper looper = new Looper (
new EventQueueUpdateLoop ( updatables ), // loopable
new NanoTimeLoopGovernor ( config.getUpdateRate ( ) ),
null, // exceptionHandler
config.getThreadName ( ),
Thread.MIN_PRIORITY,
true ); // useDaemonThread
final Lifecycle lifecycle = new CompositeLifecycle (
new Initializable [ ] { view, looper },
new Startable [ ] { view, controller, model, looper },
new Stoppable [ ] { view, looper },
new Destroyable [ ] { view, looper } );
// The Frame is the framework.
LifecycleWindowListener.launchFrameAsDesktopApp (
jFrame,
lifecycle,
config.getFrameSize ( ),
config.getShutdownConfirmationPrompt ( ) );
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
}