--- /dev/null
+/*\r
+ * Top view\r
+ *\r
+ * Copyright(c) 2008 olyutorskii\r
+ * $Id: TopView.java 888 2009-11-04 06:23:35Z olyutorskii $\r
+ */\r
+\r
+package jp.sourceforge.jindolf;\r
+\r
+import java.awt.BorderLayout;\r
+import java.awt.CardLayout;\r
+import java.awt.GridBagConstraints;\r
+import java.awt.GridBagLayout;\r
+import java.awt.Insets;\r
+import javax.swing.BorderFactory;\r
+import javax.swing.JComponent;\r
+import javax.swing.JLabel;\r
+import javax.swing.JPanel;\r
+import javax.swing.JProgressBar;\r
+import javax.swing.JScrollPane;\r
+import javax.swing.JSplitPane;\r
+import javax.swing.JTextField;\r
+import javax.swing.JToolBar;\r
+import javax.swing.JTree;\r
+import javax.swing.SwingConstants;\r
+import javax.swing.border.BevelBorder;\r
+import javax.swing.border.Border;\r
+import javax.swing.border.CompoundBorder;\r
+\r
+/**\r
+ * 最上位ビュー。\r
+ * メインアプリウィンドウのコンポーネントの親コンテナ。\r
+ */\r
+@SuppressWarnings("serial")\r
+public class TopView extends JPanel{\r
+\r
+ private static final String INITCARD = "INITCARD";\r
+ private static final String LANDCARD = "LANDINFO";\r
+ private static final String BROWSECARD = "BROWSER";\r
+\r
+ private final JComponent cards;\r
+ private final CardLayout cardLayout = new CardLayout();\r
+\r
+ private final LandsTree landsTreeView = new LandsTree();\r
+\r
+ private final LandInfoPanel landInfo = new LandInfoPanel();\r
+\r
+ private final JTextField sysMessage = new JTextField();\r
+ private final JProgressBar progressBar = new JProgressBar();\r
+\r
+ private final TabBrowser tabBrowser = new TabBrowser();\r
+\r
+ private JComponent browsePanel;\r
+\r
+ /**\r
+ * トップビューを生成する。\r
+ */\r
+ public TopView(){\r
+ super();\r
+\r
+ this.cards = createCards();\r
+ JComponent split = createSplitPane(this.landsTreeView, this.cards);\r
+ JComponent statusBar = createStatusBar();\r
+\r
+ BorderLayout layout = new BorderLayout();\r
+ setLayout(layout);\r
+ add(split, BorderLayout.CENTER);\r
+ add(statusBar, BorderLayout.SOUTH);\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * カードパネルを生成する。\r
+ * @return カードパネル\r
+ */\r
+ private JComponent createCards(){\r
+ this.browsePanel = createBrowsePanel();\r
+\r
+ JPanel panel = new JPanel();\r
+ panel.setLayout(this.cardLayout);\r
+ panel.add(INITCARD, createInitCard());\r
+ panel.add(LANDCARD, createLandInfoCard());\r
+ panel.add(BROWSECARD, this.browsePanel);\r
+\r
+ return panel;\r
+ }\r
+\r
+ /**\r
+ * 初期パネルを生成。\r
+ * @return 初期パネル\r
+ */\r
+ private JComponent createInitCard(){\r
+ JLabel initMessage = new JLabel("← 村を選択してください");\r
+\r
+ StringBuilder acct = new StringBuilder();\r
+ acct.append("※ 参加中の村がある人は<br></br>");\r
+ acct.append("メニューの「アカウント管理」から<br></br>");\r
+ acct.append("ログインしてください");\r
+ acct.insert(0, "<center>").append("</center>");\r
+ acct.insert(0, "<body>") .append("</body>");\r
+ acct.insert(0, "<html>") .append("</html>");\r
+ JLabel acctMessage = new JLabel(acct.toString());\r
+\r
+ StringBuilder warn = new StringBuilder();\r
+ warn.append("※ たまにはWebブラウザでアクセスして、");\r
+ warn.append("<br></br>");\r
+ warn.append("運営の動向を確かめようね!");\r
+ warn.insert(0, "<center>").append("</center>");\r
+ warn.insert(0, "<body>") .append("</body>");\r
+ warn.insert(0, "<html>") .append("</html>");\r
+ JLabel warnMessage = new JLabel(warn.toString());\r
+\r
+ JPanel panel = new JPanel();\r
+ GridBagLayout layout = new GridBagLayout();\r
+ GridBagConstraints constraints = new GridBagConstraints();\r
+ panel.setLayout(layout);\r
+\r
+ constraints.weightx = 1.0;\r
+ constraints.weighty = 1.0;\r
+ constraints.anchor = GridBagConstraints.CENTER;\r
+ constraints.gridx = GridBagConstraints.REMAINDER;\r
+ panel.add(initMessage, constraints);\r
+ panel.add(acctMessage, constraints);\r
+ panel.add(warnMessage, constraints);\r
+\r
+ JScrollPane scrollPane = new JScrollPane(panel);\r
+\r
+ return scrollPane;\r
+ }\r
+\r
+ /**\r
+ * 国別情報を生成。\r
+ * @return 国別情報\r
+ */\r
+ private JComponent createLandInfoCard(){\r
+ this.landInfo.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));\r
+ JScrollPane scrollPane = new JScrollPane(this.landInfo);\r
+ return scrollPane;\r
+ }\r
+\r
+ /**\r
+ * 内部ブラウザを生成。\r
+ * @return 内部ブラウザ\r
+ */\r
+ private JComponent createBrowsePanel(){\r
+ JPanel panel = new JPanel();\r
+ BorderLayout layout = new BorderLayout();\r
+ panel.setLayout(layout);\r
+\r
+ panel.add(this.tabBrowser, BorderLayout.CENTER);\r
+\r
+ return panel;\r
+ }\r
+\r
+ /**\r
+ * ブラウザ用ツールバーをセットする。\r
+ * @param toolbar ツールバー\r
+ */\r
+ public void setBrowseToolBar(JToolBar toolbar){\r
+ this.browsePanel.add(toolbar, BorderLayout.NORTH);\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * SplitPaneを生成。\r
+ * @param left 左コンポーネント\r
+ * @param right 右コンポーネント\r
+ * @return SplitPane\r
+ */\r
+ private JComponent createSplitPane(JComponent left, JComponent right){\r
+ JSplitPane split = new JSplitPane();\r
+ split.setLeftComponent(left);\r
+ split.setRightComponent(right);\r
+ split.setOrientation(JSplitPane.HORIZONTAL_SPLIT);\r
+ split.setContinuousLayout(false);\r
+ split.setOneTouchExpandable(true);\r
+ split.setDividerLocation(200);\r
+\r
+ return split;\r
+ }\r
+\r
+ /**\r
+ * ステータスバーを生成する。\r
+ * @return ステータスバー\r
+ */\r
+ private JComponent createStatusBar(){\r
+ this.sysMessage.setText(\r
+ Jindolf.TITLE + " " + Jindolf.VERSION\r
+ + " を使ってくれてありがとう!" );\r
+ this.sysMessage.setEditable(false);\r
+ Border inside = BorderFactory.createBevelBorder(BevelBorder.LOWERED);\r
+ Border outside = BorderFactory.createEmptyBorder(2, 5, 2, 2);\r
+ Border border = new CompoundBorder(inside, outside);\r
+ this.sysMessage.setBorder(border);\r
+\r
+ this.progressBar.setIndeterminate(false);\r
+ this.progressBar.setOrientation(SwingConstants.HORIZONTAL);\r
+ this.progressBar.setMinimum(0);\r
+ this.progressBar.setMaximum(99);\r
+ this.progressBar.setValue(0);\r
+\r
+ JPanel statusBar = new JPanel();\r
+ GridBagLayout layout = new GridBagLayout();\r
+ GridBagConstraints constraints = new GridBagConstraints();\r
+ statusBar.setLayout(layout);\r
+\r
+ constraints.weightx = 1.0;\r
+ constraints.fill = GridBagConstraints.HORIZONTAL;\r
+ statusBar.add(this.sysMessage, constraints);\r
+\r
+ constraints.weightx = 0.0;\r
+ constraints.fill = GridBagConstraints.NONE;\r
+ constraints.insets = new Insets(2, 2, 2, 2);\r
+ statusBar.add(this.progressBar, constraints);\r
+\r
+ return statusBar;\r
+ }\r
+\r
+ /**\r
+ * 国村選択ツリービューを返す。\r
+ * @return 国村選択ツリービュー\r
+ */\r
+ public JTree getTreeView(){\r
+ return this.landsTreeView.getTreeView();\r
+ }\r
+\r
+ /**\r
+ * タブビューを返す。\r
+ * @return タブビュー\r
+ */\r
+ public TabBrowser getTabBrowser(){\r
+ return this.tabBrowser;\r
+ }\r
+\r
+ /**\r
+ * 村一覧ビューを返す。\r
+ * @return 村一番ビュー\r
+ */\r
+ public LandsTree getLandsTree(){\r
+ return this.landsTreeView;\r
+ }\r
+\r
+ /**\r
+ * プログレスバーとカーソルの設定を行う。\r
+ * @param busy trueならプログレスバーのアニメ開始&WAITカーソル。\r
+ * falseなら停止&通常カーソル。\r
+ */\r
+ public void setBusy(boolean busy){\r
+ this.progressBar.setIndeterminate(busy);\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * ステータスバーの更新。\r
+ * @param message 更新文字列\r
+ */\r
+ public void updateSysMessage(String message){\r
+ if(message == null) return;\r
+ String text;\r
+ if(message.length() <= 0) text = " ";\r
+ else text = message;\r
+ this.sysMessage.setText(text); // Thread safe\r
+ GUIUtils.dispatchEmptyAWTEvent();\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * 初期パネルを表示する。\r
+ */\r
+ public void showInitPanel(){\r
+ this.cardLayout.show(this.cards, INITCARD);\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * 村情報を表示する。\r
+ * @param village 村\r
+ */\r
+ public void showVillageInfo(Village village){\r
+ this.tabBrowser.setVillage(village);\r
+ this.cardLayout.show(this.cards, BROWSECARD);\r
+ this.tabBrowser.repaint();\r
+ this.tabBrowser.revalidate();\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * 国情報を表示する。\r
+ * @param land 国\r
+ */\r
+ public void showLandInfo(Land land){\r
+ this.landInfo.update(land);\r
+ this.cardLayout.show(this.cards, LANDCARD);\r
+ return;\r
+ }\r
+\r
+ // TODO setEnabled()を全子フレームにも波及させるべきか\r
+}\r