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 }