001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Nov 30, 2002
005 * Time: 7:49:41 PM
006 */
007
008 package EVolve.visualization.XYViz.ValValViz;
009
010 import EVolve.visualization.*;
011 import EVolve.visualization.Dimension;
012 import EVolve.Scene;
013 import EVolve.util.*;
014 import EVolve.util.Equators.*;
015 import EVolve.util.Equators.Set;
016 import EVolve.util.Painters.RandomPainter;
017 import EVolve.data.*;
018 import javax.swing.*;
019 import java.util.*;
020 import java.awt.event.*;
021 import java.awt.*;
022
023 public class DotplotViz extends ValueValueVisualization {
024 private ArrayList menuList;
025 private JMenuItem itemChangeThread;
026 private JTextField textInterval,textMatch, textBegin,textEnd;
027 private DataTrace trace;
028 private int event;
029 private JComboBox comboEquator;
030 private Equator[] equatorList;
031 private float percent;
032 private Equator selectedEquator;
033 private JMenuItem itemSelectX, itemSelectTimeFrame;
034 private static JMenuItem selectionMenu[] = null;
035 private static int SELECT_OPTION = 0x0011;
036
037 public DotplotViz() {
038 super();
039 dataFilterName = new String[1];
040 dataFilterName[0] = "Thread";
041
042 menuList = new ArrayList();
043
044 beginCall = 0;
045 endCall = 300;
046 interval = 10;
047 percent = 100;
048
049
050 equatorList = new Equator[2];
051 equatorList[0] = new OrderedEquator();
052 equatorList[1] = new UnorderedEquator();
053 selectedEquator = null;
054 }
055
056 public Dimension[] createDimension() {
057 Dimension [] returnDimension = super.createDimension();
058
059 returnDimension[1] = zAxis;
060 internalDimension[0] = threadFilter;
061
062 return returnDimension;
063 }
064
065 public void autoUpdateConfiguration(HashMap config) {
066 super.autoUpdateConfiguration(config);
067 if (config.get("Match")!=null) {
068 percent = ((Float)(config.get("Match"))).floatValue();
069 }
070 if (config.get("Options")!=null) {
071 String equatorName = (String)config.get("Options");
072 for (int i=0; i<equatorList.length; i++)
073 if (equatorList[i].getName().equals(equatorName)) {
074 selectedEquator = equatorList[i];
075 comboEquator.setSelectedIndex(i);
076 break;
077 }
078 }
079 textInterval.setText(String.valueOf(interval));
080 textMatch.setText(String.valueOf(percent));
081 textBegin.setText(String.valueOf(beginCall));
082 textEnd.setText(String.valueOf(endCall));
083 }
084
085 protected void updateConfiguration() {
086
087 if (Scene.getFilter().getSelection().length != 0) {
088 textBegin.setEnabled(false);
089 textEnd.setEnabled(false);
090 } else {
091 textBegin.setEnabled(true);
092 textEnd.setEnabled(true);
093 }
094
095 subject = subjectDefinition.getName();
096 selectedEquator = equatorList[comboEquator.getSelectedIndex()];
097
098 try {
099 if (autoInterval != -1) {
100 interval = autoInterval;
101 autoInterval = -1;
102 } else {
103 interval = Integer.parseInt(textInterval.getText());
104 percent = Float.parseFloat(textMatch.getText());
105 if ((percent>100)||(percent < 0)) {
106 Scene.showErrorMessage("Match percent must be between 0 and 100.");
107 configure();
108 }
109 textInterval.setText(String.valueOf(interval));
110 textMatch.setText(String.valueOf(percent));
111 }
112
113 beginCall = Integer.parseInt(textBegin.getText());
114 endCall = Integer.parseInt(textEnd.getText());
115 selectedEquator.setInterval(interval);
116 selectedEquator.setMatch(percent);
117
118 ((AxesPanel)panel).setName(zAxis.getName(), zAxis.getName());
119 super.updateConfiguration();
120 } catch (Exception e) {
121 Scene.showErrorMessage("Interval, begin call and end call must be an integer and smaller than "+Integer.MAX_VALUE+".");
122 configure();
123 };
124
125 }
126
127 public HashMap getCurrentConfigure() {
128 HashMap configure = super.getCurrentConfigure();
129
130 configure.put("Interval", interval+";"+beginCall+","+endCall+","+percent);
131 configure.put("Options", selectedEquator.getName());
132
133 return configure;
134 }
135
136 public void preVisualize() {
137 image = new AutoImage();
138 trace = selectedEquator.initialDataTrace(interval, Scene.getDataManager().getEntity()[zAxis.getDataFilter().getTargetType()].length);
139 event = 0;
140 getSelection();
141 installPainter();
142 super.preVisualize();
143 }
144
145 protected void receiveElement(Element element) {
146 if (element.getField()[element.getField().length-1] == Integer.MAX_VALUE)
147 return;
148
149 int traceId = zAxis.getField(element);
150 int no = xAxis.getField(element) - 1;
151
152 countEvents(no);
153 if ((no < beginCall)||(no > endCall)) {
154 return;
155 }
156
157 event++;
158 trace.updateTrace3(traceId);
159
160 ArrayList data = trace.getTrace();
161
162 if ((event%interval == 0)||(event-endCall==1)) {
163 int size = data.size() - 1;
164 for (int i=size+1; i>1; i--) {
165 Set set1 = (Set)data.get(size);
166 Set set2 = (Set)data.get(i-2);
167 if (selectedEquator.isEqual(set1,set2)) {
168 painter.paint(image,i-2,size,set1.getHashValue());
169 painter.paint(image,size,i-2,set1.getHashValue());
170 }
171 }
172 if (size>=0) image.setColor(size,size,Color.black);
173 }
174 }
175
176 public void visualize() {
177 ((AxesPanel)panel).setName("Time - " + xAxis.getDataFilter().getName() + " (" + event +" events)", "Time - " + xAxis.getDataFilter().getName() + " (" + event + " events)");
178 sort();
179 }
180
181 protected void mouseMove(int x,int y) {
182 if (interval > 1) return;
183
184 int X = ((AxesPanel)panel).getImageX(x);
185 int Y = ((AxesPanel)panel).getImageY(y);
186 int index = X < Y ? X : Y;
187 if ((index >= 0) && (index < trace.size())) {
188 int methodId = ((Set)trace.getTrace().get(index)).getElement(0);
189 if (shift_pressed && (image.getSortedColor(null,null,X,Y)==null))
190 Scene.setStatus(" ");
191 else
192 Scene.setStatus(Scene.getDataManager().getEntity()[zAxis.getDataFilter().getTargetType()][methodId].getName());
193 } else {
194 Scene.setStatus(" ");
195 }
196 }
197
198 public void makeSelection() {
199 ArrayList idList = new ArrayList();
200
201 int x1 = ((AxesPanel)panel).getStartX();
202 int x2 = ((AxesPanel)panel).getEndX();
203
204 if (x1 < 0) x1 = 0;
205 if (x2 >= trace.getTrace().size()) x2 = trace.getTrace().size()-1;
206
207 Set unionSet = ((Set)(trace.getTrace().get(x1)));
208 for (int i=x1+1; i<=x2; i++) {
209 Set next = ((Set)(trace.getTrace().get(i)));
210 unionSet = unionSet.union(next);
211 }
212
213 for (int i=0; i<unionSet.getValidSize(); i++) {
214 if (unionSet.getEntityId(i)!=-1)
215 idList.add(new Integer(unionSet.getEntityId(i)));
216 }
217
218 int selection[] = null;
219 if ((SELECT_OPTION & 0x00f0) == 0x0010) {
220 selection = new int[idList.size()];
221 for (int i=0; i<selection.length; i++)
222 selection[i] = ((Integer)idList.get(i)).intValue();
223 } else {
224 selection = new int[zAxis.getEntityNumber()];
225 for (int i=0; i<selection.length; i++)
226 selection[i] = i;
227 }
228
229
230 int start = ((Integer)eventCounter.get(x1)).intValue();
231 int end;
232 if (x1==x2) {
233 if (x1+1>trace.getTrace().size()-1)
234 end = Integer.MAX_VALUE;
235 else
236 end = ((Integer)eventCounter.get(x1+1)).intValue() -1;
237 } else {
238 end = ((Integer)eventCounter.get(x2)).intValue();
239 }
240 if ((SELECT_OPTION & 0x000f) == 0x0000) {
241 start = 0;
242 end = Integer.MAX_VALUE;
243 }
244 Scene.getFilter().addSelection(new Selection(zAxis.getDataFilter().getTargetType(), selection,
245 start,end));
246 }
247
248 protected ArrayList createOptionalMenu() {
249 if (menuList.size() > 0) return null;
250
251 menuList.clear();
252
253 itemChangeThread = new JMenuItem("Switch thread...");
254 itemChangeThread.setMnemonic(KeyEvent.VK_T);
255 itemChangeThread.addActionListener(new ActionListener() {
256 public void actionPerformed(ActionEvent e) {
257 visualize();
258 }
259 });
260
261 menuList.add(itemChangeThread);
262 return menuList;
263 }
264
265 protected JPanel createConfigurationPanel() {
266 JPanel returnVal = new JPanel(new GridLayout(1, 1, 5, 5));
267 JPanel panelEvent = new JPanel(new GridLayout(2,2));
268 JPanel equatorBox = new JPanel(new GridLayout(1,2));
269
270 Box panelBottom = new Box(BoxLayout.Y_AXIS);
271 returnVal.add(panelBottom);
272
273 textBegin = new JTextField(String.valueOf(beginCall));
274 textEnd = new JTextField(String.valueOf(endCall));
275 panelEvent.add(new JLabel("From Event No:"));
276 panelEvent.add(textBegin);
277 panelEvent.add(new JLabel("To Event No:"));
278 panelEvent.add(textEnd);
279 panelBottom.add(panelEvent);
280
281 comboEquator = new JComboBox();
282 for (int i=0; i<equatorList.length; i++)
283 comboEquator.addItem(equatorList[i].getName());
284 comboEquator.addActionListener(new ActionListener() {
285 public void actionPerformed(ActionEvent e) {
286 textInterval.setText(String.valueOf(equatorList[comboEquator.getSelectedIndex()].getInterval()));
287 textMatch.setText(String.valueOf(equatorList[comboEquator.getSelectedIndex()].getMatch()));
288 }
289 });
290
291 equatorBox.add(new JLabel("Equator:"));
292 equatorBox.add(comboEquator);
293 panelBottom.add(equatorBox);
294
295 JPanel panelEquator = new JPanel(new GridLayout(2,2));
296
297 textInterval = new JTextField(String.valueOf(interval));
298 textMatch = new JTextField(String.valueOf(percent));
299
300 panelEquator.add(new JLabel("Interval:"));
301 panelEquator.add(textInterval);
302 panelEquator.add(new JLabel("Match:"));
303 panelEquator.add(textMatch);
304
305 panelBottom.add(panelEquator);
306
307 return returnVal;
308 }
309
310 protected void changeOrientation() {
311 }
312
313 protected void installPainter() {
314 painter = new RandomPainter();
315 }
316
317 public JMenuItem[] createSelectionMenuItem() {
318 if (selectionMenu != null) return selectionMenu;
319
320 itemSelectTimeFrame = new JCheckBoxMenuItem("Time Frame");
321 itemSelectTimeFrame.setMnemonic(KeyEvent.VK_T);
322 itemSelectTimeFrame.addActionListener(new ActionListener() {
323 public void actionPerformed(ActionEvent e) {
324 boolean selected = itemSelectTimeFrame.isSelected();
325 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_TIME_FRAME);
326 }
327 });
328 itemSelectTimeFrame.setSelected(true);
329
330 itemSelectX = new JCheckBoxMenuItem("Occurred Entitiies");
331 itemSelectX.setMnemonic(KeyEvent.VK_O);
332 itemSelectX.addActionListener(new ActionListener() {
333 public void actionPerformed(ActionEvent e) {
334 boolean selected = itemSelectX.isSelected();
335 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_OCCURRED_ENTITIES);
336 }
337 });
338 itemSelectX.setSelected(true);
339
340 selectionMenu = new JMenuItem[2];
341 selectionMenu[0] = itemSelectTimeFrame;
342 selectionMenu[1] = itemSelectX;
343
344 return selectionMenu;
345 }
346 }