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="http://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 }