001package com.ganteater.ae.desktop.ui;
002
003import java.awt.BorderLayout;
004import java.awt.Dimension;
005import java.awt.event.MouseAdapter;
006import java.awt.event.MouseEvent;
007import java.util.Vector;
008
009import javax.swing.JPanel;
010import javax.swing.JScrollPane;
011import javax.swing.JSplitPane;
012import javax.swing.JTextArea;
013import javax.swing.JTree;
014import javax.swing.tree.DefaultMutableTreeNode;
015
016import org.apache.commons.lang.exception.ExceptionUtils;
017
018import com.ganteater.ae.CommandException;
019import com.ganteater.ae.desktop.editor.TaskEditor;
020import com.ganteater.ae.processor.Processor;
021import com.ganteater.ae.util.xml.easyparser.Node;
022import com.ganteater.ae.util.xml.easyparser.Node.TreeVector;
023
024class TracePanel extends JPanel {
025
026        private static final long serialVersionUID = 1L;
027
028        public TracePanel(AEFrame frame, Processor processor, Throwable e, Node command) {
029                super(new BorderLayout());
030
031                String message = ExceptionUtils.getRootCauseMessage(e);
032                if (message == null) {
033                        message = ExceptionUtils.getRootCause(e).getClass().getSimpleName();
034                }
035                JTextArea theJTextArea = new JTextArea(message);
036                theJTextArea.setEditable(false);
037                JScrollPane scrollPane = new JScrollPane(theJTextArea);
038
039                TreeVector taskTree = new TreeVector();
040                taskTree.add(command.getVector());
041                JTree theTask = new JTree(taskTree);
042                theTask.setRootVisible(false);
043                JSplitPane theStackPanel = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane, new JScrollPane(theTask));
044                theStackPanel.setDividerLocation(40);
045
046                Vector<Object> callTaskTrace = processor.getCallTaskTrace();
047                JTree jTree = new JTree(callTaskTrace);
048
049                jTree.addMouseListener(new MouseAdapter() {
050                        @Override
051                        public void mousePressed(MouseEvent e) {
052                                if (e.getClickCount() == 2) {
053                                        DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) jTree.getLastSelectedPathComponent();
054                                        Node node = (Node) selectedNode.getUserObject();
055
056                                        String name = node.getAttribute("recipe");
057                                        if (name != null) {
058                                                TaskEditor editTask;
059                                                try {
060                                                        editTask = frame.editTask(name);
061                                                        editTask.setRunButtonAction(true);
062                                                } catch (CommandException e1) {
063                                                        // TODO Auto-generated catch block
064                                                        e1.printStackTrace();
065                                                }
066                                        }
067                                }
068                        }
069                });
070
071                jTree.setRootVisible(false);
072                JSplitPane panel = new JSplitPane(JSplitPane.VERTICAL_SPLIT, theStackPanel, new JScrollPane(jTree));
073                panel.setDividerLocation(160);
074
075                add(panel, BorderLayout.CENTER);
076                setPreferredSize(new Dimension(400, 300));
077        }
078}