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 }