/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
 * 
 * ludovic.apvrille AT enst.fr
 * 
 * This software is a computer program whose purpose is to allow the
 * edition of TURTLE analysis, design and deployment diagrams, to
 * allow the generation of RT-LOTOS or Java code from this diagram,
 * and at last to allow the analysis of formal validation traces
 * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
 * from INRIA Rhone-Alpes.
 * 
 * This software is governed by the CeCILL  license under French law and
 * abiding by the rules of distribution of free software.  You can  use,
 * modify and/ or redistribute the software under the terms of the CeCILL
 * license as circulated by CEA, CNRS and INRIA at the following URL
 * "http://www.cecill.info".
 * 
 * As a counterpart to the access to the source code and  rights to copy,
 * modify and redistribute granted by the license, users are provided only
 * with a limited warranty  and the software's author,  the holder of the
 * economic rights,  and the successive licensors  have only  limited
 * liability.
 * 
 * In this respect, the user's attention is drawn to the risks associated
 * with loading,  using,  modifying and/or developing or reproducing the
 * software by the user in light of its specific status of free software,
 * that may mean  that it is complicated to manipulate,  and  that  also
 * therefore means  that it is reserved for developers  and  experienced
 * professionals having in-depth computer knowledge. Users are therefore
 * encouraged to load and test the software's suitability as regards their
 * requirements in conditions enabling the security of their systems and/or
 * data to be ensured and,  more generally, to use and operate it in the
 * same conditions as regards security.
 * 
 * The fact that you are presently reading this means that you have had
 * knowledge of the CeCILL license and that you accept its terms.
 */




package ui.window;

import launcher.LauncherException;
import launcher.RshClient;
import myutil.FileUtils;
import myutil.ScrolledJTextArea;
import translator.*;
import ui.*;
import ui.cd.TClassDiagramPanel;
import ui.util.IconManager;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Vector;


/**
 * Class JDialogProjection
 * Dialog for managing Tclasses to be validated
 * Creation: 30/06/2004
 * @version 1.0 30/06/2004
 * @author Ludovic APVRILLE
 */
public class JDialogProjection extends JDialog implements ActionListener, ListSelectionListener, Runnable  {
    private static boolean isAldebaranSelected = false;
    private static boolean isOminSelected = false;
    private static boolean isStrongSelected = true;


    private LinkedList<TClassAndGateDS> gatesIgnored;
    private LinkedList<TClassAndGateDS> gatesProjected;
    
    private MainGUI mgui;
    
    private String aldebaranHost;
    private String aldebaranPath;
    private String bcgioPath;
    private String bcgminPath;
    
    private String inputData;
    private String fileName;
    
    
    // mode and thred management
    protected int mode;
    protected RshClient rshc;
    protected Thread t;
    
    protected final static int NO_OPTIONS = 0;
    protected final static int NOT_STARTED = 1;
    protected final static int STARTED = 2;
    protected final static int STOPPED = 3;
    
    //subpanels
    private JPanel panel1, panel2, panel3, panel4;
    private JList<TClassAndGateDS> listIgnored;
    private JList<TClassAndGateDS> listProjected;
    private JButton allProjected;
    private JButton addOneProjected;
    private JButton addOneIgnored;
    private JButton allIgnored;
    protected JTextArea jta;
    
    private JRadioButton omin, imin;
    private JRadioButton aldebaran, bcgmin;
    private JRadioButton strong, branching;
    
    // Main Panel
    private JButton start, stop, close;
    
    /** Creates new form  */
    public JDialogProjection(Frame f, MainGUI _mgui, TClassDiagramPanel tcd, TURTLEModeling tm, String _aldebaranHost, String _aldebaranPath, String _bcgminPath, String _bcgioPath, String _inputData, String _fileName, String title) {
        super(f, title, true);
        
        mgui = _mgui;
        
        aldebaranHost = _aldebaranHost;
        aldebaranPath = _aldebaranPath;
        bcgioPath = _bcgioPath;
        bcgminPath = _bcgminPath;
        inputData = _inputData;
        fileName = _fileName;
        
        if (tcd != null) {
            initGates(tcd);
        }
        
        if (tm != null) {
            initGates(tm);
        }
        
        initComponents();
        myInitComponents();
        pack();
        
        //getGlassPane().addMouseListener( new MouseAdapter() {});
        getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    }
    
