001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Dec 1, 2002
005     * Time: 1:16:41 AM
006     */
007    
008    package EVolve.visualization.XYViz.ValValViz;
009    
010    import EVolve.visualization.*;
011    import EVolve.Scene;
012    import EVolve.util.Painters.MissRatePainter;
013    import EVolve.util.VizInfo;
014    import EVolve.data.*;
015    import javax.swing.*;
016    import java.awt.*;
017    import java.awt.event.*;
018    import java.util.HashMap;
019    
020    public class MissPredictionMetricViz extends Metric {
021        private PredictorFactory[] factory; // predictor factories
022        private Predictor[] predictor; // predictors
023        private JComboBox comboPredictor; // combobox for selecting predictor factory
024        private PredictorFactory selectedFactory; // predictor factory in use
025        private JTextField textInterval;
026        private JMenuItem itemSelectTimeFrame;
027        protected static JMenuItem selectionMenu[] = null;
028        private static int SELECT_OPTION;
029    
030        public MissPredictionMetricViz(PredictorFactory[] factory) {
031            super();
032            dataFilterName = new String[0];
033            this.factory = factory;
034            SELECT_OPTION = 0x0001;
035        }
036    
037        protected void updateConfiguration() {
038            try {
039                if (autoInterval != -1) {
040                    interval = autoInterval;
041                    autoInterval = -1;
042                } else
043                    interval = Integer.parseInt(textInterval.getText());
044    
045                ((AxesPanel)panel).setName("Bytecode", "Miss rate");
046                super.updateConfiguration();
047            } catch (Exception e) {
048                Scene.showErrorMessage("Interval must be an integer");
049                configure();
050            }
051        }
052    
053        protected JPanel createConfigurationPanel() {
054            JPanel configurationPanel = new JPanel(new GridLayout(2, 1, 5, 5));
055    
056            selectedFactory = factory[0];
057    
058            JPanel panelTop = new JPanel(new FlowLayout());
059            configurationPanel.add(panelTop);
060    
061            panelTop.add(new JLabel("Predictor: "));
062    
063            comboPredictor = new JComboBox();
064            for (int i = 0; i < factory.length; i++) {
065                comboPredictor.addItem(factory[i].getName());
066            }
067            panelTop.add(comboPredictor);
068    
069    
070            JPanel panelBottom = new JPanel(new FlowLayout());
071            panelBottom.add(new JLabel("Interval: "));
072    
073            textInterval = new JTextField(String.valueOf(interval), 10);
074            panelBottom.add(textInterval);
075    
076            configurationPanel.add(panelBottom);
077    
078            return configurationPanel;
079        }
080    
081        public void preVisualize() {
082            predictor = new Predictor[locationFilter.getMaxEntityNumber()];
083            for (int i = 0; i < predictor.length; i++) {
084                predictor[i] = selectedFactory.createPredictor();
085            }
086    
087            image = new AutoImage();
088            xMax = 0;
089            installPainter();
090            super.preVisualize();
091        }
092    
093        public void receiveElement(Element element) {
094            if (element.getField()[element.getField().length-1] == Integer.MAX_VALUE)
095                return;
096            int x = xAxis.getField(element) / interval;
097            int y = locationFilter.getField(element);
098            int z = zAxis.getField(element);
099    
100            countEvents(xAxis.getField(element));
101    
102            if (xOffset == -1) xOffset = x;
103            painter.paint(image,x-xOffset,y,z);
104    
105            countEvents(xAxis.getField(element));
106            if (xAxis.getField(element) > xMax) {
107                xMax = xAxis.getField(element);
108            }
109        }
110    
111        public void visualize() {
112    
113            ((AxesPanel)panel).setName(xAxis.getName() + " (" + xMax + ")",
114                                       "Miss Prediction rate (" +
115                                       ((MissRatePainter)painter).getMaxMiss()*100 + "%)");
116            sort();
117        }
118    
119        protected void mouseMove(int x, int y) {
120            int X = ((AxesPanel)panel).getImageX(x);
121            if ((X >= 0) && (X < image.getW())) {
122                    Scene.setStatus(((MissRatePainter)painter).getMissrate(X)+"%");
123            } else {
124                Scene.setStatus(" ");
125            }
126        }
127    
128        protected void installPainter() {
129            painter = new MissRatePainter(predictor);
130        }
131    
132        public void makeSelection() {
133            int x1 = ((AxesPanel)panel).getStartX();
134            int x2 = ((AxesPanel)panel).getEndX();
135    
136            if (x1 < 0) {
137                x1 = 0;
138            }
139    
140            if (x2 > (eventCounter.size() - 1)) {
141                x2 = eventCounter.size() - 1;
142            }
143    
144            int[] selection = new int[locationFilter.getEntityNumber()];
145            for (int i = 0; i < selection.length; i++) {
146                selection[i] = i;
147            }
148    
149    
150            Scene.getFilter().addSelection(new Selection(locationFilter.getDataFilter().getTargetType(), selection,
151                                            ((Integer)eventCounter.get(x1)).intValue(), ((Integer)eventCounter.get(x2)).intValue()));
152    
153        }
154    
155        public HashMap getCurrentConfigure() {
156            HashMap configure = super.getCurrentConfigure();
157    
158            VizInfo vizInfo = new VizInfo();
159            vizInfo.setFactory((VisualizationFactory)configure.get("Factory"));
160            vizInfo.setSubject((ElementDefinition)configure.get("Subject"));
161    
162            String[] dimensionDefs = new String[3];
163            dimensionDefs[0] = xAxis.getName() ;
164            dimensionDefs[1] = locationFilter.getName() ;
165            dimensionDefs[2] = zAxis.getName() ;
166            configure.put("Dimension",vizInfo.createDimension(dimensionDefs));
167            configure.put("Predictor",selectedFactory);
168    
169            return configure;
170        }
171    
172        public JMenuItem[] createSelectionMenuItem() {
173            itemSelectTimeFrame = new JCheckBoxMenuItem("Time Frame");
174            itemSelectTimeFrame.setMnemonic(KeyEvent.VK_T);
175            itemSelectTimeFrame.setSelected(true);
176            itemSelectTimeFrame.setEnabled(false);
177    
178    
179            JMenuItem[] items = new JMenuItem[1];
180            items[0] = itemSelectTimeFrame;
181    
182            return items;
183        }
184    }