View Javadoc

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   * Clase que representa el panel para el arbol
27   * 
28   * 
29   *
30   */
31  public class TreeViewPane extends JPanel implements TreeSelectionListener {
32  
33  	/**
34  	 * Version
35  	 */
36  	private static final long serialVersionUID = 1L;
37  	/**
38  	 * Arbol
39  	 */
40  	private JTree tree;
41  	/**
42  	 * Ventana del validador
43  	 */
44  	private ENIValidator eniValidator;
45  	/**
46  	 * Representacion XML del árbol
47  	 */
48  	private XmlTree xmlTree;
49  
50  
51  	/**
52  	 * Constructor
53  	 * @param eniValidator Ventana del validador
54  	 */
55  	public TreeViewPane(ENIValidator eniValidator){
56  		this.eniValidator = eniValidator;
57  		this.xmlTree = null;
58  		this.tree = null;
59  	}
60  
61  
62  	/**
63  	 * @return Devuelve el valor del campo tree
64  	 */
65  	public JTree getTree() {
66  		return tree;
67  	}
68  
69  	/**
70  	 * @param Asigna al campo tree el valor del parámetro tree
71  	 */
72  	public void setTree(JTree tree) {
73  		this.tree = tree;
74  	}
75  
76  	/**
77  	 * @return Devuelve el valor del campo eniValidator
78  	 */
79  	public ENIValidator getEniValidator() {
80  		return eniValidator;
81  	}
82  
83  	/**
84  	 * @param Asigna al campo eniValidator el valor del parámetro eniValidator
85  	 */
86  	public void setEniValidator(ENIValidator eniValidator) {
87  		this.eniValidator = eniValidator;
88  	}
89  
90  	/**
91  	 * @return Devuelve el valor del campo xmlTree
92  	 */
93  	public XmlTree getXmlTree() {
94  		return xmlTree;
95  	}
96  
97  	/**
98  	 * @param Asigna al campo xmlTree el valor del parámetro xmlTree
99  	 */
100 	public void setXmlTree(XmlTree xmlTree) {
101 		this.xmlTree = xmlTree;
102 		//Limpia el panel
103 		removeAll();
104 
105 		if(xmlTree!=null && xmlTree.getXmlNodes().size()>0){
106 			XmlNode rootXmlNode = xmlTree.getXmlNodes().entrySet().iterator().next().getValue();
107 
108 			//Raiz del arbol
109 			DefaultMutableTreeNode top = new DefaultMutableTreeNode(new TreeViewNode(rootXmlNode));
110 			//Crea los nodos del arbol
111 			createNodes(top, rootXmlNode.getChilds());
112 
113 			//Aspecto de los nodos del LookAndFeel javax.swing.plaf.metal.MetalLookAndFeel
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 			//Arbol
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 			//Color
131 			tree.setCellRenderer(new EniCellRenderer());
132 
133 			//Expande todos los nodos
134 			expandAll();
135 			//Layout
136 			setLayout(new BorderLayout());
137 			setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
138 			removeAll();
139 			//Añade el arbol
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 	 * @see javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event.TreeSelectionEvent)
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 		//Muestra la informacion del nodo XML
168 		TransformedViewMouseListener.showXmlInfo(treeViewNode.getXmlNode(), eniValidator.getConsoleTextarea());
169 	}
170 
171 	/**
172 	 * Expande el árbol
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 	 * Nodo del árbol
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 		 * Etiqueta mostrada en el árbol para el nodo
197 		 */
198 		public String toString() {
199 			String result = "";
200 			result = xmlNode.getlName();
201 			//Si es una hoja mostramos los primeros caracteres del valor
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 		 * @return Devuelve el valor del campo xmlNode
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 		 * @see javax.swing.tree.DefaultTreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean)
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 			//Resaltamos los elementos de tipo fichero
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 }