    private void initGates(TClassDiagramPanel tcd) {
        gatesIgnored = new LinkedList<TClassAndGateDS> ();
        gatesProjected = new LinkedList<TClassAndGateDS> ();
        
        java.util.List<TGComponent> list = tcd.getComponentList();
        for (TGComponent tgc: list)
            if (tgc instanceof TClassInterface) {
                TClassInterface tci = (TClassInterface)tgc;
                java.util.List<TAttribute> gates = tci.getGates();
                for (TAttribute ta: gates) {
                    TClassAndGateDS tcg = new TClassAndGateDS(tci, ta);
                    gatesIgnored.add (tcg);
                }
            }
        
        Collections.sort(gatesIgnored);
    }
    
    private void initGates(TURTLEModeling tm) {
        //System.out.println("*** init gates tm ***");
        gatesIgnored = new LinkedList<TClassAndGateDS> ();
        gatesProjected = new LinkedList<TClassAndGateDS> ();
        
        for(int i=0; i<tm.classNb(); i++) {
            TClass t = tm.getTClassAtIndex(i);
            Vector<Gate> gateList = t.getGateList();
            for(int j=0; j<gateList.size(); j++) {
                Gate g = gateList.elementAt(j);
                TClassAndGateDS tcg = new TClassAndGateDS(t, g);
                gatesIgnored.add (tcg);
            }
            
        }
        
        Collections.sort(gatesIgnored);
    }
    
    
    private void myInitComponents() {
        mode = NO_OPTIONS;
        setButtons();
    }
    
