View Javadoc

1   package helloagain.kanday;
2   
3   import java.util.logging.Logger;
4   
5   
6   /***
7    * KandayMain.java
8    *
9    * HelloAgain Desktop編プログラムのmainを提供するクラス。
10   * 主要機能は、
11   * <ul>
12   * <li>プログラム起動時のスプラッシュ画面表示制御
13   * <li>KandayPreferecesの生成
14   * <li>KandayFrameの生成
15   * <li>シャットダウンフックで終了前に設定の保存
16   * </ul>
17   * <p>
18   * コマンドライン引数
19   * <ul>
20   * <li>-nologo スプラッシュを表示しない
21   * <li>-notoolbar ツールバーを表示しない(未実装)
22   * </ul>
23   * <p>
24   * Created: Wed May 26 12:54:18 2004
25   *
26   * @author <a href="mailto:torutk@02.246.ne.jp">TAKAHASHI,Toru</a>
27   * @version 1.0
28   */
29  
30  public class KandayMain{
31  
32      /***
33       * プログラム起動時に呼ばれる<code>main</code>メソッド。
34       * @param args コマンドライン引数
35       */
36      public static final void main(final String[] args) {
37          logger.entering(MYCLASS, "main", args);
38          startTime = System.currentTimeMillis();
39  
40          for (int i=0; i<args.length; i++) {
41              if ("-nologo".equals(args[i])) {
42                  // スプラッシュ画面表示抑制設定
43                  isSplash = false;
44              } else if ("-notoolbar".equals(args[i])) {
45                  // no implement
46              }
47          }
48  
49          // スプラッシュ画面表示
50          showSplash();
51  
52          final KandayPreferences pref = new KandayPreferences();
53          final KandayFrame frame = new KandayFrame(pref);
54          
55          // シャットダウンフックの追加
56          Runtime.getRuntime().addShutdownHook(new Thread() {
57                  public void run() {
58                      savePreferences(pref, frame);
59                  }
60              });
61  
62          // スプラッシュ表示時間の調整
63          waitSplash();
64  
65          frame.setVisible(true);
66          logger.exiting(MYCLASS, "main");
67      }
68  
69      /***
70       * 実行するコンピュータの画面中央に位置するスプラッシュ画面を
71       * 生成する。クラス変数<code>isSplash</code>が偽であれば、即時
72       * リターンする。
73       */
74      private static void showSplash() {
75          logger.entering(MYCLASS, "showSplash");
76          if (isSplash == false) {
77              logger.config("Splash is disabled");
78              return;
79          }
80  
81          splash = new KandaySplash();
82          splash.setVisible(true);
83          logger.exiting(MYCLASS, "showSplash");
84      }
85  
86      /***
87       * 表示されているスプラッシュ画面を消去するタイミングを図り、
88       * スプラッシュ画面を破棄する。
89       * 定数SPLASH_DURATION_TIMEミリ秒の経過を待つ。ただし、プログラムが
90       * 起動されてから本メソッドが呼ばれるまでに経過した時間を差っ引いて
91       * いる。
92       */
93      private static void waitSplash() {
94          logger.entering(MYCLASS, "waitSplash");
95          if (isSplash == false) {
96              return;
97          }
98          long lapse = System.currentTimeMillis() - startTime;
99          if (lapse < SPLASH_DURATION_TIME ) {
100             try {
101                 Thread.sleep(SPLASH_DURATION_TIME - lapse);
102             } catch (InterruptedException e) {
103                 // do nothing
104             }
105         }
106         splash.setVisible(false);
107         logger.exiting(MYCLASS, "waitSplash");
108     }
109 
110     /***
111      * 永続化対象データを保存する処理を呼び出す。
112      * @param aPreferences 永続化の処理を行うインスタンス
113      * @param aFrame 永続化対象データの取得に必要
114      */
115     private static void savePreferences(
116         KandayPreferences aPreferences, KandayFrame aFrame
117     ) {
118         logger.entering(MYCLASS, "savePreferences",
119                         new Object[] {aPreferences, aFrame}
120         );
121         int positionX = aFrame.getLocation().x;
122         int positionY = aFrame.getLocation().y;
123         int width = aFrame.getWidth();
124         int height = aFrame.getHeight();
125 
126         aPreferences.setFramePositionX(positionX);
127         aPreferences.setFramePositionY(positionY);
128         aPreferences.setFrameWidth(width);
129         aPreferences.setFrameHeight(height);
130         aPreferences.save();
131 
132         logger.exiting(MYCLASS, "savePreferences");
133     }
134 
135     /*** スプラッシュ画面を表示する時間[ms] */
136     private final static int SPLASH_DURATION_TIME = 5000;
137     /*** スプラッシュ画面の表示有無を示すフラグ */
138     private static boolean isSplash = true;
139     /*** スプラッシュ画面インスタンス */
140     private static KandaySplash splash;
141     /*** スプラッシュ画面表示開始時間を保持 */
142     private static long startTime;
143 
144     // ロギング関連
145     private static final String MYCLASS = KandayMain.class.getName();
146     private static Logger logger = Logger.getLogger(MYCLASS);
147 } // KandayMain