001 /** 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: Apr 27, 2003 005 * Time: 9:18:07 PM 006 */ 007 008 package EVolve.util.phasedetectors; 009 010 import java.util.ArrayList; 011 import java.util.HashSet; 012 013 import EVolve.Scene; 014 import EVolve.util.HelperFuncs; 015 import EVolve.visualization.XYViz.XYVisualization; 016 017 public class PhaseClipboard { 018 private ArrayList copiedPhase; 019 private XYVisualization source; 020 private HashSet targetList; 021 private ArrayList sourceTimeMap, targetTimeMap; 022 private int sourceInterval, targetInterval; 023 private boolean isEmpty; 024 025 public PhaseClipboard() { 026 isEmpty = true; 027 targetList = new HashSet(); 028 } 029 030 public void copyPhase() { 031 ArrayList phaseList = null; 032 source = HelperFuncs.getActiveXYViz(); 033 034 if ((source == null)||(source.getPhaseDetector()==null)) { 035 Scene.showErrorMessage("No phase information available."); 036 return; 037 } 038 039 sourceTimeMap = source.getTimeMap(); 040 sourceInterval = source.getInterval(); 041 phaseList = source.getPhaseDetector().getPhase(); 042 if ((phaseList == null) || (phaseList.size() == 0)) { 043 Scene.showErrorMessage("No phase information available."); 044 return; 045 } 046 047 copiedPhase = HelperFuncs.cloneArrayList(phaseList); 048 if (copiedPhase.size() > 0) isEmpty = false; 049 } 050 051 public void pastePhase() { 052 XYVisualization target = null; 053 054 if (copiedPhase == null) { 055 Scene.showErrorMessage("No phase data available, please copy phase first."); 056 return; 057 } 058 059 target = HelperFuncs.getActiveXYViz(); 060 if (target == null) { 061 Scene.showErrorMessage("Can not paste phase to non-HotSpotVisualization."); 062 return ; 063 } 064 065 if (source.getDataSourceId() != target.getDataSourceId()) { 066 Scene.showErrorMessage("Can not paste phases to a visualization generated from a different data source"); 067 return; 068 } 069 070 PhaseDetector detector = target.getPhaseDetector(); 071 if (detector == null) return; 072 073 if (!targetList.contains(target)) 074 targetList.add(target); 075 076 targetTimeMap = target.getTimeMap(); 077 targetInterval = target.getInterval(); 078 ArrayList phases = translatePhase(); 079 080 detector.pastePhases(phases); 081 } 082 083 public boolean isEmpty() { 084 return isEmpty; 085 } 086 087 private ArrayList translatePhase() { 088 ArrayList translated = new ArrayList(); 089 ArrayList eventNoList = new ArrayList(); 090 091 for (int i=0; i<copiedPhase.size(); i++) { 092 Integer phase = (Integer)copiedPhase.get(i); 093 long event = findEventNo(sourceTimeMap, phase.intValue()+1,sourceInterval); 094 eventNoList.add(new Long(event)); 095 } 096 097 for (int i=0; i<eventNoList.size(); i++) { 098 Long event = (Long)eventNoList.get(i); 099 long time = findTime(targetTimeMap, event.longValue()); 100 translated.add(new Integer((int)(time/targetInterval))); 101 } 102 103 return translated; 104 } 105 106 private long findTime(ArrayList timeMap, long eventNo) { 107 long prevEvent = 0, curEvent = 0; 108 long time = 0; 109 110 for (int i=0; i<timeMap.size(); i++) { 111 long[] time2Event = (long[])timeMap.get(i); 112 curEvent = time2Event[1]; 113 time = time2Event[0]; 114 if ((prevEvent == eventNo) || (curEvent == eventNo) || 115 ((prevEvent < eventNo) && (eventNo < curEvent))) { 116 break; 117 } 118 prevEvent = curEvent; 119 } 120 121 return time; 122 } 123 124 private long findEventNo(ArrayList timeMap, int time, int interval) { 125 long prevTime = 0, curTime = 0; 126 long event = 0; 127 128 for (int i=0; i<timeMap.size(); i++) { 129 long[] time2Event = (long[])timeMap.get(i); 130 curTime = time2Event[0]; 131 if ((prevTime/interval == time) || (curTime/interval == time) || 132 ((prevTime/interval < time) && (time < curTime/interval))) { 133 break; 134 } 135 event = time2Event[1]; 136 prevTime = curTime; 137 } 138 139 return event; 140 141 } 142 }