    private void initComponents() {
        Container c = getContentPane();
        GridBagLayout gridbag1 = new GridBagLayout();
        GridBagConstraints c1 = new GridBagConstraints();
        GridBagLayout gridbag4 = new GridBagLayout();
        GridBagConstraints c4 = new GridBagConstraints();
        setFont(new Font("Helvetica", Font.PLAIN, 14));
        c.setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        
        // ignored list
        
        JPanel panelTop = new JPanel();
        panelTop.setLayout(new BorderLayout());
        
        panel1 = new JPanel();
        panel1.setLayout(new BorderLayout());
        panel1.setBorder(new javax.swing.border.TitledBorder("Gates ignored"));
        listIgnored = new JList<TClassAndGateDS> (gatesIgnored.toArray (new TClassAndGateDS[0]));
        //listIgnored.setPreferredSize(new Dimension(200, 250));
        listIgnored.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
        listIgnored.addListSelectionListener(this);
        JScrollPane scrollPane1 = new JScrollPane(listIgnored);
        panel1.add(scrollPane1, BorderLayout.CENTER);
        panel1.setPreferredSize(new Dimension(400, 250));
        panelTop.add(panel1, BorderLayout.WEST);
        
        // validated list
        panel2 = new JPanel();
        panel2.setLayout(new BorderLayout());
        panel2.setBorder(new javax.swing.border.TitledBorder("Gates taken into account"));
        listProjected = new JList<TClassAndGateDS> (gatesProjected.toArray (new TClassAndGateDS[0]));
        //listProjected.setPreferredSize(new Dimension(200, 250));
        listProjected.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
        listProjected.addListSelectionListener(this);
        JScrollPane scrollPane2 = new JScrollPane(listProjected);
        panel2.add(scrollPane2, BorderLayout.CENTER);
        panel2.setPreferredSize(new Dimension(400, 250));
        panelTop.add(panel2, BorderLayout.EAST);
        
        // radio buttons
        panel4 = new JPanel();
        panel4.setLayout(gridbag4);
        panel4.setBorder(new javax.swing.border.TitledBorder("Minimization: tools and options"));
        aldebaran = new JRadioButton("aldebaran");
        aldebaran.setSelected(isAldebaranSelected);
        aldebaran.setEnabled(true);
        aldebaran.addActionListener(this);
        omin = new JRadioButton("-omin");
        omin.setEnabled(true);
        omin.setSelected(isOminSelected);
        imin = new JRadioButton("-imin");
        imin.setEnabled(true);
        imin.setSelected(!isOminSelected);
        //c4.anchor = GridBagConstraints.EAST;
        c4.weighty = 1.0;
        c4.weightx = 1.0;
        c4.gridwidth = GridBagConstraints.REMAINDER; //end row
        c4.fill = GridBagConstraints.HORIZONTAL;
        c4.gridheight = 1;
        panel4.add(aldebaran, c4);
        c4.gridwidth = 1;
        panel4.add(new JLabel("       "));
        c4.gridwidth = GridBagConstraints.REMAINDER; //end row
        panel4.add(imin, c4);
        c4.gridwidth = 1;
        panel4.add(new JLabel("       "));
        c4.gridwidth = GridBagConstraints.REMAINDER; //end row
        panel4.add(omin, c4);

        bcgmin = new JRadioButton("bcg_min");
        bcgmin.setSelected(!isAldebaranSelected);
        bcgmin.setEnabled(true);
        bcgmin.addActionListener(this);
        strong = new JRadioButton("-strong");
        strong.setEnabled(true);
        strong.setSelected(isStrongSelected);
        branching = new JRadioButton("-branching");
        branching.setEnabled(true);
        branching.setSelected(!isStrongSelected);
        imin.setSelected(true);
        c4.weighty = 1.0;
        c4.weightx = 1.0;
        c4.gridwidth = GridBagConstraints.REMAINDER; //end row
        c4.fill = GridBagConstraints.HORIZONTAL;
        c4.gridheight = 1;
        panel4.add(bcgmin, c4);
        c4.gridwidth = 1;
        panel4.add(new JLabel("       "));
        c4.gridwidth = GridBagConstraints.REMAINDER; //end row
        panel4.add(strong, c4);
        c4.gridwidth = 1;
        panel4.add(new JLabel("       "));
        c4.gridwidth = GridBagConstraints.REMAINDER; //end row
        panel4.add(branching, c4);

        panelTop.add(panel4, BorderLayout.SOUTH);
        activeAldebaran(isAldebaranSelected);
        
        ButtonGroup bg = new ButtonGroup();
        bg.add(aldebaran);
        bg.add(bcgmin);
        
        bg = new ButtonGroup();
        bg.add(omin);
        bg.add(imin);
        
        bg = new ButtonGroup();
        bg.add(strong);
        bg.add(branching);
        
        // central buttons
        panel3 = new JPanel();
        panel3.setLayout(gridbag1);
        
        c1.weighty = 1.0;
        c1.weightx = 1.0;
        c1.gridwidth = GridBagConstraints.REMAINDER; //end row
        c1.fill = GridBagConstraints.HORIZONTAL;
        c1.gridheight = 1;
        
        allProjected = new JButton(IconManager.imgic50);
        allProjected.setPreferredSize(new Dimension(50, 25));
        allProjected.addActionListener(this);
        allProjected.setActionCommand("allProjected");
        panel3.add(allProjected, c1);
        
        addOneProjected = new JButton(IconManager.imgic48);
        addOneProjected.setPreferredSize(new Dimension(50, 25));
        addOneProjected.addActionListener(this);
        addOneProjected.setActionCommand("addOneProjected");
        panel3.add(addOneProjected, c1);
        
        panel3.add(new JLabel(" "), c1);
        
        addOneIgnored = new JButton(IconManager.imgic46);
        addOneIgnored.addActionListener(this);
        addOneIgnored.setPreferredSize(new Dimension(50, 25));
        addOneIgnored.setActionCommand("addOneIgnored");
        panel3.add(addOneIgnored, c1);
        
        allIgnored = new JButton(IconManager.imgic44);
        allIgnored.addActionListener(this);
        allIgnored.setPreferredSize(new Dimension(50, 25));
        allIgnored.setActionCommand("allIgnored");
        panel3.add(allIgnored, c1);
        
        panelTop.add(panel3, BorderLayout.CENTER);
        
        c.add(panelTop, BorderLayout.NORTH);
        
        // textarea panel
        jta = new ScrolledJTextArea();
        jta.setEditable(false);
        jta.setMargin(new Insets(10, 10, 10, 10));
        jta.setTabSize(3);
        jta.append("Select gates and then, click on 'start' to start minimization\n");
        Font f = new Font("Courrier", Font.BOLD, 12);
        jta.setFont(f);
        JScrollPane jsp = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        
        c.add(jsp, BorderLayout.CENTER);
        
        
        // Button panel;
        start = new JButton("Start", IconManager.imgic53);
        stop = new JButton("Stop", IconManager.imgic55);
        close = new JButton("Close", IconManager.imgic27);
        
        start.setPreferredSize(new Dimension(100, 30));
        stop.setPreferredSize(new Dimension(100, 30));
        close.setPreferredSize(new Dimension(100, 30));
        
        start.addActionListener(this);
        stop.addActionListener(this);
        close.addActionListener(this);
        
        JPanel jp2 = new JPanel();
        jp2.add(start);
        jp2.add(stop);
        jp2.add(close);
        
        c.add(jp2, BorderLayout.SOUTH);
    }
    
