OSDN Git Service

Mavenプラグイン更新
[jindolf/Jindolf.git] / src / main / java / jp / sfjp / jindolf / view / TopView.java
1 /*
2  * Top view
3  *
4  * License : The MIT License
5  * Copyright(c) 2008 olyutorskii
6  */
7
8 package jp.sfjp.jindolf.view;
9
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;
33
34 /**
35  * 最上位ビュー。
36  * メインアプリウィンドウのコンポーネントの親コンテナ。
37  */
38 @SuppressWarnings("serial")
39 public class TopView extends JPanel{
40
41     private static final String INITCARD = "INITCARD";
42     private static final String LANDCARD = "LANDINFO";
43     private static final String BROWSECARD = "BROWSER";
44
45     private static final String MSG_THANKS =
46             VerInfo.TITLE + "\u0020" + VerInfo.VERSION
47             + "\u0020を使ってくれてありがとう!";
48
49
50     private final JComponent cards;
51     private final CardLayout cardLayout = new CardLayout();
52
53     private final LandsTree landsTreeView = new LandsTree();
54
55     private final LandInfoPanel landInfo = new LandInfoPanel();
56
57     private final JTextField sysMessage = new JTextField("");
58     private final JProgressBar progressBar = new JProgressBar();
59
60     private final TabBrowser tabBrowser = new TabBrowser();
61
62     private JComponent browsePanel;
63
64     /**
65      * トップビューを生成する。
66      */
67     public TopView(){
68         super();
69
70         this.cards = createCards();
71         JComponent split = createSplitPane(this.landsTreeView, this.cards);
72         JComponent statusBar = createStatusBar();
73
74         BorderLayout layout = new BorderLayout();
75         setLayout(layout);
76         add(split, BorderLayout.CENTER);
77         add(statusBar, BorderLayout.SOUTH);
78
79         return;
80     }
81
82     /**
83      * カードパネルを生成する。
84      * @return カードパネル
85      */
86     private JComponent createCards(){
87         this.browsePanel = createBrowsePanel();
88
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);
94
95         return panel;
96     }
97
98     /**
99      * 初期パネルを生成。
100      * @return 初期パネル
101      */
102     private JComponent createInitCard(){
103         JLabel initMessage = new JLabel("← 村を選択してください");
104
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());
113
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());
122
123         JPanel panel = new JPanel();
124         GridBagLayout layout = new GridBagLayout();
125         GridBagConstraints constraints = new GridBagConstraints();
126         panel.setLayout(layout);
127
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);
135
136         JScrollPane scrollPane = new JScrollPane(panel);
137
138         return scrollPane;
139     }
140
141     /**
142      * 国別情報を生成。
143      * @return 国別情報
144      */
145     private JComponent createLandInfoCard(){
146         this.landInfo.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
147         JScrollPane scrollPane = new JScrollPane(this.landInfo);
148         return scrollPane;
149     }
150
151     /**
152      * 内部ブラウザを生成。
153      * @return 内部ブラウザ
154      */
155     private JComponent createBrowsePanel(){
156         JPanel panel = new JPanel();
157         BorderLayout layout = new BorderLayout();
158         panel.setLayout(layout);
159
160         panel.add(this.tabBrowser, BorderLayout.CENTER);
161
162         return panel;
163     }
164
165     /**
166      * ブラウザ用ツールバーをセットする。
167      * @param toolbar ツールバー
168      */
169     public void setBrowseToolBar(JToolBar toolbar){
170         this.browsePanel.add(toolbar, BorderLayout.NORTH);
171         return;
172     }
173
174     /**
175      * SplitPaneを生成。
176      * @param left 左コンポーネント
177      * @param right 右コンポーネント
178      * @return SplitPane
179      */
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);
188
189         return split;
190     }
191
192     /**
193      * ステータスバーを生成する。
194      * @return ステータスバー
195      */
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);
203
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);
209
210         JPanel statusBar = new JPanel();
211         GridBagLayout layout = new GridBagLayout();
212         GridBagConstraints constraints = new GridBagConstraints();
213         statusBar.setLayout(layout);
214
215         constraints.weightx = 1.0;
216         constraints.fill = GridBagConstraints.HORIZONTAL;
217         statusBar.add(this.sysMessage, constraints);
218
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);
223
224         return statusBar;
225     }
226
227     /**
228      * 国村選択ツリービューを返す。
229      * @return 国村選択ツリービュー
230      */
231     public JTree getTreeView(){
232         return this.landsTreeView.getTreeView();
233     }
234
235     /**
236      * タブビューを返す。
237      * @return タブビュー
238      */
239     public TabBrowser getTabBrowser(){
240         return this.tabBrowser;
241     }
242
243     /**
244      * 村一覧ビューを返す。
245      * @return 村一番ビュー
246      */
247     public LandsTree getLandsTree(){
248         return this.landsTreeView;
249     }
250
251     /**
252      * プログレスバーとカーソルの設定を行う。
253      * @param busy trueならプログレスバーのアニメ開始&amp;WAITカーソル。
254      *              falseなら停止&amp;通常カーソル。
255      */
256     public void setBusy(boolean busy){
257         this.progressBar.setIndeterminate(busy);
258         return;
259     }
260
261     /**
262      * ステータスバーの更新。
263      * @param message 更新文字列
264      */
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();
270         return;
271     }
272
273     /**
274      * ステータスバー文字列を返す。
275      * @return ステータスバー文字列
276      */
277     public String getSysMessage(){
278         String result = this.sysMessage.getText();
279         if(result == null) result = "";
280         return result;
281     }
282
283     /**
284      * 初期パネルを表示する。
285      */
286     public void showInitPanel(){
287         this.cardLayout.show(this.cards, INITCARD);
288         return;
289     }
290
291     /**
292      * 村情報を表示する。
293      * @param village 村
294      */
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();
300
301         return;
302     }
303
304     /**
305      * 国情報を表示する。
306      * @param land 国
307      */
308     public void showLandInfo(Land land){
309         this.landInfo.update(land);
310         this.cardLayout.show(this.cards, LANDCARD);
311         return;
312     }
313
314     // TODO setEnabled()を全子フレームにも波及させるべきか
315 }