View Javadoc
1   package net.logAnalyzer.gui.reports;
2   
3   import java.awt.BorderLayout;
4   import java.awt.Color;
5   import java.awt.Component;
6   import java.awt.Dimension;
7   import java.awt.Font;
8   import java.awt.event.MouseAdapter;
9   import java.awt.event.MouseEvent;
10  import java.awt.event.MouseListener;
11  import java.util.Hashtable;
12  import java.util.Vector;
13  
14  import javax.swing.Box;
15  import javax.swing.BoxLayout;
16  import javax.swing.Icon;
17  import javax.swing.JComponent;
18  import javax.swing.JPanel;
19  import javax.swing.JScrollPane;
20  import javax.swing.JTree;
21  import javax.swing.tree.DefaultMutableTreeNode;
22  import javax.swing.tree.DefaultTreeCellRenderer;
23  import javax.swing.tree.DefaultTreeModel;
24  import javax.swing.tree.TreePath;
25  import javax.swing.tree.TreeSelectionModel;
26  
27  import net.logAnalyzer.LogAnalyzerGUI;
28  import net.logAnalyzer.reports.LAReport;
29  import net.logAnalyzer.resources.LAResourceBundle;
30  import net.logAnalyzer.utils.gui.GraphicsAttributes;
31  import net.logAnalyzer.utils.gui.IQuickBarComponent;
32  
33  /***
34   * Used to visualize all generated reports in a treview.
35   * @author David Vicente
36   * @version 0.1
37   */
38  public class ReportsTreePanel extends JPanel implements IQuickBarComponent{
39      private static final long serialVersionUID = 1L;
40      
41      /***
42       * The treeview.
43       */
44      private JTree configtree = new JTree();
45  
46      /***
47       * Root node.
48       */
49      private DefaultMutableTreeNode root;
50  
51      /***
52       * default model.
53       */
54      private DefaultTreeModel model;
55  
56      /***
57       * Listeners for ReportsTree events.
58       * @see ReportsTreeListener
59       */
60      private Vector reportsTreeListeners = new Vector();
61  
62      /***
63       * Reports structure.
64       */
65      private Hashtable reportsTable = new Hashtable();
66  
67      /***
68       * Used to construct a new ReportsTreePanel.
69       */
70      public ReportsTreePanel() {
71          super();
72         addComponents();
73      }
74      /***
75       * Used to construct a new ReportsTreePanel with the specified listener.
76       * @param listener The linked listener.
77       */
78      public ReportsTreePanel(ReportsTreeListener listener) {
79          super();
80         addReportsTreeListener(listener);
81         addComponents();
82      }
83     
84  
85      public Icon getIcon() {
86          return LAResourceBundle.getIcon("ReportsView.icon");
87      }
88  
89      public String getTitle() {
90          return LAResourceBundle.getLocalizedString("ReportsView.quickbar.title");
91      }
92  
93      /***
94       * Adds components to main panel.
95       */
96      public void addComponents() {
97          
98          setLayout(new BorderLayout());
99          
100         // add treeView
101         fillTreeModel();
102         configtree = new JTree(model);
103         configtree.setRootVisible(false);
104         configtree.setBackground(GraphicsAttributes.BACKGROUND_COLOR);
105         configtree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
106         // set up node icons
107         configtree.setCellRenderer(new ReportsTreeCellRenderer());
108         
109        // add mouse listener to manage the mouse double-click used to open the report         
110        MouseListener ml = new MouseAdapter() {
111             public void mousePressed(MouseEvent e) {
112                 int selRow = configtree.getRowForLocation(e.getX(), e.getY());
113                 if (selRow != -1) {
114                     if (e.getClickCount() == 2) {
115                         TreePath oSelectedPath = configtree.getPathForLocation(e.getX(), e.getY());
116                         if (oSelectedPath != null) {
117                             // select object
118                             configtree.setSelectionPath(oSelectedPath);
119                             // get last object in path
120                             DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) oSelectedPath
121                                     .getLastPathComponent();
122                             if (selectedNode.isLeaf()) {
123                                 Object item = reportsTable.get(selectedNode);
124                                 if (item != null) {
125                                     LAReport report = (LAReport) item;
126                                     fireDisplayReport(report);
127                                 }
128                             }
129                         }
130                     }
131                 }
132             }
133         };
134         
135         configtree.addMouseListener(ml);
136         
137         JScrollPane scrollpane = new JScrollPane(configtree,
138                 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
139         scrollpane.setBackground(GraphicsAttributes.BACKGROUND_COLOR);
140         add(Box.createRigidArea(new Dimension(0,10)));
141         this.add(scrollpane,BorderLayout.CENTER);
142                
143     }
144     private void fillTreeModel(){
145         
146         //the root of the class tree is Object
147         root = new DefaultMutableTreeNode(LAResourceBundle
148                 .getLocalizedString("ReportsView.tree.rootnode"));
149         LAReport[] reports = LogAnalyzerGUI.getReports();
150 
151         if (reports != null && reports.length > 0) {
152             Hashtable nodes = new Hashtable();
153 
154             for (int i = 0; i < reports.length; i++) {
155                 LAReport report = reports[i];
156                 Class classreport = report.getClass();
157                 String typereport = classreport.getName().substring(
158                         classreport.getName().lastIndexOf(".") + 1, classreport.getName().length());
159                 DefaultMutableTreeNode reporttype = null;
160                 if (!nodes.containsKey(typereport)) {
161                     reporttype = new DefaultMutableTreeNode(typereport);
162                     nodes.put(typereport, reporttype);
163                     root.add(reporttype);
164                 } else {
165                     reporttype = (DefaultMutableTreeNode) nodes.get(typereport);
166                 }
167                 DefaultMutableTreeNode reportnode = new DefaultMutableTreeNode(report.getName());
168                 // reportnode.
169                 reportsTable.put(reportnode, report);
170                 reporttype.add(reportnode);
171             }
172         }
173 
174         model = new DefaultTreeModel(root);
175     }
176     /***
177      * {@link  javax.swing.tree.DefaultTreeCellRenderer}.
178      * @author David Vicente
179      */
180     class ReportsTreeCellRenderer extends DefaultTreeCellRenderer {
181         private static final long serialVersionUID = 1L;
182 
183         public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
184                 boolean expanded, boolean leaf, int row, boolean hasFocus) {
185             Component comp = super.getTreeCellRendererComponent(tree, value, selected, expanded,
186                     leaf, row, hasFocus);
187             // get the user object
188             // comp.setForeground(BACKGROUND_COLOR);
189             DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
190             Object obj = node.getUserObject();
191             if (obj instanceof String) {
192                 String strnode = (String) obj;
193                 if (strnode.equalsIgnoreCase(LAResourceBundle
194                         .getLocalizedString("ReportsView.tree.rootnode"))) {
195                     comp.setFont(getFont().deriveFont(Font.PLAIN));
196                     setIcon(LAResourceBundle.getIcon("ReportsView.icon"));
197                 } else {
198                     Object item = reportsTable.get(node);
199                     if (item != null) {
200                         comp.setFont(getFont().deriveFont(Font.PLAIN));
201                         Class classreport = ((LAReport) item).getClass();
202                         String typereport = classreport.getName().substring(
203                                 classreport.getName().lastIndexOf(".") + 1,
204                                 classreport.getName().length());
205                         setIcon(LAResourceBundle.getIcon("ReportsView.icon." + typereport));
206                     } else {
207                         comp.setFont(getFont().deriveFont(Font.BOLD));
208                         setIcon(LAResourceBundle.getIcon("ReportsView.icon.renderer"));
209                     }
210                 }
211             }
212             if(selected){
213                 comp.setFont(getFont().deriveFont(Font.BOLD));
214             }
215       
216             return comp;
217         }
218 
219         public Color getTextSelectionColor() {
220             return GraphicsAttributes.TEXTSELECTED_COLOR;
221         }
222 
223         public Color getTextNonSelectionColor() {
224             return GraphicsAttributes.TEXTNORMAL_COLOR;
225         }
226 
227         public Color getBackgroundNonSelectionColor() {
228             return GraphicsAttributes.BACKGROUND_COLOR;
229         }
230 
231         public Color getBackgroundSelectionColor() {
232             return GraphicsAttributes.BACKGROUND_COLOR;
233         }
234     }
235     /***
236      * Adds a listener.
237      * @param listener Lister to add.
238      */
239     public final void addReportsTreeListener(ReportsTreeListener listener) {
240         if (!reportsTreeListeners.contains(listener)) {
241             reportsTreeListeners.add(listener);
242         }
243     }
244 
245     /***
246      * Removes a listener.
247      * @param listener Lister to remove.
248      */
249     public final void removeReportsTreeListener(ReportsTreeListener listener) {
250         reportsTreeListeners.remove(listener);
251     }
252 
253     /***
254      * Fires a message event.
255      */
256     public final void fireDisplayReport(LAReport report) {
257         for (int i = 0; i < reportsTreeListeners.size(); i++) {
258             ((ReportsTreeListener) reportsTreeListeners.get(i)).displayReport(report);
259         }
260     }
261 
262    /* public JComponent getGUI() {
263         // TODO Auto-generated method stub
264         return this;
265     }*/
266 }