    public void	actionPerformed(ActionEvent evt)  {
        String command = evt.getActionCommand();
        
        // Compare the action command to the known actions.
        if (evt.getSource() == aldebaran) {
          activeAldebaran(true);
        } else if (evt.getSource() == bcgmin) {
          activeAldebaran(false);
        } else if (command.equals("Start"))  {
            startProcess();
        } else if (command.equals("Stop")) {
            stopProcess();
        } else if (command.equals("Close")) {
            closeDialog();
        } else if (command.equals("addOneIgnored")) {
            addOneIgnored();
        } else if (command.equals("addOneProjected")) {
            addOneProjected();
        } else if (command.equals("allProjected")) {
            allProjected();
        } else if (command.equals("allIgnored")) {
            allIgnored();
        }
    }

    public void activeAldebaran(boolean b) {
      omin.setEnabled(b);
      imin.setEnabled(b);
      strong.setEnabled(!b);
      branching.setEnabled(!b);
    }
    
    
    private void addOneIgnored() {
        int [] list = listProjected.getSelectedIndices();
        LinkedList<TClassAndGateDS> v = new LinkedList<TClassAndGateDS> ();
        for (int i=0; i<list.length; i++){
            TClassAndGateDS o = gatesProjected.get (list[i]);
            gatesIgnored.add (o);
            v.add (o);
        }
        
        gatesProjected.removeAll(v);
        moveSynchronizedGatesAsWell(gatesIgnored, gatesProjected);
        Collections.sort(gatesIgnored);
        listIgnored.setListData(gatesIgnored.toArray (new TClassAndGateDS[0]));
        listProjected.setListData(gatesProjected.toArray (new TClassAndGateDS[0]));
        checkMode();
        setButtons();
    }
    
    private void addOneProjected() {
        int [] list = listIgnored.getSelectedIndices();
        LinkedList<TClassAndGateDS> v = new LinkedList<TClassAndGateDS> ();
        for (int i=0; i<list.length; i++){
            TClassAndGateDS o = gatesIgnored.get (list[i]);
            gatesProjected.add (o);
            v.add (o);
        }
        
        gatesIgnored.removeAll(v);
        moveSynchronizedGatesAsWell(gatesProjected, gatesIgnored);
        Collections.sort(gatesProjected);
        listIgnored.setListData(gatesIgnored.toArray (new TClassAndGateDS[0]));
        listProjected.setListData(gatesProjected.toArray (new TClassAndGateDS[0]));
        checkMode();
        setButtons();
    }
    
