SciFrame.java
/* 
 * ################################################################
 
 * ProActive: The Java(TM) library for Parallel, Distributed, 
 *            Concurrent computing with Security and Mobility
 
 * Copyright (C) 1997-2007 INRIA/University of Nice-Sophia Antipolis
 * Contact: proactive@objectweb.org
 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or any later version.
 *  
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
 * USA
 *  
 *  Initial developer(s):               The ProActive Team
 *                        http://www.inria.fr/oasis/ProActive/contacts.html
 *  Contributor(s): 
 
 * ################################################################
 */ 
package org.objectweb.proactive.ext.scilab.gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeSet;

import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.ListSelectionModel;
import javax.swing.Timer;
import javax.swing.WindowConstants;
import javax.swing.filechooser.FileFilter;
import javax.swing.table.DefaultTableModel;

import org.objectweb.proactive.ext.scilab.SciDeployEngine;
import org.objectweb.proactive.ext.scilab.monitor.SciEngineInfo;
import org.objectweb.proactive.ext.scilab.monitor.SciEvent;
import org.objectweb.proactive.ext.scilab.monitor.SciEventListener;
import org.objectweb.proactive.ext.scilab.monitor.SciTaskInfo;
import org.objectweb.proactive.ext.scilab.monitor.ScilabService;

public class SciFrame extends javax.swing.JFrame {
  private JMenuBar menuBar;
  private JSplitPane splitMain2;
  private JScrollPane scrollTreeEngine;
  private JTree treeEngine;
  private JScrollPane scrollTaskWait;
  private JPanel pnlTaskRun;
  private JButton btnClearTaskRun;
  private JFileChooser chooserDescriptor;
  private JMenuItem itemDesktopGrid;
  private JMenuItem itemDescriptor;
  private JMenu menuEngine;
  private JMenuItem itemExit;
  private JMenuItem itemTask;
  private JMenu menuCommand;
  private JPanel pnlLogSouth;
  private JTextArea txtLog;
  private JScrollPane scrollLog;
  private JPanel pnlMainLog;
  private JButton btnDeleteTaskEnd;
  private JButton btnSaveTaskEnd;
  private JPanel pnlBtnTaskEnd;
  private JTable tableTaskEnd;
  private JScrollPane scrollTaskEnd;
  private JLabel lblTaskEnd;
  private JPanel pnlTaskEnd;
  private JButton btnKillTaskRun;
  private JPanel pnlBtnTaskRun;
  private JTable tableTaskRun;
  private JScrollPane scrollTaskRun;
  private JLabel lblTaskRun;
  private JButton btnClearTaskWait;
  private JButton btnCancelTaskWait;
  private JPanel pnlBtnTaskWait;
  private JTable tableTaskWait;
  private JLabel lblTaskWait;
  private JPanel pnlTaskWait;
  private JSplitPane splitMain1;
  private JSplitPane splitTask1;
  private JPanel pnlBtnClearCenter;
  private JPanel pnlBtnClear;
  private JPanel pnlLblTaskEnd;
  private JPanel pnlLblTaskRun;
  private JPanel pnlLblTaskWait;
  private JMenuItem itemLegend;
  private JPanel pnlScilab;
  private JPanel pnlLogo;
  private JButton btnClearLog;
  private JPanel pnlProActive;
  private JMenuItem itemRestartEngine;
  private JPopupMenu popupTreeEngine;
  private JList listPreview;
  private JSplitPane splitTask2;
  private DefaultTableModel tableTaskWaitModel;
  private DefaultTableModel tableTaskRunModel;
  private DefaultTableModel tableTaskEndModel;
  private TreeEngineNode rootEngine;
  private ScilabService service;
  private DialogTask dialogTask;
  private DialogResult dialogResult;
  private String pathDescriptor;
  private String nameVn;
  private Timer timerRefresh;
  private JFileChooser chooserSave;
  private JPanel pnlPreview;
  private JLabel lblVn;
  private DefaultComboBoxModel listPreviewModel;
  private JScrollPane scrollPreview;
  private TreeEngineRenderer treeRenderer;
  private DialogLegend dialogLegend;
  
  /**
   * Auto-generated main method to display this JFrame
   */
  public static void main(String[] args) {
    SciFrame inst = new SciFrame();
    inst.setVisible(true);
  }

  public SciFrame() {
    super();
    initGUI();
    
    dialogTask = new DialogTask(this);
    dialogTask.setModal(true);
    
    dialogResult = new DialogResult(this);
    dialogResult.setModal(true);
    
    dialogLegend = new DialogLegend(this);
    dialogLegend.setModal(true);
    
    service = new ScilabService();
    
    service.addEventListenerTask(new SciEventListener(){
      public void actionPerformed(SciEvent evt){
        SciTaskInfo sciTaskInfo = (SciTaskInfoevt.getSource();
        
        if(sciTaskInfo.getState() == SciTaskInfo.PENDING){
          updateTableTaskWait(sciTaskInfo);
          return;
        }
        
        if(sciTaskInfo.getState() == SciTaskInfo.CANCELLED){
          updateTableTaskCancel(sciTaskInfo);
          return;
        }
        
        if(sciTaskInfo.getState() == SciTaskInfo.RUNNING){
          updateTableTaskRun(sciTaskInfo);
          return;
        }
        
        if(sciTaskInfo.getState() == SciTaskInfo.KILLED){
          updateTableTaskKill(sciTaskInfo);
          return;
        }
        
        if(sciTaskInfo.getState() == SciTaskInfo.SUCCEEDED || sciTaskInfo.getState() == SciTaskInfo.ABORTED){
          updateTableTaskEnd(sciTaskInfo);
          return;
        }
      }  
    });
    
    
    service.addEventListenerEngine(new SciEventListener(){
      public void actionPerformed(SciEvent evt){
        refreshTreeEngine();
      }
    });
    
    timerRefresh = new Timer(1000new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        timerRefreshActionPerformed(evt);
      }
    })
    

