001    /* EVolve - an Extensible Software Visualization Framework
002     * Copyright (C) 2001-2002 Qin Wang
003     *
004     * This library is free software; you can redistribute it and/or
005     * modify it under the terms of the GNU Library General Public
006     * License as published by the Free Software Foundation; either
007     * version 2 of the License, or (at your option) any later version.
008     *
009     * This library is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
012     * Library General Public License for more details.
013     *
014     * You should have received a copy of the GNU Library General Public
015     * License along with this library; if not, write to the
016     * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
017     * Boston, MA 02111-1307, USA.
018     */
019    
020    /*
021     * EVolve is distributed at http://www.sable.mcgill.ca/EVolve/
022     */
023    
024    package EVolve.visualization;
025    
026    import EVolve.*;
027    import EVolve.data.*;
028    import EVolve.util.*;
029    import java.util.*;
030    
031    public class ReferenceDimension extends Dimension {
032        private ArrayList comparatorList;
033    
034        private int currentOrder;
035        private int[] order;
036        private Entity[] entity;
037        private Entity[] linkedEntity;
038        private int selectedIndex;
039        private int entityNumber;
040    
041        private Sorter sorter;
042    
043        public ReferenceDimension() {
044            comparatorList = new ArrayList();
045            linkedEntity = null;
046            selectedIndex = 0;
047            entityNumber = -1;
048        }
049    
050        public int getMaxEntityNumber() {
051            return Scene.getDataManager().getEntity()[dataFilter.getTargetType()].length;
052        }
053    
054        public int getEntityNumber() {
055            return (entityNumber == -1) ? entity.length : entityNumber;
056        }
057    
058        public int getField(Element element) {
059            int returnVal = dataFilter.getData(element);
060            if (order[returnVal] == Integer.MAX_VALUE) {
061                order[returnVal] = currentOrder;
062                currentOrder++;
063            }
064            return returnVal;
065        }
066    
067        public void preVisualize() {
068            currentOrder = 0;
069            order = new int[getMaxEntityNumber()];
070            for (int i = 0; i < order.length; i++) {
071                order[i] = Integer.MAX_VALUE;
072            }
073        }
074    
075        public void visualize() {
076            if (linkedEntity == null) {
077                entity = new Entity[currentOrder];
078    
079                for (int i = 0; i < order.length; i++) {
080                    if (order[i] != Integer.MAX_VALUE) {
081                        entity[order[i]] = Scene.getDataManager().getEntity()[dataFilter.getTargetType()][i];
082                    }
083                }
084            } else { //linked
085                int free,i;
086                //try {
087                entityNumber = currentOrder;
088                entity = new Entity[linkedEntity.length];
089                free = currentOrder;
090                for (i = 0; i< order.length; i++) {
091                    if (order[i] != Integer.MAX_VALUE) {
092                        entity[order[i]] = linkedEntity[i];
093                    } else {
094                        entity[free] = linkedEntity[i];
095                        free++;
096                    }
097                }
098                /*} catch (Exception e) {
099                    int kk;
100                    kk=0;
101                    kk = kk+1;
102                    kk =kk *2;
103                }
104                for(int i=0; i<entity.length; i++) {
105                    if (entity[i] == null) {
106                        System.out.println(i);
107                    }
108                }*/
109            }
110    
111            comparatorList.clear();
112            comparatorList.add(new LexicalComparator());
113            comparatorList.add(new ValueComparator("Temporal", true, order));
114            ArrayList entityComparatorList = ((EntityDefinition)(Scene.getDataManager().getElementDefinition()[dataFilter.getTargetType()])).getComparator();
115            for (int i = 0; i < entityComparatorList.size(); i++) {
116                comparatorList.add(entityComparatorList.get(i));
117            }
118    
119            sorter = new Sorter(entity, (EntityComparator)(comparatorList.get(selectedIndex)));
120    
121            // we generate an exception on purpose
122            if (entity.length == 0) entity[0] = null;
123        }
124    
125        public Entity getEntity(int index) {
126            int id = sorter.getSource(index);
127            if ((id < entity.length) && (id >= 0))
128                return entity[id];
129            else
130                return null;
131        }
132    
133        public ArrayList getComparator() {
134            return comparatorList;
135        }
136    
137        public void selectComparator(int selectedIndex) {
138            sorter = new Sorter(entity, (EntityComparator)(comparatorList.get(selectedIndex)));
139            this.selectedIndex = selectedIndex;
140        }
141    
142        public void addComparator(EntityComparator comparator) {
143            comparatorList.add(comparator);
144        }
145    
146        public int getSortedIndex(int entityIndex) {
147            if (order[entityIndex] == Integer.MAX_VALUE) {
148                return -1;
149            } else {
150                return sorter.getTarget(order[entityIndex]);
151            }
152        }
153    
154        public void makeSelection(int[] selection) {
155            if (selection.length != 0) {
156                int[] selected = new int[selection.length];
157                for (int i = 0; i < selected.length; i++) {
158                    selected[i] = entity[sorter.getSource(selection[i])].getId();
159                }
160                Scene.getFilter().addSelection(new Selection(dataFilter.getTargetType(), selected, 0, Integer.MAX_VALUE));
161            }
162        }
163    
164        public void makeSelection(int[] selection, int start, int end) {
165            if (selection.length != 0) {
166                int[] selected = new int[selection.length];
167                for (int i = 0; i < selected.length; i++) {
168                    selected[i] = entity[sorter.getSource(selection[i])].getId();
169                }
170                Scene.getFilter().addSelection(new Selection(dataFilter.getTargetType(), selected, start, end));
171            }
172        }
173    
174        public Entity[] getEntity() {
175            return entity;
176        }
177    
178        public int getSourceIndex(int index) {
179            int orderValue = sorter.getSource(index);
180            for (int i=0; i<order.length;i++) {
181                if (order[i]==orderValue) {
182                    return i;
183                }
184            }
185            return -1;
186        }
187    
188        public int getTargetIndex(int index) {
189            int orderValue = order[index];
190    
191            return sorter.getTarget(orderValue);
192        }
193    
194        public void linkEntities(Entity [] linkedEntity) {
195            this.linkedEntity = linkedEntity;
196        }
197    
198        public void clearEntityMap() {
199            linkedEntity = null;
200            entity = null;
201        }
202    
203        public int getSelectedComparatorIndex() {
204            return selectedIndex;
205        }
206    
207        public String getSelectedComparatorName() {
208    
209            return ((EntityComparator)comparatorList.get(selectedIndex)).getName();
210        }
211    
212        public int[] getOrdering() {
213            return order;
214        }
215    
216        public void setOrdering(int[] newOrder) {
217            order = newOrder;
218        }
219    
220    }