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 java.awt.*; 029 import java.awt.event.*; 030 import java.util.*; 031 import javax.swing.*; 032 033 public class VisualizationManager { 034 private VisualizationFactory[] factory; 035 private ArrayList visualizationList; 036 private ArrayList toVisualize; 037 private Visualization[][] visualization; 038 039 private JDialog dialog; 040 private JList listVisualization; 041 private DefaultListModel model; 042 043 public VisualizationManager(VisualizationFactory[] factory) { 044 this.factory = factory; 045 this.visualizationList = new ArrayList(); 046 this.toVisualize = new ArrayList(); 047 this.dialog = null; 048 } 049 050 public void init() { 051 visualizationList.clear(); 052 toVisualize.clear(); 053 } 054 055 private void createDialog() { 056 dialog = new JDialog(Scene.getFrame(), "Select Visualizations", true); 057 model = new DefaultListModel(); 058 listVisualization = new JList(model); 059 listVisualization.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 060 061 JScrollPane scrollPane = new JScrollPane(listVisualization); 062 scrollPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Choose visualizations")); 063 dialog.getContentPane().add(scrollPane, BorderLayout.CENTER); 064 065 JPanel panelButton = new JPanel(new FlowLayout()); 066 dialog.getContentPane().add(panelButton, BorderLayout.SOUTH); 067 068 JButton buttonApply = new JButton("Apply"); 069 buttonApply.addActionListener(new ActionListener() { 070 public void actionPerformed(ActionEvent e) { 071 dialogApply(); 072 } 073 }); 074 panelButton.add(buttonApply); 075 076 JButton buttonCancel = new JButton("Cancel"); 077 buttonCancel.addActionListener(new ActionListener() { 078 public void actionPerformed(ActionEvent e) { 079 dialogCancel(); 080 } 081 }); 082 panelButton.add(buttonCancel); 083 } 084 085 public String[] getFactoryName() { 086 ArrayList list = new ArrayList(); 087 for (int i = 0; i < factory.length; i++) { 088 ElementDefinition[] temp = Scene.getDataManager().getElementDefinition(factory[i].getDefinition()); 089 if (temp.length != 0) { 090 list.add(factory[i]); 091 } 092 } 093 094 String[] returnVal = new String[list.size()]; 095 for (int i = 0; i < returnVal.length; i++) { 096 returnVal[i] = ((VisualizationFactory)(list.get(i))).getName(); 097 } 098 return returnVal; 099 } 100 101 public Visualization newVisualization(String name) { 102 Visualization newVisualization = null; 103 104 for (int i = 0; i < factory.length; i++) { 105 if (name.equals(factory[i].getName())) { 106 newVisualization = factory[i].createVisualization(); 107 newVisualization.setName(name); 108 newVisualization.setFactory(factory[i]); 109 newVisualization.setDefinition(factory[i].getDefinition()); 110 break; 111 } 112 } 113 visualizationList.add(newVisualization); 114 toVisualize.add(newVisualization); 115 Scene.getUIManager().addVisualization(newVisualization); 116 return newVisualization; 117 } 118 119 public void removeVisualization(Visualization visualization) { 120 visualizationList.remove(visualization); 121 toVisualize.remove(visualization); 122 } 123 124 public void preVisualize() { 125 if (dialog == null) { 126 createDialog(); 127 } 128 129 int[] selected = new int[toVisualize.size()]; 130 int selectedCounter = 0; 131 132 model.removeAllElements(); 133 134 for (int i = 0; i < visualizationList.size(); i++) { 135 model.addElement(((Visualization)(visualizationList.get(i))).getName()); 136 if (toVisualize.indexOf(visualizationList.get(i)) != -1) { 137 selected[selectedCounter] = i; 138 selectedCounter++; 139 } 140 } 141 142 listVisualization.setSelectedIndices(selected); 143 144 Scene.getUIManager().showDialog(dialog, 270, 360); 145 } 146 147 public void receiveEvent(EVolve.data.Event event) { 148 for (int i = 0; i < visualization[event.getType()].length; i++) { 149 visualization[event.getType()][i].receiveElement(event); 150 } 151 } 152 153 public void visualize() { 154 int i=0,j=0,k=0; 155 try { 156 for (i = 0; i < visualization.length; i++) { 157 for (j = 0; j < visualization[i].length; j++) { 158 for (k = 0; k < visualization[i][j].getDimension().length; k++) { 159 if (visualization[i][j].getDimension()[k] instanceof ReferenceDimension) { 160 ((ReferenceDimension)(visualization[i][j].getDimension()[k])).visualize(); 161 } 162 } 163 visualization[i][j].visualize(); 164 visualization[i][j].updateMenu(); 165 visualization[i][j].enableSortMenu(); 166 } 167 } 168 } catch (Exception e) { 169 Scene.showErrorMessage("Data are not enough to be visualized!"); 170 Scene.getUIManager().removeWindow(visualization[i][j].getWindow()); 171 } 172 173 } 174 175 private void dialogApply() { 176 dialog.setVisible(false); 177 178 toVisualize.clear(); 179 180 int[] selected = listVisualization.getSelectedIndices(); 181 182 for (int i = 0; i < selected.length; i++) { 183 toVisualize.add(visualizationList.get(selected[i])); 184 } 185 186 if (toVisualize.size() != 0) { 187 prepareListToBeVisualized(); 188 Scene.visualize(); 189 } 190 } 191 192 private void dialogCancel() { 193 dialog.setVisible(false); 194 } 195 196 public ArrayList getVisualizationType() { 197 ArrayList returnVal = new ArrayList(); 198 for (int i = 0; i < visualizationList.size(); i++) { 199 String s = "" + ((Visualization)(visualizationList.get(i))).getSubjectDefinition().getType() + ""; 200 if (returnVal.indexOf(s) == -1) { 201 returnVal.add(s); 202 } 203 } 204 205 return returnVal; 206 } 207 208 public VisualizationFactory getFactory(String name) { 209 VisualizationFactory retFac = null; 210 for (int i = 0; i < factory.length; i++) { 211 if (name.equals(factory[i].getName())) { 212 retFac = factory[i]; 213 break; 214 } 215 } 216 return retFac; 217 } 218 219 public void autoPreVisualize(HashMap conf) { 220 Visualization visual= (Visualization)visualizationList.get(0); 221 222 visual.autoUpdateConfiguration(conf); 223 224 toVisualize.clear(); 225 226 toVisualize.add(visualizationList.get(0)); 227 228 if (toVisualize.size() != 0) { 229 prepareListToBeVisualized(); 230 } 231 } 232 233 public void autoSaveResult(String path, String dataFn) { 234 Visualization visual= (Visualization)visualizationList.get(0); 235 visual.autoSave(path,dataFn); 236 } 237 238 public ArrayList getVisualizationList() { 239 return visualizationList; 240 } 241 242 public void prepareListToBeVisualized() { 243 visualization = new Visualization[Scene.getDataManager().getElementDefinition().length][]; 244 for (int i = 0; i < visualization.length; i++) { 245 ArrayList list = new ArrayList(); 246 for (int j = 0; j < toVisualize.size(); j++) { 247 if (((Visualization)(toVisualize.get(j))).getSubjectDefinition().getType() == i) { 248 list.add(toVisualize.get(j)); 249 } 250 } 251 visualization[i] = new Visualization[list.size()]; 252 for (int j = 0; j < visualization[i].length; j++) { 253 visualization[i][j] = (Visualization)(list.get(j)); 254 visualization[i][j].preVisualize(); 255 for (int k = 0; k < visualization[i][j].getDimension().length; k++) { 256 visualization[i][j].getDimension()[k].preVisualize(); 257 } 258 } 259 } 260 } 261 262 // following methods are used in predefined visualization 263 public void cleanup() { 264 Scene.getUIManager().clearWindowsList(); 265 for (int i=0; i<visualizationList.size(); i++) { 266 Visualization visual =(Visualization) visualizationList.get(i); 267 visual.getWindow().dispose(); 268 } 269 init(); 270 } 271 272 // following methods are used in linked visualization 273 public void addAllVisualizations() { 274 toVisualize.clear(); 275 for (int i=0; i<visualizationList.size(); i++) 276 toVisualize.add(visualizationList.get(i)); 277 } 278 279 public void prepareForLinkedViz(ArrayList viz,int beginRepaint) { 280 toVisualize.clear(); 281 282 for (int i=beginRepaint; i< viz.size(); i++) { 283 toVisualize.add(viz.get(i)); 284 } 285 if (toVisualize.size() != 0) 286 prepareListToBeVisualized(); 287 } 288 289 public Visualization prepareForAsynOverlapViz(String name) { 290 Visualization newVisualization = null; 291 292 for (int i = 0; i < factory.length; i++) { 293 if (name.equals(factory[i].getName())) { 294 newVisualization = factory[i].createVisualization(); 295 newVisualization.setName(name); 296 newVisualization.setFactory(factory[i]); 297 newVisualization.setDefinition(factory[i].getDefinition()); 298 break; 299 } 300 } 301 return newVisualization; 302 } 303 304 public void viuslizeNow() { 305 Visualization visual = null; 306 for (int k = 0; k< visualizationList.size(); k++) { 307 visual = (Visualization)visualizationList.get(k); 308 if (visual.getWindow().isSelected()) { 309 visualization = new Visualization[Scene.getDataManager().getElementDefinition().length][]; 310 for (int i = 0; i < visualization.length; i++) { 311 ArrayList list = new ArrayList(); 312 if (visual.getSubjectDefinition().getType() == i) { 313 list.add(visual); 314 } 315 visualization[i] = new Visualization[list.size()]; 316 for (int j = 0; j < visualization[i].length; j++) { 317 visualization[i][j] = (Visualization)(list.get(j)); 318 visualization[i][j].preVisualize(); 319 for (int l = 0; l < visualization[i][j].getDimension().length; l++) { 320 (visualization[i][j].getDimension()[l]).preVisualize(); 321 } 322 } 323 } 324 325 Scene.visualize(); 326 break; 327 } 328 } 329 } 330 } 331