1 package es.inteco.eni.swing;
2
3 import java.awt.BorderLayout;
4 import java.awt.Color;
5 import java.awt.Component;
6 import java.util.Iterator;
7 import java.util.Map;
8 import java.util.Map.Entry;
9
10 import javax.swing.BorderFactory;
11 import javax.swing.JPanel;
12 import javax.swing.JTree;
13 import javax.swing.LookAndFeel;
14 import javax.swing.UIManager;
15 import javax.swing.event.TreeSelectionEvent;
16 import javax.swing.event.TreeSelectionListener;
17 import javax.swing.tree.DefaultMutableTreeNode;
18 import javax.swing.tree.DefaultTreeCellRenderer;
19 import javax.swing.tree.TreeSelectionModel;
20
21 import es.inteco.eni.commons.EniConstants;
22 import es.inteco.eni.xml.XmlNode;
23 import es.inteco.eni.xml.XmlTree;
24
25
26
27
28
29
30
31 public class TreeViewPane extends JPanel implements TreeSelectionListener {
32
33
34
35
36 private static final long serialVersionUID = 1L;
37
38
39
40 private JTree tree;
41
42
43
44 private ENIValidator eniValidator;
45
46
47
48 private XmlTree xmlTree;
49
50
51
52
53
54
55 public TreeViewPane(ENIValidator eniValidator){
56 this.eniValidator = eniValidator;
57 this.xmlTree = null;
58 this.tree = null;
59 }
60
61
62
63
64
65 public JTree getTree() {
66 return tree;
67 }
68
69
70
71
72 public void setTree(JTree tree) {
73 this.tree = tree;
74 }
75
76
77
78
79 public ENIValidator getEniValidator() {
80 return eniValidator;
81 }
82
83
84
85
86 public void setEniValidator(ENIValidator eniValidator) {
87 this.eniValidator = eniValidator;
88 }
89
90
91
92
93 public XmlTree getXmlTree() {
94 return xmlTree;
95 }
96
97
98
99
100 public void setXmlTree(XmlTree xmlTree) {
101 this.xmlTree = xmlTree;
102
103 removeAll();
104
105 if(xmlTree!=null && xmlTree.getXmlNodes().size()>0){
106 XmlNode rootXmlNode = xmlTree.getXmlNodes().entrySet().iterator().next().getValue();
107
108
109 DefaultMutableTreeNode top = new DefaultMutableTreeNode(new TreeViewNode(rootXmlNode));
110
111 createNodes(top, rootXmlNode.getChilds());
112
113
114 LookAndFeel laf = new javax.swing.plaf.metal.MetalLookAndFeel();
115 Iterator<Entry<Object, Object>> it = laf.getDefaults().entrySet().iterator();
116 while(it.hasNext()){
117 Entry<Object, Object> entry = it.next();
118 if(entry.getKey() instanceof String && ((String) entry.getKey()).startsWith("Tree")){
119 UIManager.put(entry.getKey(), entry.getValue());
120 }
121 }
122
123
124 tree = new JTree(top);
125 tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
126 tree.addTreeSelectionListener(this);
127 tree.addMouseListener(new TreeViewMouseListener(eniValidator, this));
128 tree.setToggleClickCount(0);
129
130
131 tree.setCellRenderer(new EniCellRenderer());
132
133
134 expandAll();
135
136 setLayout(new BorderLayout());
137 setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
138 removeAll();
139
140 add(tree, BorderLayout.LINE_START);
141 }
142 }
143
144 private void createNodes(DefaultMutableTreeNode parentNode, Map<String, XmlNode> childs) {
145 Iterator<Entry<String, XmlNode>> it = childs.entrySet().iterator();
146 while(it.hasNext()){
147 Entry<String, XmlNode> entry = it.next();
148 XmlNode xmlNode = entry.getValue();
149 DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(new TreeViewNode(xmlNode));
150 parentNode.add(treeNode);
151 createNodes(treeNode, xmlNode.getChilds());
152 }
153 }
154
155
156
157
158
159 @Override
160 public void valueChanged(TreeSelectionEvent e) {
161 DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
162 if (node == null){
163 return;
164 }
165 Object nodeInfo = node.getUserObject();
166 TreeViewNode treeViewNode = (TreeViewNode)nodeInfo;
167
168 TransformedViewMouseListener.showXmlInfo(treeViewNode.getXmlNode(), eniValidator.getConsoleTextarea());
169 }
170
171
172
173
174
175 private void expandAll(){
176 for (int i = 0; i < tree.getRowCount(); i++) {
177 tree.expandRow(i);
178 }
179 }
180
181
182
183
184
185
186
187 public static final class TreeViewNode {
188 private static final int MAX_VALUE_LENGTH = 100;
189 private XmlNode xmlNode;
190
191 private TreeViewNode(XmlNode xmlNode) {
192 this.xmlNode = xmlNode;
193 }
194
195
196
197
198 public String toString() {
199 String result = "";
200 result = xmlNode.getlName();
201
202 if(xmlNode.getChilds().size()==0){
203 String value = xmlNode.getValue()!=null ? xmlNode.getValue() : "";
204 if(value.length()>0){
205 value = value.length()>MAX_VALUE_LENGTH ? value.substring(0, MAX_VALUE_LENGTH) + "...": value;
206 result+= " [" + value + "]";
207 }
208 }
209 return result;
210 }
211
212
213
214
215 public XmlNode getXmlNode() {
216 return xmlNode;
217 }
218 }
219
220 private static class EniCellRenderer extends DefaultTreeCellRenderer{
221 private static final long serialVersionUID = 1L;
222
223
224
225
226 public Component getTreeCellRendererComponent(JTree pTree,
227 Object pValue, boolean pIsSelected, boolean pIsExpanded,
228 boolean pIsLeaf, int pRow, boolean pHasFocus){
229 DefaultMutableTreeNode node = (DefaultMutableTreeNode)pValue;
230
231 Object nodeInfo = node.getUserObject();
232 TreeViewNode treeViewNode = (TreeViewNode)nodeInfo;
233
234 if (FileOpener.isFile(treeViewNode.getXmlNode())){
235 setTextNonSelectionColor(Color.BLUE);
236 setTextSelectionColor(Color.RED);
237 }else{
238 setTextNonSelectionColor(Color.BLACK);
239 setTextSelectionColor(Color.BLACK);
240 }
241 super.getTreeCellRendererComponent(pTree, pValue, pIsSelected,
242 pIsExpanded, pIsLeaf, pRow, pHasFocus);
243 return (this);
244 }
245 }
246 }