001        package com.croftsoft.apps.neuro;
002         
003        import java.awt.*;
004        import javax.swing.*;
005        
006        import com.croftsoft.core.gui.LifecycleWindowListener;
007        import com.croftsoft.core.lang.lifecycle.Lifecycle;
008        import com.croftsoft.core.lang.lifecycle.LifecycleLib;
009        import com.croftsoft.core.lang.lifecycle.Updatable;
010        import com.croftsoft.core.util.loop.EventQueueUpdateLoop;
011        import com.croftsoft.core.util.loop.Looper;
012        import com.croftsoft.core.util.loop.NanoTimeLoopGovernor;
013        import com.croftsoft.core.util.mail.FlipMail;
014         
015        /***********************************************************************
016        * Main.
017        *
018        * Launches the application within a framework.
019        * 
020        * @version
021        *   $Id: NeuroMain.java,v 1.2 2008/08/30 00:52:22 croft Exp $
022        * @since
023        *   2008-08-17
024        * @author
025        *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
026        ***********************************************************************/
027    
028        public final class  NeuroMain
029          implements Lifecycle
030        ////////////////////////////////////////////////////////////////////////
031        ////////////////////////////////////////////////////////////////////////
032        {
033           
034        private final NeuroConfig      neuroConfig;
035         
036        private final NeuroModelImp    neuroModelImp;
037         
038        private final NeuroController  neuroController;
039           
040        private final NeuroView        neuroView;
041         
042        private final Looper           looper;
043           
044        ////////////////////////////////////////////////////////////////////////
045        // public static methods
046        ////////////////////////////////////////////////////////////////////////
047    
048        public static void  main ( final String [ ]  args )
049        ////////////////////////////////////////////////////////////////////////
050        {
051          final NeuroMain  neuroMain = new NeuroMain ( args );
052           
053          final JFrame  jFrame = new JFrame (
054            neuroMain.neuroConfig.getFrameTitle ( ) );
055           
056          neuroMain.setContentPane ( jFrame.getContentPane ( ) );
057           
058          // The Frame is the framework.
059           
060          LifecycleWindowListener.launchFrameAsDesktopApp (
061            jFrame,
062            neuroMain,
063            neuroMain.neuroConfig.getFrameSize ( ),
064            neuroMain.neuroConfig.getShutdownConfirmationPrompt ( ) );
065        }
066         
067        ////////////////////////////////////////////////////////////////////////
068        // constructor methods
069        ////////////////////////////////////////////////////////////////////////
070         
071        public  NeuroMain ( final String [ ]  args )
072        ////////////////////////////////////////////////////////////////////////
073        {
074          neuroConfig = NeuroConfigImp.load ( args );
075           
076          System.out.println ( "\n" + neuroConfig.getInfo ( ) );
077          
078          final FlipMail<NeuroMessage>  flipMail
079            = new FlipMail<NeuroMessage> ( );
080           
081          neuroModelImp = new NeuroModelImp (
082            neuroConfig,
083            flipMail );
084           
085          neuroController = new NeuroController ( flipMail );
086           
087          neuroView = new NeuroView (
088            neuroConfig,
089            flipMail,
090            neuroModelImp );
091           
092          neuroView.addUserInputListener ( neuroController );
093          
094          final Updatable [ ]  updatables = new Updatable [ ] {
095            flipMail,
096            neuroModelImp,
097            neuroView,
098            neuroController };
099           
100          looper = new Looper (
101            new EventQueueUpdateLoop ( updatables ), // loopable
102            new NanoTimeLoopGovernor ( neuroConfig.getUpdateRate ( ) ),
103            null, // exceptionHandler
104            neuroConfig.getThreadName ( ),
105            Thread.MIN_PRIORITY,
106            true ); // useDaemonThread
107        }
108         
109        ////////////////////////////////////////////////////////////////////////
110        // accessor methods
111        ////////////////////////////////////////////////////////////////////////
112         
113        public NeuroConfig  getNeuroConfig ( )
114        ////////////////////////////////////////////////////////////////////////
115        {
116          return neuroConfig;
117        }
118         
119        ////////////////////////////////////////////////////////////////////////
120        // mutator methods
121        ////////////////////////////////////////////////////////////////////////
122         
123        public void  setContentPane ( final Container  contentPane )
124        ////////////////////////////////////////////////////////////////////////
125        {
126          neuroView.setContentPane ( contentPane );
127        }
128         
129        ////////////////////////////////////////////////////////////////////////
130        // interface Lifecycle methods
131        ////////////////////////////////////////////////////////////////////////
132         
133        public void  init ( )
134        ////////////////////////////////////////////////////////////////////////
135        {
136          LifecycleLib.init ( neuroView, looper );
137        }
138         
139        public void  start ( )
140        ////////////////////////////////////////////////////////////////////////
141        {
142          LifecycleLib.start (
143            neuroView, neuroController, neuroModelImp, looper );
144        }
145         
146        public void  stop ( )
147        ////////////////////////////////////////////////////////////////////////
148        {
149          LifecycleLib.stop ( neuroView, looper );
150        }
151         
152        public void  destroy ( )
153        ////////////////////////////////////////////////////////////////////////
154        {
155          LifecycleLib.destroy ( neuroView, looper );
156        }     
157           
158        ////////////////////////////////////////////////////////////////////////
159        ////////////////////////////////////////////////////////////////////////
160        }