001 /*
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: 2002-9-6
005 * Time: 15:53:41
006 * To change template for new class use
007 * Code Style | Class Templates options (Tools | IDE Options).
008 */
009 package EVolve.util;
010
011 import EVolve.visualization.*;
012 import EVolve.visualization.XYViz.XYVisualization;
013 import EVolve.visualization.XYViz.RefRefViz.ReferenceReferenceVisualization;
014 import EVolve.Scene;
015 import EVolve.data.*;
016 import javax.swing.*;
017 import javax.swing.filechooser.FileSystemView;
018 import java.awt.*;
019 import java.awt.event.*;
020 import java.io.*;
021 import java.util.*;
022
023 public class AsynchronousOverlapper extends OverlapVisualization {
024 private final String name = "AsynchronousOverlapper";
025 private JList fileList,procList;
026 private JTextField txtConfName;
027 private HashSet setFile;
028 private ArrayList setProcessFiles;
029 private DefaultListModel procListModel,fileListModel;
030 private ArrayList[] entityList;
031
032 public AsynchronousOverlapper() {
033 super();
034 dialog = null;
035 setProcessFiles = new ArrayList();
036 setFile = new HashSet();
037 colorList = new ArrayList();
038 entityList = new ArrayList[2];
039 entityList[0] = new ArrayList();
040 entityList[1] = new ArrayList();
041 }
042
043 public String getName() {
044 return name;
045 }
046
047 public void createDialog() {
048 setFile.clear();
049 setProcessFiles.clear();
050 colorList.clear();
051 visualizationList.clear();
052 dialog = new JDialog(Scene.getFrame(),"Overlap Visualizations...",true);
053 dialog.setBounds(new Rectangle(500,400));
054
055 JPanel batchName = new JPanel(new FlowLayout());
056 dialog.getContentPane().add(batchName,BorderLayout.NORTH);
057
058 Box boxMain = new Box(BoxLayout.Y_AXIS);
059 boxMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
060 "Choose data source(s) to be overlapped & Processing configuration"));
061 dialog.getContentPane().add(boxMain,BorderLayout.CENTER);
062
063
064 Box boxLabels = new Box(BoxLayout.X_AXIS);
065 JButton buttonGetDir = new JButton("Select Directory ..");
066 buttonGetDir.addActionListener(new ActionListener(){
067 public void actionPerformed(ActionEvent e){
068 fillFileList();
069 }
070 });
071 boxLabels.add(buttonGetDir);
072 boxLabels.add(Box.createHorizontalGlue());
073 boxLabels.add(new JLabel("Processing List "));
074
075 Box boxLists = new Box(BoxLayout.X_AXIS);
076 fileListModel = new DefaultListModel();
077 fileList = new JList(fileListModel);
078
079 Box boxAddRemove = new Box(BoxLayout.Y_AXIS);
080 JButton buttonAdd = new JButton(" > ");
081 buttonAdd.addActionListener(new ActionListener(){
082 public void actionPerformed(ActionEvent e){
083 addFiles();
084 }
085 });
086 JButton buttonRemove = new JButton(" < ");
087 buttonRemove.addActionListener(new ActionListener(){
088 public void actionPerformed(ActionEvent e){
089 removeFiles();
090 }
091 });
092 boxAddRemove.add(Box.createVerticalStrut(40));
093 boxAddRemove.add(buttonAdd);
094 boxAddRemove.add(Box.createVerticalStrut(20));
095 boxAddRemove.add(buttonRemove);
096
097 procListModel = new DefaultListModel();
098 procList = new JList(procListModel);
099
100 JScrollPane scrollPane1 = new JScrollPane(fileList);
101 JScrollPane scrollPane2 = new JScrollPane(procList);
102 boxLists.add(scrollPane1);
103 boxLists.add(boxAddRemove);
104 boxLists.add(scrollPane2);
105
106 boxMain.add(boxLabels);
107 boxMain.add(Box.createVerticalStrut(5));
108 boxMain.add(boxLists);
109
110 Box boxConfig = new Box(BoxLayout.X_AXIS);
111 boxConfig.add(new JLabel("Choose configure file:"));
112 txtConfName = new JTextField(12);
113 boxConfig.add(Box.createHorizontalStrut(20));
114 boxConfig.add(txtConfName,BorderLayout.CENTER);
115 JButton buttonConfig = new JButton("...");
116 buttonConfig.addActionListener(new ActionListener(){
117 public void actionPerformed(ActionEvent e){
118 txtConfName.setText(chooseConfig());
119 }
120 });
121 boxConfig.add(buttonConfig,BorderLayout.EAST);
122
123 Box boxOkCancel = new Box(BoxLayout.X_AXIS);
124 JButton buttonOK = new JButton("OK");
125 JButton buttonCancel = new JButton("Cancel");
126 JButton buttonColor = new JButton("Coloring");
127
128 buttonOK.addActionListener(new ActionListener(){
129 public void actionPerformed(ActionEvent e){
130 onOK();
131 }
132 });
133 buttonCancel.addActionListener(new ActionListener(){
134 public void actionPerformed(ActionEvent e){
135 onCancel();
136 }
137 });
138 buttonColor.addActionListener(new ActionListener(){
139 public void actionPerformed(ActionEvent e){
140 selectColor();
141 }
142 });
143
144 boxOkCancel.add(Box.createHorizontalStrut(25));
145 boxOkCancel.add(buttonColor);
146 boxOkCancel.add(Box.createHorizontalStrut(20));
147 boxOkCancel.add(buttonOK);
148 boxOkCancel.add(Box.createHorizontalStrut(20));
149 boxOkCancel.add(buttonCancel);
150
151 Box boxBottom = Box.createVerticalBox();
152 boxBottom.add(Box.createVerticalStrut(12));
153 boxBottom.add(boxConfig);
154 boxBottom.add(Box.createVerticalStrut(30));
155 boxBottom.add(boxOkCancel);
156
157
158 dialog.getContentPane().add(boxBottom,BorderLayout.SOUTH);
159 //dialog.setResizable(false);
160
161 }
162
163 private void selectColor() {
164 int index = procList.getSelectedIndex();
165
166 if (index != -1) {
167 Color newColor = JColorChooser.showDialog(Scene.getFrame(), "Choose a color", Color.black);
168 if (newColor != null) {
169 colorList.add(index,newColor);
170 colorList.remove(index+1);
171 procListModel.removeAllElements();
172
173 for (int i=0; i<setProcessFiles.size(); i++) {
174 if (colorList.get(i) == null)
175 procListModel.addElement(setProcessFiles.get(i));
176 else
177 procListModel.addElement("<html><font color=#" + getColorHex((Color)colorList.get(i)) + ">"
178 + setProcessFiles.get(i) +" </font></html>" );
179 }
180 }
181 }
182 }
183
184 private void onOK() {
185
186 if (procListModel.size() < 2) {
187 Scene.showErrorMessage("Please select at least 2 data source.");
188 return;
189 }
190
191 if (txtConfName.getText().trim().length() == 0) {
192 Scene.showErrorMessage("No configuration file selected!");
193 return;
194 }
195 dialog.setVisible(false);
196 noEntityAvailable = false;
197
198 overlappedVisualize();
199 }
200
201 private void onCancel() {
202 dialog.setVisible(false);
203 }
204
205 private void addFiles() {
206 int[] selectIndex = fileList.getSelectedIndices();
207 ArrayList newColorList = new ArrayList();
208
209 for (int i=0;i<selectIndex.length;i++) {
210 if (setProcessFiles.contains(fileListModel.getElementAt(selectIndex[i]))) continue;
211
212 setProcessFiles.add(fileListModel.getElementAt(selectIndex[i]));
213 procListModel.addElement(fileListModel.getElementAt(selectIndex[i]));
214 }
215
216 for (int i=0; i<setProcessFiles.size();i++) {
217 if (i<colorList.size())
218 newColorList.add(i,colorList.get(i));
219 else
220 newColorList.add(i,null);
221 }
222 colorList = newColorList;
223 }
224
225 private void removeFiles() {
226 int[] selectIndex = procList.getSelectedIndices();
227
228 for (int i=selectIndex.length -1 ;i>=0;i--) {
229 setProcessFiles.remove(selectIndex[i]);
230 colorList.remove(selectIndex[i]);
231 procListModel.removeElement(procListModel.getElementAt(selectIndex[i]));
232 }
233 }
234
235 private String chooseConfig() {
236 JFileChooser fc = new JFileChooser(Scene.getUIManager().getLastConfigDir());
237
238 if(fc.showOpenDialog(Scene.getFrame()) == JFileChooser.APPROVE_OPTION) {
239 File f = fc.getSelectedFile();
240 Scene.getUIManager().setLastConfigDir(f.getPath());
241 return (f.getPath());
242 }
243 else return "";
244 }
245
246 private void fillFileList() {
247 JFileChooser fc = new JFileChooser(Scene.getUIManager().getLastDataDir());
248 String path;
249
250 fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
251
252 fileListModel.removeAllElements();
253 if(fc.showOpenDialog(Scene.getFrame()) == JFileChooser.APPROVE_OPTION) {
254 path = fc.getSelectedFile().getAbsolutePath();
255 Scene.getUIManager().setLastDataDir(path);
256 File dir = new File(path);
257 FileSystemView fv = fc.getFileSystemView();
258 File[] fl = fv.getFiles(dir,false);
259 for (int i=0;i<fl.length;i++) {
260 String fn = fl[i].getName();
261 if (!fl[i].isFile() || !fn.endsWith(".dat") || setFile.contains(path+File.separator+fn))
262 continue;
263 setFile.add(path+File.separator+fn);
264 fileListModel.addElement(path+File.separator+fn);
265 }
266 }
267
268 }
269
270 public boolean isOverlapable(Visualization visualToBeOverlapped) {
271 return true;
272 }
273
274 public void preOverlappedVisualize() {
275 RandomAccessFile inConfigFile;
276 String dataSource;
277 VizInfo vizInfo = null;
278 String dimensionDefs[] = new String[3];
279 String factoryName,subjectName,predictor,interval;
280 HashMap mapConfig = new HashMap();
281 Visualization visual;
282
283 reset();
284 try {
285 inConfigFile = new RandomAccessFile(txtConfName.getText().trim(), "r");
286 String version = inConfigFile.readLine().trim();
287 if (!version.equals(Scene.VERSION)) throw (new IOException());
288 inConfigFile.readLine();
289 factoryName = inConfigFile.readLine().trim();
290 subjectName = inConfigFile.readLine().trim();
291 for (int j=0;j<dimensionDefs.length;j++) {
292 dimensionDefs[j] = inConfigFile.readLine().trim();
293 }
294 predictor = inConfigFile.readLine().trim();
295 interval = inConfigFile.readLine().trim();
296 inConfigFile.close();
297 for (int i=0; i<procListModel.size(); i++) {
298 dataSource = (String)setProcessFiles.get(i);
299 Scene.setDataFilename(dataSource);
300 Scene.autoLoadDataSource();
301
302 vizInfo = new VizInfo();
303 vizInfo.createFactory(factoryName);
304 vizInfo.createSubjectDefinition(subjectName);
305 vizInfo.createDimension(dimensionDefs);
306 vizInfo.createPredictor(predictor);
307 vizInfo.createInterval(interval);
308 vizInfo.createTitle(dataSource);
309 for (int k=0; k< entityList.length; k++)
310 if (vizInfo.getDimension()[k] instanceof ReferenceDimension)
311 entityList[k].add(Scene.getDataManager().getEntity()[vizInfo.getDimension()[k].getDataFilter().getTargetType()]);
312
313 mapConfig.put("Factory",vizInfo.getFactory());
314 mapConfig.put("Subject",vizInfo.getSubject());
315 mapConfig.put("Dimension",vizInfo.getDimension());
316 mapConfig.put("Predictor",vizInfo.getPredictor());
317 mapConfig.put("Interval",new Integer(vizInfo.getInterval()));
318 mapConfig.put("BeginCall",new Integer(vizInfo.getBeginCall()));
319 mapConfig.put("EndCall",new Integer(vizInfo.getEndCall()));
320
321 visual = Scene.getVisualizationManager().newVisualization(((VisualizationFactory)mapConfig.get("Factory")).getName());
322
323 visual.setName(vizInfo.getTitle());
324 visual.autoUpdateConfiguration(mapConfig);
325 visualizationList.add(visual);
326
327 Scene.getVisualizationManager().addAllVisualizations();
328 Scene.getVisualizationManager().prepareListToBeVisualized();
329 Scene.autoVisualize();
330
331 }
332 } catch (Exception e) {
333 System.out.println("Configure file error!");
334 }
335 }
336
337 public void overlappedVisualize() {
338 Visualization visual;
339
340 Scene.getVisualizationManager().init();
341 Scene.getUIManager().init();
342
343 if (window instanceof EVolve.Window) {
344 Scene.getUIManager().removeWindow(window);
345 window = null;
346 }
347 visualizationList.clear();
348 Scene.getUIManager().setDoNotRemoveWindow(true);
349 preOverlappedVisualize();
350 Scene.getUIManager().setDoNotRemoveWindow(false);
351 Scene.setDataFilename(null);
352
353
354 unifyVisualizations();
355
356 // begin drawing overlap
357 if (window instanceof EVolve.Window) {
358 Scene.getUIManager().removeWindow(window);
359 window = null;
360 }
361
362 newOverlappedVisualization(this);
363
364 int [] selectedIndex = new int[2];
365 int [] sortedDimension = new int[2];
366 visual = (Visualization)visualizationList.get(0);
367
368 for (int i=0; i<maxEntity.length; i++) {
369 if (visual.getDimension()[i] instanceof ReferenceDimension) {
370
371 selectedIndex[i] = ((ReferenceDimension)visual.getDimension()[i]).getSelectedComparatorIndex();
372 sortedDimension[i] = 1;
373 break;
374 }
375 }
376
377 sort();
378 enableSortMenu();
379 }
380
381 private void unifyVisualizations() {
382 // now we begin unify all entities
383 ArrayList standard[] = new ArrayList[2];
384 standard[0] = new ArrayList();
385 standard[1] = new ArrayList();
386 ArrayList posMapList[] = new ArrayList[2];
387 posMapList[0] = new ArrayList();
388 posMapList[1] = new ArrayList();
389 // initial the max entity to visualization 0's entity
390 for (int i=0; i<entityList.length; i++) {
391 Entity[] temp;
392 if (entityList[i].size() !=0 ) {
393 temp = (Entity[])entityList[i].get(0);
394 HashMap map = new HashMap();
395 for (int j=0; j<temp.length; j++) {
396 standard[i].add(temp[j]);
397 map.put(new Integer(j),new Integer(j));
398 }
399 posMapList[i].add(map);
400
401 } else
402 continue;
403 }
404
405 for (int i=0; i<entityList.length; i++) {
406 for (int j=1; j<entityList[i].size(); j++) {
407 HashMap map = unifyEntities(standard[i], (Entity[])entityList[i].get(j));
408 posMapList[i].add(map);
409 }
410 }
411 // dump the unified entity to an array
412 for (int i=0; i<standard.length; i++) {
413 if (standard[i].size() == 0) continue;
414 maxEntity[i] = new Entity[standard[i].size()];
415 for (int j=0; j<standard[i].size(); j++) {
416 maxEntity[i][j] = (Entity)standard[i].get(j);
417 }
418 }
419 // unifying entity done here, begin to update ordering information in all visualizations
420
421 // update ordering information begins
422 Visualization visual;
423 for (int i=0; i<entityList.length; i++) {
424 if (entityList[i].size() == 0) continue; // not a reference dimension
425 for (int j=0; j<visualizationList.size(); j++) {
426 visual = (Visualization)visualizationList.get(j);
427 AutoImage newImage;
428
429 ReferenceDimension dim = visual.getLinkableDimension(i);
430 // reorganize the image data here
431 Color newColor = (Color)colorList.get(j);
432 AutoImage image = visual.getImage();
433 if (i == 0) {
434 newImage = switchColor(image,(HashMap)posMapList[i].get(j),newColor,false);
435 } else {
436 newImage = switchColor(image,(HashMap)posMapList[i].get(j),newColor,true);
437 }
438
439 if (newImage!=null) visual.setImage(newImage);
440
441 // reorganize the image data ends
442 int[] order = updateOrdering(maxEntity[i],(HashMap)posMapList[i].get(j),dim.getOrdering());
443 dim.setOrdering(order);
444 dim.linkEntities(maxEntity[i]);
445 dim.visualize();
446 ((XYVisualization)visual).disablePopupMenu();
447 }
448 }
449
450 for (int i=0; i<visualizationList.size(); i++) {
451 visual = (Visualization)visualizationList.get(i);
452 if (!(visual instanceof ReferenceReferenceVisualization))
453 break;
454
455 int[][] newValue = new int[maxEntity[0].length][maxEntity[1].length];
456 switchValues((ReferenceReferenceVisualization)visual,newValue,posMapList[i]);
457 }
458 // update ordering information ends
459 }
460
461 private AutoImage switchColor(AutoImage image, HashMap positionMap,Color newColor, boolean rowSwitch) {
462 int w = image.getW();
463 int h = image.getH();
464 int end = rowSwitch ? h : w;
465 AutoImage returnVal = new AutoImage();
466
467 if (positionMap == null) return null;
468 for (int oldPos=0; oldPos<end; oldPos++) {
469 int newPos = ((Integer)positionMap.get(new Integer(oldPos))).intValue();
470 int end2 = rowSwitch ? w : h;
471 for (int k=0; k<end2; k++) {
472 Color tempColor = null;
473 if (rowSwitch) {
474 tempColor = image.getColor(k,oldPos);
475 if (tempColor == null) continue;
476 if (newColor != null) tempColor = newColor;
477 returnVal.setColor(k,newPos,tempColor);
478 } else {
479 tempColor = image.getColor(oldPos,k);
480 if (tempColor == null) continue;
481 if (newColor != null) tempColor = newColor;
482 returnVal.setColor(newPos,k,tempColor);
483
484 }
485 }
486 }
487 return returnVal;
488 }
489
490 private void switchValues(ReferenceReferenceVisualization visual, int[][] newValue, ArrayList positionMap) {
491 int[][] oldValue = visual.getValue();
492
493 for (int i=0; i<positionMap.size(); i++) {
494 HashMap map = (HashMap)positionMap.get(i);
495 if (i == 0) {
496 for (int j=0; j<oldValue[0].length; j++) {
497 if (!map.containsKey(new Integer(j))) continue;
498 int newPos = ((Integer)map.get(new Integer(j))).intValue();
499 for (int k=0; k<oldValue.length; k++) {
500 newValue[k][newPos] = oldValue[k][j];
501 }
502 }
503 } else {
504 oldValue = null;
505 oldValue = new int[newValue.length][newValue[0].length];
506 for (int j=0; j<oldValue.length; j++) {
507 if (!map.containsKey(new Integer(j))) continue;
508 int newPos = ((Integer)map.get(new Integer(j))).intValue();
509 for (int k=0; k<oldValue[0].length; k++) {
510 oldValue[newPos][k] = newValue[j][k];
511 }
512 }
513 }
514 }
515
516 visual.setValue(oldValue);
517 }
518
519 private HashMap unifyEntities(ArrayList standard, Entity[] toBeUnified) {
520 int oldPosition, stdPosition,appendPosition = standard.size();
521 ArrayList tobeAdded = new ArrayList();
522 HashMap positionMap = new HashMap();
523
524
525
526 for (oldPosition = 0; oldPosition < toBeUnified.length; oldPosition++) {
527 boolean found = false;
528 for (stdPosition = 0; stdPosition < standard.size(); stdPosition++) {
529 if (((Entity)standard.get(stdPosition)).getName().equals(toBeUnified[oldPosition].getName())) {
530 found = true;
531 positionMap.put(new Integer(oldPosition),new Integer(stdPosition));
532 break;
533 }
534 }
535 if (!found) {
536 tobeAdded.add(toBeUnified[oldPosition]);
537 positionMap.put(new Integer(oldPosition), new Integer(appendPosition));
538 appendPosition++;
539 }
540 }
541
542 for (int i=0; i<tobeAdded.size(); i++) {
543 standard.add(tobeAdded.get(i));
544 }
545
546 return positionMap;
547 }
548
549 private int[] updateOrdering(Entity[] standard, HashMap positionMap, int[] oldOrder) {
550 int newOrder[] = new int[standard.length];
551
552
553 for (int i=0; i<newOrder.length; i++) {
554 newOrder[i] = Integer.MAX_VALUE;
555 }
556
557 if (positionMap == null) {
558 for (int i=0; i<oldOrder.length; i++)
559 newOrder[i] = oldOrder[i];
560 return newOrder;
561 }
562
563 Iterator it = positionMap.keySet().iterator();
564
565 while (it.hasNext()) {
566 Integer oldPosition = (Integer)it.next();
567 Integer newPosition = (Integer)positionMap.get(oldPosition);
568
569 newOrder[newPosition.intValue()] = oldOrder[oldPosition.intValue()];
570 }
571
572 return newOrder;
573 }
574
575 private void reset() {
576 maxEntity[0] = null;
577 maxEntity[1] = null;
578 for (int i= 0; i<entityList.length ; i++) {
579 entityList[i].clear();
580 }
581 }
582 }