2 * Lands tree container
\r
4 * License : The MIT License
\r
5 * Copyright(c) 2008 olyutorskii
\r
8 package jp.sourceforge.jindolf;
\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
32 * 国一覧Tree周辺コンポーネント群。
\r
34 @SuppressWarnings("serial")
\r
35 public class LandsTree
\r
37 implements ActionListener, TreeSelectionListener{
\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
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
53 private final JButton orderButton = new JButton();
\r
54 private final JButton reloadButton = new JButton();
\r
55 private final JTree treeView = new JTree();
\r
57 private boolean ascending = false;
\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
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
80 TreeSelectionModel selModel = this.treeView.getSelectionModel();
\r
81 selModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
\r
82 this.treeView.addTreeSelectionListener(this);
\r
90 private void design(){
\r
91 BorderLayout layout = new BorderLayout();
\r
94 JToolBar toolBar = new JToolBar();
\r
95 toolBar.add(this.orderButton);
\r
96 toolBar.add(this.reloadButton);
\r
98 JComponent landSelector = createLandSelector();
\r
100 add(toolBar, BorderLayout.NORTH);
\r
101 add(landSelector, BorderLayout.CENTER);
\r
107 * 国村選択ツリーコンポーネントを生成する。
\r
108 * @return 国村選択ツリーコンポーネント
\r
110 private JComponent createLandSelector(){
\r
111 this.treeView.setRootVisible(false);
\r
112 this.treeView.setCellRenderer(new VillageIconRenderer());
\r
114 Border border = BorderFactory.createEmptyBorder(5, 5, 5, 5);
\r
115 this.treeView.setBorder(border);
\r
117 JScrollPane landSelector = new JScrollPane(this.treeView);
\r
119 return landSelector;
\r
126 public JButton getReloadVillageListButton(){
\r
127 return this.reloadButton;
\r
132 * @return 国村選択ツリービュー
\r
134 public JTree getTreeView(){
\r
135 return this.treeView;
\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
152 * 管理下のLandsModelを返す。
\r
153 * @return LandsModel
\r
155 private LandsModel getLandsModel(){
\r
156 TreeModel model = this.treeView.getModel();
\r
157 if(model instanceof LandsModel){
\r
158 return (LandsModel) model;
\r
165 * @return 反転後が昇順ならtrue
\r
167 private boolean toggleTreeOrder(){
\r
168 this.ascending = ! this.ascending;
\r
170 if(this.ascending){
\r
171 this.orderButton.setToolTipText(TIP_ASCEND);
\r
172 this.orderButton.setIcon(ICON_ASCEND);
\r
174 this.orderButton.setToolTipText(TIP_DESCEND);
\r
175 this.orderButton.setIcon(ICON_DESCEND);
\r
178 final TreePath lastPath = this.treeView.getSelectionPath();
\r
180 LandsModel model = getLandsModel();
\r
182 model.setAscending(this.ascending);
\r
185 EventQueue.invokeLater(new Runnable(){
\r
187 if(lastPath != null){
\r
188 LandsTree.this.treeView.setSelectionPath(lastPath);
\r
189 LandsTree.this.treeView.scrollPathToVisible(lastPath);
\r
195 return this.ascending;
\r
201 * @param event ボタン押下イベント {@inheritDoc}
\r
204 public void actionPerformed(ActionEvent event){
\r
205 String cmd = event.getActionCommand();
\r
206 if(ActionManager.CMD_SWITCHORDER.equals(cmd)){
\r
214 * ツリーリストで何らかの要素(国、村)がクリックされたときの処理。
\r
215 * @param event イベント {@inheritDoc}
\r
218 public void valueChanged(TreeSelectionEvent event){
\r
219 TreePath path = event.getNewLeadSelectionPath();
\r
221 this.reloadButton.setEnabled(false);
\r
225 Object selObj = path.getLastPathComponent();
\r
227 if( selObj instanceof Land ){
\r
228 this.reloadButton.setEnabled(true);
\r
230 this.reloadButton.setEnabled(false);
\r
240 public void updateUI(){
\r
242 if(this.treeView != null){
\r
243 this.treeView.setCellRenderer(new VillageIconRenderer());
\r