OSDN Git Service

L&Fを「MacOSX」から変更する際の例外に対処。(バグ報告#26564)
[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.append("<br></br>");
110         warn.append("広告収入にも貢献しよう!");
111         warn.insert(0, "<center>").append("</center>");
112         warn.insert(0, "<body>")  .append("</body>");
113         warn.insert(0, "<html>")  .append("</html>");
114         JLabel warnMessage = new JLabel(warn.toString());
115
116         JPanel panel = new JPanel();
117         GridBagLayout layout = new GridBagLayout();
118         GridBagConstraints constraints = new GridBagConstraints();
119         panel.setLayout(layout);
120
121         constraints.weightx = 1.0;
122         constraints.weighty = 1.0;
123         constraints.anchor = GridBagConstraints.CENTER;
124         constraints.gridx = GridBagConstraints.REMAINDER;
125         panel.add(initMessage, constraints);
126         panel.add(acctMessage, constraints);
127         panel.add(warnMessage, constraints);
128
129         JScrollPane scrollPane = new JScrollPane(panel);
130
131         return scrollPane;
132     }
133
134     /**
135      * 国別情報を生成。
136      * @return 国別情報
137      */
138     private JComponent createLandInfoCard(){
139         this.landInfo.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
140         JScrollPane scrollPane = new JScrollPane(this.landInfo);
141         return scrollPane;
142     }
143
144     /**
145      * 内部ブラウザを生成。
146      * @return 内部ブラウザ
147      */
148     private JComponent createBrowsePanel(){
149         JPanel panel = new JPanel();
150         BorderLayout layout = new BorderLayout();
151         panel.setLayout(layout);
152
153         panel.add(this.tabBrowser, BorderLayout.CENTER);
154
155         return panel;
156     }
157
158     /**
159      * ブラウザ用ツールバーをセットする。
160      * @param toolbar ツールバー
161      */
162     public void setBrowseToolBar(JToolBar toolbar){
163         this.browsePanel.add(toolbar, BorderLayout.NORTH);
164         return;
165     }
166
167     /**
168      * SplitPaneを生成。
169      * @param left 左コンポーネント
170      * @param right 右コンポーネント
171      * @return SplitPane
172      */
173     private JComponent createSplitPane(JComponent left, JComponent right){
174         JSplitPane split = new JSplitPane();
175         split.setLeftComponent(left);
176         split.setRightComponent(right);
177         split.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
178         split.setContinuousLayout(false);
179         split.setOneTouchExpandable(true);
180         split.setDividerLocation(200);
181
182         return split;
183     }
184
185     /**
186      * ステータスバーを生成する。
187      * @return ステータスバー
188      */
189     private JComponent createStatusBar(){
190         this.sysMessage.setText(
191                   Jindolf.TITLE + " " + Jindolf.VERSION
192                 + " を使ってくれてありがとう!" );
193         this.sysMessage.setEditable(false);
194         Border inside  = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
195         Border outside = BorderFactory.createEmptyBorder(2, 5, 2, 2);
196         Border border = new CompoundBorder(inside, outside);
197         this.sysMessage.setBorder(border);
198
199         this.progressBar.setIndeterminate(false);
200         this.progressBar.setOrientation(SwingConstants.HORIZONTAL);
201         this.progressBar.setMinimum(0);
202         this.progressBar.setMaximum(99);
203         this.progressBar.setValue(0);
204
205         JPanel statusBar = new JPanel();
206         GridBagLayout layout = new GridBagLayout();
207         GridBagConstraints constraints = new GridBagConstraints();
208         statusBar.setLayout(layout);
209
210         constraints.weightx = 1.0;
211         constraints.fill = GridBagConstraints.HORIZONTAL;
212         statusBar.add(this.sysMessage, constraints);
213
214         constraints.weightx = 0.0;
215         constraints.fill = GridBagConstraints.NONE;
216         constraints.insets = new Insets(2, 2, 2, 2);
217         statusBar.add(this.progressBar, constraints);
218
219         return statusBar;
220     }
221
222     /**
223      * 国村選択ツリービューを返す。
224      * @return 国村選択ツリービュー
225      */
226     public JTree getTreeView(){
227         return this.landsTreeView.getTreeView();
228     }
229
230     /**
231      * タブビューを返す。
232      * @return タブビュー
233      */
234     public TabBrowser getTabBrowser(){
235         return this.tabBrowser;
236     }
237
238     /**
239      * 村一覧ビューを返す。
240      * @return 村一番ビュー
241      */
242     public LandsTree getLandsTree(){
243         return this.landsTreeView;
244     }
245
246     /**
247      * プログレスバーとカーソルの設定を行う。
248      * @param busy trueならプログレスバーのアニメ開始&WAITカーソル。
249      *              falseなら停止&通常カーソル。
250      */
251     public void setBusy(boolean busy){
252         this.progressBar.setIndeterminate(busy);
253         return;
254     }
255
256     /**
257      * ステータスバーの更新。
258      * @param message 更新文字列
259      */
260     public void updateSysMessage(String message){
261         if(message == null) return;
262         String text;
263         if(message.length() <= 0) text = " ";
264         else                      text = message;
265         this.sysMessage.setText(text);   // Thread safe
266         GUIUtils.dispatchEmptyAWTEvent();
267         return;
268     }
269
270     /**
271      * 初期パネルを表示する。
272      */
273     public void showInitPanel(){
274         this.cardLayout.show(this.cards, INITCARD);
275         return;
276     }
277
278     /**
279      * 村情報を表示する。
280      * @param village 村
281      */
282     public void showVillageInfo(Village village){
283         this.tabBrowser.setVillage(village);
284         this.cardLayout.show(this.cards, BROWSECARD);
285         this.tabBrowser.repaint();
286         this.tabBrowser.revalidate();
287
288         return;
289     }
290
291     /**
292      * 国情報を表示する。
293      * @param land 国
294      */
295     public void showLandInfo(Land land){
296         this.landInfo.update(land);
297         this.cardLayout.show(this.cards, LANDCARD);
298         return;
299     }
300
301     // TODO setEnabled()を全子フレームにも波及させるべきか
302 }