OSDN Git Service

Merge commit '2458eff3aea04f67893bc824b5cf896fbb767332'
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / TopView.java
diff --git a/src/main/java/jp/sourceforge/jindolf/TopView.java b/src/main/java/jp/sourceforge/jindolf/TopView.java
new file mode 100644 (file)
index 0000000..f1f52d5
--- /dev/null
@@ -0,0 +1,300 @@
+/*\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