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    }