/**
* メインアプリウィンドウ。
*
- * {@link TopView}をウィンドウ表示するための皮。
+ * <p>各種ウィンドウシステムとの接点を管理する。
+ * (ウィンドウ最小化UI、クローズUI、リサイズ操作、
+ * ウィンドウタイトル、タスクバーアイコンなど)
+ *
+ * <p>メニューバーと{@link TopView}を自身のコンテナ上にレイアウトする。
+ * アプリ画面本体の処理は{@link TopView}に委譲される。
+ *
+ * <p>アプリウィンドウ上のカーソル形状を管理する。
+ * ヘビーな処理を行う間は砂時計アイコンになる。
+ *
+ * <p>glass paneの操作により、
+ * ヘビーな処理中の各種アプリ操作(キーボード、マウス)をマスクする。
+ *
+ * <p>アプリによる各ウィンドウの親及び祖先となる。
+ *
+ * <p>各種モーダルダイアログの親となる。
*/
@SuppressWarnings("serial")
public class TopFrame extends JFrame{
/**
* グラスペインのカスタマイズを行う。
*
+ * <p>アプリウィンドウは常に透明なグラスペインに覆い尽くされている。
+ *
* <p>このグラスペインは、可視化されている間、
* キーボード入力とマウス入力を無視する。
*/
}
/**
- * トップビューを返す。
+ * 実際のアプリ画面を担当する{@link TopView}を返す。
+ *
* @return トップビュー
*/
public TopView getTopView(){
}
/**
- * ビジー状態の設定を行う。
- *
- * <p>ヘビーなタスク実行をアピールするために、
- * プログレスバーとカーソルの設定を行う。
+ * アプリウィンドウ上のマウスカーソルのビジー状態を管理する。
*
- * <p>ビジー中のマウス操作、キーボード入力は
- * 全てグラブされるため無視される。
- *
- * @param isBusy trueならプログレスバーのアニメ開始&WAITカーソル。
- * falseなら停止&通常カーソル。
+ * @param isBusy ビジーならtrue。
*/
- public void setBusy(boolean isBusy){
+ private void setCursorBusy(boolean isBusy){
Cursor cursor;
if(isBusy){
cursor = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR);
Component glassPane = getGlassPane();
glassPane.setCursor(cursor);
- this.topView.setBusy(isBusy);
+ return;
+ }
+ /**
+ * アプリウィンドウ上のマウス及びキー入力のグラブを管理する。
+ *
+ * <p>ビジー状態の場合、
+ * アプリ画面上のマウス及びキー操作は全て事前にグラブされ無視される。
+ *
+ * @param isBusy ビジーならtrue
+ */
+ private void setUiMask(boolean isBusy){
+ Component glassPane = getGlassPane();
glassPane.setVisible(isBusy);
+ return;
+ }
+ /**
+ * ビジー状態の設定を行う。
+ *
+ * <p>ヘビーなタスク実行をアピールするために、
+ * プログレスバーとカーソルの設定を行う。
+ *
+ * <p>ビジー中のマウス操作、キーボード入力は
+ * 全てグラブされるため無視される。
+ *
+ * <p>プログラスバーの表示操作は{@link TopView}に委譲される。
+ *
+ * @param isBusy trueならプログレスバーのアニメ開始&WAITカーソル。
+ * falseなら停止&通常カーソル。
+ */
+ public void setBusy(boolean isBusy){
+ setCursorBusy(isBusy);
+ setUiMask(isBusy);
+ this.topView.setBusy(isBusy);
return;
}
import jp.sfjp.jindolf.VerInfo;
import jp.sfjp.jindolf.data.Land;
import jp.sfjp.jindolf.data.Village;
-import jp.sfjp.jindolf.util.GUIUtils;
/**
* 最上位ビュー。
- * メインアプリウィンドウのコンポーネントの親コンテナ。
+ *
+ * <p>メインアプリウィンドウの各種コンポーネントの祖先コンテナ。
+ *
+ * <p>{@link JSplitPane}の左に国村選択リスト、
+ * 右にカードコンテナがレイアウトされる。
+ *
+ * <p>カードコンテナ上に
+ * 初期画面、国情報パネル{@link LandsTree}とタブブラウザ{@link TabBrowser}
+ * の3コンポーネントが重ねてレイアウトされ、必要に応じて切り替わる。
+ *
+ * <p>ヘビーなタスク実行をアピールするために、
+ * プログレスバーとフッタメッセージの管理を行う。
*/
@SuppressWarnings("serial")
public class TopView extends JPanel{
private final TabBrowser tabBrowser = new TabBrowser();
- private JComponent browsePanel;
+ // to place toolbar
+ private final JComponent browsePanel = createBrowsePanel();
+
/**
- * ã\83\88ã\83\83ã\83\97ã\83\93ã\83¥ã\83¼ã\82\92ç\94\9fæ\88\90ã\81\99ã\82\8b。
+ * ã\82³ã\83³ã\82¹ã\83\88ã\83©ã\82¯ã\82¿。
*/
public TopView(){
super();
/**
* カードパネルを生成する。
+ *
* @return カードパネル
*/
private JComponent createCards(){
- this.browsePanel = createBrowsePanel();
+ JComponent initCard = createInitCard();
+ JComponent landInfoCard = createLandInfoCard();
- JPanel panel = new JPanel();
- panel.setLayout(this.cardLayout);
- panel.add(INITCARD, createInitCard());
- panel.add(LANDCARD, createLandInfoCard());
- panel.add(BROWSECARD, this.browsePanel);
+ JPanel cardContainer = new JPanel();
+ cardContainer.setLayout(this.cardLayout);
- return panel;
+ cardContainer.add(INITCARD, initCard);
+ cardContainer.add(LANDCARD, landInfoCard);
+ cardContainer.add(BROWSECARD, this.browsePanel);
+
+ return cardContainer;
}
/**
* 初期パネルを生成。
+ *
* @return 初期パネル
*/
private JComponent createInitCard(){
- JLabel initMessage = new JLabel("← 村を選択してください");
-
- StringBuilder acct = new StringBuilder();
- acct.append("※ 参加中の村がある人は<br></br>");
- acct.append("メニューの「アカウント管理」から<br></br>");
- acct.append("ログインしてください");
- acct.insert(0, "<center>").append("</center>");
- acct.insert(0, "<body>") .append("</body>");
- acct.insert(0, "<html>") .append("</html>");
- JLabel acctMessage = new JLabel(acct.toString());
+ StringBuilder init = new StringBuilder();
+ init.append("← 村を選択してください");
+ init.insert(0, "<font 'size=+1'>").append("</font>");
+ init.insert(0, "<center>").append("</center>");
+ init.insert(0, "<body>").append("</body>");
+ init.insert(0, "<html>").append("</html>");
+ JLabel initMessage = new JLabel(init.toString());
StringBuilder warn = new StringBuilder();
warn.append("※ たまにはWebブラウザでアクセスして、");
warn.append("<br></br>");
warn.append("運営の動向を確かめようね!");
+ warn.insert(0, "<font 'size=+1'>").append("</font>");
warn.insert(0, "<center>").append("</center>");
warn.insert(0, "<body>") .append("</body>");
warn.insert(0, "<html>") .append("</html>");
constraints.anchor = GridBagConstraints.CENTER;
constraints.gridx = GridBagConstraints.REMAINDER;
panel.add(initMessage, constraints);
- panel.add(acctMessage, constraints);
panel.add(warnMessage, constraints);
JScrollPane scrollPane = new JScrollPane(panel);
/**
* 国別情報を生成。
+ *
* @return 国別情報
*/
private JComponent createLandInfoCard(){
- this.landInfo.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+ Border border = BorderFactory.createEmptyBorder(5, 5, 5, 5);
+ this.landInfo.setBorder(border);
JScrollPane scrollPane = new JScrollPane(this.landInfo);
return scrollPane;
}
/**
- * 内部ブラウザを生成。
- * @return 内部ブラウザ
+ * タブブラウザにツールバーを併設するためのコンテナを生成。
+ *
+ * @return コンテナ
*/
private JComponent createBrowsePanel(){
JPanel panel = new JPanel();
/**
* ブラウザ用ツールバーをセットする。
+ *
* @param toolbar ツールバー
*/
public void setBrowseToolBar(JToolBar toolbar){
/**
* SplitPaneを生成。
+ *
* @param left 左コンポーネント
* @param right 右コンポーネント
* @return SplitPane
split.setContinuousLayout(false);
split.setOneTouchExpandable(true);
split.setDividerLocation(200);
-
return split;
}
/**
* ステータスバーを生成する。
+ *
* @return ステータスバー
*/
private JComponent createStatusBar(){
this.sysMessage.setText(MSG_THANKS);
this.sysMessage.setEditable(false);
+
Border inside = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
Border outside = BorderFactory.createEmptyBorder(2, 5, 2, 2);
Border border = new CompoundBorder(inside, outside);
/**
* 国村選択ツリービューを返す。
+ *
* @return 国村選択ツリービュー
*/
public JTree getTreeView(){
/**
* タブビューを返す。
+ *
* @return タブビュー
*/
public TabBrowser getTabBrowser(){
/**
* 村一覧ビューを返す。
+ *
* @return 村一番ビュー
*/
public LandsTree getLandsTree(){
* プログレスバーの設定を行う。
*
* @param busy trueならプログレスバーのアニメ開始。
- * falseなら停止。
+ * falseなら停止。
*/
public void setBusy(boolean busy){
this.progressBar.setIndeterminate(busy);
/**
* ステータスバーの更新。
+ *
* @param message 更新文字列
*/
public void updateSysMessage(String message){
/**
* ステータスバー文字列を返す。
+ *
* @return ステータスバー文字列
*/
public String getSysMessage(){
/**
* 村情報を表示する。
+ *
* @param village 村
*/
public void showVillageInfo(Village village){
/**
* 国情報を表示する。
+ *
* @param land 国
*/
public void showLandInfo(Land land){
return;
}
- // TODO setEnabled()を全子フレームにも波及させるべきか
}