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 }