001         package com.croftsoft.apps.client;
002         
003         import java.awt.*;
004         import java.util.*;
005         import java.util.concurrent.*;
006         import javax.swing.*;
007         
008         import com.croftsoft.core.gui.LifecycleWindowListener;
009         import com.croftsoft.core.lang.lifecycle.*;
010         import com.croftsoft.core.util.loop.*;
011         
012         /*********************************************************************
013         * Main.
014         *
015         * Launches the application within a framework.
016         * 
017         * @version
018         *   $Id: ClientMain.java,v 1.7 2006/12/09 05:23:45 croft Exp $
019         * @since
020         *   2006-10-30
021         * @author
022         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
023         *********************************************************************/
024    
025         public final class  ClientMain
026           implements Lifecycle
027         //////////////////////////////////////////////////////////////////////
028         //////////////////////////////////////////////////////////////////////
029         {
030           
031         private final ClientConfig      clientConfig;
032           
033         private final ClientModel       clientModel;
034         
035         private final ClientNet         clientNet;
036         
037         private final ClientView        clientView;
038           
039         private final Looper            looper;
040         
041         private final Queue<ClientMessage>
042           modelQueue,
043           viewQueue;
044         
045         private final BlockingQueue<ClientMessage>  netQueue;
046         
047         //////////////////////////////////////////////////////////////////////
048         //////////////////////////////////////////////////////////////////////
049           
050         public static void  main ( final String [ ]  args )
051         //////////////////////////////////////////////////////////////////////
052         {
053           final ClientMain  clientMain = new ClientMain ( args );
054           
055           final JFrame  jFrame = new JFrame (
056             clientMain.clientConfig.getFrameTitle ( ) );
057           
058           clientMain.setContentPane ( jFrame.getContentPane ( ) );
059           
060           // The Frame is the framework.
061           
062           LifecycleWindowListener.launchFrameAsDesktopApp (
063             jFrame,
064             clientMain,
065             clientMain.clientConfig.getFrameSize ( ),
066             clientMain.clientConfig.getShutdownConfirmationPrompt ( ) );
067         }
068           
069         //////////////////////////////////////////////////////////////////////
070         //////////////////////////////////////////////////////////////////////
071         
072         public  ClientMain ( final String [ ]  args )
073         //////////////////////////////////////////////////////////////////////
074         {
075           clientConfig = ClientConfig.load ( args );
076           
077           System.out.println ( "\n" + clientConfig.getInfo ( ) );
078           
079           modelQueue = new LinkedList<ClientMessage> ( );
080           
081           viewQueue  = new LinkedList<ClientMessage> ( );
082           
083           netQueue   = new LinkedBlockingQueue<ClientMessage> ( );
084           
085           clientModel = new ClientModel ( modelQueue, viewQueue, netQueue );
086           
087           clientNet = new ClientNet ( clientConfig, netQueue, modelQueue );
088           
089           clientView = new ClientView ( clientConfig, viewQueue, modelQueue );
090           
091           final Updatable [ ]  updatables = new Updatable [ ] {
092             clientModel,
093             clientView };
094           
095           looper = new Looper (
096             new EventQueueUpdateLoop ( updatables ), // loopable
097             new NanoTimeLoopGovernor ( clientConfig.getUpdateRate ( ) ),
098             null, // exceptionHandler
099             clientConfig.getThreadName ( ),
100             Thread.MIN_PRIORITY,
101             true ); // useDaemonThread
102         }
103         
104         //////////////////////////////////////////////////////////////////////
105         //////////////////////////////////////////////////////////////////////
106         
107         public ClientConfig  getClientConfig ( ) { return clientConfig; }
108         
109         //////////////////////////////////////////////////////////////////////
110         //////////////////////////////////////////////////////////////////////
111         
112         public void  setContentPane ( final Container  contentPane )
113         //////////////////////////////////////////////////////////////////////
114         {
115           clientView.setContentPane ( contentPane );
116         }
117         
118         //////////////////////////////////////////////////////////////////////
119         // interface Lifecycle methods
120         //////////////////////////////////////////////////////////////////////
121         
122         public void  init ( )
123         //////////////////////////////////////////////////////////////////////
124         {
125           LifecycleLib.init ( clientView, looper, clientNet );
126         }
127         
128         public void  start ( )
129         //////////////////////////////////////////////////////////////////////
130         {
131           LifecycleLib.start ( clientView, looper, clientNet );
132         }
133         
134         public void  stop ( )
135         //////////////////////////////////////////////////////////////////////
136         {
137           LifecycleLib.stop ( clientNet, clientView, looper );
138         }
139         
140         public void  destroy ( )
141         //////////////////////////////////////////////////////////////////////
142         {
143           LifecycleLib.destroy ( clientNet, clientView, looper );
144         }     
145         
146         //////////////////////////////////////////////////////////////////////
147         //////////////////////////////////////////////////////////////////////
148         }