4 * License : The MIT License
5 * Copyright(c) 2008 olyutorskii
8 package jp.sourceforge.jindolf;
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;
32 * メインアプリウィンドウのコンポーネントの親コンテナ。
34 @SuppressWarnings("serial")
35 public class TopView extends JPanel{
37 private static final String INITCARD = "INITCARD";
38 private static final String LANDCARD = "LANDINFO";
39 private static final String BROWSECARD = "BROWSER";
41 private final JComponent cards;
42 private final CardLayout cardLayout = new CardLayout();
44 private final LandsTree landsTreeView = new LandsTree();
46 private final LandInfoPanel landInfo = new LandInfoPanel();
48 private final JTextField sysMessage = new JTextField();
49 private final JProgressBar progressBar = new JProgressBar();
51 private final TabBrowser tabBrowser = new TabBrowser();
53 private JComponent browsePanel;
61 this.cards = createCards();
62 JComponent split = createSplitPane(this.landsTreeView, this.cards);
63 JComponent statusBar = createStatusBar();
65 BorderLayout layout = new BorderLayout();
67 add(split, BorderLayout.CENTER);
68 add(statusBar, BorderLayout.SOUTH);
77 private JComponent createCards(){
78 this.browsePanel = createBrowsePanel();
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);
93 private JComponent createInitCard(){
94 JLabel initMessage = new JLabel("← 村を選択してください");
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());
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());
114 JPanel panel = new JPanel();
115 GridBagLayout layout = new GridBagLayout();
116 GridBagConstraints constraints = new GridBagConstraints();
117 panel.setLayout(layout);
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);
127 JScrollPane scrollPane = new JScrollPane(panel);
136 private JComponent createLandInfoCard(){
137 this.landInfo.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
138 JScrollPane scrollPane = new JScrollPane(this.landInfo);
146 private JComponent createBrowsePanel(){
147 JPanel panel = new JPanel();
148 BorderLayout layout = new BorderLayout();
149 panel.setLayout(layout);
151 panel.add(this.tabBrowser, BorderLayout.CENTER);
158 * @param toolbar ツールバー
160 public void setBrowseToolBar(JToolBar toolbar){
161 this.browsePanel.add(toolbar, BorderLayout.NORTH);
167 * @param left 左コンポーネント
168 * @param right 右コンポーネント
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);
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);
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);
203 JPanel statusBar = new JPanel();
204 GridBagLayout layout = new GridBagLayout();
205 GridBagConstraints constraints = new GridBagConstraints();
206 statusBar.setLayout(layout);
208 constraints.weightx = 1.0;
209 constraints.fill = GridBagConstraints.HORIZONTAL;
210 statusBar.add(this.sysMessage, constraints);
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);
224 public JTree getTreeView(){
225 return this.landsTreeView.getTreeView();
232 public TabBrowser getTabBrowser(){
233 return this.tabBrowser;
240 public LandsTree getLandsTree(){
241 return this.landsTreeView;
245 * プログレスバーとカーソルの設定を行う。
246 * @param busy trueならプログレスバーのアニメ開始&WAITカーソル。
249 public void setBusy(boolean busy){
250 this.progressBar.setIndeterminate(busy);
256 * @param message 更新文字列
258 public void updateSysMessage(String message){
259 if(message == null) return;
261 if(message.length() <= 0) text = " ";
263 this.sysMessage.setText(text); // Thread safe
264 GUIUtils.dispatchEmptyAWTEvent();
271 public void showInitPanel(){
272 this.cardLayout.show(this.cards, INITCARD);
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();
293 public void showLandInfo(Land land){
294 this.landInfo.update(land);
295 this.cardLayout.show(this.cards, LANDCARD);
299 // TODO setEnabled()を全子フレームにも波及させるべきか