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