001        package com.croftsoft.apps.skipper;
002    
003        import java.awt.*;
004        import java.util.logging.*;
005        import javax.swing.*;
006    
007        import com.croftsoft.core.gui.LifecycleWindowListener;
008        import com.croftsoft.core.lang.lifecycle.Lifecycle;
009        import com.croftsoft.core.lang.lifecycle.LifecycleLib;
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    
014        /***********************************************************************
015        * Skipper Main.
016        *
017        * Copyright 2007 David Wallace Croft.
018        * 
019        * @version
020        *   $Date: 2007/07/28 16:57:04 $ $Author: croft $
021        * @since
022        *   2006-12-19
023        * @author
024        *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
025        ***********************************************************************/
026    
027        public final class  SkipperMain
028          implements Lifecycle
029        ////////////////////////////////////////////////////////////////////////
030        ////////////////////////////////////////////////////////////////////////
031        {
032         
033        private final SkipperConfig  skipperConfig;
034         
035        private final SkipperModel   skipperModel;
036    
037        private final SkipperView    skipperView;
038    
039        private final Looper         looper;
040    
041        ////////////////////////////////////////////////////////////////////////
042        // public static methods
043        ////////////////////////////////////////////////////////////////////////
044    
045        public static void  main ( final String [ ]  args )
046        ////////////////////////////////////////////////////////////////////////
047        {
048          final Logger  logger = Logger.getLogger (
049            SkipperMain.class.getPackage ( ).getName ( ) );
050    
051          logger.setLevel ( Level.INFO );
052    
053          final Handler  handler = new ConsoleHandler ( );
054    
055          handler.setLevel ( Level.WARNING );
056    
057          logger.addHandler ( handler );
058    
059          final SkipperMain  skipperMain = new SkipperMain ( args );
060    
061          final JFrame  jFrame = new JFrame (
062            skipperMain.skipperConfig.getFrameTitle ( ) );
063    
064          skipperMain.setContentPane ( jFrame.getContentPane ( ) );
065    
066          // The Frame is the framework.
067    
068          LifecycleWindowListener.launchFrameAsDesktopApp (
069            jFrame,
070            skipperMain,
071            skipperMain.skipperConfig.getFrameSize ( ),
072            skipperMain.skipperConfig.getShutdownConfirmationPrompt ( ) );
073        }
074    
075        ////////////////////////////////////////////////////////////////////////
076        ////////////////////////////////////////////////////////////////////////
077    
078        public  SkipperMain ( final String [ ]  args )
079        ////////////////////////////////////////////////////////////////////////
080        {
081          skipperConfig = SkipperConfig.load ( args );
082    
083          skipperModel = new SkipperModel ( skipperConfig );
084    
085          skipperView = new SkipperView ( skipperConfig, skipperModel );
086    
087          looper = new Looper (
088            new EventQueueUpdateLoop ( skipperView ), // loopable
089            new NanoTimeLoopGovernor ( skipperConfig.getUpdateRate ( ) ),
090            null, // exceptionHandler
091            skipperConfig.getThreadName ( ),
092            Thread.MIN_PRIORITY,
093            true ); // useDaemonThread
094        }
095    
096        ////////////////////////////////////////////////////////////////////////
097        // accessor methods
098        ////////////////////////////////////////////////////////////////////////
099    
100        public SkipperConfig  getSkipperConfig ( )
101        ////////////////////////////////////////////////////////////////////////
102        {
103          return skipperConfig;
104        }
105    
106        ////////////////////////////////////////////////////////////////////////
107        // mutator methods
108        ////////////////////////////////////////////////////////////////////////
109    
110        public void  setContentPane ( final Container  contentPane )
111        ////////////////////////////////////////////////////////////////////////
112        {
113          skipperView.setContentPane ( contentPane );
114        }
115    
116        ////////////////////////////////////////////////////////////////////////
117        // interface Lifecycle methods
118        ////////////////////////////////////////////////////////////////////////
119    
120        public void  init ( )
121        ////////////////////////////////////////////////////////////////////////
122        {
123          LifecycleLib.init ( skipperModel, skipperView, looper );
124        }
125    
126        public void  start ( )
127        ////////////////////////////////////////////////////////////////////////
128        {
129          LifecycleLib.start ( looper );
130        }
131    
132        public void  stop ( )
133        ////////////////////////////////////////////////////////////////////////
134        {
135          LifecycleLib.stop ( looper );
136        }
137    
138        public void  destroy ( )
139        ////////////////////////////////////////////////////////////////////////
140        {
141          LifecycleLib.destroy ( looper, skipperModel );
142    
143          try
144          {
145            skipperConfig.save ( );
146          }
147          catch ( final Exception  ex )
148          {
149            ex.printStackTrace ( );
150          }
151        }     
152    
153        ////////////////////////////////////////////////////////////////////////
154        ////////////////////////////////////////////////////////////////////////
155        }