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.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());
116 JPanel panel = new JPanel();
117 GridBagLayout layout = new GridBagLayout();
118 GridBagConstraints constraints = new GridBagConstraints();
119 panel.setLayout(layout);
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);
129 JScrollPane scrollPane = new JScrollPane(panel);
138 private JComponent createLandInfoCard(){
139 this.landInfo.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
140 JScrollPane scrollPane = new JScrollPane(this.landInfo);
148 private JComponent createBrowsePanel(){
149 JPanel panel = new JPanel();
150 BorderLayout layout = new BorderLayout();
151 panel.setLayout(layout);
153 panel.add(this.tabBrowser, BorderLayout.CENTER);
160 * @param toolbar ツールバー
162 public void setBrowseToolBar(JToolBar toolbar){
163 this.browsePanel.add(toolbar, BorderLayout.NORTH);
169 * @param left 左コンポーネント
170 * @param right 右コンポーネント
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);
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);
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);
205 JPanel statusBar = new JPanel();
206 GridBagLayout layout = new GridBagLayout();
207 GridBagConstraints constraints = new GridBagConstraints();
208 statusBar.setLayout(layout);
210 constraints.weightx = 1.0;
211 constraints.fill = GridBagConstraints.HORIZONTAL;
212 statusBar.add(this.sysMessage, constraints);
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);
226 public JTree getTreeView(){
227 return this.landsTreeView.getTreeView();
234 public TabBrowser getTabBrowser(){
235 return this.tabBrowser;
242 public LandsTree getLandsTree(){
243 return this.landsTreeView;
247 * プログレスバーとカーソルの設定を行う。
248 * @param busy trueならプログレスバーのアニメ開始&WAITカーソル。
251 public void setBusy(boolean busy){
252 this.progressBar.setIndeterminate(busy);
258 * @param message 更新文字列
260 public void updateSysMessage(String message){
261 if(message == null) return;
263 if(message.length() <= 0) text = " ";
265 this.sysMessage.setText(text); // Thread safe
266 GUIUtils.dispatchEmptyAWTEvent();
273 public void showInitPanel(){
274 this.cardLayout.show(this.cards, INITCARD);
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();
295 public void showLandInfo(Land land){
296 this.landInfo.update(land);
297 this.cardLayout.show(this.cards, LANDCARD);
301 // TODO setEnabled()を全子フレームにも波及させるべきか