    timerRefresh.start();
  }

  private void initGUI() {
    try {
      {
        chooserSave = new JFileChooser();
        chooserSave.setDialogTitle("Save Scilab Result");
      }
      {
        splitMain1 = new JSplitPane();
        getContentPane().add(splitMain1, BorderLayout.CENTER);
        splitMain1.setOrientation(JSplitPane.VERTICAL_SPLIT);
        splitMain1.setOneTouchExpandable(true);
        splitMain1.setDividerLocation(520);
        splitMain1.setDividerSize(7);
        {
          splitMain2 = new JSplitPane();
          splitMain1.add(splitMain2, JSplitPane.TOP);
          splitMain2.setOneTouchExpandable(true);
          splitMain2.setDividerLocation(160);
          splitMain2.setDividerSize(7);
          {
            scrollTreeEngine = new JScrollPane();
            splitMain2.add(scrollTreeEngine, JSplitPane.LEFT);
            {
              rootEngine = new TreeEngineNode("Scilab Engines");
              treeEngine = new JTree(rootEngine);
                treeRenderer = new TreeEngineRenderer();
                treeEngine.setCellRenderer(treeRenderer);
              scrollTreeEngine.setViewportView(treeEngine);
              {
                popupTreeEngine = new JPopupMenu();
                setComponentPopupMenu(
                  treeEngine,
                  popupTreeEngine);
                {
                  
                  itemRestartEngine = new JMenuItem();
                  popupTreeEngine.add(itemRestartEngine);
                  itemRestartEngine.setText("Restart Engine");
                  itemRestartEngine.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                      itemRestartEngineActionPerformed(evt);
                    }
                    });
                }
              }
              treeEngine.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent evt) {
                  treeEngineMouseClicked(evt);
                }
              });
            }
          }
          {
            splitTask1 = new JSplitPane();
            splitTask1.setOrientation(JSplitPane.VERTICAL_SPLIT);
            splitTask1.setDividerSize(7);
            splitTask1.setOneTouchExpandable(true);
            splitMain2.add(splitTask1, JSplitPane.RIGHT);
            
              splitTask2 = new JSplitPane();
              splitTask2.setOneTouchExpandable(true);
              splitTask2.setOrientation(JSplitPane.VERTICAL_SPLIT);
              splitTask2.setDividerSize(7);
              splitTask1.add(splitTask2, JSplitPane.TOP);
              {
                pnlTaskWait = new JPanel();
                splitTask2.add(pnlTaskWait, JSplitPane.TOP);
                BorderLayout pnlTaskWaitLayout = new BorderLayout();
                pnlTaskWait.setLayout(pnlTaskWaitLayout);
                pnlTaskWait.setSize(700180);
                pnlTaskWait.setPreferredSize(new java.awt.Dimension(702150));
                pnlTaskWait.setBackground(new Color(96106173));
                {
                  pnlLblTaskWait = new JPanel();
                  pnlTaskWait.add(pnlLblTaskWait, BorderLayout.NORTH);
                  pnlLblTaskWait.setBackground(new java.awt.Color(96,106,173));
                  {
                    lblTaskWait = new JLabel();
                    pnlLblTaskWait.add(lblTaskWait);
                    FlowLayout lblTaskWaitLayout = new FlowLayout();
                    lblTaskWait
                      .setLayout(lblTaskWaitLayout);
                    lblTaskWait.setForeground(Color.WHITE);
                    lblTaskWait.setFont(new Font(
                      "Tahoma",
                      Font.BOLD,
                      13));

                    lblTaskWait.setText("Pending Tasks");
                  }
                }

                {
                  scrollTaskWait = new JScrollPane();
                  pnlTaskWait.add(scrollTaskWait,
                      BorderLayout.CENTER);
                  scrollTaskWait.setPreferredSize(new java.awt.Dimension(690135));
                
                  {
                    tableTaskWaitModel = new DefaultTableModel(
                            null, new String[] { "Id Task""Script",
                                  "Priority""Awaited Time(ms)",
                                "State"});
                    
                    tableTaskWait = new JTable() {
                          public boolean isCellEditable(int rowIndex, int vColIndex) {
                              return false;
                          }
                      };
                      
                    scrollTaskWait.setViewportView(tableTaskWait);
                    scrollTaskWait.getViewport().setBackground(Color.WHITE);
                    tableTaskWait.setModel(tableTaskWaitModel);
                    tableTaskWait.getTableHeader().setBackground(new java.awt.Color(250,251,253));
                    tableTaskWait.getColumnModel().getColumn(4).setCellRenderer(new IconRenderer());
                    tableTaskWait.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
                    tableTaskWait
                        .addMouseListener(new MouseAdapter() {
                          public void mouseClicked(
                              MouseEvent evt) {
                            tableTaskWaitMouseClicked(evt);
                          }
                        });
                  }
                }
                {
                  pnlBtnTaskWait = new JPanel();
                  pnlTaskWait.add(pnlBtnTaskWait,
                      BorderLayout.SOUTH);
                  FlowLayout pnlBtnTaskWaitLayout = new FlowLayout();
                  pnlBtnTaskWaitLayout
                      .setAlignment(FlowLayout.RIGHT);
                  pnlBtnTaskWait.setLayout(pnlBtnTaskWaitLayout);
                  {
                    btnCancelTaskWait = new JButton();
                    pnlBtnTaskWait.add(btnCancelTaskWait);
                    btnCancelTaskWait.setText("Cancel");
                    btnCancelTaskWait.setToolTipText("Cancel pending tasks ");
                    btnCancelTaskWait
                        .addActionListener(new ActionListener() {
                          public void actionPerformed(
                              ActionEvent evt) {
                            btnCancelTaskWaitActionPerformed(evt);
                          }
                        });
                  }
                  {
                    btnClearTaskWait = new JButton();
                    pnlBtnTaskWait.add(btnClearTaskWait);
                    btnClearTaskWait.setText("Clear");
                    btnClearTaskWait.setSize(7022);
                    btnClearTaskWait.setToolTipText("Clear  cancelled tasks");
                    btnClearTaskWait
                        .addActionListener(new ActionListener() {
                          public void actionPerformed(
                              ActionEvent evt) {
                            btnClearTaskWaitActionPerformed(evt);
                          }
                        });
                  }
                }
              }
              {
                pnlTaskRun = new JPanel();
                splitTask2.add(pnlTaskRun, JSplitPane.BOTTOM);
                BorderLayout pnlTaskRunLayout = new BorderLayout();
                pnlTaskRun.setLayout(pnlTaskRunLayout);
                pnlTaskRun.setSize(700180);
                pnlTaskRun.setPreferredSize(new java.awt.Dimension(
                    702150));
                pnlTaskRun.setBackground(new Color(96106173));

                {
                  scrollTaskRun = new JScrollPane();
                  pnlTaskRun.add(scrollTaskRun,
                      BorderLayout.CENTER);
                  scrollTaskRun.setPreferredSize(new java.awt.Dimension(690135));
                  {
                    tableTaskRunModel = new DefaultTableModel(
                        null, new String[] { "Id Task""Script",
                            "Id Engine""Global Time(ms)",
                            "State"});
            
                    tableTaskRun = new JTable() {
                          public boolean isCellEditable(int rowIndex, int vColIndex) {
                              return false;
                          }
                      };
                   
                    scrollTaskRun.setViewportView(tableTaskRun);
                    scrollTaskRun.getViewport().setBackground(Color.WHITE);
                  
                    tableTaskRun.setModel(tableTaskRunModel);
                    tableTaskRun.getTableHeader().setBackground(new java.awt.Color(250,251,253));
                    
                    tableTaskRun.getColumnModel().getColumn(4).setCellRenderer(new IconRenderer());
                    tableTaskRun.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
                    tableTaskRun.addMouseListener(new MouseAdapter() {
                          public void mouseClicked(
                              MouseEvent evt) {
                            tableTaskRunMouseClicked(evt);
                          }
                        });
                  }
                }
                {
                  pnlBtnTaskRun = new JPanel();
                  pnlTaskRun.add(pnlBtnTaskRun,
                      BorderLayout.SOUTH);
                  FlowLayout pnlBtnTaskRunLayout = new FlowLayout();
                  pnlBtnTaskRunLayout
                      .setAlignment(FlowLayout.RIGHT);
                  pnlBtnTaskRun.setLayout(pnlBtnTaskRunLayout);
                  {
                    btnKillTaskRun = new JButton();
                    pnlBtnTaskRun.add(btnKillTaskRun);
                    btnKillTaskRun.setText("Kill");
                    btnKillTaskRun.setSize(7022);
                    btnKillTaskRun.setToolTipText("Kill executing tasks");
                    btnKillTaskRun.addActionListener(new ActionListener() {
                          public void actionPerformed(
                              ActionEvent evt) {
                            btnKillTaskRunActionPerformed(evt);
                          }
                        });
                  }
                  {
                    btnClearTaskRun = new JButton();
                    pnlBtnTaskRun.add(btnClearTaskRun);
                    btnClearTaskRun.setText("Clear");
                    btnClearTaskRun.setSize(7022);
                    btnClearTaskRun.setToolTipText("Clear killed tasks");
                    btnClearTaskRun.addActionListener(new ActionListener() {
                          public void actionPerformed(
                              ActionEvent evt) {
                            btnClearTaskRunActionPerformed(evt);
                          }
                        });
                  }
                }
                {
                  pnlLblTaskRun = new JPanel();
                  pnlTaskRun.add(pnlLblTaskRun, BorderLayout.NORTH);
                  pnlLblTaskRun.setBackground(new java.awt.Color(96,106,173));
                  {
                    lblTaskRun = new JLabel();
                    pnlLblTaskRun.add(lblTaskRun);
                    lblTaskRun.setForeground(Color.WHITE);
                    lblTaskRun.setFont(new Font(
                      "Tahoma",
                      Font.BOLD,
                      13));
                    lblTaskRun.setText("Executing Tasks");
                  }
                }
              }

            }  
            {
              pnlTaskEnd = new JPanel();
              splitTask1.add(pnlTaskEnd, JSplitPane.BOTTOM);
              BorderLayout pnlTaskEndLayout = new BorderLayout();
              pnlTaskEnd.setLayout(pnlTaskEndLayout);
              pnlTaskEnd.setSize(700180);
              pnlTaskEnd.setPreferredSize(new java.awt.Dimension(
                  702150));
              pnlTaskEnd.setBackground(new Color(96106173));
              {
                scrollTaskEnd = new JScrollPane();
                pnlTaskEnd.add(scrollTaskEnd,BorderLayout.CENTER);
                scrollTaskEnd.setPreferredSize(new java.awt.Dimension(690135));
                {
                  tableTaskEndModel = new DefaultTableModel(
                      null, new String[] { "Id Task""Script"
                          "Execution Time(ms)""Global Time(ms)",
                          "State"});
                  
                  tableTaskEnd = new JTable() {
                        public boolean isCellEditable(int rowIndex, int vColIndex) {
                            return false;
                        }
                    };
                  scrollTaskEnd.setViewportView(tableTaskEnd);
                  scrollTaskEnd.getViewport().setBackground(Color.WHITE);
                  tableTaskEnd.setModel(tableTaskEndModel);
                  tableTaskEnd.getTableHeader().setBackground(new java.awt.Color(250,251,253));
                  tableTaskEnd.getColumnModel().getColumn(4).setCellRenderer(new IconRenderer());
                  tableTaskEnd.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
                  tableTaskEnd.addMouseListener(new MouseAdapter() {
                        public void mouseClicked(
                            MouseEvent evt) {
                          tableTaskEndMouseClicked(evt);
                        }
                      });
                }
              }
              {
                pnlBtnTaskEnd = new JPanel();
                pnlTaskEnd.add(pnlBtnTaskEnd, BorderLayout.SOUTH);
                FlowLayout pnlBtnTaskEndLayout = new FlowLayout();
                pnlBtnTaskEndLayout
                    .setAlignment(FlowLayout.RIGHT);
                pnlBtnTaskEnd.setLayout(pnlBtnTaskEndLayout);
                {
                  btnSaveTaskEnd = new JButton();
                  pnlBtnTaskEnd.add(btnSaveTaskEnd);
                  btnSaveTaskEnd.setText("Save");
                  btnSaveTaskEnd.setSize(7022);
                  btnSaveTaskEnd.setToolTipText("Save results");
                  btnSaveTaskEnd
                      .addActionListener(new ActionListener() {
                        public void actionPerformed(
                            ActionEvent evt) {
                          btnSaveTaskEndActionPerformed(evt);
                        }
                      });
                }
                {
                  btnDeleteTaskEnd = new JButton();
                  pnlBtnTaskEnd.add(btnDeleteTaskEnd);
                  btnDeleteTaskEnd.setText("Delete");
                  btnDeleteTaskEnd.setSize(7022);
                  btnDeleteTaskEnd.setToolTipText("Delete result");
                  btnDeleteTaskEnd
                      .addActionListener(new ActionListener() {
                        public void actionPerformed(
                            ActionEvent evt) {
                          btnDeleteTaskEndActionPerformed(evt);
                        }
                      });
                }
              }
              {
                pnlLblTaskEnd = new JPanel();
                pnlTaskEnd.add(pnlLblTaskEnd, BorderLayout.NORTH);
                pnlLblTaskEnd.setBackground(new java.awt.Color(96,106,173));
                {
                  lblTaskEnd = new JLabel();
                  pnlLblTaskEnd.add(lblTaskEnd);
                  lblTaskEnd.setForeground(Color.WHITE);
                  lblTaskEnd.setFont(new Font(
                    "Tahoma",
                    Font.BOLD,
                    13));
                  lblTaskEnd.setText("Terminated Tasks");
                }
              }
            }
          }
        }
        {
          pnlMainLog = new JPanel();
          splitMain1.add(pnlMainLog, JSplitPane.BOTTOM);
          BorderLayout pnlMainLogLayout = new BorderLayout();
          pnlMainLog.setLayout(pnlMainLogLayout);
          pnlMainLog
              .setPreferredSize(new java.awt.Dimension(790348));
          pnlMainLog.setSize(790200);
          pnlMainLog.setBorder(BorderFactory.createTitledBorder("Operations"));
          {
            scrollLog = new JScrollPane();
            pnlMainLog.add(scrollLog, BorderLayout.CENTER);
            {
              txtLog = new JTextArea();
              scrollLog.setViewportView(txtLog);
            }
          }
          {
            pnlLogSouth = new JPanel();
            pnlMainLog.add(pnlLogSouth, BorderLayout.SOUTH);
            BorderLayout pnlLogSouthLayout = new BorderLayout();
            pnlLogSouth.setLayout(pnlLogSouthLayout);
            {
              pnlLogo = new JPanel();
              pnlLogSouth.add(pnlLogo, BorderLayout.CENTER);
              FlowLayout pnlLogoLayout = new FlowLayout();
              pnlLogo.setLayout(pnlLogoLayout);
              pnlLogo.setSize(80260);
              pnlLogo.setPreferredSize(new java.awt.Dimension(80260));
              {
                pnlProActive = new JPanel() {
                  public void paintComponent(Graphics g) {
                    super.paintComponent(g);

                    g.drawImage(
                        Toolkit
                          .getDefaultToolkit()
                          .getImage(
                            getClass()
                              .getResource(
                                "img/logo_proactive.png")),
                        0,
                        0,
                        this);
                  }
                };
                pnlLogo.add(pnlProActive);

                pnlProActive
                  .setPreferredSize(new java.awt.Dimension(
                    200,
                    30));
                pnlProActive.setSize(20070);
              }
              {
                pnlScilab = new JPanel() {
                  public void paintComponent(Graphics g) {
                    super.paintComponent(g);

                    g.drawImage(
                        Toolkit
                          .getDefaultToolkit()
                          .getImage(
                            getClass()
                              .getResource(
                                "img/logo_scilab1.gif")),
                        0,
                        0,
                        this);
                  }
                };
                pnlLogo.add(pnlScilab);

                pnlScilab
                  .setPreferredSize(new java.awt.Dimension(
                    125,
                    70));
                pnlScilab.setSize(12570);
              }
            }
            {
              pnlBtnClear = new JPanel();
              BorderLayout pnlBtnClearLayout = new BorderLayout();
              pnlBtnClear.setLayout(pnlBtnClearLayout);
              pnlLogSouth.add(pnlBtnClear, BorderLayout.EAST);
              {
                btnClearLog = new JButton();
                pnlBtnClear.add(btnClearLog, BorderLayout.NORTH);
                btnClearLog.setText("Clear");
                btnClearLog
                  .setToolTipText("Clear operation logs");
                btnClearLog
                  .addActionListener(new ActionListener() {
                    public void actionPerformed(
                      ActionEvent evt) {
                      btnClearLogActionPerformed(evt);
                    }
                  });
              }
              {
                pnlBtnClearCenter = new JPanel();
                pnlBtnClear.add(
                  pnlBtnClearCenter,
                  BorderLayout.CENTER);
              }
            }
          }
        }
      }

      {
        menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        {
          menuCommand = new JMenu();
          menuBar.add(menuCommand);
          menuCommand.setText("Command");
          {
            menuEngine = new JMenu();
            menuCommand.add(menuEngine);
            menuEngine.setText("New Engine");
            {
              itemDescriptor = new JMenuItem();
              menuEngine.add(itemDescriptor);
              itemDescriptor.setText("From Descriptor");
              itemDescriptor
                  .addActionListener(new ActionListener() {
                    public void actionPerformed(
                        ActionEvent evt) {
                      itemDescriptorActionPerformed(evt);
                    }
                  });
            }
            {
              itemDesktopGrid = new JMenuItem();
              menuEngine.add(itemDesktopGrid);
              itemDesktopGrid.setText("From Desktop Grid");
              //to modify
              itemDesktopGrid.setEnabled(false);
              itemDesktopGrid
                  .addActionListener(new ActionListener() {
                    public void actionPerformed(
                        ActionEvent evt) {
                      itemDesktopGridActionPerformed(evt);
                    }
                  });
            }
          }
          {
            itemTask = new JMenuItem();
            menuCommand.add(itemTask);
            itemTask.setText("New Task");
            itemTask.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent evt) {
                itemTaskActionPerformed(evt);
              }
            });
          }
          {
            itemLegend = new JMenuItem();
            menuCommand.add(itemLegend);
            itemLegend.setText("Legend");
            itemLegend.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent evt) {
                itemLegendActionPerformed(evt);
              }
            });
          }
          {
            itemExit = new JMenuItem();
            menuCommand.add(itemExit);
            itemExit.setText("Exit");
            itemExit.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent evt) {
              
                if(service != null){
                  service.exit();
                }
                
                System.exit(0);
              }
            });
          }
        }
      }
      {
        chooserDescriptor = new JFileChooser();
        FileFilter filter = new FileFilter() {
          public boolean accept(File f) {

            if (f == null) {
              return false;
            }

            if (f.isDirectory()) {
              return true;
            }

            return f.getName().endsWith(".xml");
          }

          public String getDescription() {
            return "XML Filter";
          }
        };

        chooserDescriptor.setApproveButtonText("Deploy");
        chooserDescriptor.setFileFilter(filter);
        
        {
          pnlPreview = new JPanel();
          BorderLayout pnlPreviewLayout = new BorderLayout();
          pnlPreview.setLayout(pnlPreviewLayout);
          pnlPreview.setBorder(BorderFactory.createTitledBorder(""));
          {
            lblVn = new JLabel();
            lblVn.setText("Select Virtual Node");
            pnlPreview.add(lblVn, BorderLayout.NORTH);
          }
          {
            scrollPreview = new JScrollPane();
            scrollPreview.setPreferredSize(new java.awt.Dimension(9080));
            scrollPreview.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            pnlPreview.add(scrollPreview, BorderLayout.CENTER);
            {
              listPreviewModel = new DefaultComboBoxModel();
              listPreview = new JList();
              listPreview.setModel(listPreviewModel);
              scrollPreview.setViewportView(listPreview);
            }
          }
        }
        
        chooserDescriptor.setAccessory(pnlPreview);
        chooserDescriptor.addPropertyChangeListenernew PropertyChangeListener(){
          public void propertyChange(PropertyChangeEvent evt) {  
            if(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(evt.getPropertyName())) {
              File newFile = (Fileevt.getNewValue();
              if(newFile != null) {
                String path = newFile.getAbsolutePath();
                
                String arrayNameVn[] = SciDeployEngine.getListVirtualNode(path);
                
                if(listPreviewModel == null){
                  txtLog.append("Invalid deployment descriptor:" + path);
                  return;
                }
                
                listPreviewModel.removeAllElements();
                for(int i=0; i<arrayNameVn.length; i++){
                  listPreviewModel.addElement(arrayNameVn[i]);
                }
              }      
            }
          }
        });
      }
      
      setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
      this.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent evt) {
          
          if(service != null){
            service.exit();
          }
          
          System.exit(0);
        }
      });
      pack();
      Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
      Dimension f = this.getSize();
          int x = (d.width - f.width2;
          int y = (d.height - f.height2;
          this.setBounds(x, y, f.width, f.height );
          this.setIconImage(new ImageIcon(getClass().getResource("img/icone.png")).getImage());
          this.setTitle("Grid Scilab ToolBox");
      this.setSize(812780);
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  
  private void itemDescriptorActionPerformed(ActionEvent evt) {
    
    this.deployDescriptor();
  }

  private void itemDesktopGridActionPerformed(ActionEvent evt) {
    
  }
  
  private void itemTaskActionPerformed(ActionEvent evt) {
    
    this.addTask();
  }

  private void treeEngineMouseClicked(MouseEvent evt) {
    
  }

  private void tableTaskWaitMouseClicked(MouseEvent evt) {
    
    if (evt.getClickCount() == 2) {
      String idTask = (Stringthis.tableTaskWaitModel.getValueAt(this.tableTaskWait.getSelectedRow()0);
      
      ArrayList listTask = service.getListTaskWait();
      
      SciTaskInfo sciTaskInfo = null;
      int i; 
      for(i=0; i<listTask.size(); i++){
        sciTaskInfo = (SciTaskInfolistTask.get(i);
        if(idTask.equals(sciTaskInfo.getIdTask())){
          break;
        }
      }
      
      if(i == listTask.size()){
        return;
      }
        
      
      this.dialogResult.setPathScript(sciTaskInfo.getPathScript());
      this.dialogResult.setJobInit(sciTaskInfo.getSciTask().getJobInit());
      this.dialogResult.setDataOut("");
      this.dialogResult.setSaveEnable(false);
      
      this.dialogResult.setLocationRelativeTo(this);
          this.dialogResult.setVisible(true);
    }
  }

  private void tableTaskRunMouseClicked(MouseEvent evt) {
    
    if (evt.getClickCount() == 2) {
      String idTask = (String)this.tableTaskRunModel.getValueAt(this.tableTaskRun.getSelectedRow()0);
      
      SciTaskInfo sciTaskInfo = (SciTaskInfoservice.getMapTaskRun().get(idTask);
      this.dialogResult.setPathScript(sciTaskInfo.getPathScript());
      this.dialogResult.setJobInit(sciTaskInfo.getSciTask().getJobInit());
      this.dialogResult.setDataOut("");
      this.dialogResult.setSaveEnable(false);
      
      this.dialogResult.setLocationRelativeTo(this);
          this.dialogResult.setVisible(true);
    }
  }

  private void tableTaskEndMouseClicked(MouseEvent evt) {
    
  
    if (evt.getClickCount() == 2) {
      String idTask = (String)this.tableTaskEndModel.getValueAt(this.tableTaskEnd.getSelectedRow()0);
      
      SciTaskInfo sciTaskInfo = service.getTaskEnd(idTask);
      this.dialogResult.setPathScript(sciTaskInfo.getPathScript());
      this.dialogResult.setJobInit(sciTaskInfo.getSciTask().getJobInit());
      
      String strResult="";
      ArrayList listResult = sciTaskInfo.getSciResult().getList();
      for(int i=0; i< listResult.size(); i++){
        strResult += listResult.get(i).toString() "\n";
      }
      
      this.dialogResult.setSaveEnable(true);
      this.dialogResult.setDataOut(strResult);
      this.dialogResult.setLocationRelativeTo(this);
          this.dialogResult.setVisible(true);
    }
  }

  private void btnCancelTaskWaitActionPerformed(ActionEvent evt) {
    
    int array[] this.tableTaskWait.getSelectedRows();
    
    String idEngine;
    for(int i=0; i<array.length; i++){
      idEngine = (Stringthis.tableTaskWaitModel.getValueAt(array[i]0);
      service.cancelTask(idEngine);
    }  
  }

  private void btnClearTaskWaitActionPerformed(ActionEvent evt) {
    
    int i = 0;
    int count =  this.tableTaskWaitModel.getRowCount();
    String value;
    
    while(i<count){
      value = (Stringthis.tableTaskWaitModel.getValueAt(i, 3);
      
      if(value.equals("-")){
        this.tableTaskWaitModel.removeRow(i);
        count--;
      }else{
        i++;
      }    
    }
  }

  private void btnKillTaskRunActionPerformed(ActionEvent evt) {
    
    int array[] this.tableTaskRun.getSelectedRows();
    
    String idEngine;
    for(int i=0; i<array.length; i++){
      idEngine = (Stringthis.tableTaskRunModel.getValueAt(array[i]0);
      service.killTask(idEngine);
    }  
  }

  private void btnClearTaskRunActionPerformed(ActionEvent evt) {
    
    int i = 0;
    int count =  this.tableTaskRunModel.getRowCount();
    String value;
    
    while(i<count){
      value = (Stringthis.tableTaskRunModel.getValueAt(i, 3);
      
      if(value.equals("-")){
        this.tableTaskRunModel.removeRow(i);
        count--;
      }else{
        i++;
      }    
    }
  }

  private void btnSaveTaskEndActionPerformed(ActionEvent evt) {
    
    
    int i = this.tableTaskWait.getSelectedRow();
    
    ifi== -1return;
    
    String idTask = (Stringthis.tableTaskEndModel.getValueAt(i, 0);
    SciTaskInfo sciTaskInfo = service.getTaskEnd(idTask);
    
    if (this.chooserSave.showSaveDialog(this!= JFileChooser.APPROVE_OPTION) {
      return;
    }
    
    File f = this.chooserSave.getSelectedFile().getAbsoluteFile();
    if(f.exists() && !f.canWrite()){
      return;
    }
  
    String strResult="";
    ArrayList listResult = sciTaskInfo.getSciResult().getList();
    for(i=0; i< listResult.size(); i++){
      strResult += listResult.get(i).toString() "\n";
    }
    try{
      FileWriter fw = new FileWriter(f);
      fw.write(strResult);
      fw.close();
      
    }catch(IOException e){
      e.printStackTrace();
    }
  }

  private void btnDeleteTaskEndActionPerformed(ActionEvent evt) {
    
    
    int array[] this.tableTaskEnd.getSelectedRows();
    int length = array.length;
    String idEngine;
    for(int i=length-1; i >= 0; i--){
      idEngine = (Stringthis.tableTaskEndModel.getValueAt(array[i]0);
      service.removeTask(idEngine);
      this.tableTaskEndModel.removeRow(array[i]);
    }  
  }
  
  private void btnClearLogActionPerformed(ActionEvent evt) {
    
    this.txtLog.setText("");
  }

  private void timerRefreshActionPerformed(ActionEvent evt){
    this.refreshTableTask();
  }
  
  private void deployDescriptor() {
    if (this.chooserDescriptor.showOpenDialog(this!= JFileChooser.APPROVE_OPTION) {
      return;
    }
    
    pathDescriptor = this.chooserDescriptor.getSelectedFile().getAbsolutePath();
    nameVn = (String)listPreview.getSelectedValue();
    
    if(nameVn == null){
      txtLog.append("->Please select a Virtual Node: "
          + pathDescriptor + "\n");
      return;
    }
    
    txtLog.append("->Deployment is running: "
        + pathDescriptor + "\n");
    
    (new Thread(){
      private String path = pathDescriptor;
      public void run(){
        service.deployEngine(nameVn, path);
        txtLog.append("->Deployment is successfull:" + path + "\n");
      }
    }).start();
  }
  
  private void addTask() {
  
    if(this.service == null){
      this.txtLog.append("->No Node Descriptor is deployed" "\n");
      return;
    }
    
    if(this.service.getNbEngine() == 0){
      this.txtLog.append("->No Scilab Engine is launched" "\n");
      return;
    }
    
        this.dialogTask.setLocationRelativeTo(this);
        this.dialogTask.setVisible(true);
    
    if ((this.dialogTask.getState() == DialogTask.CANCEL)) {
      return;
    }
    
    int priority = SciTaskInfo.NORMAL;
    
    if(dialogTask.getTaskPriority().equals("Low")){
      priority = SciTaskInfo.LOW;
    }else if(dialogTask.getTaskPriority().equals("High")){
      priority = SciTaskInfo.HIGH;
    }
    
    try {
      service.sendTask(dialogTask.getPath(), dialogTask.getJobInit(), dialogTask.getDataOut(), priority);
    catch (IOException e) {
      txtLog.append("->Path Error :" + dialogTask.getPath() "\n");
    }  
  }

  private void refreshTreeEngine(){
    HashMap mapEngine = this.service.getMapEngine();
    SciEngineInfo sciEngineInfo;
    TreeEngineNode nodeEngine;
    
    int i = 0;
    int count = this.rootEngine.getChildCount();
    while(i<count){
      nodeEngine = (TreeEngineNodethis.rootEngine.getChildAt(i);
      sciEngineInfo = (SciEngineInfomapEngine.remove(nodeEngine.toString());
      if(sciEngineInfo == null){
        nodeEngine.removeFromParent();
        count--;
      }else{
        nodeEngine.removeAllChildren();
        nodeEngine.add(new TreeEngineNode(sciEngineInfo.getSciEngineUrl()));
        i++;
      }
    }
    
    TreeSet listSort = new TreeSet(mapEngine.keySet());
    Iterator it = listSort.iterator();
    
    while(it.hasNext()){
      sciEngineInfo = (SciEngineInfomapEngine.get(it.next());
      nodeEngine = new TreeEngineNode(sciEngineInfo.getIdEngine());
      nodeEngine.add(new TreeEngineNode(sciEngineInfo.getSciEngineUrl()));
      this.rootEngine.add(nodeEngine);
    }
    
    updateTreeNodes();
  }
  
  private void updateTreeNodes(){
    EventQueue.invokeLaternew Runnable(){
      public void run() {
        treeEngine.updateUI();
      }} );

  }
  
  private void setStateTreeNode(String idEngine, int state){
    TreeEngineNode nodeEngine;
    for(int i=0; i < this.rootEngine.getChildCount(); i++){
      nodeEngine = (TreeEngineNodethis.rootEngine.getChildAt(i);
      nodeEngine.getUserObject();
      if(idEngine.equals(nodeEngine.toString())){
        nodeEngine.setState(state);
      }
    }    
  }
  
  private void refreshTableTask(){
    String value;
    for(int i=0; i<this.tableTaskWaitModel.getRowCount(); i++){
      value = (String)this.tableTaskWaitModel.getValueAt(i, 3);
      
      if(value.equals("-"))
        continue;
      
      value = (String)this.tableTaskWaitModel.getValueAt(i, 3);
      value = Integer.parseInt(value1000 ""
      this.tableTaskWaitModel.setValueAt(value, i, 3);
    }
    
    for(int i=0; i<this.tableTaskRunModel.getRowCount(); i++){
      value = (String)this.tableTaskRunModel.getValueAt(i, 3);
      if(value.equals("-"))
        continue;
      
      value = (String)this.tableTaskRunModel.getValueAt(i, 3);
      value = Integer.parseInt(value1000 ""
      this.tableTaskRunModel.setValueAt(value, i, 3);
    }
  }

  private void updateTableTaskWait(SciTaskInfo sciTaskInfo){
    String strPriority;

    if (sciTaskInfo.getPriority() == SciTaskInfo.HIGH) {
      strPriority = "High";
    else if (sciTaskInfo.getPriority() == SciTaskInfo.NORMAL) {
      strPriority = "Normal";
    else {
      strPriority = "Low";
    }
    
    Object row[] new Object[]{
        sciTaskInfo.getIdTask(),
        sciTaskInfo.getNameScript(),
        strPriority,
        (new Date()).getTime() - sciTaskInfo.getDateStart() "",    
        new ImageIcon(getClass().getResource("img/runTask.gif"))
    };
    this.tableTaskWaitModel.addRow(row);
    txtLog.append("->Add new Scilab Task :" + sciTaskInfo.getIdTask() "\n");
  }
  
  private void updateTableTaskCancel(SciTaskInfo sciTaskInfo){
    String idTask;
    for(int i=0; i<this.tableTaskWaitModel.getRowCount(); i++){
      idTask = (Stringthis.tableTaskWaitModel.getValueAt(i,0);
      if(idTask.equals(sciTaskInfo.getIdTask())){
        this.tableTaskWaitModel.setValueAt("-", i, 2);
        this.tableTaskWaitModel.setValueAt("-", i, 3);
        this.tableTaskWaitModel.setValueAt(new ImageIcon(getClass().getResource("img/stopTask.gif")), i, 4);
        break;
      }  
    }
    txtLog.append("->Cancel Scilab Task :" + sciTaskInfo.getIdTask() "\n");
  }
  
  private void updateTableTaskRun(SciTaskInfo sciTaskInfo){
    String idTask;
    
    for(int i=0; i<this.tableTaskWaitModel.getRowCount(); i++){
      idTask = (Stringthis.tableTaskWaitModel.getValueAt(i,0);
      if(idTask.equals(sciTaskInfo.getIdTask())){
        this.tableTaskWaitModel.removeRow(i);
        break;
      }  
    }
    
    Object row[] new Object[]{
        sciTaskInfo.getIdTask(),
        sciTaskInfo.getNameScript(),
        sciTaskInfo.getIdEngine(),
        (new Date()).getTime() - sciTaskInfo.getDateStart() "",    
        new ImageIcon(getClass().getResource("img/runTask.gif"))
    };
    
    this.tableTaskRunModel.addRow(row);
    txtLog.append("->Execute Scilab Task :" + sciTaskInfo.getIdTask() "\n");
  }
  
  private void updateTableTaskKill(SciTaskInfo sciTaskInfo){
    String idTask;
    for(int i=0; i<this.tableTaskRunModel.getRowCount(); i++){
      idTask = (Stringthis.tableTaskRunModel.getValueAt(i,0);
      if(idTask.equals(sciTaskInfo.getIdTask())){
        this.tableTaskRunModel.setValueAt("-", i, 2);
        this.tableTaskRunModel.setValueAt("-", i, 3);
        this.tableTaskRunModel.setValueAt(new ImageIcon(getClass().getResource("img/stopTask.gif")), i, 4);
        txtLog.append("->Execute Scilab Task :" + sciTaskInfo.getIdTask() "\n");
        break;
      }  
    }
  }
  
  private void updateTableTaskEnd(SciTaskInfo sciTaskInfo){
    String idTask;
    for(int i=0; i<this.tableTaskRunModel.getRowCount(); i++){
      idTask = (Stringthis.tableTaskRunModel.getValueAt(i,0);
      if(idTask.equals(sciTaskInfo.getIdTask())){
        this.tableTaskRunModel.removeRow(i);
        break;
      }  
    }
    
    String strTmp;
    
    if(sciTaskInfo.getState() == SciTaskInfo.SUCCEEDED){
      strTmp = "img/successTask.gif";
      setStateTreeNode(sciTaskInfo.getIdEngine(), TreeEngineNode.VALID);
    }
    else{
      strTmp = "img/abortTask.gif";
      setStateTreeNode(sciTaskInfo.getIdEngine(), TreeEngineNode.SUSPECT);
    }

    Object row[] new Object[]{
        sciTaskInfo.getIdTask(),
        sciTaskInfo.getNameScript(),
        sciTaskInfo.getTimeExecution() "",
        sciTaskInfo.getTimeGlobal() "",    
        new ImageIcon(getClass().getResource(strTmp))
    };
    this.tableTaskEndModel.addRow(row);
    
    updateTreeNodes();
    
    txtLog.append("->Terminate Scilab Task :" + sciTaskInfo.getIdTask() "\n");
  }
  
  /**
  * Auto-generated method for setting the popup menu for a component
  */
  private void setComponentPopupMenu(
    final java.awt.Component parent,
    final javax.swing.JPopupMenu menu) {
    parent.addMouseListener(new java.awt.event.MouseAdapter() {
      public void mousePressed(java.awt.event.MouseEvent e) {
        if (e.isPopupTrigger())
          menu.show(parent, e.getX(), e.getY());
        
        TreeEngineNode nodeEngine = (TreeEngineNodetreeEngine.getLastSelectedPathComponent();
        
        if(nodeEngine == null){
          return;
        }
        
        if(!nodeEngine.isRoot() && !nodeEngine.isLeaf()){
          itemRestartEngine.setEnabled(true);
        }else{
          itemRestartEngine.setEnabled(false);
        }
      }
      public void mouseReleased(java.awt.event.MouseEvent e) {
        if (e.isPopupTrigger())
          menu.show(parent, e.getX(), e.getY());
      }
    });
  }
  
  private void itemRestartEngineActionPerformed(ActionEvent evt) {
    
    
    TreeEngineNode nodeEngine = (TreeEngineNodetreeEngine.getLastSelectedPathComponent();
    
    if(nodeEngine == null){
      return;
    }
    
    nodeEngine.setState(TreeEngineNode.VALID);
    service.restartEngine(nodeEngine.toString());
  }
  
  private void itemLegendActionPerformed(ActionEvent evt) {
    this.dialogLegend.setLocationRelativeTo(this);
        this.dialogLegend.setVisible(true);
  }
}