OSDN Git Service

f1f52d5a6c96f8ef1f7f4ac051b43d2b2a0c73fe
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / TopView.java
1 /*\r
2  * Top view\r
3  *\r
4  * Copyright(c) 2008 olyutorskii\r
5  * $Id: TopView.java 888 2009-11-04 06:23:35Z olyutorskii $\r
6  */\r
7 \r
8 package jp.sourceforge.jindolf;\r
9 \r
10 import java.awt.BorderLayout;\r
11 import java.awt.CardLayout;\r
12 import java.awt.GridBagConstraints;\r
13 import java.awt.GridBagLayout;\r
14 import java.awt.Insets;\r
15 import javax.swing.BorderFactory;\r
16 import javax.swing.JComponent;\r
17 import javax.swing.JLabel;\r
18 import javax.swing.JPanel;\r
19 import javax.swing.JProgressBar;\r
20 import javax.swing.JScrollPane;\r
21 import javax.swing.JSplitPane;\r
22 import javax.swing.JTextField;\r
23 import javax.swing.JToolBar;\r
24 import javax.swing.JTree;\r
25 import javax.swing.SwingConstants;\r
26 import javax.swing.border.BevelBorder;\r
27 import javax.swing.border.Border;\r
28 import javax.swing.border.CompoundBorder;\r
29 \r
30 /**\r
31  * 最上位ビュー。\r
32  * メインアプリウィンドウのコンポーネントの親コンテナ。\r
33  */\r
34 @SuppressWarnings("serial")\r
35 public class TopView extends JPanel{\r
36 \r
37     private static final String INITCARD = "INITCARD";\r
38     private static final String LANDCARD = "LANDINFO";\r
39     private static final String BROWSECARD = "BROWSER";\r
40 \r
41     private final JComponent cards;\r
42     private final CardLayout cardLayout = new CardLayout();\r
43 \r
44     private final LandsTree landsTreeView = new LandsTree();\r
45 \r
46     private final LandInfoPanel landInfo = new LandInfoPanel();\r
47 \r
48     private final JTextField sysMessage = new JTextField();\r
49     private final JProgressBar progressBar = new JProgressBar();\r
50 \r
51     private final TabBrowser tabBrowser = new TabBrowser();\r
52 \r
53     private JComponent browsePanel;\r
54 \r
55     /**\r
56      * トップビューを生成する。\r
57      */\r
58     public TopView(){\r
59         super();\r
60 \r
61         this.cards = createCards();\r
62         JComponent split = createSplitPane(this.landsTreeView, this.cards);\r
63         JComponent statusBar = createStatusBar();\r
64 \r
65         BorderLayout layout = new BorderLayout();\r
66         setLayout(layout);\r
67         add(split, BorderLayout.CENTER);\r
68         add(statusBar, BorderLayout.SOUTH);\r
69 \r
70         return;\r
71     }\r
72 \r
73     /**\r
74      * カードパネルを生成する。\r
75      * @return カードパネル\r
76      */\r
77     private JComponent createCards(){\r
78         this.browsePanel = createBrowsePanel();\r
79 \r
80         JPanel panel = new JPanel();\r
81         panel.setLayout(this.cardLayout);\r
82         panel.add(INITCARD, createInitCard());\r
83         panel.add(LANDCARD, createLandInfoCard());\r
84         panel.add(BROWSECARD, this.browsePanel);\r
85 \r
86         return panel;\r
87     }\r
88 \r
89     /**\r
90      * 初期パネルを生成。\r
91      * @return 初期パネル\r
92      */\r
93     private JComponent createInitCard(){\r
94         JLabel initMessage = new JLabel("← 村を選択してください");\r
95 \r
96         StringBuilder acct = new StringBuilder();\r
97         acct.append("※ 参加中の村がある人は<br></br>");\r
98         acct.append("メニューの「アカウント管理」から<br></br>");\r
99         acct.append("ログインしてください");\r
100         acct.insert(0, "<center>").append("</center>");\r
101         acct.insert(0, "<body>")  .append("</body>");\r
102         acct.insert(0, "<html>")  .append("</html>");\r
103         JLabel acctMessage = new JLabel(acct.toString());\r
104 \r
105         StringBuilder warn = new StringBuilder();\r
106         warn.append("※ たまにはWebブラウザでアクセスして、");\r
107         warn.append("<br></br>");\r
108         warn.append("運営の動向を確かめようね!");\r
109         warn.insert(0, "<center>").append("</center>");\r
110         warn.insert(0, "<body>")  .append("</body>");\r
111         warn.insert(0, "<html>")  .append("</html>");\r
112         JLabel warnMessage = new JLabel(warn.toString());\r
113 \r
114         JPanel panel = new JPanel();\r
115         GridBagLayout layout = new GridBagLayout();\r
116         GridBagConstraints constraints = new GridBagConstraints();\r
117         panel.setLayout(layout);\r
118 \r
119         constraints.weightx = 1.0;\r
120         constraints.weighty = 1.0;\r
121         constraints.anchor = GridBagConstraints.CENTER;\r
122         constraints.gridx = GridBagConstraints.REMAINDER;\r
123         panel.add(initMessage, constraints);\r
124         panel.add(acctMessage, constraints);\r
125         panel.add(warnMessage, constraints);\r
126 \r
127         JScrollPane scrollPane = new JScrollPane(panel);\r
128 \r
129         return scrollPane;\r
130     }\r
131 \r
132     /**\r
133      * 国別情報を生成。\r
134      * @return 国別情報\r
135      */\r
136     private JComponent createLandInfoCard(){\r
137         this.landInfo.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));\r
138         JScrollPane scrollPane = new JScrollPane(this.landInfo);\r
139         return scrollPane;\r
140     }\r
141 \r
142     /**\r
143      * 内部ブラウザを生成。\r
144      * @return 内部ブラウザ\r
145      */\r
146     private JComponent createBrowsePanel(){\r
147         JPanel panel = new JPanel();\r
148         BorderLayout layout = new BorderLayout();\r
149         panel.setLayout(layout);\r
150 \r
151         panel.add(this.tabBrowser, BorderLayout.CENTER);\r
152 \r
153         return panel;\r
154     }\r
155 \r
156     /**\r
157      * ブラウザ用ツールバーをセットする。\r
158      * @param toolbar ツールバー\r
159      */\r
160     public void setBrowseToolBar(JToolBar toolbar){\r
161         this.browsePanel.add(toolbar, BorderLayout.NORTH);\r
162         return;\r
163     }\r
164 \r
165     /**\r
166      * SplitPaneを生成。\r
167      * @param left 左コンポーネント\r
168      * @param right 右コンポーネント\r
169      * @return SplitPane\r
170      */\r
171     private JComponent createSplitPane(JComponent left, JComponent right){\r
172         JSplitPane split = new JSplitPane();\r
173         split.setLeftComponent(left);\r
174         split.setRightComponent(right);\r
175         split.setOrientation(JSplitPane.HORIZONTAL_SPLIT);\r
176         split.setContinuousLayout(false);\r
177         split.setOneTouchExpandable(true);\r
178         split.setDividerLocation(200);\r
179 \r
180         return split;\r
181     }\r
182 \r
183     /**\r
184      * ステータスバーを生成する。\r
185      * @return ステータスバー\r
186      */\r
187     private JComponent createStatusBar(){\r
188         this.sysMessage.setText(\r
189                   Jindolf.TITLE + " " + Jindolf.VERSION\r
190                 + " を使ってくれてありがとう!" );\r
191         this.sysMessage.setEditable(false);\r
192         Border inside  = BorderFactory.createBevelBorder(BevelBorder.LOWERED);\r
193         Border outside = BorderFactory.createEmptyBorder(2, 5, 2, 2);\r
194         Border border = new CompoundBorder(inside, outside);\r
195         this.sysMessage.setBorder(border);\r
196 \r
197         this.progressBar.setIndeterminate(false);\r
198         this.progressBar.setOrientation(SwingConstants.HORIZONTAL);\r
199         this.progressBar.setMinimum(0);\r
200         this.progressBar.setMaximum(99);\r
201         this.progressBar.setValue(0);\r
202 \r
203         JPanel statusBar = new JPanel();\r
204         GridBagLayout layout = new GridBagLayout();\r
205         GridBagConstraints constraints = new GridBagConstraints();\r
206         statusBar.setLayout(layout);\r
207 \r
208         constraints.weightx = 1.0;\r
209         constraints.fill = GridBagConstraints.HORIZONTAL;\r
210         statusBar.add(this.sysMessage, constraints);\r
211 \r
212         constraints.weightx = 0.0;\r
213         constraints.fill = GridBagConstraints.NONE;\r
214         constraints.insets = new Insets(2, 2, 2, 2);\r
215         statusBar.add(this.progressBar, constraints);\r
216 \r
217         return statusBar;\r
218     }\r
219 \r
220     /**\r
221      * 国村選択ツリービューを返す。\r
222      * @return 国村選択ツリービュー\r
223      */\r
224     public JTree getTreeView(){\r
225         return this.landsTreeView.getTreeView();\r
226     }\r
227 \r
228     /**\r
229      * タブビューを返す。\r
230      * @return タブビュー\r
231      */\r
232     public TabBrowser getTabBrowser(){\r
233         return this.tabBrowser;\r
234     }\r
235 \r
236     /**\r
237      * 村一覧ビューを返す。\r
238      * @return 村一番ビュー\r
239      */\r
240     public LandsTree getLandsTree(){\r
241         return this.landsTreeView;\r
242     }\r
243 \r
244     /**\r
245      * プログレスバーとカーソルの設定を行う。\r
246      * @param busy trueならプログレスバーのアニメ開始&WAITカーソル。\r
247      *              falseなら停止&通常カーソル。\r
248      */\r
249     public void setBusy(boolean busy){\r
250         this.progressBar.setIndeterminate(busy);\r
251         return;\r
252     }\r
253 \r
254     /**\r
255      * ステータスバーの更新。\r
256      * @param message 更新文字列\r
257      */\r
258     public void updateSysMessage(String message){\r
259         if(message == null) return;\r
260         String text;\r
261         if(message.length() <= 0) text = " ";\r
262         else                      text = message;\r
263         this.sysMessage.setText(text);   // Thread safe\r
264         GUIUtils.dispatchEmptyAWTEvent();\r
265         return;\r
266     }\r
267 \r
268     /**\r
269      * 初期パネルを表示する。\r
270      */\r
271     public void showInitPanel(){\r
272         this.cardLayout.show(this.cards, INITCARD);\r
273         return;\r
274     }\r
275 \r
276     /**\r
277      * 村情報を表示する。\r
278      * @param village 村\r
279      */\r
280     public void showVillageInfo(Village village){\r
281         this.tabBrowser.setVillage(village);\r
282         this.cardLayout.show(this.cards, BROWSECARD);\r
283         this.tabBrowser.repaint();\r
284         this.tabBrowser.revalidate();\r
285 \r
286         return;\r
287     }\r
288 \r
289     /**\r
290      * 国情報を表示する。\r
291      * @param land 国\r
292      */\r
293     public void showLandInfo(Land land){\r
294         this.landInfo.update(land);\r
295         this.cardLayout.show(this.cards, LANDCARD);\r
296         return;\r
297     }\r
298 \r
299     // TODO setEnabled()を全子フレームにも波及させるべきか\r
300 }\r