    private void allProjected() {
        gatesProjected.addAll(gatesIgnored);
        Collections.sort(gatesProjected);
        gatesIgnored.clear ();
        listIgnored.setListData(gatesIgnored.toArray (new TClassAndGateDS[0]));
        listProjected.setListData(gatesProjected.toArray (new TClassAndGateDS[0]));
        checkMode();
        setButtons();
    }
    
    private void allIgnored() {
        gatesIgnored.addAll(gatesProjected);
        Collections.sort(gatesIgnored);
        gatesProjected.clear ();
        listIgnored.setListData(gatesIgnored.toArray (new TClassAndGateDS[0]));
        listProjected.setListData(gatesProjected.toArray (new TClassAndGateDS[0]));
        checkMode();
        setButtons();
    }
    
    private void moveSynchronizedGatesAsWell(LinkedList<TClassAndGateDS> toCheck, LinkedList<TClassAndGateDS> toPickup) {
        TClassAndGateDS tcg1;
        MasterGateManager mgm = mgui.gtm.getNewMasterGateManager();
        //Gate g;
        GroupOfGates gog, gog1;
        

        for (TClassAndGateDS tcg: toCheck) {
            gog = mgm.groupOf(tcg.getTClassName(), tcg.getGateName());
            if (gog != null) {
                for(int j=0; j<toPickup.size(); j++) {
                    tcg1 = toPickup.get (j);
                    gog1 = mgm.groupOf(tcg1.getTClassName(), tcg1.getGateName());
                    if (gog1 == gog) {
                        toCheck.add (tcg1);
                        toPickup.remove (j);
                        j--;
                    }
                }
            }
        }
    }
    
    public void checkMode() {
        if (gatesProjected.size() > 0) {
            mode = NOT_STARTED;
        } else {
            mode = NO_OPTIONS;
        }
    }
    
    private void setButtons() {
        switch(mode) {
            case NO_OPTIONS:
                listProjected.setEnabled(true);
                listIgnored.setEnabled(true);
                setButtonsList();
                start.setEnabled(false);
                stop.setEnabled(false);
                close.setEnabled(true);
                getGlassPane().setVisible(false);
                break;
            case NOT_STARTED:
                listProjected.setEnabled(true);
                listIgnored.setEnabled(true);
                setButtonsList();
                start.setEnabled(true);
                stop.setEnabled(false);
                close.setEnabled(true);
                getGlassPane().setVisible(false);
                break;
            case STARTED:
                listProjected.setEnabled(false);
                listIgnored.setEnabled(false);
                unsetButtonsList();
                start.setEnabled(false);
                stop.setEnabled(true);
                close.setEnabled(false);
                aldebaran.setEnabled(false);
                bcgmin.setEnabled(false);
                omin.setEnabled(false);
                imin.setEnabled(false);
                strong.setEnabled(false);
                branching.setEnabled(false);
                getGlassPane().setVisible(true);
                break;
            case STOPPED:
            default:
                listProjected.setEnabled(false);
                listIgnored.setEnabled(false);
                unsetButtonsList();
                start.setEnabled(false);
                stop.setEnabled(false);
                close.setEnabled(true);
                getGlassPane().setVisible(false);
                break;
        }
    }
    
    private void unsetButtonsList() {
        addOneProjected.setEnabled(false);
        addOneIgnored.setEnabled(false);
        allProjected.setEnabled(false);
        allIgnored.setEnabled(false);
    }
    
    private void setButtonsList() {
        int i1 = listIgnored.getSelectedIndex();
        int i2 = listProjected.getSelectedIndex();
        
        if (i1 == -1) {
            addOneProjected.setEnabled(false);
        } else {
            addOneProjected.setEnabled(true);
        }
        
        if (i2 == -1) {
            addOneIgnored.setEnabled(false);
        } else {
            addOneIgnored.setEnabled(true);
        }
        
        if (gatesIgnored.size() ==0) {
            allProjected.setEnabled(false);
        } else {
            allProjected.setEnabled(true);
        }
        
        if (gatesProjected.size() ==0) {
            allIgnored.setEnabled(false);
            //closeButton.setEnabled(false);
            //closeButton.setEnabled(false);
        } else {
            allIgnored.setEnabled(true);
            //closeButton.setEnabled(true);
        }
    }
    
