4 * License : The MIT License
5 * Copyright(c) 2008 olyutorskii
8 package jp.sfjp.jindolf.view;
10 import java.awt.BorderLayout;
11 import java.awt.CardLayout;
12 import java.awt.GridBagConstraints;
13 import java.awt.GridBagLayout;
14 import java.awt.Insets;
15 import javax.swing.BorderFactory;
16 import javax.swing.JComponent;
17 import javax.swing.JLabel;
18 import javax.swing.JPanel;
19 import javax.swing.JProgressBar;
20 import javax.swing.JScrollPane;
21 import javax.swing.JSplitPane;
22 import javax.swing.JTextField;
23 import javax.swing.JToolBar;
24 import javax.swing.JTree;
25 import javax.swing.SwingConstants;
26 import javax.swing.border.BevelBorder;
27 import javax.swing.border.Border;
28 import javax.swing.border.CompoundBorder;
29 import jp.sfjp.jindolf.VerInfo;
30 import jp.sfjp.jindolf.data.Land;
31 import jp.sfjp.jindolf.data.Village;
32 import jp.sfjp.jindolf.util.GUIUtils;
36 * メインアプリウィンドウのコンポーネントの親コンテナ。
38 @SuppressWarnings("serial")
39 public class TopView extends JPanel{
41 private static final String INITCARD = "INITCARD";
42 private static final String LANDCARD = "LANDINFO";
43 private static final String BROWSECARD = "BROWSER";
45 private static final String MSG_THANKS =
46 VerInfo.TITLE + "\u0020" + VerInfo.VERSION
47 + "\u0020を使ってくれてありがとう!";
50 private final JComponent cards;
51 private final CardLayout cardLayout = new CardLayout();
53 private final LandsTree landsTreeView = new LandsTree();
55 private final LandInfoPanel landInfo = new LandInfoPanel();
57 private final JTextField sysMessage = new JTextField("");
58 private final JProgressBar progressBar = new JProgressBar();
60 private final TabBrowser tabBrowser = new TabBrowser();
62 private JComponent browsePanel;
70 this.cards = createCards();
71 JComponent split = createSplitPane(this.landsTreeView, this.cards);
72 JComponent statusBar = createStatusBar();
74 BorderLayout layout = new BorderLayout();
76 add(split, BorderLayout.CENTER);
77 add(statusBar, BorderLayout.SOUTH);
86 private JComponent createCards(){
87 this.browsePanel = createBrowsePanel();
89 JPanel panel = new JPanel();
90 panel.setLayout(this.cardLayout);
91 panel.add(INITCARD, createInitCard());
92 panel.add(LANDCARD, createLandInfoCard());
93 panel.add(BROWSECARD, this.browsePanel);
102 private JComponent createInitCard(){
103 JLabel initMessage = new JLabel("← 村を選択してください");
105 StringBuilder acct = new StringBuilder();
106 acct.append("※ 参加中の村がある人は<br></br>");
107 acct.append("メニューの「アカウント管理」から<br></br>");
108 acct.append("ログインしてください");
109 acct.insert(0, "<center>").append("</center>");
110 acct.insert(0, "<body>") .append("</body>");
111 acct.insert(0, "<html>") .append("</html>");
112 JLabel acctMessage = new JLabel(acct.toString());
114 StringBuilder warn = new StringBuilder();
115 warn.append("※ たまにはWebブラウザでアクセスして、");
116 warn.append("<br></br>");
117 warn.append("運営の動向を確かめようね!");
118 warn.insert(0, "<center>").append("</center>");
119 warn.insert(0, "<body>") .append("</body>");
120 warn.insert(0, "<html>") .append("</html>");
121 JLabel warnMessage = new JLabel(warn.toString());
123 JPanel panel = new JPanel();
124 GridBagLayout layout = new GridBagLayout();
125 GridBagConstraints constraints = new GridBagConstraints();
126 panel.setLayout(layout);
128 constraints.weightx = 1.0;
129 constraints.weighty = 1.0;
130 constraints.anchor = GridBagConstraints.CENTER;
131 constraints.gridx = GridBagConstraints.REMAINDER;
132 panel.add(initMessage, constraints);
133 panel.add(acctMessage, constraints);
134 panel.add(warnMessage, constraints);
136 JScrollPane scrollPane = new JScrollPane(panel);
145 private JComponent createLandInfoCard(){
146 this.landInfo.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
147 JScrollPane scrollPane = new JScrollPane(this.landInfo);
155 private JComponent createBrowsePanel(){
156 JPanel panel = new JPanel();
157 BorderLayout layout = new BorderLayout();
158 panel.setLayout(layout);
160 panel.add(this.tabBrowser, BorderLayout.CENTER);
167 * @param toolbar ツールバー
169 public void setBrowseToolBar(JToolBar toolbar){
170 this.browsePanel.add(toolbar, BorderLayout.NORTH);
176 * @param left 左コンポーネント
177 * @param right 右コンポーネント
180 private JComponent createSplitPane(JComponent left, JComponent right){
181 JSplitPane split = new JSplitPane();
182 split.setLeftComponent(left);
183 split.setRightComponent(right);
184 split.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
185 split.setContinuousLayout(false);
186 split.setOneTouchExpandable(true);
187 split.setDividerLocation(200);
196 private JComponent createStatusBar(){
197 this.sysMessage.setText(MSG_THANKS);
198 this.sysMessage.setEditable(false);
199 Border inside = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
200 Border outside = BorderFactory.createEmptyBorder(2, 5, 2, 2);
201 Border border = new CompoundBorder(inside, outside);
202 this.sysMessage.setBorder(border);
204 this.progressBar.setIndeterminate(false);
205 this.progressBar.setOrientation(SwingConstants.HORIZONTAL);
206 this.progressBar.setMinimum(0);
207 this.progressBar.setMaximum(99);
208 this.progressBar.setValue(0);
210 JPanel statusBar = new JPanel();
211 GridBagLayout layout = new GridBagLayout();
212 GridBagConstraints constraints = new GridBagConstraints();
213 statusBar.setLayout(layout);
215 constraints.weightx = 1.0;
216 constraints.fill = GridBagConstraints.HORIZONTAL;
217 statusBar.add(this.sysMessage, constraints);
219 constraints.weightx = 0.0;
220 constraints.fill = GridBagConstraints.NONE;
221 constraints.insets = new Insets(2, 2, 2, 2);
222 statusBar.add(this.progressBar, constraints);
231 public JTree getTreeView(){
232 return this.landsTreeView.getTreeView();
239 public TabBrowser getTabBrowser(){
240 return this.tabBrowser;
247 public LandsTree getLandsTree(){
248 return this.landsTreeView;
252 * プログレスバーとカーソルの設定を行う。
253 * @param busy trueならプログレスバーのアニメ開始&WAITカーソル。
254 * falseなら停止&通常カーソル。
256 public void setBusy(boolean busy){
257 this.progressBar.setIndeterminate(busy);
263 * @param message 更新文字列
265 public void updateSysMessage(String message){
266 String text = message;
267 if(message == null) text = "";
268 this.sysMessage.setText(text); // Thread safe
269 GUIUtils.dispatchEmptyAWTEvent();
277 public String getSysMessage(){
278 String result = this.sysMessage.getText();
279 if(result == null) result = "";
286 public void showInitPanel(){
287 this.cardLayout.show(this.cards, INITCARD);
295 public void showVillageInfo(Village village){
296 this.tabBrowser.setVillage(village);
297 this.cardLayout.show(this.cards, BROWSECARD);
298 this.tabBrowser.repaint();
299 this.tabBrowser.revalidate();
308 public void showLandInfo(Land land){
309 this.landInfo.update(land);
310 this.cardLayout.show(this.cards, LANDCARD);
314 // TODO setEnabled()を全子フレームにも波及させるべきか