001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Nov 28, 2002
005     * Time: 2:37:43 AM
006     */
007    
008    package EVolve.visualization.XYViz.ValRefViz.HotSpotViz;
009    
010    import EVolve.util.Painters.StackHotspotPainter;
011    import EVolve.util.ThreadChooser;
012    import EVolve.data.Element;
013    import EVolve.visualization.AutoImage;
014    import EVolve.visualization.ReferenceDimension;
015    
016    import javax.swing.*;
017    import java.util.*;
018    import java.awt.event.*;
019    
020    public class StackHotspotViz extends HotSpotVisualization{
021        private ArrayList menuList;
022        private String dataFilterName[];
023        private JMenuItem itemChangThread;
024        private HashMap methodStacks;
025        private ThreadChooser td;
026        private Stack stack;
027    
028        public StackHotspotViz() {
029            super();
030            dataFilterName = new String[2];
031    
032            dataFilterName[0] = "Bytecode";
033            dataFilterName[1] = "Method";
034    
035            menuList = new ArrayList();
036            td = new ThreadChooser(imageMap,false);
037        }
038    
039        protected void updateConfiguration() {
040            int subjectIndex = 0;
041            for (int i=0; i<elementDefinition.length; i++)
042                if (elementDefinition[i].getName().equals("Method Invocation")) {
043                    subjectDefinition = elementDefinition[i];
044                    subjectIndex = i;
045                }
046    
047            dimension[0].setDataFilter(dataFilter[subjectIndex][0][0]);
048            for (int i=1; i<2; i++) {
049                for (int j=0; j<dataFilter[subjectIndex][1].length; j++) {
050                    if (dataFilter[subjectIndex][1][j].getName().equals(dataFilterName[i])) {
051                        dimension[i].setDataFilter(dataFilter[subjectIndex][1][j]);
052                        break;
053                    }
054                }
055            }
056            super.updateConfiguration();
057        }
058    
059        protected ArrayList createOptionalMenu() {
060            if (menuList.size() > 0) return null;
061    
062            menuList.clear();
063            itemChangThread = new JMenuItem("Switch thread...");
064            itemChangThread.setMnemonic(KeyEvent.VK_T);
065            itemChangThread.addActionListener(new ActionListener() {
066                public void actionPerformed(ActionEvent e) {
067                    visualize();
068                }
069            });
070    
071            menuList.add(itemChangThread);
072            return menuList;
073        }
074    
075        public void preVisualize() {
076            super.preVisualize();
077            image = null;
078            methodStacks = new HashMap();
079        }
080    
081        public void receiveElement(Element element) {
082            int threadId = threadFilter.getField(element);
083    
084            switchThread(threadId);
085            int x = xAxis.getField(element);
086            int y = yAxis.getField(element);
087            int z = element.getField()[element.getField().length-1];
088    
089            ((StackHotspotPainter)painter).setStack(stack);
090            paint(x,y,z);
091        }
092    
093        public void visualize() {
094            String selected = td.showDialog();
095    
096            image = (AutoImage)imageMap.get(new Integer(selected.substring(7,selected.length())));
097            sort();
098        }
099    
100        protected void installPainter() {
101            painter = new StackHotspotPainter();
102        }
103    
104        protected void createDialog() {
105            super.createDialog();
106            comboSubject.setEnabled(false);
107            for (int i=0; i<comboDimension.length; i++) {
108                comboDimension[i].setEnabled(false);
109            }
110        }
111    
112        protected void switchThread(int threadId) {
113            if (currentThread != threadId) {
114                stack = (Stack)methodStacks.get(new Integer(threadId));
115                if (stack == null) {
116                    stack = new Stack();
117                    methodStacks.put(new Integer(threadId),stack);
118                }
119                super.switchThread(threadId);
120            }
121        }
122    }