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;
025    
026    import java.awt.*;
027    import java.awt.event.*;
028    import java.util.ArrayList;
029    import javax.swing.*;
030    import javax.swing.event.*;
031    import EVolve.data.DataManager;
032    import EVolve.util.HelperFuncs;
033    import EVolve.util.predefinedutils.VisualizationSerializer;
034    import EVolve.util.predefinedutils.*;
035    import EVolve.util.overlappers.OverlapVisualization;
036    import EVolve.util.phasedetectors.phasedetectorUI.PhaseDetectorToolBar;
037    import EVolve.util.settings.SceneSetting;
038    import EVolve.visualization.Visualization;
039    
040    public class UIManager {
041        private JFrame frame;
042        private JDesktopPane desktop;
043        private boolean doNotRemoveWindow;
044    
045        private ArrayList windowList;
046    
047        private JPanel panelStatus;
048        private JLabel labelStatus;
049    
050        private JMenuBar menuBar;
051    
052        private JMenu menuFile;
053        private JMenuItem itemLoad;
054        private JMenuItem itemAddDataSource;
055        private JMenuItem itemExit;
056        private JMenuItem itemRemoveDataSource;
057    
058        private JMenu menuVisualization;
059        private JMenu menuNew;
060        private JMenuItem[] itemNew;
061        private JMenuItem itemVisualize;
062    
063        private JMenu menuWindow;
064        private JMenuItem itemArrange;
065    
066        /** added functions */
067        private JMenu menuTool;
068    
069        private JMenu menuBatch;
070        private JMenuItem itemBuildBatch;
071        private JMenuItem itemRunBatch;
072    
073        private JMenuItem itemReadSetting;
074        private JMenuItem itemSaveSetting;
075    
076        private JMenu menuOverlapViz;
077    
078        private JCheckBoxMenuItem itemDebug;
079    
080        private JMenuItem[] itemSettings;
081        private JMenuItem itemSynOverlap;
082        private JMenuItem itemAsynOverlap;
083    
084        private JMenuItem itemEnablePhaseDetector;
085    
086        private JMenu menuOptions;
087        private JMenuItem itemPath;
088    
089        private JMenu menuHelp;
090        private JMenuItem itemAbout;
091    
092        private JDialog dialog;
093        private JComboBox comboColumn;
094        private JList listVisualization;
095        private DefaultListModel model;
096    
097        private JDialog dialogAbout;
098    
099        private String lastConfigDir, lastDataDir, lastResultDir;
100    
101        private JToolBar toolbar;
102        private EVolve.util.phasedetectors.phasedetectorUI.PhaseDetectorToolBar toolbarPhaseDetector;
103        private JButton tblVizNow, tblConfigure;
104        private JComboBox tblComboDataSource;
105    
106        private JList listDataSource;
107        private JDialog dialogDataSource;
108    
109        public UIManager() {
110            try {
111                javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getCrossPlatformLookAndFeelClassName());
112            } catch (Exception e) {}
113    
114            frame = new JFrame(Scene.VERSION);
115    
116            ImageIcon icon = new ImageIcon(this.getClass().getResource("img/logo_icon.gif"));
117            frame.setIconImage(icon.getImage());
118    
119            frame.addWindowListener(new WindowAdapter() {
120                public void windowClosing(WindowEvent e) {
121                    System.exit(0);
122                }
123            });
124    
125            frame.setBounds(0, 0, Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
126    
127            windowList = new ArrayList();
128    
129            createMenu();
130    
131            createToolBar();
132            frame.getContentPane().add(toolbar, BorderLayout.NORTH);
133    
134    
135            desktop = new JDesktopPane();
136            desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
137            frame.getContentPane().add(desktop, BorderLayout.CENTER);
138    
139            panelStatus = new JPanel(new BorderLayout());
140            panelStatus.setBackground(new Color(240, 240, 240));
141            panelStatus.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLoweredBevelBorder(), BorderFactory.createLineBorder(new Color(240, 240, 240), 2)));
142            frame.getContentPane().add(panelStatus, BorderLayout.SOUTH);
143    
144            labelStatus = new JLabel(Scene.VERSION);
145            panelStatus.add(labelStatus, BorderLayout.WEST);
146    
147            frame.setVisible(true);
148    
149            createDialog();
150            createAbout();
151            doNotRemoveWindow = false;
152    
153            lastDataDir = "";
154            lastConfigDir = "";
155            lastResultDir="";
156        }
157    
158        private void createMenu() {
159            menuBar = new JMenuBar();
160            frame.setJMenuBar(menuBar);
161    
162            menuFile = new JMenu("File");
163            menuFile.setMnemonic(KeyEvent.VK_F);
164            menuFile.addMenuListener(new MenuListener() {
165                public void menuCanceled(MenuEvent e) {}
166                public void menuDeselected(MenuEvent e) {}
167                public void menuSelected(MenuEvent e) {
168                    menuFile.removeAll();
169                    menuFile.add(itemLoad);
170                    menuFile.addSeparator();
171                    for (int i=0; i<Main.availableDataSource.size(); i++) {
172                        JMenuItem item = new JMenuItem(((char)(i + 48)) + " - Load a " + Main.availableDataSource.get(i) + " Trace");
173                        item.setMnemonic(i + 48);
174                        item.addActionListener(new ActionListener() {
175                            public void actionPerformed(ActionEvent e) {
176                                String menuSelected = ((JMenuItem)e.getSource()).getText();
177                                String name = menuSelected.substring(11,menuSelected.length()-6);
178                                boolean success = addDataSource(name);
179                                if (success)
180                                    loadDataSource();
181                            }
182                        });
183                        menuFile.add(item);
184                    }
185                    menuFile.addSeparator();
186                    menuFile.add(itemAddDataSource);
187                    menuFile.add(itemRemoveDataSource);
188                    for (int i=0; i<Main.availableDataSource.size(); i++) {
189                        JMenuItem item = new JMenuItem(((char)(i + 65)) + " - Add " + Main.availableDataSource.get(i));
190                        item.setMnemonic(i + 65);
191                        item.addActionListener(new ActionListener() {
192                            public void actionPerformed(ActionEvent e) {
193                                String name = ((JMenuItem)(e.getSource())).getText().substring(8);
194                                addDataSource(name);
195                            }
196                        });
197                        menuFile.add(item);
198                    }
199    
200                    menuFile.addSeparator();
201                    menuFile.add(itemExit);
202                }
203            });
204    
205            menuBar.add(menuFile);
206    
207            itemLoad = new JMenuItem("Load Data...");
208            itemLoad.setMnemonic(KeyEvent.VK_L);
209            itemLoad.addActionListener(new ActionListener() {
210                public void actionPerformed(ActionEvent e) {
211                    loadDataSource();
212                }
213            });
214    
215            itemAddDataSource = new JMenuItem("Add Data Source...");
216            itemAddDataSource.setMnemonic(KeyEvent.VK_A);
217            itemAddDataSource.addActionListener(new ActionListener() {
218                public void actionPerformed(ActionEvent e) {
219                    String name = JOptionPane.showInputDialog(getDesktop(),"Name of the new data source:");
220                    if (name != null) {
221                        addDataSource(name);
222                    }
223                }
224            });
225    
226            itemRemoveDataSource = new JMenuItem("Remove Data Source...");
227            itemRemoveDataSource.setMnemonic(KeyEvent.VK_R);
228            itemRemoveDataSource.addActionListener(new ActionListener() {
229                public void actionPerformed(ActionEvent e) {
230                    removeDataSource();
231                }
232            });
233    
234            itemExit = new JMenuItem("Exit");
235            itemExit.setMnemonic(KeyEvent.VK_X);
236            itemExit.addActionListener(new ActionListener() {
237                public void actionPerformed(ActionEvent e) {
238                    System.exit(0);
239                }
240            });
241    
242            menuVisualization = new JMenu("Visualization");
243            menuVisualization.setMnemonic(KeyEvent.VK_V);
244            menuBar.add(menuVisualization);
245            menuVisualization.addMenuListener(new MenuListener() {
246                public void menuSelected(MenuEvent e) {
247                    menuVisualization.removeAll();
248                    menuVisualization.add(menuNew);
249                    menuVisualization.add(itemVisualize);
250                    menuVisualization.add(itemReadSetting);
251                    menuVisualization.add(itemSaveSetting);
252    
253                    itemSettings = new JMenuItem[Scene.getToolsManager().getPredefinedVisualizationRunner().getPredefinedVisualizationNumber()];
254                    for (int i = 0; i < itemSettings.length; i++) {
255                        String addConfigureName = Scene.getToolsManager().getPredefinedVisualizationRunner().getConfigureName(i);
256                        itemSettings[i] = new JMenuItem(addConfigureName);
257                        itemSettings[i].addActionListener(new ActionListener() {
258                            public void actionPerformed(ActionEvent e) {
259                                PredefinedVisualizationRunner runner = Scene.getToolsManager().getPredefinedVisualizationRunner();
260                                int selected = runner.getIdFromName(((JMenuItem)(e.getSource())).getText());
261                                runner.setSelected(selected);
262                                runner.runPredefinedVisualization();
263                            }
264                        });
265                    }
266                    if (itemSettings.length > 0) {
267                        menuVisualization.addSeparator();
268                        for (int i=0; i<itemSettings.length; i++)
269                            menuVisualization.add(itemSettings[i]);
270                    }
271                    enablePredefinedMenu();
272                }
273    
274                public void menuDeselected(MenuEvent e) {};
275                public void menuCanceled(MenuEvent e) {};
276            });
277    
278            itemVisualize = new JMenuItem("Visualize...");
279            itemVisualize.setMnemonic(KeyEvent.VK_V);
280            itemVisualize.addActionListener(new ActionListener() {
281                public void actionPerformed(ActionEvent e) {
282                    Scene.getVisualizationManager().preVisualize();
283                }
284            });
285            menuVisualization.add(itemVisualize);
286    
287            itemReadSetting = new JMenuItem("Load Predefined Viz Setting");
288            itemReadSetting.setMnemonic(KeyEvent.VK_L);
289            itemReadSetting.addActionListener(new ActionListener() {
290                public void actionPerformed(ActionEvent e) {
291                    VisualizationSerializer.v().loadConfiguration();
292                    enableFileMenus();
293                }
294            });
295            itemSaveSetting = new JMenuItem("Save Current Viz Setting");
296            itemSaveSetting.setMnemonic(KeyEvent.VK_S);
297            itemSaveSetting.addActionListener(new ActionListener() {
298                public void actionPerformed(ActionEvent e) {
299                    ArrayList vizList = Scene.getVisualizationManager().getVisualizationList();
300                    if (vizList.size() == 0) return;
301    
302                    VisualizationSerializer.v().showSavingDialog();
303                }
304            });
305    
306            menuNew = new JMenu("New");
307            menuNew.setMnemonic(KeyEvent.VK_N);
308            menuVisualization.add(menuNew);
309    
310            menuWindow = new JMenu("Window");
311            menuWindow.setMnemonic(KeyEvent.VK_W);
312            menuWindow.addMenuListener(new MenuListener() {
313                public void menuSelected(MenuEvent e) {
314                    menuWindow.removeAll();
315                    menuWindow.add(itemArrange);
316                    for (int i=0; i<windowList.size(); i++){
317                        JMenuItem item = new JMenuItem(((char)(i + 65)) + " - " + ((Window)windowList.get(i)).getTitle());
318                        item.setMnemonic(i + 65);
319                        item.addActionListener(new ActionListener() {
320                           public void actionPerformed(ActionEvent e) {
321                               Window selected = null;
322                               for (int i=0; i<windowList.size(); i++) {
323                                   selected = (Window)windowList.get(i);
324                                   if (((JMenuItem)(e.getSource())).getText().substring(4).equals(selected.getTitle())) {
325                                       break;
326                                   }
327                               }
328                               if (selected != null) {
329                                   try {
330                                    selected.setIcon(false);
331                                   } catch (Exception exp) {}
332                                   selected.moveToFront();
333                                   selected.setVisible(true);
334                               }
335                           }
336                        });
337                        menuWindow.add(item);
338                    }
339                }
340    
341                public void menuDeselected(MenuEvent e) {};
342                public void menuCanceled(MenuEvent e) {};
343            });
344            menuBar.add(menuWindow);
345    
346            itemArrange = new JMenuItem("Arrange...");
347            itemArrange.setMnemonic(KeyEvent.VK_A);
348            itemArrange.addActionListener(new ActionListener() {
349                public void actionPerformed(ActionEvent e) {
350                    arrange();
351                }
352            });
353            menuWindow.add(itemArrange);
354    
355            menuTool = new JMenu("Tools");
356            menuTool.setMnemonic(KeyEvent.VK_T);
357            menuBar.add(menuTool);
358    
359            itemBuildBatch = new JMenuItem("Build Batch");
360            itemBuildBatch.setMnemonic(KeyEvent.VK_B);
361            itemBuildBatch.addActionListener(new ActionListener() {
362                public void actionPerformed(ActionEvent e) {
363                    Scene.getToolsManager().getBatchRunner().showWindow();
364                 }
365            });
366            itemRunBatch = new JMenuItem("Run Batch");
367            itemRunBatch.setMnemonic(KeyEvent.VK_R);
368            itemRunBatch.addActionListener(new ActionListener() {
369                public void actionPerformed(ActionEvent e) {
370                    if (Scene.getToolsManager().getBatchRunner() != null)
371                        Scene.getToolsManager().getBatchRunner().runBatch();
372                }
373            });
374            menuBatch = new JMenu("Auto Generate Visualizations");
375            menuBatch.setMnemonic(KeyEvent.VK_A);
376            menuBatch.add(itemBuildBatch);
377            menuBatch.add(itemRunBatch);
378    
379            itemSynOverlap = new JMenuItem("Overlap Visualizations...");
380            itemSynOverlap.setMnemonic(KeyEvent.VK_O);
381            itemSynOverlap.addActionListener(new ActionListener() {
382                public void actionPerformed(ActionEvent e) {
383                    Scene.getToolsManager().getOverlapVisualizationRunner().getSynOverlapper().showWindow();
384                }
385            });
386            itemAsynOverlap = new JMenuItem("Auto Overlap Visualizations ...");
387            itemAsynOverlap.setMnemonic(KeyEvent.VK_A);
388            itemAsynOverlap.addActionListener(new ActionListener() {
389                public void actionPerformed(ActionEvent e) {
390                    Scene.getToolsManager().getOverlapVisualizationRunner().getAsynOverlapper().showWindow();
391                }
392            });
393            menuOverlapViz = new JMenu("Overlap Visualizations");
394            menuOverlapViz.setMnemonic(KeyEvent.VK_O);
395            menuOverlapViz.add(itemSynOverlap);
396            menuOverlapViz.add(itemAsynOverlap);
397    
398            itemEnablePhaseDetector = new JMenuItem("Enable Phase Detector");
399            itemEnablePhaseDetector.setMnemonic(KeyEvent.VK_E);
400            itemEnablePhaseDetector.addActionListener(new ActionListener() {
401                public void actionPerformed(ActionEvent e) {
402                    toolbarPhaseDetector.setVisible(true);
403                    refreshToolBar();
404                    Scene.getVisualizationManager().enablePhaseDetector(true);
405                }
406            });
407    
408            itemDebug = new JCheckBoxMenuItem("In debugging");
409            itemDebug.setMnemonic(KeyEvent.VK_D);
410            itemDebug.addActionListener(new ActionListener() {
411                public void actionPerformed(ActionEvent e) {
412                    HelperFuncs.inDebug = itemDebug.isSelected();
413                }
414            });
415            itemDebug.setSelected(false);
416    
417            menuTool.add(menuBatch);
418            menuTool.add(menuOverlapViz);
419            //menuTool.add(itemLinkViz);
420            menuTool.add(itemEnablePhaseDetector);
421            //menuTool.add(itemDebug);
422    
423            menuOptions = new JMenu("Options");
424            menuOptions.setMnemonic(KeyEvent.VK_O);
425            menuBar.add(menuOptions);
426    
427            itemPath = new JMenuItem("Setting Path...");
428            itemPath.setMnemonic(KeyEvent.VK_S);
429            itemPath.addActionListener(new ActionListener() {
430                public void actionPerformed(ActionEvent e) {
431                    SceneSetting.v().showSettingDialog();
432                }
433            });
434    
435            menuOptions.add(itemPath);
436    
437            menuHelp = new JMenu("Help");
438            menuHelp.setMnemonic(KeyEvent.VK_H);
439            menuBar.add(menuHelp);
440    
441            itemAbout = new JMenuItem("About EVolve...");
442            itemAbout.setMnemonic(KeyEvent.VK_A);
443            itemAbout.addActionListener(new ActionListener() {
444                public void actionPerformed(ActionEvent e) {
445                    showDialog(dialogAbout, 300, 150);
446                }
447            });
448            menuHelp.add(itemAbout);
449        }
450    
451        private void createToolBar() {
452            toolbar = new JToolBar();
453            toolbar.setPreferredSize(new java.awt.Dimension(frame.getWidth(),31));
454            FlowLayout layout = new FlowLayout(FlowLayout.LEFT,2,0);
455            layout.layoutContainer(toolbar);
456            toolbar.setLayout(layout);
457            toolbar.setFloatable(false);
458            toolbar.setRollover(true);
459            toolbar.setBackground(new Color(207,207,207));
460    
461            tblComboDataSource = new JComboBox();
462            ArrayList dmList = Scene.getDataSourceManager().getDataManagerList();
463            for (int i=0; i<dmList.size(); i++) {
464                tblComboDataSource.addItem(((DataManager)dmList.get(i)).getDatasourceName());
465            }
466            tblComboDataSource.addActionListener(new ActionListener() {
467                public void actionPerformed(ActionEvent e) {
468                    DataSourceManager dsm = Scene.getDataSourceManager();
469                    dsm.switchDataSource(tblComboDataSource.getSelectedIndex());
470                    if (Scene.getDataManager().isDataLoaded() == false) {
471                        disableFunctionMenus();
472                    } else {
473                        enableMenu();
474                    }
475                }
476            });
477    
478            tblConfigure = new JButton(new ImageIcon(Scene.getGifURL("config.gif")));
479            tblConfigure.setToolTipText("Configure Current Visualization");
480            tblConfigure.addActionListener(new ActionListener() {
481                public void actionPerformed(ActionEvent e) {
482                    Visualization visual = Scene.getVisualizationManager().getActiveVisualization();
483                    if (visual != null) visual.configure();
484                }
485            });
486            tblConfigure.setPreferredSize(new java.awt.Dimension(28,28));
487    
488            tblVizNow = new JButton(new ImageIcon(Scene.getGifURL("vizNow.gif")));
489            tblVizNow.setToolTipText("Visualize Current Visualization Now");
490            tblVizNow.addActionListener(new ActionListener() {
491                public void actionPerformed(ActionEvent e) {
492                    Scene.getVisualizationManager().visualizeNow();
493                }
494            });
495            tblVizNow.setPreferredSize(new java.awt.Dimension(28,28));
496    
497            toolbarPhaseDetector = new EVolve.util.phasedetectors.phasedetectorUI.PhaseDetectorToolBar();
498            toolbarPhaseDetector.setVisible(false);
499    
500            toolbar.add(new JLabel("Data Source: "));
501            toolbar.add(tblComboDataSource);
502            toolbar.add(tblConfigure);
503            toolbar.add(tblVizNow);
504            toolbar.add(toolbarPhaseDetector);
505    
506            toolbar.addContainerListener(new ContainerAdapter() {
507                public void componentAdded(ContainerEvent e) {
508                    refreshToolBar();
509                }
510    
511                public void componentRemoved(ContainerEvent e) {
512                    refreshToolBar();
513                }
514            });
515        }
516    
517        private void createDialog() {
518            dialog = new JDialog(frame, "Select Windows", true);
519            model = new DefaultListModel();
520            listVisualization = new JList(model);
521            listVisualization.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
522    
523            JPanel panelColumn = new JPanel(new FlowLayout());
524            dialog.getContentPane().add(panelColumn, BorderLayout.NORTH);
525    
526            panelColumn.add(new JLabel("Number of column: "));
527    
528            comboColumn = new JComboBox();
529            comboColumn.addItem("   1   ");
530            comboColumn.addItem("   2   ");
531            comboColumn.addItem("   3   ");
532            comboColumn.addItem("   4   ");
533            panelColumn.add(comboColumn);
534    
535            JScrollPane scrollPane = new JScrollPane(listVisualization);
536            scrollPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Choose windows"));
537            dialog.getContentPane().add(scrollPane, BorderLayout.CENTER);
538    
539            JPanel panelButton = new JPanel(new FlowLayout());
540            dialog.getContentPane().add(panelButton, BorderLayout.SOUTH);
541    
542            JButton buttonApply = new JButton("Apply");
543            buttonApply.addActionListener(new ActionListener() {
544                public void actionPerformed(ActionEvent e) {
545                    dialogApply();
546                }
547            });
548            panelButton.add(buttonApply);
549    
550            JButton buttonCancel = new JButton("Cancel");
551            buttonCancel.addActionListener(new ActionListener() {
552                public void actionPerformed(ActionEvent e) {
553                    dialogCancel();
554                }
555            });
556            panelButton.add(buttonCancel);
557        }
558    
559        public void createAbout() {
560            dialogAbout = new JDialog(frame, "About EVolve", true);
561            dialogAbout.getContentPane().setBackground(new Color(240, 240, 240));
562            dialogAbout.getContentPane().add(new JLabel(new ImageIcon(this.getClass().getResource("img/logo_about.gif"))), BorderLayout.CENTER);
563        }
564    
565        public void init() {
566            if (doNotRemoveWindow) return;
567            /*windowList.clear();
568            JInternalFrame[] frame = desktop.getAllFrames();
569            for (int i = 0; i < frame.length; i++) {
570                frame[i].dispose();
571            }*/
572            ArrayList vizList = Scene.getVisualizationManager().getVisualizationList();
573            ArrayList newWindowList = new ArrayList();
574            int datasourceId = Scene.getDataSourceManager().getCurrentDataSourceId();
575            for (int i=0; i<vizList.size(); i++) {
576                Visualization visual = (Visualization)vizList.get(i);
577                EVolve.Window window = visual.getWindow();
578                if (visual.getDataSourceId() == datasourceId)
579                    window.dispose();
580                else
581                    newWindowList.add(window);
582            }
583            windowList = newWindowList;
584    
585            disableFunctionMenus();
586            menuWindow.setEnabled(false);
587        }
588    
589        public JFrame getFrame() {
590            return frame;
591        }
592    
593        public void setStatus(String status) {
594            labelStatus.setText(status);
595        }
596    
597        public void enableMenu() {
598            menuNew.removeAll();
599            String[] name = Scene.getVisualizationManager().getFactoryName();
600            itemNew = new JMenuItem[name.length];
601            for (int i = 0; i < itemNew.length; i++) {
602                itemNew[i] = new JMenuItem(((char)(i + 65)) + " - " + name[i]);
603                itemNew[i].setMnemonic(i + 65);
604                itemNew[i].addActionListener(new ActionListener() {
605                    public void actionPerformed(ActionEvent e) {
606                        Scene.getVisualizationManager().newVisualization(((JMenuItem)(e.getSource())).getText().substring(4));
607                    }
608                });
609                menuNew.add(itemNew[i]);
610            }
611    
612            //menuVisualization.setEnabled(true);
613            menuNew.setEnabled(true);
614            itemVisualize.setEnabled(true);
615            menuWindow.setEnabled(true);
616            enablePredefinedMenu();
617            updateToolbarButtons(windowList.size() > 0);
618        }
619    
620        public void enableFileMenus() {
621            menuFile.setEnabled(true);
622            menuTool.setEnabled(true);
623        }
624    
625        public void showDialog(JDialog dialog, int width, int height) {
626            dialog.setBounds((Toolkit.getDefaultToolkit().getScreenSize().width - width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - height) / 2, width, height);
627            dialog.setVisible(true);
628        }
629    
630        public void addVisualization(Visualization visualization) {
631            Window newWindow = new Window(visualization);
632            newWindow.setBounds(0, 0, desktop.getSize().width, desktop.getSize().height);
633            newWindow.setVisible(true);
634    
635            desktop.add(newWindow);
636            newWindow.addInternalFrameListener(new InternalFrameAdapter() {
637                public void internalFrameActivated(InternalFrameEvent e) {
638                    Visualization visual = Scene.getVisualizationManager().getActiveVisualization();
639                    if (visual != null) {
640                        switchDataSource(visual.getDataSourceId());
641                    }
642                    refreshToolBar();
643                }
644    
645                public void internalFrameClosed(InternalFrameEvent e) {
646                    refreshToolBar();
647                }
648    
649                public void internalFrameOpened(InternalFrameEvent e) {
650                    refreshToolBar();
651                }
652            });
653            try {
654                newWindow.setSelected(true);
655            } catch (Exception e) {};
656    
657            windowList.add(newWindow);
658    
659            visualization.setWindow(newWindow);
660            updateToolbarButtons(windowList.size() > 0);
661            refreshToolBar();
662        }
663    
664        public Window addOverlappedVisualization(OverlapVisualization visual) {
665            Window newWindow = new Window(visual);
666            newWindow.setBounds(0, 0, desktop.getSize().width/2, desktop.getSize().height/2);
667            newWindow.setVisible(true);
668    
669            desktop.add(newWindow);
670            newWindow.addInternalFrameListener(new InternalFrameAdapter() {
671                public void internalFrameActivated(InternalFrameEvent e) {
672                    updateToolbarButtons(false);
673                    refreshToolBar();
674                }
675    
676                public void internalFrameClosed(InternalFrameEvent e) {
677                    updateToolbarButtons(true);
678                    refreshToolBar();
679                }
680    
681                public void internalFrameDeactivated(InternalFrameEvent e) {
682                    updateToolbarButtons(true);
683                    refreshToolBar();
684                }
685            });
686            try {
687                newWindow.setSelected(true);
688            } catch (Exception e) {};
689    
690            windowList.add(newWindow);
691            return newWindow;
692        }
693    
694        public void removeWindow(Window window) {
695            window.dispose();
696            Scene.getVisualizationManager().removeVisualization(window.getVisualization());
697            windowList.remove(window);
698            updateToolbarButtons(windowList.size()>0);
699        }
700    
701        private void arrange() {
702            int selectedCounter = 0;
703            for (int i = 0; i < windowList.size(); i++) {
704                if (!((Window)(windowList.get(i))).isIcon()) {
705                    selectedCounter++;
706                }
707            }
708    
709            int[] selected = new int[selectedCounter];
710            selectedCounter = 0;
711    
712            model.removeAllElements();
713    
714            for (int i = 0; i < windowList.size(); i++) {
715                model.addElement(((Window)(windowList.get(i))).getTitle());
716                if (!((Window)(windowList.get(i))).isIcon()) {
717                    selected[selectedCounter] = i;
718                    selectedCounter++;
719                }
720            }
721    
722            listVisualization.setSelectedIndices(selected);
723    
724            showDialog(dialog, 270, 360);
725        }
726    
727        private void dialogApply() {
728            dialog.setVisible(false);
729    
730            for (int i = 0; i < windowList.size(); i++) {
731                try {
732                    ((Window)(windowList.get(i))).setIcon(true);
733                } catch (Exception e) {}
734            }
735    
736            int[] selected = listVisualization.getSelectedIndices();
737    
738            if (selected.length != 0) {
739                boolean[] located = new boolean[selected.length];
740                for (int i = 0; i < located.length; i++) {
741                    located[i] = false;
742                }
743    
744                int columnNumber = comboColumn.getSelectedIndex() + 1;
745                int width = desktop.getWidth() / columnNumber;
746                int height = desktop.getHeight() / ((selected.length - 1) / columnNumber + 1);
747    
748                for (int i = 0; i < selected.length; i++) {
749                    int x = (i % columnNumber) * width;
750                    int y = (i / columnNumber) * height;
751    
752                    int minDistance = Integer.MAX_VALUE;
753                    int minIndex = -1;
754    
755                    for (int j = 0; j < selected.length; j++) {
756                        if (!located[j]) {
757                            int distance = (((Window)(windowList.get(selected[j]))).getX() - x) * (((Window)(windowList.get(selected[j]))).getX() - x) + (((Window)(windowList.get(selected[j]))).getY() - y) * (((Window)(windowList.get(selected[j]))).getY() - y);
758                            if (distance < minDistance) {
759                                minDistance = distance;
760                                minIndex = j;
761                            }
762                        }
763                    }
764    
765                    try {
766                        ((Window)(windowList.get(selected[minIndex]))).setIcon(false);
767                        ((Window)(windowList.get(selected[minIndex]))).setBounds(x, y, width, height);
768                        located[minIndex] = true;
769                    } catch (Exception e) {}
770                }
771            }
772        }
773    
774        private void dialogCancel() {
775            dialog.setVisible(false);
776        }
777    
778        private void refreshMenu(String filename,String configureName) {
779            int selIndex = 0;
780            /*if (Scene.getToolsManager().getPredefinedVisualizationRunner().containsConfigure(configureName)) {
781                Scene.showErrorMessage("Visualization configuration for this name already exists!");
782                return;
783            }*/
784    
785            Scene.getToolsManager().getPredefinedVisualizationRunner().addPredefinedVisualization(filename,configureName);
786            itemSettings = new JMenuItem[Scene.getToolsManager().getPredefinedVisualizationRunner().getPredefinedVisualizationNumber()];
787            for (int i = 0; i < itemSettings.length; i++) {
788                String addConfigureName = Scene.getToolsManager().getPredefinedVisualizationRunner().getConfigureName(i);
789                if (addConfigureName.equals(configureName)) {
790                    Scene.getToolsManager().getPredefinedVisualizationRunner().setSelected(i);
791                    selIndex = i;
792                }
793                itemSettings[i] = new JMenuItem(addConfigureName);
794                itemSettings[i].addActionListener(new ActionListener() {
795                    public void actionPerformed(ActionEvent e) {
796                        for (int i=0; i<itemSettings.length; i++) {
797                            if (itemSettings[i].isSelected()) itemSettings[i].setSelected(false);
798                        }
799                        int selected = Scene.getToolsManager().getPredefinedVisualizationRunner().getIdFromName(
800                                       ((JRadioButtonMenuItem)(e.getSource())).getText());
801                        Scene.getToolsManager().getPredefinedVisualizationRunner().setSelected(selected);
802                        itemSettings[selected].setSelected(true);
803                    }
804                });
805            }
806            itemSettings[selIndex].setSelected(true);
807        }
808    
809        public void clearWindowsList() {
810            windowList.clear();
811        }
812    
813        public void setDoNotRemoveWindow(boolean newValue) {
814            doNotRemoveWindow = newValue;
815        }
816    
817        public JDesktopPane getDesktop() {
818            return desktop;
819        }
820    
821        public String getLastDataDir() {
822            return lastDataDir;
823        }
824    
825        public void setLastDataDir(String dir) {
826            lastDataDir = dir;
827        }
828    
829        public String getLastConfigDir() {
830            return lastConfigDir;
831        }
832    
833        public void setLastConfigDir(String dir) {
834            lastConfigDir = dir;
835        }
836    
837        public String getLastResultDir() {
838            return lastResultDir;
839        }
840    
841        public void setLastResultDir(String dir) {
842            lastResultDir = dir;
843        }
844    
845        public void disableFunctionMenus() {
846            //menuVisualization.setEnabled(false);
847            menuNew.setEnabled(false);
848            itemVisualize.setEnabled(false);
849            enablePredefinedMenu();
850            tblVizNow.setEnabled(false);
851            tblConfigure.setEnabled(false);
852        }
853    
854        public void disableFileMenus() {
855            menuFile.setEnabled(false);
856            menuTool.setEnabled(false);
857        }
858    
859        public void updateDatasourceCombo() {
860            int dsourceId = Scene.getDataSourceManager().getCurrentDataSourceId();
861    
862            tblComboDataSource.removeAllItems();
863            ArrayList dmList = Scene.getDataSourceManager().getDataManagerList();
864            for (int i=0; i<dmList.size(); i++) {
865                tblComboDataSource.addItem(((DataManager)dmList.get(i)).getDatasourceName());
866            }
867            tblComboDataSource.setSelectedIndex(dsourceId);
868            refreshToolBar();
869        }
870    
871        public void updateToolbarButtons(boolean flag) {
872            tblVizNow.setEnabled(flag);
873            tblConfigure.setEnabled(flag);
874        }
875    
876        public void refreshToolBar() {
877            int toolbarWidth = 0;
878    
879            toolbarPhaseDetector.refresh();
880            for (int i=0; i<toolbar.getComponents().length; i++) {
881                if (!toolbar.getComponent(i).isVisible()) continue;
882                double width = toolbar.getComponent(i).getPreferredSize().getWidth();
883    
884                if (width < toolbar.getComponent(i).getWidth())
885                    width = toolbar.getComponent(i).getWidth();
886    
887                toolbarWidth += width;
888            }
889            if (toolbarWidth>=frame.getWidth()-20) {
890                toolbar.setBounds(0,0,frame.getWidth(),60);
891                toolbar.setPreferredSize(new Dimension(frame.getWidth(),60));
892            } else {
893                toolbar.setPreferredSize(new Dimension(frame.getWidth(),30));
894                toolbar.setBounds(0,0,frame.getWidth(),30);
895            }
896            toolbar.revalidate();
897            desktop.revalidate();
898    
899        }
900    
901        public void enablePhaseDetectorButton(boolean flag) {
902            toolbarPhaseDetector.enableButton(flag);
903        }
904    
905        public void updateFunctionControl(boolean flag) {
906            //menuVisualization.setEnabled(flag);
907            menuNew.setEnabled(flag);
908            itemVisualize.setEnabled(flag);
909            enablePredefinedMenu();
910            tblVizNow.setEnabled(flag);
911            tblConfigure.setEnabled(flag);
912    
913            menuFile.setEnabled(flag);
914            menuTool.setEnabled(flag);
915    
916            for (int i=0; i<toolbar.getComponents().length; i++) {
917                toolbar.getComponent(i).setEnabled(flag);
918            }
919            toolbarPhaseDetector.enableButton(flag);
920        }
921    
922        public PhaseDetectorToolBar getPhaseDetectorToolBar() {
923            return toolbarPhaseDetector;
924        }
925    
926        public void resetDebugMenu(boolean flag) {
927            itemDebug.setSelected(flag);
928        }
929    
930        public void switchDataSource(int datasourceId) {
931            if (!tblComboDataSource.isEnabled()) return;
932            DataSourceManager dsm = Scene.getDataSourceManager();
933            tblComboDataSource.setSelectedIndex(datasourceId);
934            dsm.switchDataSource(datasourceId);
935            refreshToolBar();
936        }
937    
938        public boolean addDataSource(String name) {
939            boolean success = Scene.getDataSourceManager().addDataSource(name);
940            if (success) {
941                updateDatasourceCombo();
942                switchDataSource(Scene.getDataSourceManager().getDataManagerList().size()-1);
943            }
944    
945            return success;
946        }
947    
948        private void loadDataSource() {
949            Scene.loadDataSource();
950            for (int i = 0; i<Scene.getToolsManager().getPredefinedVisualizationRunner().getPredefinedVisualizationNumber(); i++) {
951                Scene.getToolsManager().getPredefinedVisualizationRunner().getPredefinedVizByIndex(i).setTranslated(false);
952            }
953        }
954    
955        private void removeDataSource() {
956            dialogDataSource = new JDialog(Scene.getFrame(), "Select Data Source to be reomved", true);
957            model = new DefaultListModel();
958            listDataSource = new JList(model);
959            listDataSource.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
960    
961            JScrollPane scrollPane = new JScrollPane(listDataSource);
962            scrollPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Choose Data Source"));
963            dialogDataSource.getContentPane().add(scrollPane, BorderLayout.CENTER);
964    
965            JPanel panelButton = new JPanel(new FlowLayout());
966            dialogDataSource.getContentPane().add(panelButton, BorderLayout.SOUTH);
967    
968            JButton buttonRemove = new JButton("Remove");
969            buttonRemove.addActionListener(new ActionListener() {
970                public void actionPerformed(ActionEvent e) {
971                    remove();
972                    dialogDataSource.setVisible(false);
973                }
974            });
975            panelButton.add(buttonRemove);
976    
977            JButton buttonCancel = new JButton("Cancel");
978            buttonCancel.addActionListener(new ActionListener() {
979                public void actionPerformed(ActionEvent e) {
980                    dialogDataSource.setVisible(false);
981                }
982            });
983            panelButton.add(buttonCancel);
984    
985            ArrayList dmList = Scene.getDataSourceManager().getDataManagerList();
986            for (int i=0; i<dmList.size(); i++)
987                model.addElement(((DataManager)dmList.get(i)).getDatasourceName());
988    
989            Scene.getUIManager().showDialog(dialogDataSource, 270, 360);
990        }
991    
992        private void remove() {
993            int [] indices = listDataSource.getSelectedIndices();
994    
995            if (indices.length == model.getSize()) {
996                Scene.showErrorMessage("At least one data source should be left!");
997                return;
998            }
999    
1000            windowList = Scene.getVisualizationManager().removeDataSource(indices);
1001            Scene.getDataSourceManager().removeDataSource(indices);
1002            Scene.setCurrentDataFilename(Scene.getDataManager().getDataSource().getFileName());
1003            updateDatasourceCombo();
1004            createDialog();
1005        }
1006    
1007        private void enablePredefinedMenu() {
1008            if (itemSettings == null) return;
1009    
1010            PredefinedVisualizationRunner runner = Scene.getToolsManager().getPredefinedVisualizationRunner();
1011            ArrayList list = runner.getPredefinedVizList();
1012            boolean flag = Scene.getDataManager().isDataLoaded();
1013    
1014            for (int i=0; i<itemSettings.length; i++) {
1015                PredefinedVisualization pViz = (PredefinedVisualization)list.get(i);
1016                itemSettings[i].setEnabled(pViz.isAutoLoadTrace()|(flag&&
1017                       pViz.getUsedDataSourceName().equals(Scene.getDataManager().getDataSource().getClass().getName())));
1018            }
1019        }
1020    }