OSDN Git Service

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