OSDN Git Service

@Override追加
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / LandsTree.java
1 /*\r
2  * Lands tree container\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2008 olyutorskii\r
6  */\r
7 \r
8 package jp.sourceforge.jindolf;\r
9 \r
10 import java.awt.BorderLayout;\r
11 import java.awt.EventQueue;\r
12 import java.awt.Insets;\r
13 import java.awt.event.ActionEvent;\r
14 import java.awt.event.ActionListener;\r
15 import java.net.URL;\r
16 import javax.swing.BorderFactory;\r
17 import javax.swing.ImageIcon;\r
18 import javax.swing.JButton;\r
19 import javax.swing.JComponent;\r
20 import javax.swing.JPanel;\r
21 import javax.swing.JScrollPane;\r
22 import javax.swing.JToolBar;\r
23 import javax.swing.JTree;\r
24 import javax.swing.border.Border;\r
25 import javax.swing.event.TreeSelectionEvent;\r
26 import javax.swing.event.TreeSelectionListener;\r
27 import javax.swing.tree.TreeModel;\r
28 import javax.swing.tree.TreePath;\r
29 import javax.swing.tree.TreeSelectionModel;\r
30 \r
31 /**\r
32  * 国一覧Tree周辺コンポーネント群。\r
33  */\r
34 @SuppressWarnings("serial")\r
35 public class LandsTree\r
36         extends JPanel\r
37         implements ActionListener, TreeSelectionListener{\r
38 \r
39     private static final String TIP_ASCEND = "押すと降順に";\r
40     private static final String TIP_DESCEND = "押すと昇順に";\r
41     private static final String TIP_ORDER = "選択中の国の村一覧を読み込み直す";\r
42     private static final ImageIcon ICON_ASCEND;\r
43     private static final ImageIcon ICON_DESCEND;\r
44 \r
45     static{\r
46         URL url;\r
47         url = Jindolf.getResource("resources/image/ascend.png");\r
48         ICON_ASCEND = new ImageIcon(url);\r
49         url = Jindolf.getResource("resources/image/descend.png");\r
50         ICON_DESCEND = new ImageIcon(url);\r
51     }\r
52 \r
53     private final JButton orderButton = new JButton();\r
54     private final JButton reloadButton = new JButton();\r
55     private final JTree treeView = new JTree();\r
56 \r
57     private boolean ascending = false;\r
58 \r
59     /**\r
60      * コンストラクタ。\r
61      */\r
62     public LandsTree(){\r
63         super();\r
64 \r
65         design();\r
66 \r
67         this.orderButton.setIcon(ICON_DESCEND);\r
68         this.orderButton.setToolTipText(TIP_DESCEND);\r
69         this.orderButton.setMargin(new Insets(1, 1, 1, 1));\r
70         this.orderButton.setActionCommand(ActionManager.CMD_SWITCHORDER);\r
71         this.orderButton.addActionListener(this);\r
72 \r
73         URL url;\r
74         url = Jindolf.getResource("resources/image/reload.png");\r
75         this.reloadButton.setIcon(new ImageIcon(url));\r
76         this.reloadButton.setToolTipText(TIP_ORDER);\r
77         this.reloadButton.setMargin(new Insets(1, 1, 1, 1));\r
78         this.reloadButton.setActionCommand(ActionManager.CMD_VILLAGELIST);\r
79 \r
80         TreeSelectionModel selModel = this.treeView.getSelectionModel();\r
81         selModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);\r
82         this.treeView.addTreeSelectionListener(this);\r
83 \r
84         return;\r
85     }\r
86 \r
87     /**\r
88      * GUIパーツのデザインを行う。\r
89      */\r
90     private void design(){\r
91         BorderLayout layout = new BorderLayout();\r
92         setLayout(layout);\r
93 \r
94         JToolBar toolBar = new JToolBar();\r
95         toolBar.add(this.orderButton);\r
96         toolBar.add(this.reloadButton);\r
97 \r
98         JComponent landSelector = createLandSelector();\r
99 \r
100         add(toolBar,      BorderLayout.NORTH);\r
101         add(landSelector, BorderLayout.CENTER);\r
102 \r
103         return;\r
104     }\r
105 \r
106     /**\r
107      * 国村選択ツリーコンポーネントを生成する。\r
108      * @return 国村選択ツリーコンポーネント\r
109      */\r
110     private JComponent createLandSelector(){\r
111         this.treeView.setRootVisible(false);\r
112         this.treeView.setCellRenderer(new VillageIconRenderer());\r
113 \r
114         Border border = BorderFactory.createEmptyBorder(5, 5, 5, 5);\r
115         this.treeView.setBorder(border);\r
116 \r
117         JScrollPane landSelector = new JScrollPane(this.treeView);\r
118 \r
119         return landSelector;\r
120     }\r
121 \r
122     /**\r
123      * リロードボタンを返す。\r
124      * @return リロードボタン\r
125      */\r
126     public JButton getReloadVillageListButton(){\r
127         return this.reloadButton;\r
128     }\r
129 \r
130     /**\r
131      * 国村選択ツリービューを返す。\r
132      * @return 国村選択ツリービュー\r
133      */\r
134     public JTree getTreeView(){\r
135         return this.treeView;\r
136     }\r
137 \r
138     /**\r
139      * 指定した国を展開する。\r
140      * @param land 国\r
141      */\r
142     public void expandLand(Land land){\r
143         TreeModel model = this.treeView.getModel();\r
144         Object root = model.getRoot();\r
145         Object[] path = {root, land};\r
146         TreePath treePath = new TreePath(path);\r
147         this.treeView.expandPath(treePath);\r
148         return;\r
149     }\r
150 \r
151     /**\r
152      * 管理下のLandsModelを返す。\r
153      * @return LandsModel\r
154      */\r
155     private LandsModel getLandsModel(){\r
156         TreeModel model = this.treeView.getModel();\r
157         if(model instanceof LandsModel){\r
158             return (LandsModel) model;\r
159         }\r
160         return null;\r
161     }\r
162 \r
163     /**\r
164      * Tree表示順を反転させる。\r
165      * @return 反転後が昇順ならtrue\r
166      */\r
167     private boolean toggleTreeOrder(){\r
168         this.ascending = ! this.ascending;\r
169 \r
170         if(this.ascending){\r
171             this.orderButton.setToolTipText(TIP_ASCEND);\r
172             this.orderButton.setIcon(ICON_ASCEND);\r
173         }else{\r
174             this.orderButton.setToolTipText(TIP_DESCEND);\r
175             this.orderButton.setIcon(ICON_DESCEND);\r
176         }\r
177 \r
178         final TreePath lastPath = this.treeView.getSelectionPath();\r
179 \r
180         LandsModel model = getLandsModel();\r
181         if(model != null){\r
182             model.setAscending(this.ascending);\r
183         }\r
184 \r
185         EventQueue.invokeLater(new Runnable(){\r
186             public void run(){\r
187                 if(lastPath != null){\r
188                     LandsTree.this.treeView.setSelectionPath(lastPath);\r
189                     LandsTree.this.treeView.scrollPathToVisible(lastPath);\r
190                 }\r
191                 return;\r
192             }\r
193         });\r
194 \r
195         return this.ascending;\r
196     }\r
197 \r
198     /**\r
199      * {@inheritDoc}\r
200      * ボタン押下処理。\r
201      * @param event ボタン押下イベント {@inheritDoc}\r
202      */\r
203     @Override\r
204     public void actionPerformed(ActionEvent event){\r
205         String cmd = event.getActionCommand();\r
206         if(ActionManager.CMD_SWITCHORDER.equals(cmd)){\r
207             toggleTreeOrder();\r
208         }\r
209         return;\r
210     }\r
211 \r
212     /**\r
213      * {@inheritDoc}\r
214      * ツリーリストで何らかの要素(国、村)がクリックされたときの処理。\r
215      * @param event イベント {@inheritDoc}\r
216      */\r
217     @Override\r
218     public void valueChanged(TreeSelectionEvent event){\r
219         TreePath path = event.getNewLeadSelectionPath();\r
220         if(path == null){\r
221             this.reloadButton.setEnabled(false);\r
222             return;\r
223         }\r
224 \r
225         Object selObj = path.getLastPathComponent();\r
226 \r
227         if( selObj instanceof Land ){\r
228             this.reloadButton.setEnabled(true);\r
229         }else{\r
230             this.reloadButton.setEnabled(false);\r
231         }\r
232 \r
233         return;\r
234     }\r
235 \r
236     /**\r
237      * {@inheritDoc}\r
238      */\r
239     @Override\r
240     public void updateUI(){\r
241         super.updateUI();\r
242         if(this.treeView != null){\r
243             this.treeView.setCellRenderer(new VillageIconRenderer());\r
244         }\r
245         return;\r
246     }\r
247 \r
248 }\r