OSDN Git Service

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