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