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 java.awt.event.ActionEvent;
011    import java.awt.event.ActionListener;
012    import java.awt.event.KeyEvent;
013    import java.util.ArrayList;
014    import java.util.HashMap;
015    import java.util.Iterator;
016    import java.util.Stack;
017    
018    import javax.swing.JMenuItem;
019    
020    import EVolve.data.Element;
021    import EVolve.util.ThreadChooser;
022    import EVolve.util.painters.StackHotspotPainter;
023    import EVolve.util.painters.Painter;
024    import EVolve.visualization.AutoImage;
025    import EVolve.visualization.Dimension;
026    import EVolve.visualization.ReferenceDimension;
027    import EVolve.visualization.ValueDimension;
028    
029    public class StackHotspotViz extends HotSpotVisualization{
030        private ArrayList menuList;
031        private String dataFilterName[];
032        private JMenuItem itemChangThread;
033        private HashMap methodStacks;
034        private ThreadChooser td;
035        private Stack stack;
036    
037        public StackHotspotViz() {
038            super();
039            dataFilterName = new String[2];
040    
041            dataFilterName[0] = "Bytecode";
042            dataFilterName[1] = "Method";
043    
044            menuList = new ArrayList();
045            td = new ThreadChooser(imageMap,false);
046            painters = new Painter[1];
047            painters[0] = new StackHotspotPainter();
048        }
049    
050        public Dimension[] createDimension() {
051            Dimension [] returnDimension = new Dimension[3];
052    
053            xAxis = new ValueDimension();
054            yAxis = new ReferenceDimension(true);
055            zAxis = new ReferenceDimension();
056    
057            returnDimension[0] = xAxis;
058            returnDimension[1] = yAxis;
059            returnDimension[2] = zAxis;
060    
061            return returnDimension;
062        }
063    
064        protected ArrayList createOptionalMenu() {
065            if (menuList.size() > 0) return null;
066    
067            menuList.clear();
068            itemChangThread = new JMenuItem("Switch thread...");
069            itemChangThread.setMnemonic(KeyEvent.VK_T);
070            itemChangThread.addActionListener(new ActionListener() {
071                public void actionPerformed(ActionEvent e) {
072                    visualize();
073                }
074            });
075    
076            menuList.add(itemChangThread);
077            return menuList;
078        }
079    
080        public void preVisualize() {
081            super.preVisualize();
082            image = null;
083            methodStacks = new HashMap();
084        }
085    
086        public void receiveElement(Element element) {
087            long threadId = zAxis.getField(element);
088    
089            switchThread(threadId);
090            long x = xAxis.getField(element);
091            long y = yAxis.getField(element);
092            long z = element.isOptional() ? Integer.MAX_VALUE : Integer.MIN_VALUE;
093    
094            ((StackHotspotPainter)painter).setStack(stack);
095            paint(x,y,z);
096        }
097    
098        public void visualize() {
099            String selected = null;
100            if (imageMap.size() == 0 ) return;
101            while (selected==null) {
102                selected = td.showDialog();
103                if (selected != null) {
104                    image = (AutoImage)imageMap.get(new Long(selected.substring(7,selected.length())));
105                    selected = null;
106                    break;
107                }
108            }
109            super.visualize();
110        }
111    
112        protected void switchThread(long threadId) {
113            if (currentThread != threadId) {
114                stack = (Stack)methodStacks.get(new Long(threadId));
115                if (stack == null) {
116                    stack = new Stack();
117                    methodStacks.put(new Long(threadId),stack);
118                }
119                super.switchThread(threadId);
120            }
121        }
122    
123        public Object clone() {
124            StackHotspotViz o = (StackHotspotViz)super.clone();
125            o.createOptionalMenu();
126            o.dataFilterName = new String[dataFilterName.length];
127            for (int i=0; i<dataFilterName.length; i++)
128                o.dataFilterName[i] = dataFilterName[i];
129            if (methodStacks == null) {
130                o.methodStacks = (HashMap)methodStacks.clone();
131                Iterator it = methodStacks.keySet().iterator();
132                while(it.hasNext()) {
133                    Object key = it.next();
134                    o.methodStacks.put(key, methodStacks.get(key));
135                }
136            }
137            o.td = new ThreadChooser(o.imageMap,false);
138            o.stack = (Stack)stack.clone();
139            o.menuList.clear();
140            return o;
141        }
142    }