    public void valueChanged(ListSelectionEvent e) {
        setButtons();
    }
    
    public void closeDialog() {
        if (mode == STARTED) {
            stopProcess();
        }
        dispose();
    }
    
    public void stopProcess() {
        if (rshc != null) {
            try {
                rshc.stopCommand();
            } catch (LauncherException le) {
                
            }
            rshc = null;
        }
        mode = 	STOPPED;
        setButtons();
    }
    
    public void startProcess() {
        t = new Thread(this);
        mode = STARTED;
        setButtons();
        t.start();
    }
    
    public void run() {
        String cmd1 = "";
        String autproj;
        String autprojdot;
     //   String data;
        int id = 0;
        String filenamebcg;
        Point p;
		
		RshClient rshctmp = null;
		

        try {
          // saving current options
          isAldebaranSelected = aldebaran.isSelected();
          isOminSelected = omin.isSelected();
          isStrongSelected = strong.isSelected();

            mgui.gtm.reinitRGAUTPROJDOT();
            jta.append("Modifying original RG\n");
            //System.out.println("Input data = " + inputData);
            
            autproj = mgui.gtm.performProjection(inputData, gatesProjected);
            
            if (autproj == null) {
                jta.append("\nError: the RG could not be prepared for minimization\n");
            } else {
              jta.append("\nRemoving ignored gates\n");
                if (isAldebaranSelected) {

                //System.out.println("Output data = " + autproj);
                
                //jta.append(autproj);

                //mgui.gtm.setRGAUTPROJ(autproj);
                //mgui.saveRGAutProj();
                
                if ((aldebaranHost == null) || (aldebaranHost.length() == 0)) {
                    jta.append("No Aldebaran installed -> cannot performed minimization\n");
                    mgui.gtm.setRGAUTPROJ(autproj);
                    mgui.saveRGAutProj();
                } else {
                    jta.append("Minimization with Aldebaran\n");
                    rshc = new RshClient(aldebaranHost);
					rshctmp = rshc;
                    id = rshc.getId();
                    fileName = FileUtils.addBeforeFileExtension(fileName, "_" + id);
                    jta.append("Session id on launcher="+id + " ; working on " + fileName + "\n");

                    rshc.deleteFile(fileName);
                    jta.append("Sending data\n");
                    rshc.sendFileData(fileName, autproj);
                    cmd1 = aldebaranPath;
                    if (omin.isSelected()) {
                        cmd1 +=  " -omin ";
                    } else {
                        cmd1 +=  " -imin ";
                    }
                    cmd1 += fileName;
                    jta.append("Performing minimization\n");
                    autproj = processCmd(cmd1);

                    // Print info on minimized graph
                    p = FormatManager.nbStateTransitionRGAldebaran(autproj);
                    jta.append("\n" + p.x + " state(s), " + p.y + " transition(s)\n\n");

                    mgui.gtm.setRGAUTPROJ(autproj);
                    mgui.saveRGAutProj();
                    jta.append("Minimization done\n");
                    //jta.append(autproj);
                    
                    // AUT proj dot
                    jta.append("\nConverting to dotty format\n");
                    rshc.sendFileData(fileName, autproj);
                    cmd1 = bcgioPath + " -aldebaran " + fileName + " -graphviz " + fileName + ".dot";
                    autproj = processCmd(cmd1);
                    autprojdot = rshc.getFileData(fileName + ".dot");
                    mgui.gtm.setRGAUTPROJDOT(autprojdot);
                    mgui.saveRGAutProjDOT();
                    rshc.deleteFile(fileName);
                    rshc.deleteFile(fileName + ".dot");
                    rshc.freeId(id);
                }
                } else {
                  // BCGMIN
                  if ((aldebaranHost == null) || (aldebaranHost.length() == 0) ||(bcgminPath.length() == 0)) {
                    jta.append("No bcgmin installed -> cannot performed minimization\n");
                    mgui.gtm.setRGAUTPROJ(autproj);
                    mgui.saveRGAutProj();
                } else {
                    jta.append("Minimization with bcgmin\n");
                    rshc = new RshClient(aldebaranHost);
                    id = rshc.getId();
					rshctmp = rshc;
                    fileName = FileUtils.addBeforeFileExtension(fileName, "_" + id);
                    filenamebcg = FileUtils.changeFileExtension(fileName, "bcg");
                    jta.append("Session id on launcher="+id + " ; working on " + fileName + "\n");

                    jta.append("Sending data\n");
                    rshc.sendFileData(fileName, autproj);
                    
                    // Converting to bcg format
                    jta.append("Converting data to bcg format\n");
                    cmd1 = bcgioPath + " -aldebaran " + fileName + " -bcg " + filenamebcg;
                    /*data =*/ processCmd(cmd1);

                    cmd1 = bcgminPath;
                    if (isStrongSelected) {
                        cmd1 +=  " -strong ";
                    } else {
                        cmd1 +=  " -branching ";
                    }
                    cmd1 += filenamebcg+ " " + filenamebcg;
                    jta.append("Performing minimization\n");
                    /*data =*/ processCmd(cmd1);
                    jta.append("Minimization done\n");

                    jta.append("Converting data to aut format\n");
                    cmd1 = bcgioPath + " -bcg " + filenamebcg+ " -aldebaran " + fileName;
                    /*data = */processCmd(cmd1);

                    jta.append("Getting aut data\n");
                    autproj = rshc.getFileData(fileName);
                    
                    // Print info on minimized graph
                    p = FormatManager.nbStateTransitionRGAldebaran(autproj);
                    jta.append("\n" + p.x + " state(s), " + p.y + " transition(s)\n\n");

                    mgui.gtm.setRGAUTPROJ(autproj);
                    mgui.saveRGAutProj();
                    //jta.append(autproj);

                    // AUT proj dot
                    jta.append("\nConverting to dotty format\n");
                    rshc.sendFileData(fileName, autproj);
                    cmd1 = bcgioPath + " -bcg " + filenamebcg + " -graphviz " + fileName + ".dot";
                    /*data =*/ processCmd(cmd1);
                    jta.append("Getting dot data\n");
                    autprojdot = rshc.getFileData(fileName + ".dot");
                    mgui.gtm.setRGAUTPROJDOT(autprojdot);
                    mgui.saveRGAutProjDOT();
                    
                    fileName = FileUtils.removeFileExtension(fileName);
                    rshc.deleteFile(fileName + ".aut");
                    rshc.deleteFile(fileName + ".bcg");
                    rshc.deleteFile(fileName + ".aut.dot");
                    rshc.deleteFile(fileName + ".o");
                    rshc.deleteFile(fileName + "@1.o");
                    rshc.freeId(id);
                }
                }
            }

            jta.append("Done\n");
            
        } catch (LauncherException le) {
            jta.append("Error:" + le.getMessage() + "\n");
			try{
				if (rshctmp != null) {
					rshctmp.freeId(id);
				}
			} catch (LauncherException leb) {}
            mode = STOPPED;
            setButtons();
            return;
        } catch (Exception e) {
            mode = STOPPED;
			try{
				if (rshctmp != null) {
					rshctmp.freeId(id);
				}
			} catch (LauncherException leb) {}
            setButtons();
            return;
        }
        
        mode = STOPPED;
        setButtons();
    }
    
    protected String processCmd(String cmd) throws LauncherException {
        rshc.setCmd(cmd);
        String s = null;
        rshc.sendExecuteCommandRequest();
        s = rshc.getDataFromProcess();
        return s;
    }
}