001    /*
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * ACL Lab, School of Computer Science, Montreal, QC
005     * Date: 2002-8-27
006     * Time: 21:51:21
007     */
008    package EVolve.util;
009    
010    import EVolve.visualization.*;
011    import EVolve.visualization.Dimension;
012    import EVolve.data.*;
013    import EVolve.*;
014    import java.awt.*;
015    import java.util.StringTokenizer;
016    
017    public class VizInfo {
018        private VisualizationFactory factory;
019        private ElementDefinition subjectDefinition; // definition of the subject
020        private int subjectIndex;
021        private Dimension[] dimension; // dimension of the visualization
022        private PredictorFactory predictor;
023        private int interval;
024        private String windowTitle;
025        private Rectangle windowPos;
026        private int beginCall;
027        private int endCall;
028        private float match;
029        private String options;
030    
031        private ElementDefinition[] elementDefinition; // definition of elements that can be used as subject
032        private DataFilter[][][] dataFilter; // data filters that can be used by the dimensions
033        private VisualizationDefinition definition; // definition of the visualization
034    
035        private boolean validCallRange;
036    
037    
038        public VizInfo() {
039            factory = null;
040            subjectDefinition = null;
041            subjectIndex = 0;
042            elementDefinition = null;
043            dataFilter = null;
044            dimension = null;
045            windowPos = null;
046            beginCall = Integer.MIN_VALUE;
047            endCall = Integer.MIN_VALUE ;
048            match = 100;
049            validCallRange = false;
050    
051            definition = null;
052            interval = -1;
053            predictor = null;
054            windowTitle = null;
055        }
056    
057        public VisualizationFactory getFactory() {
058            return factory;
059        }
060    
061        public void setFactory(VisualizationFactory factory) {
062            try {
063                createFactory(factory.getFactoryName());
064            } catch (Exception e) {
065                System.out.println("Class "+factory.getFactoryName()+" creation failed!");
066            }
067        }
068    
069        public VisualizationFactory createFactory(String name) throws Exception{
070            String fullname = "EVolve/visualization/VizFactory/" + name;
071            ClassLoader loader = ClassLoader.getSystemClassLoader();
072            factory = (VisualizationFactory)loader.loadClass(fullname).newInstance();
073    
074            factory.createDefinition();
075            definition = factory.getDefinition();
076            elementDefinition = Scene.getDataManager().getElementDefinition(definition);
077            dataFilter = new DataFilter[elementDefinition.length][definition.getDimensionDefinition().length][];
078            for (int i = 0; i < dataFilter.length; i++) {
079                for (int j = 0; j < dataFilter[i].length; j++) {
080                    dataFilter[i][j] = Scene.getDataManager().getDataFilter(elementDefinition[i], definition.getDimensionDefinition()[j].getProperty());
081                    for (int k = 0; k < dataFilter[i][j].length; k++) {
082                        assert (((dataFilter[i][j][k].getTargetType() != -1) && (dimension[j] instanceof ReferenceDimension)) || ((dataFilter[i][j][k].getTargetType() == -1) && (dimension[j] instanceof ValueDimension))) : "Incompatible dimension type.";
083                    }
084                }
085            }
086    
087            return this.factory;
088        }
089    
090        public ElementDefinition getSubject() {
091            return subjectDefinition;
092        }
093    
094        public void setSubject(ElementDefinition subject) {
095            for (int i=0;i<elementDefinition.length;i++) {
096                if (subject.getName().equals(elementDefinition[i].getName())) {
097                    subjectDefinition = elementDefinition[i];
098                    subjectIndex = i;
099                    break;
100                }
101            }
102        }
103    
104        public ElementDefinition createSubjectDefinition(String name) {
105            for (int i = 0; i < elementDefinition.length; i++) {
106                if (elementDefinition[i].getName().equals(name)) {
107                    subjectDefinition = elementDefinition[i];
108                    subjectIndex = i;
109                    break;
110                }
111            }
112    
113            return this.subjectDefinition;
114        }
115    
116        public Dimension[] getDimension() {
117            return dimension;
118        }
119    
120        public void setDimension(Dimension[] dimension) {
121            this.dimension = new Dimension[dimension.length];
122    
123            for (int i = 0; i < dimension.length; i++) {
124                this.dimension[i] = dimension[i];
125            }
126        }
127    
128        public Dimension[] createDimension(String[] defs) {
129            dimension = factory.createVisualization().createDimension();
130    
131            for (int i=0;i<dimension.length;i++) {
132                for (int j=i;j<defs.length;j++) {
133                    if (defs[j].charAt(0) == ';') continue; //a unused entry
134                    for (int k=0;k<dataFilter[subjectIndex][i].length;k++) {
135                        if (dataFilter[subjectIndex][i][k].getName().equals(defs[j])) {
136                            dimension[i].setDataFilter(dataFilter[subjectIndex][i][k]);
137                            j =  defs.length+1;
138                            break;
139                        }
140                    }
141                }
142            }
143    
144            return dimension;
145        }
146    
147        public int getInterval() {
148            return interval;
149        }
150    
151        public void setInterval(int interval) {
152            this.interval = interval;
153        }
154    
155        public Integer createInterval(String interval) {
156    
157            StringTokenizer token;
158            float values[] = new float[3];
159            int counter = 0;
160    
161            int pos = interval.indexOf(';');
162            if (pos == -1)
163                this.interval = Integer.parseInt(interval);
164            else { // exist begin/end/match
165                this.interval = Integer.parseInt(interval.substring(0,pos));
166                token = new StringTokenizer(interval.substring(pos+1)+",",",");
167                while (token.hasMoreTokens()) {
168                    values[counter++] = Float.parseFloat(token.nextToken());
169                }
170                beginCall = (int)values[0];
171                endCall = (int)values[1];
172                if (counter>2) match = values[2];
173            }
174    
175            return new Integer(this.interval);
176        }
177    
178        public PredictorFactory getPredictor() {
179            return predictor;
180        }
181    
182        public void setPredictor(PredictorFactory predictor) {
183            this.predictor = predictor;
184        }
185    
186        public PredictorFactory createPredictor(String name) {
187            if (name.charAt(0) == ';') {
188                this.predictor = null;
189            } else {
190                this.predictor = new DefaultPredictorFactory();
191            }
192    
193            return this.predictor;
194        }
195    
196        public void setWindowPosition(Rectangle position) {
197            this.windowPos = position;
198        }
199    
200        public Rectangle getWindowPosition() {
201            return this.windowPos;
202        }
203    
204        public void createWindowPosition(String x,String y,String w,String h) {
205            this.windowPos = new Rectangle(new Integer(x).intValue(),new Integer(y).intValue(),
206                                           new Integer(w).intValue(),new Integer(h).intValue());
207        }
208    
209        public void reset() {
210            factory = null;
211            subjectDefinition = null;
212            subjectIndex = 0;
213            dimension = null;
214            definition = null;
215            interval = -1;
216            predictor = null;
217            windowPos = null;
218        }
219    
220        public VisualizationDefinition getDefinition() {
221            return definition;
222        }
223    
224        public void setDefinition(VisualizationDefinition def) {
225            definition = def;
226        }
227    
228        public VisualizationDefinition creatDefinition() {
229            return null;
230        }
231    
232        public String getTitle() {
233            return windowTitle;
234        }
235    
236        public void createTitle(String title) {
237            this.windowTitle = title;
238        }
239    
240        public int getBeginCall() {
241            return beginCall;
242        }
243    
244        public int getEndCall() {
245            return endCall;
246        }
247    
248        public float getMatch() {
249            return match;
250        }
251    
252        public boolean isValidCallRange() {
253            return validCallRange;
254        }
255    
256        //options are in string format
257        public String getOptions() {
258            return options;
259        }
260    
261        public void setOptions(String options) {
262            this.options = options;
263        }
264    
265        public void createOptions(String options) {
266            this.options = options;
267        }
268    }