/* 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 java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import launcher.LauncherException;
import launcher.RshClient;
import myutil.GraphicLib;
import myutil.MasterProcessInterface;
import myutil.TraceManager;
import tmltranslator.HwNode;
import tmltranslator.TMLArchitecture;
import tmltranslator.TMLChannel;
import tmltranslator.TMLEvent;
import tmltranslator.TMLModeling;
import tmltranslator.TMLRequest;
import tmltranslator.TMLTask;
import tmltranslator.patternhandling.AttributeTaskJsonFile;
import tmltranslator.patternhandling.MappingPatternChannel;
import tmltranslator.patternhandling.MappingPatternTask;
import tmltranslator.patternhandling.PatternChannelWithSecurity;
import tmltranslator.patternhandling.PatternCloneTask;
import tmltranslator.patternhandling.PatternConfiguration;
import tmltranslator.patternhandling.PatternConnection;
import tmltranslator.patternhandling.PatternCreation;
import tmltranslator.patternhandling.PatternPortsConfig;
import tmltranslator.patternhandling.PortTaskJsonFile;
import tmltranslator.patternhandling.TaskPattern;
import tmltranslator.patternhandling.TaskPorts;
import ui.*;
import ui.util.IconManager;

/**
 * Class JDialogPatternHandling
 * Dialog for managing the generation of Patterns
 *
 * Creation: 16/08/2023
 *
 * @author Jawher JERRAY
 * @version 1.0 16/08/2023
 */

public class JDialogPatternHandling extends JDialog implements ActionListener, ListSelectionListener, MouseListener, Runnable,
        MasterProcessInterface {

    private static final Insets WEST_INSETS = new Insets(0, 0, 0, 0);

    protected MainGUI mgui;

    protected final static int NOT_STARTED = 1;
    protected final static int STARTED = 2;
    protected final static int STOPPED = 3;

    private String pathPatterns;

    private int mode;

    // Pattern Creation
    private String newPatternName;
    private JTextField jFieldNewPatternName;
    private JButton buttonAddAllTasksAsPattern, buttonAddSelectedTasksAsPattern, buttonRemoveAllTasksAsPattern, buttonRemoveSelectedTasksAsPattern;
    private JList<String> jListNoSelectedTasksAsPattern, jListSelectedTasksAsPattern;
    private Vector<String> selectedTasksAsPattern = new Vector<String>();
    private Vector<String> noSelectedTasksAsPattern = new Vector<String>();
    private Map<String, String> tasksFullName = new LinkedHashMap<String, String>();
    private JPanel jPanelPatternSelection;

    // Pattern Configuration
    private Vector<String> listPatterns = new Vector<String>();
    private Vector<String> tasksOfPatternWithExternalPort = new Vector<String>();
    private Vector<String> externalPortsOfTaskInPattern = new Vector<String>();
    private Vector<String> tasksOfModel = new Vector<String>();
    private Vector<String> portsOfTaskInModel = new Vector<String>();
    private JComboBox<String> jComboBoxPatterns;
    private JComboBox<String> jComboBoxPatternsTaskWithExternalPort;
    private DefaultComboBoxModel<String> modelPatternsTaskWithExternalPort = new DefaultComboBoxModel<>(tasksOfPatternWithExternalPort);
    private JComboBox<String> jComboBoxPatternExternalPortOfATask;
    private DefaultComboBoxModel<String> modelPatternExternalPortOfATask = new DefaultComboBoxModel<>(externalPortsOfTaskInPattern);
    private JComboBox<String> jComboBoxModelsTask;
    private DefaultComboBoxModel<String> modelTask = new DefaultComboBoxModel<>(tasksOfModel);
    private JComboBox<String> jComboBoxModelsPortOfTask;
    private DefaultComboBoxModel<String> modelPortOfATask = new DefaultComboBoxModel<>(portsOfTaskInModel);
    private JCheckBox jCheckBoxConnectToNewPort;
    private JCheckBox jCheckBoxAddConfidentiality;
    private JLabel jLabelAddAuthenticity;
    private Vector<String> authenticityModes = new Vector<String>(Arrays.asList(PatternCreation.WITHOUT_AUTHENTICITY, PatternCreation.WEAK_AUTHENTICITY, PatternCreation.STRONG_AUTHENTICITY));
    private JComboBox<String> jComboBoxAddAuthenticity;
    private JList<String> jListConnectedPorts;
    private Vector<String> connectedPorts = new Vector<String>();
    private List<PatternConnection> patternConnectionList = new ArrayList<PatternConnection>();
    private JButton addConnectionBetweenSelectedPorts, removeConnectionBetweenPorts;
    private JButton buttonCloneTask;
    private Vector<String> portsConfig = new Vector<String>();
    private JComboBox<String> jComboBoxPortsConfig;
    private DefaultComboBoxModel<String> modelPortsConfig = new DefaultComboBoxModel<>(portsConfig);
    private ButtonGroup portsConfigGroup;
    private JRadioButton jRadioPortConfigRemove, jRadioPortConfigMerge;
    private Vector<String> portsConfigMerge = new Vector<String>();
    private DefaultComboBoxModel<String> modelPortsConfigMerge = new DefaultComboBoxModel<>(portsConfigMerge);
    private JComboBox<String> jComboBoxPortsConfigMerge;
    private JList<String> jListConfigPorts;
    private Vector<String> configuredPorts = new Vector<String>();
    private List<PatternPortsConfig> configuredPortsList = new ArrayList<PatternPortsConfig>();
    private JButton addConfigPorts, removeConfigPorts;
    private JButton buttonTasksMapInArch;
    private JButton buttonChannelsMapInArch;
    private JButton buttonUpdatePatternsAttributes;

    private Vector<String> tasksCanBeCloned = new Vector<String>();
    private DefaultComboBoxModel<String> modelTaskToClone = new DefaultComboBoxModel<>(tasksCanBeCloned);
    private JComboBox<String> jComboBoxTaskToClone;
    private String newClonedTaskName;
    private JTextField jFieldNewClonedTaskName;
    private JButton addClonedTask, removeClonedTask;
    private JList<String> jListClonedTasks;
    private Vector<String> clonedTasks = new Vector<String>();
    private List<PatternCloneTask> clonedTasksList = new ArrayList<PatternCloneTask>();

    private ButtonGroup mapTaskGroup;
    private JRadioButton jRadioMapTaskInExistingHw, jRadioMapTaskInNewHw;
    private Vector<String> tasksToMap = new Vector<String>();
    private List<MappingPatternTask> tasksToMapList = new ArrayList<MappingPatternTask>();
    private Vector<String> tasksToMapInSameHw = new Vector<String>();
    private List<MappingPatternTask> tasksToMapInSameHwList = new ArrayList<MappingPatternTask>();
    private Vector<String> busToLinkNewHw = new Vector<String>();
    private DefaultComboBoxModel<String> modelTaskToMap = new DefaultComboBoxModel<>(tasksToMap);
    private DefaultComboBoxModel<String> modelMapTaskInSameHwAs = new DefaultComboBoxModel<>(tasksToMapInSameHw);
    private JComboBox<String> jComboBoxTaskToMap, jComboBoxMapTaskInSameHwAs, jComboBoxMapTaskInNewHw;
    private JButton addMappedTask, removeMappedTask;
    private JList<String> jListMappedTasks;
    private Vector<String> mappedTasks = new Vector<String>();
    private List<MappingPatternTask> mappedTasksList = new ArrayList<MappingPatternTask>();

    private ButtonGroup mapChannelGroup;
    private JRadioButton jRadioMapChannelInExistingMem, jRadioMapChannelInNewMem;
    private Vector<String> channelsToMap = new Vector<String>();
    private List<MappingPatternChannel> channelsToMapList = new ArrayList<MappingPatternChannel>();
    private Vector<String> channelsToMapInSameMem = new Vector<String>();
    private List<MappingPatternChannel> channelsToMapInSameMemList = new ArrayList<MappingPatternChannel>();
    private Vector<String> busToLinkNewMem = new Vector<String>();
    private DefaultComboBoxModel<String> modelChannelToMap = new DefaultComboBoxModel<>(channelsToMap);
    private DefaultComboBoxModel<String> modelMapChannelInSameMemAs = new DefaultComboBoxModel<>(channelsToMapInSameMem);
    private JComboBox<String> jComboBoxChannelToMap, jComboBoxMapChannelInSameMemAs, jComboBoxMapChannelInNewMem;
    private JButton addMappedChannel, removeMappedChannel;
    private JList<String> jListMappedChannels;
    private Vector<String> mappedChannels = new Vector<String>();
    private List<MappingPatternChannel> mappedChannelsList = new ArrayList<MappingPatternChannel>();

    private Vector<String> tasksToUpdateAttributes = new Vector<String>();
    private DefaultComboBoxModel<String> modelTasksToUpdateAttributes = new DefaultComboBoxModel<>(tasksToUpdateAttributes);
    private JComboBox<String> jComboBoxTasksToUpdateAttributes;
    private Vector<String> attributesOfTaskToUpdate = new Vector<String>();
    private DefaultComboBoxModel<String> modelAttributesOfTaskToUpdate = new DefaultComboBoxModel<>(attributesOfTaskToUpdate);
    private JComboBox<String> jComboBoxAttributesOfTaskToUpdate;
    private String newTaskAttibuteValue;
    private JTextField jFieldNewTaskAttibuteValue;
    private JButton buttonUpdateTaskAttributeValue;
    

    //LinkedHashMap<String, List<AttributeTaskJsonFile>> patternTasksAttributes = new LinkedHashMap<String, List<AttributeTaskJsonFile>>();
    //LinkedHashMap<String, List<PortTaskJsonFile>> patternTasksExternalPorts = new LinkedHashMap<String, List<PortTaskJsonFile>>();
    //LinkedHashMap<String, List<PortTaskJsonFile>> patternTasksInternalPorts = new LinkedHashMap<String, List<PortTaskJsonFile>>();
    private LinkedHashMap<String, TaskPattern> patternTasksAll = new LinkedHashMap<String, TaskPattern>();
    private LinkedHashMap<String, TaskPattern> patternTasksNotConnected = new LinkedHashMap<String, TaskPattern>();
    private LinkedHashMap<String, TaskPorts> portsTaskOfModelAll = new LinkedHashMap<String, TaskPorts>();
    private LinkedHashMap<String, TaskPorts> portsTaskOfModelLeft = new LinkedHashMap<String, TaskPorts>();
    private List<PatternPortsConfig> portsTaskConfig = new ArrayList<PatternPortsConfig>();
    private LinkedHashMap<String, List<AttributeTaskJsonFile>> updatedPatternAttributes = new LinkedHashMap<String, List<AttributeTaskJsonFile>>();
    private List<PatternChannelWithSecurity> channelsWithSecurity = new ArrayList<PatternChannelWithSecurity>();
    
    private List<String> busesOfModel = new ArrayList<String>();

    // Pattern Integration
    private Vector<String> listPatternsJson = new Vector<String>();
    private JComboBox<String> jComboBoxPatternsJson;
    private String patternJsonPathValue;
    private JTextField jFieldPatternJsonPath;

    //components
    private JScrollPane jsp;
    private JPanel jta;
    private JButton startButton;
    private JButton stop;
    private JButton close;
    private boolean go = false;

    private RshClient rshc;
    private JTabbedPane jp1;

    /*
     * Creates new form
     */
    public JDialogPatternHandling(Frame f, MainGUI _mgui, String title, String _pathPatterns) {
        super(f, title, Dialog.ModalityType.DOCUMENT_MODAL);

        mgui = _mgui;
        this.pathPatterns = _pathPatterns;

        TMLModeling<?> tmlmNew = mgui.gtm.getTMLMapping().getTMLModeling();
        for (TMLTask task : tmlmNew.getTasks()) {
            String[] taskNameSplit = task.getName().split("__");
            task.setName(taskNameSplit[taskNameSplit.length-1]);
        }
        for (TMLChannel ch : tmlmNew.getChannels()) {
            String[] channelNameSplit = ch.getName().split("__");
            ch.setName(channelNameSplit[channelNameSplit.length-1]);
        }
        for (TMLEvent evt : tmlmNew.getEvents()) {
            String[] eventNameSplit = evt.getName().split("__");
            evt.setName(eventNameSplit[eventNameSplit.length-1]);
        }
        for (TMLRequest req : tmlmNew.getRequests()) {
            String[] requestNameSplit = req.getName().split("__");
            req.setName(requestNameSplit[requestNameSplit.length-1]);
        }

        for (int i=0; i < mgui.gtm.getTMLMapping().getMappedTasks().size(); i++) {
            String taskFullName = mgui.gtm.getTMLMapping().getMappedTasks().get(i).getName();
            String taskShortName = taskFullName.split("__")[taskFullName.split("__").length - 1];
            tasksFullName.put(taskShortName, taskFullName);
            noSelectedTasksAsPattern.add(taskShortName);
        } 
        listPatterns = getFoldersName(_pathPatterns);
        listPatternsJson = getFoldersName(_pathPatterns);
        portsTaskOfModelAll = TaskPorts.getListPortsTask(mgui.gtm.getTMLMapping().getTMLModeling());
        portsTaskOfModelLeft = TaskPorts.getListPortsTask(mgui.gtm.getTMLMapping().getTMLModeling());
        busesOfModel = getListBus(mgui.gtm.getTMLMapping().getArch());
        initComponents();
        myInitComponents();
        pack();
    }

    protected void myInitComponents() {
        mode = NOT_STARTED;
        setButtons();
    }

    List<String> getListBus(TMLArchitecture tmlarch) {
        List<String> listBusName = new ArrayList<String>();
        for (HwNode bus : tmlarch.getBUSs()) {
            listBusName.add(bus.getName());
        }
        return listBusName;
    }

    Vector<String> getFoldersName(String path) {
        Vector<String> folders = new Vector<String>();
        File directoryPath = new File(path);
        String[] directories = directoryPath.list((dir, name) -> new File(dir, name).isDirectory());
        if (directories != null) {
            folders = new Vector<String>(Arrays.asList(directories));
        }
        return folders;
    }

    private GridBagConstraints createGbc(int y) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = y;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;

        gbc.anchor = GridBagConstraints.WEST;
        gbc.fill = GridBagConstraints.BOTH;

        gbc.insets = WEST_INSETS;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        return gbc;
    }

    protected void panelPatternCreation() {
        JPanel jp01 = new JPanel();
        GridBagLayout gridbag01 = new GridBagLayout();
        GridBagConstraints c01 = new GridBagConstraints();
        jp01.setLayout(gridbag01);
        jp01.setBorder(new javax.swing.border.TitledBorder("Pattern Creation"));

        c01.weighty = 1.0;
        c01.weightx = 1.0;
        c01.fill = GridBagConstraints.HORIZONTAL;
        c01.gridheight = 1;
        c01.gridwidth = 2;
        
        JLabel labelPatternName = new JLabel("Name of the new pattern: ");
        jp01.add(labelPatternName, c01);
        //addComponent(jp01, labelPatternName, 0, curY, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
        c01.gridwidth = GridBagConstraints.REMAINDER;
        jFieldNewPatternName = new JTextField(newPatternName, 10);
        jFieldNewPatternName.setPreferredSize(new Dimension(10, 25));
        jp01.add(jFieldNewPatternName, c01);
        //addComponent(jp01, jFieldNewPatternName, 1, curY, 3, GridBagConstraints.EAST, GridBagConstraints.BOTH);
        c01.gridwidth = GridBagConstraints.REMAINDER;
        jp01.add(new JLabel(" "), c01);
        c01.gridwidth = GridBagConstraints.REMAINDER;
        JLabel labelSelectPattern = new JLabel("Select tasks of the new Pattern: ");
        jp01.add(labelSelectPattern, c01);
        //addComponent(jp01, labelSelectPattern, 0, curY, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
        jListNoSelectedTasksAsPattern = new JList<String>(noSelectedTasksAsPattern);
        jPanelPatternSelection = new JPanel();
        jPanelPatternSelection.setPreferredSize(new Dimension(250, 200));
        GridBagConstraints c02 = new GridBagConstraints();
        c02.gridwidth = 1;
        c02.gridheight = 1;
        c02.fill= GridBagConstraints.BOTH;
         jListNoSelectedTasksAsPattern.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

        jListNoSelectedTasksAsPattern.addListSelectionListener(this);
        JScrollPane scrollPane1 = new JScrollPane(jListNoSelectedTasksAsPattern);
        scrollPane1.setPreferredSize(new Dimension(250, 200));
        jPanelPatternSelection.add(scrollPane1, BorderLayout.WEST);

        JPanel buttonPanel = new JPanel();
        GridBagConstraints c13 = new GridBagConstraints();
        c13.gridwidth = GridBagConstraints.REMAINDER;
        c13.gridheight = 1;
        
        buttonAddAllTasksAsPattern = new JButton(IconManager.imgic50);
        buttonAddAllTasksAsPattern.setPreferredSize(new Dimension(50, 25));
        buttonAddAllTasksAsPattern.addActionListener(this);
        buttonAddAllTasksAsPattern.setActionCommand("allTasksSelectedAsPattern");
        buttonPanel.add(buttonAddAllTasksAsPattern, c13);
        //buttonAddAllTasksAsPattern.setEnabled(false);

        buttonAddSelectedTasksAsPattern = new JButton(IconManager.imgic48);
        buttonAddSelectedTasksAsPattern.setPreferredSize(new Dimension(50, 25));
        buttonAddSelectedTasksAsPattern.addActionListener(this);
        buttonAddSelectedTasksAsPattern.setActionCommand("addTaskAsPattern");
        buttonPanel.add(buttonAddSelectedTasksAsPattern, c13);
        //buttonAddSelectedTasksAsPattern.setEnabled(false);

        buttonPanel.add(new JLabel(" "), c13);

        buttonRemoveSelectedTasksAsPattern = new JButton(IconManager.imgic46);
        buttonRemoveSelectedTasksAsPattern.addActionListener(this);
        buttonRemoveSelectedTasksAsPattern.setPreferredSize(new Dimension(50, 25));
        buttonRemoveSelectedTasksAsPattern.setActionCommand("removeTaskAsPattern");
        buttonPanel.add(buttonRemoveSelectedTasksAsPattern, c13);
        //buttonRemoveSelectedTasksAsPattern.setEnabled(false);

        buttonRemoveAllTasksAsPattern = new JButton(IconManager.imgic44);
        buttonRemoveAllTasksAsPattern.addActionListener(this);
        buttonRemoveAllTasksAsPattern.setPreferredSize(new Dimension(50, 25));
        buttonRemoveAllTasksAsPattern.setActionCommand("allTasksNoSelectedAsPattern");
        buttonPanel.add(buttonRemoveAllTasksAsPattern, c13);
        jPanelPatternSelection.add(buttonPanel, c02);
        buttonPanel.setPreferredSize(new Dimension(50, 200));
        //buttonRemoveAllTasksAsPattern.setEnabled(false);
        
        jListSelectedTasksAsPattern = new JList<String>(selectedTasksAsPattern);

        jListSelectedTasksAsPattern.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        jListSelectedTasksAsPattern.addListSelectionListener(this);
        JScrollPane scrollPane2 = new JScrollPane(jListSelectedTasksAsPattern);
        scrollPane2.setPreferredSize(new Dimension(250, 200));
        jPanelPatternSelection.add(scrollPane2, BorderLayout.CENTER);
        jPanelPatternSelection.setPreferredSize(new Dimension(600, 250));
        jPanelPatternSelection.setMinimumSize(new Dimension(600, 250));
        //c01.gridheight = 10;
        jp01.add(jPanelPatternSelection, c01);
        //c02.gridheight = 1;

        jp1.add("Pattern Creation", jp01);
    }

    protected void panelPatternConfiguration() {
        JPanel jp02 = new JPanel();
        GridBagLayout gridbag02 = new GridBagLayout();
        GridBagConstraints c02 = new GridBagConstraints();
        jp02.setLayout(gridbag02);
        jp02.setBorder(new javax.swing.border.TitledBorder("Pattern Selection and Configuration"));

        c02.weighty = 1.0;
        c02.weightx = 1.0;
        c02.fill = GridBagConstraints.HORIZONTAL;
        c02.anchor = GridBagConstraints.LINE_START;
        c02.gridheight = 1;
        c02.gridwidth = 1;
        
        JPanel jpPatternSelection = new JPanel();
        jpPatternSelection.setLayout(new GridBagLayout());
        GridBagConstraints cPatternSelection = new GridBagConstraints();
        cPatternSelection.gridx = 0;
        cPatternSelection.gridy = 0;
        cPatternSelection.fill = GridBagConstraints.HORIZONTAL;
        cPatternSelection.anchor = GridBagConstraints.LINE_START;
        cPatternSelection.weightx = 0.5;

        JLabel labelPatternName = new JLabel("Select a pattern: ");
        jpPatternSelection.add(labelPatternName, cPatternSelection);
        jComboBoxPatterns = new JComboBox<String>(listPatterns);
        jComboBoxPatterns.setSelectedIndex(-1);
        jComboBoxPatterns.addActionListener(this);
        cPatternSelection.gridx = 1;
        jpPatternSelection.add(jComboBoxPatterns, cPatternSelection);
        jp02.add(jpPatternSelection, c02);

        JPanel jpPatternConnetionMain = new JPanel();
        jpPatternConnetionMain.setLayout(new GridBagLayout());
        GridBagConstraints cPatternConnetionMain = new GridBagConstraints();
        cPatternConnetionMain.gridx = 0;
        cPatternConnetionMain.gridy = 0;
        cPatternConnetionMain.fill = GridBagConstraints.HORIZONTAL;
        cPatternConnetionMain.anchor = GridBagConstraints.LINE_START;
        cPatternConnetionMain.weightx = 1.0;
        jpPatternConnetionMain.add(new JLabel("Connect pattern's external ports:"), cPatternConnetionMain);

        
        JPanel jpPatternConnetion = new JPanel();
        jpPatternConnetion.setLayout(new GridBagLayout());
        GridBagConstraints cPatternConnetion = new GridBagConstraints();
        cPatternConnetion.gridx = 0;
        cPatternConnetion.gridy = 0;
        cPatternConnetion.fill = GridBagConstraints.HORIZONTAL;
        cPatternConnetion.anchor = GridBagConstraints.LINE_START;
        jpPatternConnetion.add(new JLabel("Select an external port of the pattern:"), cPatternConnetion);
        
        
        jComboBoxPatternsTaskWithExternalPort = new JComboBox<String>(modelPatternsTaskWithExternalPort);
        jComboBoxPatternsTaskWithExternalPort.setSelectedIndex(-1);
        jComboBoxPatternsTaskWithExternalPort.setEnabled(false);
        jComboBoxPatternsTaskWithExternalPort.addActionListener(this);
        cPatternConnetion.weightx = 0.4;
        cPatternConnetion.gridy = 1;
        jpPatternConnetion.add(jComboBoxPatternsTaskWithExternalPort, cPatternConnetion);
        jComboBoxPatternExternalPortOfATask = new JComboBox<String>(modelPatternExternalPortOfATask);
        jComboBoxPatternExternalPortOfATask.setSelectedIndex(-1);
        jComboBoxPatternExternalPortOfATask.setEnabled(false);
        jComboBoxPatternExternalPortOfATask.addActionListener(this);
        cPatternConnetion.gridx = 1;
        cPatternConnetion.weightx = 0.8;
        jpPatternConnetion.add(jComboBoxPatternExternalPortOfATask, cPatternConnetion);
        buttonCloneTask = new JButton("Clone Task");
        //buttonCloneTask.setPreferredSize(new Dimension(50, 25));
        buttonCloneTask.setEnabled(false);
        buttonCloneTask.addActionListener(this);
        buttonCloneTask.setActionCommand("cloneTask");
        cPatternConnetion.gridx = 2;
        cPatternConnetion.weightx = 0;
        jpPatternConnetion.add(buttonCloneTask, cPatternConnetion);

        jComboBoxModelsTask = new JComboBox<String>(modelTask);
        jComboBoxModelsTask.setSelectedIndex(-1);
        jComboBoxModelsTask.setEnabled(false);
        jComboBoxModelsTask.addActionListener(this);
        cPatternConnetion.gridx = 0;
        cPatternConnetion.gridy = 2;
        
        jpPatternConnetion.add(new JLabel("Select a model port to connect with:"), cPatternConnetion);
        cPatternConnetion.gridy = 3;
        cPatternConnetion.weightx = 0.8;
        jpPatternConnetion.add(jComboBoxModelsTask, cPatternConnetion);

        jComboBoxModelsPortOfTask = new JComboBox<String>(modelPortOfATask);
        jComboBoxModelsPortOfTask.setSelectedIndex(-1);
        jComboBoxModelsPortOfTask.setEnabled(false);
        jComboBoxModelsPortOfTask.addActionListener(this);
        cPatternConnetion.gridx = 1;
        cPatternConnetion.weightx = 0.8;
        jpPatternConnetion.add(jComboBoxModelsPortOfTask, cPatternConnetion);
        jCheckBoxConnectToNewPort = new JCheckBox("Connect to new Port");
        jCheckBoxConnectToNewPort.setEnabled(false);
        jCheckBoxConnectToNewPort.addActionListener(this);
        cPatternConnetion.gridx = 2;
        cPatternConnetion.weightx = 0;
        jpPatternConnetion.add(jCheckBoxConnectToNewPort, cPatternConnetion);

        cPatternConnetion.gridy = 4;
        cPatternConnetion.gridx = 0;
        jCheckBoxAddConfidentiality = new JCheckBox("Add Confidentiality");
        jCheckBoxAddConfidentiality.setEnabled(false);
        jCheckBoxAddConfidentiality.setVisible(false);
        jCheckBoxAddConfidentiality.addActionListener(this);
        jpPatternConnetion.add(jCheckBoxAddConfidentiality, cPatternConnetion);
        cPatternConnetion.gridx = 1;
        jLabelAddAuthenticity = new JLabel("Add Authenticity:");
        jLabelAddAuthenticity.setVisible(false);
        jpPatternConnetion.add(jLabelAddAuthenticity, cPatternConnetion);
        cPatternConnetion.gridx = 2;
        jComboBoxAddAuthenticity = new JComboBox<String>(authenticityModes);
        jComboBoxAddAuthenticity.setSelectedIndex(authenticityModes.indexOf(PatternCreation.WITHOUT_AUTHENTICITY));
        jComboBoxAddAuthenticity.setEnabled(false);
        jComboBoxAddAuthenticity.setVisible(false);
        jComboBoxAddAuthenticity.addActionListener(this);
        jpPatternConnetion.add(jComboBoxAddAuthenticity, cPatternConnetion);

        cPatternConnetionMain.gridy = 1;
        jpPatternConnetionMain.add(jpPatternConnetion, cPatternConnetionMain);


        jListConnectedPorts = new JList<String>(connectedPorts);
        JPanel jPanelPatternIntegration = new JPanel();
        jPanelPatternIntegration.setLayout(new GridBagLayout());
        GridBagConstraints cPatternIntegration = new GridBagConstraints();
        cPatternIntegration.gridx = 0;
        cPatternIntegration.gridy = 0;
        cPatternIntegration.weightx = 0.9;
        cPatternIntegration.fill = GridBagConstraints.HORIZONTAL;
        cPatternIntegration.anchor = GridBagConstraints.LINE_START;
        
        //jPanelPatternIntegration.setPreferredSize(new Dimension(600, 130));
        jListConnectedPorts.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

        jListConnectedPorts.addListSelectionListener(this);
        JScrollPane scrollPaneConnectedPorts = new JScrollPane(jListConnectedPorts);
        scrollPaneConnectedPorts.setPreferredSize(new Dimension(450, 125));
        jPanelPatternIntegration.add(scrollPaneConnectedPorts, cPatternIntegration);
        
        JPanel pannelButtonConnectPorts = new JPanel();
        pannelButtonConnectPorts.setLayout(new GridBagLayout());
        GridBagConstraints cConnectedPorts = new GridBagConstraints();
        cConnectedPorts.gridx = 0;
        cConnectedPorts.weightx = 1.0;
        cConnectedPorts.gridy = 0;
        cConnectedPorts.fill = GridBagConstraints.HORIZONTAL;
        cConnectedPorts.anchor = GridBagConstraints.LINE_START;
        addConnectionBetweenSelectedPorts = new JButton("+");
        addConnectionBetweenSelectedPorts.setEnabled(false);
        addConnectionBetweenSelectedPorts.setPreferredSize(new Dimension(50, 25));
        addConnectionBetweenSelectedPorts.addActionListener(this);
        addConnectionBetweenSelectedPorts.setActionCommand("addConnectionBetweenSelectedPorts");
        pannelButtonConnectPorts.add(addConnectionBetweenSelectedPorts, cConnectedPorts);

        removeConnectionBetweenPorts = new JButton("-");
        removeConnectionBetweenPorts.setEnabled(false);
        removeConnectionBetweenPorts.setPreferredSize(new Dimension(50, 25));
        removeConnectionBetweenPorts.addActionListener(this);
        removeConnectionBetweenPorts.setActionCommand("removeConnectionBetweenPorts");
        cConnectedPorts.gridy = 1;
        pannelButtonConnectPorts.add(removeConnectionBetweenPorts, cConnectedPorts);
        //pannelButtonConnectPorts.setPreferredSize(new Dimension(50, 125));
        //jPanelPatternIntegration.setMinimumSize(new Dimension(600, 130));
        cPatternIntegration.gridx = 1;
        cPatternIntegration.weightx = 0.1;
        jPanelPatternIntegration.add(pannelButtonConnectPorts, cPatternIntegration);
        cPatternConnetionMain.gridy = 2;
        jpPatternConnetionMain.add(jPanelPatternIntegration, cPatternConnetionMain);
        //c02.gridwidth = GridBagConstraints.REMAINDER;
        c02.gridy = 1;
        c02.insets = new Insets(10,0,0,0); 
        jp02.add(jpPatternConnetionMain, c02);
        
        JPanel jpPortConfigurationMain = new JPanel();
        jpPortConfigurationMain.setLayout(new GridBagLayout());
        GridBagConstraints cPortConfigurationMain = new GridBagConstraints();
        cPortConfigurationMain.gridx = 0;
        cPortConfigurationMain.gridy = 0;
        cPortConfigurationMain.gridwidth = 2;
        cPortConfigurationMain.anchor = GridBagConstraints.LINE_START;
        //cPortConfigurationMain.fill= GridBagConstraints.BOTH;

        jpPortConfigurationMain.add(new JLabel("Ports to configure:"), cPortConfigurationMain);
        //cPortConfigurationMain.gridwidth = GridBagConstraints.REMAINDER;
        JPanel jpPortConfiguration = new JPanel();
        jpPortConfiguration.setLayout(new GridBagLayout());
        GridBagConstraints cPortConfiguration = new GridBagConstraints();
        cPortConfiguration.gridx = 0;
        cPortConfiguration.gridy = 0;
        cPortConfiguration.gridwidth = 2;
        cPortConfiguration.fill = GridBagConstraints.HORIZONTAL;
        cPortConfiguration.anchor = GridBagConstraints.LINE_START;

        jComboBoxPortsConfig = new JComboBox<String>(modelPortsConfig);
        jComboBoxPortsConfig.setSelectedIndex(-1);
        jComboBoxPortsConfig.setEnabled(false);
        jComboBoxPortsConfig.addActionListener(this);
        jpPortConfiguration.add(jComboBoxPortsConfig, cPortConfiguration);
        //cPortConfiguration.gridwidth = GridBagConstraints.REMAINDER;
        portsConfigGroup =new ButtonGroup();
        jRadioPortConfigRemove = new JRadioButton("Remove port");
        jRadioPortConfigRemove.setEnabled(false);
        jRadioPortConfigRemove.addActionListener(this);
        cPortConfiguration.gridy = 1;
        jpPortConfiguration.add(jRadioPortConfigRemove, cPortConfiguration);
        
        jRadioPortConfigMerge = new JRadioButton("Merge with:");
        jRadioPortConfigMerge.setEnabled(false);
        jRadioPortConfigMerge.addActionListener(this);
        cPortConfiguration.gridy = 2;
        cPortConfiguration.gridwidth = 1;
        jpPortConfiguration.add(jRadioPortConfigMerge, cPortConfiguration);
        //cPortConfiguration.gridwidth = GridBagConstraints.REMAINDER;
        portsConfigGroup.add(jRadioPortConfigRemove);
        portsConfigGroup.add(jRadioPortConfigMerge);
        jComboBoxPortsConfigMerge = new JComboBox<String>(modelPortsConfigMerge);
        jComboBoxPortsConfigMerge.setSelectedIndex(-1);
        jComboBoxPortsConfigMerge.setEnabled(false);
        jComboBoxPortsConfigMerge.addActionListener(this);
        jComboBoxPortsConfigMerge.setPreferredSize(new Dimension(200, 25));
        cPortConfiguration.gridx = 1;
        cPortConfiguration.weightx = 1.0;
        jpPortConfiguration.add(jComboBoxPortsConfigMerge, cPortConfiguration);
        
        cPortConfigurationMain.gridx = 0;
        cPortConfigurationMain.gridy = 1;
        cPortConfigurationMain.weightx = 0.6;
        cPortConfigurationMain.gridwidth = 1;
        //cPortConfigurationMain.ipady = 100;
        //cPortConfigurationMain.fill = GridBagConstraints.BOTH;
        cPortConfigurationMain.anchor = GridBagConstraints.FIRST_LINE_START;
        //jpPortConfiguration.setBackground(Color.gray);
        cPortConfigurationMain.insets = new Insets(5,0,0,0);  //top padding
        jpPortConfigurationMain.add(jpPortConfiguration, cPortConfigurationMain);
        //cPortConfigurationMain.gridwidth = GridBagConstraints.REMAINDER;

        jListConfigPorts = new JList<String>(configuredPorts);
        JPanel jPanelConfigPorts = new JPanel(new GridBagLayout());
        jPanelConfigPorts.setLayout(new GridBagLayout());
        GridBagConstraints cConfigPorts = new GridBagConstraints();
        //jPanelConfigPorts.setPreferredSize(new Dimension(200, 100));
        jListConfigPorts.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

        jListConfigPorts.addListSelectionListener(this);
        JScrollPane scrollPaneConfigPorts = new JScrollPane(jListConfigPorts);
        //scrollPaneConfigPorts.setPreferredSize(new Dimension(200, 100));
        cConfigPorts.gridx = 0;
        cConfigPorts.gridy = 0;
        cConfigPorts.fill = GridBagConstraints.HORIZONTAL;
        jPanelConfigPorts.add(scrollPaneConfigPorts, cConfigPorts);
        
        JPanel pannelButtonConfigPorts = new JPanel();
        pannelButtonConfigPorts.setLayout(new GridBagLayout());
        GridBagConstraints cButtonConfigPorts = new GridBagConstraints();
        cButtonConfigPorts.gridx = 0;
        cButtonConfigPorts.gridy = 0;
        addConfigPorts = new JButton("+");
        addConfigPorts.setEnabled(false);
        addConfigPorts.setPreferredSize(new Dimension(50, 25));
        addConfigPorts.addActionListener(this);
        addConfigPorts.setActionCommand("addConfigPorts");
        pannelButtonConfigPorts.add(addConfigPorts, cButtonConfigPorts);

        removeConfigPorts = new JButton("-");
        removeConfigPorts.setEnabled(false);
        removeConfigPorts.setPreferredSize(new Dimension(50, 25));
        removeConfigPorts.addActionListener(this);
        removeConfigPorts.setActionCommand("removeConfigPorts");
        cButtonConfigPorts.gridx = 1;
        pannelButtonConfigPorts.add(removeConfigPorts, cButtonConfigPorts);
        //pannelButtonConfigPorts.setPreferredSize(new Dimension(200, 30));
        //jPanelConfigPorts.setMinimumSize(new Dimension(220, 110));
        cConfigPorts.gridy = 1;
        jPanelConfigPorts.add(pannelButtonConfigPorts, cConfigPorts);

        cPortConfigurationMain.gridx = 1;
        cPortConfigurationMain.gridy = 1;
        cPortConfigurationMain.weightx = 0.4;
        cPortConfigurationMain.fill = GridBagConstraints.HORIZONTAL;
        cPortConfigurationMain.anchor = GridBagConstraints.FIRST_LINE_START;
        //jPanelConfigPorts.setBackground(Color.red);  
        jpPortConfigurationMain.add(jPanelConfigPorts, cPortConfigurationMain);
        c02.gridy = 2;
        jp02.add(jpPortConfigurationMain, c02);
        //c02.gridwidth = GridBagConstraints.REMAINDER;

        JPanel jpOptions = new JPanel();
        jpOptions.setLayout(new GridBagLayout());
        GridBagConstraints cOptions = new GridBagConstraints();
        cOptions.gridx = 0;
        cOptions.gridy = 0;
        cOptions.fill = GridBagConstraints.HORIZONTAL;
        cOptions.anchor = GridBagConstraints.FIRST_LINE_START;
        cOptions.weightx = 1.0;
        cOptions.gridwidth = 3;
        jpOptions.add(new JLabel("Options:"), cOptions);
        
        
        buttonTasksMapInArch = new JButton("Map pattern tasks");
        buttonTasksMapInArch.setEnabled(false);
        buttonTasksMapInArch.addActionListener(this);
        buttonTasksMapInArch.setActionCommand("mapTasksManuallyInArchitecture");
        cOptions.gridy = 1;
        cOptions.gridwidth = 1;
        //cOptions.weightx = 0.3;
        cOptions.fill = GridBagConstraints.NONE;
        jpOptions.add(buttonTasksMapInArch, cOptions);

        buttonChannelsMapInArch = new JButton("Map pattern channels");
        buttonChannelsMapInArch.setEnabled(false);
        buttonChannelsMapInArch.addActionListener(this);
        buttonChannelsMapInArch.setActionCommand("mapChannelsManuallyInArchitecture");
        cOptions.gridx = 1;
        jpOptions.add(buttonChannelsMapInArch, cOptions);

        buttonUpdatePatternsAttributes = new JButton("Update Pattern's Attributes values");
        buttonUpdatePatternsAttributes.setEnabled(false);
        buttonUpdatePatternsAttributes.addActionListener(this);
        buttonUpdatePatternsAttributes.setActionCommand("updatePatternsAttributes");
        cOptions.gridx = 2;
        jpOptions.add(buttonUpdatePatternsAttributes, cOptions);

        c02.gridy = 3;
        jp02.add(jpOptions, c02);

        jp1.add("Pattern Selection and Configuration", jp02);
    }

    protected void panelPatternIntegration() {
        JPanel jp02 = new JPanel();
        GridBagLayout gridbag02 = new GridBagLayout();
        GridBagConstraints c02 = new GridBagConstraints();
        jp02.setLayout(gridbag02);
        jp02.setBorder(new javax.swing.border.TitledBorder("Pattern Integration"));

        c02.weighty = 1.0;
        c02.weightx = 1.0;
        c02.fill = GridBagConstraints.HORIZONTAL;
        c02.anchor = GridBagConstraints.LINE_START;
        c02.gridheight = 1;
        c02.gridwidth = 1;
        
        JPanel jpPatternSelection = new JPanel();
        jpPatternSelection.setLayout(new GridBagLayout());
        GridBagConstraints cPatternSelection = new GridBagConstraints();
        cPatternSelection.gridx = 0;
        cPatternSelection.gridy = 0;
        cPatternSelection.fill = GridBagConstraints.HORIZONTAL;
        cPatternSelection.anchor = GridBagConstraints.LINE_START;
        cPatternSelection.weightx = 0.5;

        JLabel labelPatternName = new JLabel("Select a pattern: ");
        jpPatternSelection.add(labelPatternName, cPatternSelection);

        jComboBoxPatternsJson = new JComboBox<String>(listPatternsJson);
        jComboBoxPatternsJson.setSelectedIndex(-1);
        jComboBoxPatternsJson.addActionListener(this);
        cPatternSelection.gridx = 1;
        jpPatternSelection.add(jComboBoxPatternsJson, cPatternSelection);

        cPatternSelection.gridy = 1;
        cPatternSelection.gridx = 0;
        jpPatternSelection.add(new JLabel("Path To Json File :"), cPatternSelection);


        jFieldPatternJsonPath = new JTextField(patternJsonPathValue, 10);
        jFieldPatternJsonPath.setEnabled(false);
        jFieldPatternJsonPath.setPreferredSize(new Dimension(10, 25));
        jFieldPatternJsonPath.addActionListener(this);
        cPatternSelection.gridx = 1;
        jpPatternSelection.add(jFieldPatternJsonPath, cPatternSelection);
        jp02.add(jpPatternSelection, c02);

        jp1.add("Pattern Integration", jp02);
    }

    protected void initComponents() {

        jp1 = GraphicLib.createTabbedPane();
        Container c = getContentPane();
        setFont(new Font("Helvetica", Font.PLAIN, 14));
        c.setLayout(new BorderLayout());

        jta = new JPanel();
        jta.setLayout(new GridBagLayout());
        jta.setBorder(new javax.swing.border.TitledBorder("Results"));
        Font f = new Font("Courrier", Font.BOLD, 12);
        jta.setFont(f);

        jsp = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        jsp.setPreferredSize(new Dimension(300, 100));
        c.add(jsp, BorderLayout.CENTER);

        startButton = new JButton("Start", IconManager.imgic53);
        stop = new JButton("Stop", IconManager.imgic55);
        close = new JButton("Close", IconManager.imgic27);

        startButton.setPreferredSize(new Dimension(100, 30));
        stop.setPreferredSize(new Dimension(100, 30));
        close.setPreferredSize(new Dimension(120, 30));

        startButton.addActionListener(this);
        stop.addActionListener(this);
        close.addActionListener(this);

        JPanel jp2 = new JPanel();
        jp2.add(startButton);
        jp2.add(stop);
        jp2.add(close);

        panelPatternCreation();
        panelPatternConfiguration();
        panelPatternIntegration();

        c.add(jp1, BorderLayout.NORTH);
        c.add(jp2, BorderLayout.SOUTH);
    }

    private void removeTaskAsPattern() {
        int[] list = jListSelectedTasksAsPattern.getSelectedIndices();
        Vector<String> v = new Vector<String>();
        String o;
        for (int i = 0; i < list.length; i++) {
            o = selectedTasksAsPattern.elementAt(list[i]);
            noSelectedTasksAsPattern.addElement(o);
            v.addElement(o);
        }

        selectedTasksAsPattern.removeAll(v);
        jListNoSelectedTasksAsPattern.setListData(noSelectedTasksAsPattern);
        jListSelectedTasksAsPattern.setListData(selectedTasksAsPattern);
        setButtons();
    }

    private void addTaskAsPattern() {
        int[] list = jListNoSelectedTasksAsPattern.getSelectedIndices();
        Vector<String> v = new Vector<String>();
        String o;

        for (int i = 0; i < list.length; i++) {
            o = noSelectedTasksAsPattern.elementAt(list[i]);
            selectedTasksAsPattern.addElement(o);
            v.addElement(o);
        }
        noSelectedTasksAsPattern.removeAll(v);
        jListNoSelectedTasksAsPattern.setListData(noSelectedTasksAsPattern);
        jListSelectedTasksAsPattern.setListData(selectedTasksAsPattern);
        setButtons();
    }

    private void allTasksSelectedAsPattern() {
        selectedTasksAsPattern.addAll(noSelectedTasksAsPattern);
        noSelectedTasksAsPattern.removeAllElements();
        jListNoSelectedTasksAsPattern.setListData(noSelectedTasksAsPattern);
        jListSelectedTasksAsPattern.setListData(selectedTasksAsPattern);
        setButtons();
    }

    private void allTasksNoSelectedAsPattern() {
        noSelectedTasksAsPattern.addAll(selectedTasksAsPattern);
        selectedTasksAsPattern.removeAllElements();
        jListNoSelectedTasksAsPattern.setListData(noSelectedTasksAsPattern);
        jListSelectedTasksAsPattern.setListData(selectedTasksAsPattern);
        setButtons();
    }

    private void mapTasksManuallyInArchitecture() {
        JDialog mapTasksInArchDialog = new JDialog(this.getOwner(), "Map manually tasks of the pattern in the architecture", Dialog.ModalityType.DOCUMENT_MODAL);
        Container contMapTasksInArch = mapTasksInArchDialog.getContentPane();
        contMapTasksInArch.setLayout(new BorderLayout());
        JPanel jpMapTasksInArch = new JPanel();
        jpMapTasksInArch.setLayout(new GridBagLayout());
        GridBagConstraints cMapTasksInArch = new GridBagConstraints();
        cMapTasksInArch.gridx = 0;
        cMapTasksInArch.gridy = 0;
        cMapTasksInArch.fill = GridBagConstraints.HORIZONTAL;
        cMapTasksInArch.anchor = GridBagConstraints.FIRST_LINE_START;
        cMapTasksInArch.weightx = 0.0;
        cMapTasksInArch.insets = new Insets(10,0,0,0);  //top padding
        jpMapTasksInArch.add(new JLabel("Select a Task to map:"), cMapTasksInArch);

        jComboBoxTaskToMap = new JComboBox<String>(modelTaskToMap);
        jComboBoxTaskToMap.setSelectedIndex(-1);
        //jComboBoxTaskToMap.setEnabled(false);
        jComboBoxTaskToMap.addActionListener(this);
        //jComboBoxPortsConfigMerge.setPreferredSize(new Dimension(150, 25));
        cMapTasksInArch.gridx = 1;
        cMapTasksInArch.weightx = 1.0;
        jpMapTasksInArch.add(jComboBoxTaskToMap, cMapTasksInArch);
        cMapTasksInArch.gridx = 0;
        cMapTasksInArch.gridy = 1;
        cMapTasksInArch.weightx = 0.0;
        
        mapTaskGroup =new ButtonGroup();
        jRadioMapTaskInExistingHw = new JRadioButton("Map in the same HW as : ");
        jRadioMapTaskInExistingHw.setEnabled(false);
        jRadioMapTaskInExistingHw.addActionListener(this);
        jpMapTasksInArch.add(jRadioMapTaskInExistingHw, cMapTasksInArch);
        cMapTasksInArch.gridx = 1;
        cMapTasksInArch.weightx = 1.0;
        jComboBoxMapTaskInSameHwAs = new JComboBox<String>(modelMapTaskInSameHwAs);
        jComboBoxMapTaskInSameHwAs.setSelectedIndex(-1);
        jComboBoxMapTaskInSameHwAs.setEnabled(false);
        jComboBoxMapTaskInSameHwAs.addActionListener(this);
        jpMapTasksInArch.add(jComboBoxMapTaskInSameHwAs, cMapTasksInArch);

        cMapTasksInArch.gridy = 2;
        cMapTasksInArch.gridx = 0;
        cMapTasksInArch.weightx = 0.0;
        jRadioMapTaskInNewHw = new JRadioButton("Map in a new HW that will be linked to bus :");
        jRadioMapTaskInNewHw.setEnabled(false);
        jRadioMapTaskInNewHw.addActionListener(this);
        jpMapTasksInArch.add(jRadioMapTaskInNewHw, cMapTasksInArch);
        cMapTasksInArch.gridx = 1;
        cMapTasksInArch.weightx = 1.0;
        busToLinkNewHw = new Vector<String>(busesOfModel) ;
        jComboBoxMapTaskInNewHw = new JComboBox<String>(busToLinkNewHw);
        jComboBoxMapTaskInNewHw.setSelectedIndex(-1);
        jComboBoxMapTaskInNewHw.setEnabled(false);
        jComboBoxMapTaskInNewHw.addActionListener(this);
        jpMapTasksInArch.add(jComboBoxMapTaskInNewHw, cMapTasksInArch);
        mapTaskGroup.add(jRadioMapTaskInExistingHw);
        mapTaskGroup.add(jRadioMapTaskInNewHw);


        jListMappedTasks = new JList<String>(mappedTasks);
        JPanel jPanelMappedTasks = new JPanel();
        jPanelMappedTasks.setLayout(new GridBagLayout());
        GridBagConstraints cMappedTasks = new GridBagConstraints();
        cMappedTasks.gridx = 0;
        cMappedTasks.gridy = 0;
        cMappedTasks.weightx = 0.95;
        cMappedTasks.fill = GridBagConstraints.HORIZONTAL;
        cMappedTasks.anchor = GridBagConstraints.LINE_START;
        
        jListMappedTasks.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        jListMappedTasks.addListSelectionListener(this);
        JScrollPane scrollPaneMappedTasks = new JScrollPane(jListMappedTasks);
        scrollPaneMappedTasks.setPreferredSize(new Dimension(250, 175));
        jPanelMappedTasks.add(scrollPaneMappedTasks, cMappedTasks);
        
        JPanel pannelButtonMappedTasks = new JPanel();
        pannelButtonMappedTasks.setLayout(new GridBagLayout());
        GridBagConstraints cButtonMappedTasks = new GridBagConstraints();
        cButtonMappedTasks.gridx = 0;
        cButtonMappedTasks.weightx = 1.0;
        cButtonMappedTasks.gridy = 0;
        cButtonMappedTasks.fill = GridBagConstraints.HORIZONTAL;
        cButtonMappedTasks.anchor = GridBagConstraints.LINE_START;
        addMappedTask = new JButton("+");
        addMappedTask.setEnabled(false);
        addMappedTask.setPreferredSize(new Dimension(40, 25));
        addMappedTask.addActionListener(this);
        addMappedTask.setActionCommand("addMappedTask");
        pannelButtonMappedTasks.add(addMappedTask, cButtonMappedTasks);

        removeMappedTask = new JButton("-");
        //removeMappedTask.setEnabled(false);
        removeMappedTask.setPreferredSize(new Dimension(40, 25));
        removeMappedTask.addActionListener(this);
        removeMappedTask.setActionCommand("removeMappedTask");
        cButtonMappedTasks.gridy = 1;
        pannelButtonMappedTasks.add(removeMappedTask, cButtonMappedTasks);

        cMappedTasks.gridx = 1;
        cMappedTasks.weightx = 0.05;
        jPanelMappedTasks.add(pannelButtonMappedTasks, cMappedTasks);
        cMapTasksInArch.gridy = 3;
        cMapTasksInArch.gridx = 0;
        cMapTasksInArch.gridwidth = 2;
        jpMapTasksInArch.add(jPanelMappedTasks, cMapTasksInArch);
        contMapTasksInArch.add(jpMapTasksInArch, BorderLayout.NORTH);
        GraphicLib.centerOnParent(mapTasksInArchDialog, 500, 400);
        mapTasksInArchDialog.setVisible(true);
    }

    private void mapChannelsManuallyInArchitecture() {
        JDialog mapChannelsInArchDialog = new JDialog(this.getOwner(), "Map manually channels of the pattern in the architecture", Dialog.ModalityType.DOCUMENT_MODAL);
        Container contMapChannelsInArch = mapChannelsInArchDialog.getContentPane();
        contMapChannelsInArch.setLayout(new BorderLayout());
        JPanel jpMapChannelsInArch = new JPanel();
        jpMapChannelsInArch.setLayout(new GridBagLayout());
        GridBagConstraints cMapChannelsInArch = new GridBagConstraints();
        cMapChannelsInArch.gridx = 0;
        cMapChannelsInArch.gridy = 0;
        cMapChannelsInArch.fill = GridBagConstraints.HORIZONTAL;
        cMapChannelsInArch.anchor = GridBagConstraints.FIRST_LINE_START;
        cMapChannelsInArch.weightx = 0.0;
        cMapChannelsInArch.insets = new Insets(10,0,0,0);  //top padding
        jpMapChannelsInArch.add(new JLabel("Select a Channel to map:"), cMapChannelsInArch);

        jComboBoxChannelToMap = new JComboBox<String>(modelChannelToMap);
        jComboBoxChannelToMap.setSelectedIndex(-1);
        //jComboBoxChannelToMap.setEnabled(false);
        jComboBoxChannelToMap.addActionListener(this);
        //jComboBoxPortsConfigMerge.setPreferredSize(new Dimension(150, 25));
        cMapChannelsInArch.gridx = 1;
        cMapChannelsInArch.weightx = 1.0;
        jpMapChannelsInArch.add(jComboBoxChannelToMap, cMapChannelsInArch);
        cMapChannelsInArch.gridx = 0;
        cMapChannelsInArch.gridy = 1;
        cMapChannelsInArch.weightx = 0.0;
        
        mapChannelGroup =new ButtonGroup();
        jRadioMapChannelInExistingMem = new JRadioButton("Map in the same Memory as : ");
        jRadioMapChannelInExistingMem.setEnabled(false);
        jRadioMapChannelInExistingMem.addActionListener(this);
        jpMapChannelsInArch.add(jRadioMapChannelInExistingMem, cMapChannelsInArch);
        cMapChannelsInArch.gridx = 1;
        cMapChannelsInArch.weightx = 1.0;
        jComboBoxMapChannelInSameMemAs = new JComboBox<String>(modelMapChannelInSameMemAs);
        jComboBoxMapChannelInSameMemAs.setSelectedIndex(-1);
        jComboBoxMapChannelInSameMemAs.setEnabled(false);
        jComboBoxMapChannelInSameMemAs.addActionListener(this);
        jpMapChannelsInArch.add(jComboBoxMapChannelInSameMemAs, cMapChannelsInArch);

        cMapChannelsInArch.gridy = 2;
        cMapChannelsInArch.gridx = 0;
        cMapChannelsInArch.weightx = 0.0;
        jRadioMapChannelInNewMem = new JRadioButton("Map in a new Memory that will be linked to bus :");
        jRadioMapChannelInNewMem.setEnabled(false);
        jRadioMapChannelInNewMem.addActionListener(this);
        jpMapChannelsInArch.add(jRadioMapChannelInNewMem, cMapChannelsInArch);
        cMapChannelsInArch.gridx = 1;
        cMapChannelsInArch.weightx = 1.0;
        busToLinkNewMem = new Vector<String>(busesOfModel) ;
        jComboBoxMapChannelInNewMem = new JComboBox<String>(busToLinkNewMem);
        jComboBoxMapChannelInNewMem.setSelectedIndex(-1);
        jComboBoxMapChannelInNewMem.setEnabled(false);
        jComboBoxMapChannelInNewMem.addActionListener(this);
        jpMapChannelsInArch.add(jComboBoxMapChannelInNewMem, cMapChannelsInArch);
        mapChannelGroup.add(jRadioMapChannelInExistingMem);
        mapChannelGroup.add(jRadioMapChannelInNewMem);


        jListMappedChannels = new JList<String>(mappedChannels);
        JPanel jPanelMappedChannels = new JPanel();
        jPanelMappedChannels.setLayout(new GridBagLayout());
        GridBagConstraints cMappedChannels = new GridBagConstraints();
        cMappedChannels.gridx = 0;
        cMappedChannels.gridy = 0;
        cMappedChannels.weightx = 0.95;
        cMappedChannels.fill = GridBagConstraints.HORIZONTAL;
        cMappedChannels.anchor = GridBagConstraints.LINE_START;
        
        jListMappedChannels.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        jListMappedChannels.addListSelectionListener(this);
        JScrollPane scrollPaneMappedChannels = new JScrollPane(jListMappedChannels);
        scrollPaneMappedChannels.setPreferredSize(new Dimension(250, 175));
        jPanelMappedChannels.add(scrollPaneMappedChannels, cMappedChannels);
        
        JPanel pannelButtonMappedChannels = new JPanel();
        pannelButtonMappedChannels.setLayout(new GridBagLayout());
        GridBagConstraints cButtonMappedChannels = new GridBagConstraints();
        cButtonMappedChannels.gridx = 0;
        cButtonMappedChannels.weightx = 1.0;
        cButtonMappedChannels.gridy = 0;
        cButtonMappedChannels.fill = GridBagConstraints.HORIZONTAL;
        cButtonMappedChannels.anchor = GridBagConstraints.LINE_START;
        addMappedChannel = new JButton("+");
        addMappedChannel.setEnabled(false);
        addMappedChannel.setPreferredSize(new Dimension(40, 25));
        addMappedChannel.addActionListener(this);
        addMappedChannel.setActionCommand("addMappedChannel");
        pannelButtonMappedChannels.add(addMappedChannel, cButtonMappedChannels);

        removeMappedChannel = new JButton("-");
        //removeMappedChannel.setEnabled(false);
        removeMappedChannel.setPreferredSize(new Dimension(40, 25));
        removeMappedChannel.addActionListener(this);
        removeMappedChannel.setActionCommand("removeMappedChannel");
        cButtonMappedChannels.gridy = 1;
        pannelButtonMappedChannels.add(removeMappedChannel, cButtonMappedChannels);

        cMappedChannels.gridx = 1;
        cMappedChannels.weightx = 0.05;
        jPanelMappedChannels.add(pannelButtonMappedChannels, cMappedChannels);
        cMapChannelsInArch.gridy = 3;
        cMapChannelsInArch.gridx = 0;
        cMapChannelsInArch.gridwidth = 2;
        jpMapChannelsInArch.add(jPanelMappedChannels, cMapChannelsInArch);
        contMapChannelsInArch.add(jpMapChannelsInArch, BorderLayout.NORTH);
        GraphicLib.centerOnParent(mapChannelsInArchDialog, 500, 400);
        mapChannelsInArchDialog.setVisible(true);
    }

    private void cloneTask() {
        JDialog cloneTaskDialog = new JDialog(this.getOwner(), "Clone a Task", Dialog.ModalityType.DOCUMENT_MODAL);
        Container contCloneTask = cloneTaskDialog.getContentPane();
        contCloneTask.setLayout(new BorderLayout());
        JPanel jpCloneTask = new JPanel();
        jpCloneTask.setLayout(new GridBagLayout());
        GridBagConstraints cCloneTask = new GridBagConstraints();
        cCloneTask.gridx = 0;
        cCloneTask.gridy = 0;
        cCloneTask.fill = GridBagConstraints.HORIZONTAL;
        cCloneTask.anchor = GridBagConstraints.FIRST_LINE_START;
        cCloneTask.weightx = 1.0;
        cCloneTask.insets = new Insets(10,0,0,0);  //top padding
        jpCloneTask.add(new JLabel("Select a Task to clone:"), cCloneTask);

        tasksCanBeCloned.removeAllElements();
        for (String s : portsTaskOfModelAll.keySet()) {
            tasksCanBeCloned.add(s);
        }
        jComboBoxTaskToClone = new JComboBox<String>(modelTaskToClone);
        jComboBoxTaskToClone.setSelectedIndex(-1);
        //jComboBoxTaskToClone.setEnabled(false);
        jComboBoxTaskToClone.addActionListener(this);
        //jComboBoxPortsConfigMerge.setPreferredSize(new Dimension(150, 25));
        cCloneTask.gridx = 1;
        jpCloneTask.add(jComboBoxTaskToClone, cCloneTask);
        cCloneTask.gridx = 0;
        cCloneTask.gridy = 1;
        jpCloneTask.add(new JLabel("Cloned task name:"), cCloneTask);
        jFieldNewClonedTaskName = new JTextField(newClonedTaskName, 10);
        jFieldNewClonedTaskName.setEnabled(false);
        jFieldNewClonedTaskName.setPreferredSize(new Dimension(10, 25));
        cCloneTask.gridx = 1;
        jpCloneTask.add(jFieldNewClonedTaskName, cCloneTask);

        jListClonedTasks = new JList<String>(clonedTasks);
        JPanel jPanelClonedTasks = new JPanel();
        jPanelClonedTasks.setLayout(new GridBagLayout());
        GridBagConstraints cClonedTasks = new GridBagConstraints();
        cClonedTasks.gridx = 0;
        cClonedTasks.gridy = 0;
        cClonedTasks.weightx = 0.95;
        cClonedTasks.fill = GridBagConstraints.HORIZONTAL;
        cClonedTasks.anchor = GridBagConstraints.LINE_START;
        
        jListClonedTasks.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        jListClonedTasks.addListSelectionListener(this);
        JScrollPane scrollPaneClonedTasks = new JScrollPane(jListClonedTasks);
        scrollPaneClonedTasks.setPreferredSize(new Dimension(250, 150));
        jPanelClonedTasks.add(scrollPaneClonedTasks, cClonedTasks);
        
        JPanel pannelButtonClonedTasks = new JPanel();
        pannelButtonClonedTasks.setLayout(new GridBagLayout());
        GridBagConstraints cButtonClonedTasks = new GridBagConstraints();
        cButtonClonedTasks.gridx = 0;
        cButtonClonedTasks.weightx = 1.0;
        cButtonClonedTasks.gridy = 0;
        cButtonClonedTasks.fill = GridBagConstraints.HORIZONTAL;
        cButtonClonedTasks.anchor = GridBagConstraints.LINE_START;
        addClonedTask = new JButton("+");
        addClonedTask.setEnabled(false);
        addClonedTask.setPreferredSize(new Dimension(40, 25));
        addClonedTask.addActionListener(this);
        addClonedTask.setActionCommand("addClonedTask");
        pannelButtonClonedTasks.add(addClonedTask, cButtonClonedTasks);

        removeClonedTask = new JButton("-");
        //removeClonedTask.setEnabled(false);
        removeClonedTask.setPreferredSize(new Dimension(40, 25));
        removeClonedTask.addActionListener(this);
        removeClonedTask.setActionCommand("removeClonedTask");
        cButtonClonedTasks.gridy = 1;
        pannelButtonClonedTasks.add(removeClonedTask, cButtonClonedTasks);

        cClonedTasks.gridx = 1;
        cClonedTasks.weightx = 0.05;
        jPanelClonedTasks.add(pannelButtonClonedTasks, cClonedTasks);
        cCloneTask.gridy = 2;
        cCloneTask.gridx = 0;
        cCloneTask.gridwidth = 2;
        jpCloneTask.add(jPanelClonedTasks, cCloneTask);
        contCloneTask.add(jpCloneTask, BorderLayout.NORTH);
        GraphicLib.centerOnParent(cloneTaskDialog, 470, 350);
        cloneTaskDialog.setVisible(true);
    }

    private void updatePatternsAttributes() {
        JDialog updatePatternsAttributesDialog = new JDialog(this.getOwner(), "Update Pattern's Attributes Values", Dialog.ModalityType.DOCUMENT_MODAL);
        Container contUpdatePatternsAttributes = updatePatternsAttributesDialog.getContentPane();
        contUpdatePatternsAttributes.setLayout(new BorderLayout());
        JPanel jpUpdatePatternsAttributes = new JPanel();
        jpUpdatePatternsAttributes.setLayout(new GridBagLayout());
        GridBagConstraints cUpdatePatternsAttributes = new GridBagConstraints();
        cUpdatePatternsAttributes.gridx = 0;
        cUpdatePatternsAttributes.gridy = 0;
        cUpdatePatternsAttributes.fill = GridBagConstraints.HORIZONTAL;
        cUpdatePatternsAttributes.anchor = GridBagConstraints.FIRST_LINE_START;
        cUpdatePatternsAttributes.weightx = 1.0;
        cUpdatePatternsAttributes.insets = new Insets(10,0,0,0);  //top padding
        jpUpdatePatternsAttributes.add(new JLabel("Select a Task to update its attributes:"), cUpdatePatternsAttributes);

        tasksToUpdateAttributes.removeAllElements();
        for (String s : patternTasksAll.keySet()) {
            tasksToUpdateAttributes.add(s);
        }
        jComboBoxTasksToUpdateAttributes = new JComboBox<String>(modelTasksToUpdateAttributes);
        jComboBoxTasksToUpdateAttributes.setSelectedIndex(-1);
        //jComboBoxTasksToUpdateAttributes.setEnabled(false);
        jComboBoxTasksToUpdateAttributes.addActionListener(this);
        cUpdatePatternsAttributes.gridx = 1;
        jpUpdatePatternsAttributes.add(jComboBoxTasksToUpdateAttributes, cUpdatePatternsAttributes);

        cUpdatePatternsAttributes.gridx = 0;
        cUpdatePatternsAttributes.gridy = 1;
        jpUpdatePatternsAttributes.add(new JLabel("Select an attribute to update:"), cUpdatePatternsAttributes);
        attributesOfTaskToUpdate.removeAllElements();
        jComboBoxAttributesOfTaskToUpdate = new JComboBox<String>(modelAttributesOfTaskToUpdate);
        jComboBoxAttributesOfTaskToUpdate.setSelectedIndex(-1);
        jComboBoxAttributesOfTaskToUpdate.setEnabled(false);
        jComboBoxAttributesOfTaskToUpdate.addActionListener(this);
        cUpdatePatternsAttributes.gridx = 1;
        jpUpdatePatternsAttributes.add(jComboBoxAttributesOfTaskToUpdate, cUpdatePatternsAttributes);

        cUpdatePatternsAttributes.gridx = 0;
        cUpdatePatternsAttributes.gridy = 2;
        jpUpdatePatternsAttributes.add(new JLabel("New Value:"), cUpdatePatternsAttributes);
        jFieldNewTaskAttibuteValue = new JTextField(newTaskAttibuteValue, 10);
        jFieldNewTaskAttibuteValue.setEnabled(false);
        jFieldNewTaskAttibuteValue.setPreferredSize(new Dimension(10, 25));
        jFieldNewTaskAttibuteValue.addActionListener(this);
        cUpdatePatternsAttributes.gridx = 1;
        jpUpdatePatternsAttributes.add(jFieldNewTaskAttibuteValue, cUpdatePatternsAttributes);
        
        JPanel pannelButtonUpdatePatternsAttributesValues = new JPanel();
        pannelButtonUpdatePatternsAttributesValues.setLayout(new GridBagLayout());
        GridBagConstraints cButtonUpdatePatternsAttributesValues = new GridBagConstraints();
        cButtonUpdatePatternsAttributesValues.gridx = 0;
        cButtonUpdatePatternsAttributesValues.weightx = 1.0;
        cButtonUpdatePatternsAttributesValues.gridy = 0;
        cButtonUpdatePatternsAttributesValues.fill = GridBagConstraints.HORIZONTAL;
        cButtonUpdatePatternsAttributesValues.anchor = GridBagConstraints.LINE_START;
        buttonUpdateTaskAttributeValue = new JButton("Update");
        buttonUpdateTaskAttributeValue.setEnabled(false);
        buttonUpdateTaskAttributeValue.setPreferredSize(new Dimension(100, 50));
        buttonUpdateTaskAttributeValue.addActionListener(this);
        buttonUpdateTaskAttributeValue.setActionCommand("updateTaskAttributeValue");
        pannelButtonUpdatePatternsAttributesValues.add(buttonUpdateTaskAttributeValue, cButtonUpdatePatternsAttributesValues);

        cUpdatePatternsAttributes.gridy = 3;
        cUpdatePatternsAttributes.gridx = 0;
        cUpdatePatternsAttributes.gridwidth = 2;
        cUpdatePatternsAttributes.fill = GridBagConstraints.NONE;
        cUpdatePatternsAttributes.anchor = GridBagConstraints.CENTER;
        jpUpdatePatternsAttributes.add(pannelButtonUpdatePatternsAttributesValues, cUpdatePatternsAttributes);
        contUpdatePatternsAttributes.add(jpUpdatePatternsAttributes, BorderLayout.NORTH);
        GraphicLib.centerOnParent(updatePatternsAttributesDialog, 470, 350);
        updatePatternsAttributesDialog.setVisible(true);
    }

    private void updateTaskAttributeValue() {
        String selectedTaskToUpdateAttributes = jComboBoxTasksToUpdateAttributes.getSelectedItem().toString();
        String selectedAttributeToUpdate = jComboBoxAttributesOfTaskToUpdate.getSelectedItem().toString();
        String newValueAttribute = jFieldNewTaskAttibuteValue.getText();
        if (newValueAttribute.matches("-?\\d+") || newValueAttribute.matches("(?i)^(true|false)")) {
            for (AttributeTaskJsonFile attributeTaskJsonFile : patternTasksAll.get(selectedTaskToUpdateAttributes).getAttributes()) {
                if (attributeTaskJsonFile.getName().equals(selectedAttributeToUpdate)) {
                    attributeTaskJsonFile.setValue(newValueAttribute);
                    jFieldNewTaskAttibuteValue.setText(attributeTaskJsonFile.getValue());
                    if (updatedPatternAttributes.containsKey(selectedTaskToUpdateAttributes)) {
                        boolean attributeExist = false;
                        for (AttributeTaskJsonFile attribUpdate : updatedPatternAttributes.get(selectedTaskToUpdateAttributes)) {
                            if (attribUpdate.getName().equals(selectedAttributeToUpdate)) {
                                attribUpdate.setValue(newValueAttribute);
                                attributeExist = true;
                            }
                        }
                        if (!attributeExist) {
                            AttributeTaskJsonFile attrib = new AttributeTaskJsonFile(selectedAttributeToUpdate, attributeTaskJsonFile.getType(), newValueAttribute);
                            updatedPatternAttributes.get(selectedTaskToUpdateAttributes).add(attrib);
                        }
                    } else {
                        List<AttributeTaskJsonFile> listAttrib = new ArrayList<AttributeTaskJsonFile>();
                        AttributeTaskJsonFile attrib = new AttributeTaskJsonFile(selectedAttributeToUpdate, attributeTaskJsonFile.getType(), newValueAttribute);
                        listAttrib.add(attrib);
                        updatedPatternAttributes.put(selectedTaskToUpdateAttributes, listAttrib);
                    }
                    
                }
            }
        }
    }

    private void addConnectionBetweenSelectedPorts() {
        String patternTaskName = jComboBoxPatternsTaskWithExternalPort.getSelectedItem().toString();
        String patternTaskPortName = jComboBoxPatternExternalPortOfATask.getSelectedItem().toString();
        String modelTaskName = jComboBoxModelsTask.getSelectedItem().toString();
        String modelTaskPortName = jComboBoxModelsPortOfTask.getSelectedItem().toString();
        Boolean isNewPort = jCheckBoxConnectToNewPort.isSelected();
        PatternConnection patternConnection = new PatternConnection(patternTaskName, patternTaskPortName, modelTaskName, modelTaskPortName, isNewPort);
        
        connectedPorts.add(patternConnection.getStringDisplay());
        if (!isNewPort) {
            TaskPorts pt = portsTaskOfModelLeft.get(modelTaskName);
            if (pt.getWriteChannels().contains(modelTaskPortName)) {
                pt.getWriteChannels().remove(modelTaskPortName);
            } else if (pt.getReadChannels().contains(modelTaskPortName)) {
                pt.getReadChannels().remove(modelTaskPortName);
            } else if (pt.getSendEvents().contains(modelTaskPortName)) {
                pt.getSendEvents().remove(modelTaskPortName);
            } else if (pt.getWaitEvents().contains(modelTaskPortName)) {
                pt.getWaitEvents().remove(modelTaskPortName);
            } 
        }
        TaskPattern tp = patternTasksNotConnected.get(patternTaskName);
        int indexElemToRemove = -1;
        for (int i = 0; i < tp.getExternalPorts().size(); i++){
            if (tp.getExternalPorts().get(i).getName().equals(patternTaskPortName)) {
                indexElemToRemove = i;
                break;
            }
        }
        if (indexElemToRemove >= 0) {
            tp.getExternalPorts().remove(indexElemToRemove);
        }
        if (tp.getExternalPorts().size() == 0) {
            patternTasksNotConnected.remove(patternTaskName);
            tasksOfPatternWithExternalPort.removeAllElements();
            for (String pTaskName : patternTasksNotConnected.keySet()) {
                if (patternTasksNotConnected.get(pTaskName).getExternalPorts().size() > 0) {
                    tasksOfPatternWithExternalPort.add(pTaskName);
                }
            }
        }

        for (PortTaskJsonFile  portTaskJsonFile : patternTasksAll.get(patternTaskName).getExternalPorts()) {
            if (portTaskJsonFile.getName().equals(patternTaskPortName)) {
                if (portTaskJsonFile.getType().equals(PatternCreation.CHANNEL)) {
                    if (jCheckBoxAddConfidentiality.isSelected()) {
                        portTaskJsonFile.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY);
                    } else {
                        portTaskJsonFile.setConfidentiality(PatternCreation.WITHOUT_CONFIDENTIALITY);
                    }
                    portTaskJsonFile.setAuthenticity(jComboBoxAddAuthenticity.getSelectedItem().toString());
                    break;
                }
            }
        }

        patternConnectionList.add(patternConnection);
        
        /*if (jCheckBoxAddConfidentiality.isSelected() || (jComboBoxAddAuthenticity.getSelectedIndex() >= 0 && !jComboBoxAddAuthenticity.getSelectedItem().toString().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase()))) {
            if (channelsWithSecurity.containsKey(patternTaskName)) {
                boolean channelWithSecToUpdate = false;
                for (PortTaskJsonFile pt : channelsWithSecurity.get(patternTaskName)) {
                    if (pt.getName().equals(patternTaskPortName)) {
                        if (jCheckBoxAddConfidentiality.isSelected()) {
                            pt.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY);
                        }
                        if (jComboBoxAddAuthenticity.getSelectedIndex() >= 0 && !jComboBoxAddAuthenticity.getSelectedItem().toString().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) {
                            pt.setAuthenticity(jComboBoxAddAuthenticity.getSelectedItem().toString());
                        }
                        channelWithSecToUpdate = true;
                        break;
                    }
                }
                if (!channelWithSecToUpdate) {
                    for (PortTaskJsonFile  portTaskJsonFile : patternTasksAll.get(patternTaskName).getExternalPorts()) {
                        if (portTaskJsonFile.getName().equals(patternTaskPortName)) {
                            if (jCheckBoxAddConfidentiality.isSelected()) {
                                portTaskJsonFile.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY);
                            }
                            if (jComboBoxAddAuthenticity.getSelectedIndex() >= 0 && !jComboBoxAddAuthenticity.getSelectedItem().toString().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) {
                                portTaskJsonFile.setAuthenticity(jComboBoxAddAuthenticity.getSelectedItem().toString());
                            }
                            channelsWithSecurity.get(patternTaskName).add(portTaskJsonFile);
                            break;
                        }
                    }
                }
            } else {
                List<PortTaskJsonFile> channelWithSecInfo = new ArrayList<PortTaskJsonFile>();
                for (PortTaskJsonFile  portTaskJsonFile : patternTasksAll.get(patternTaskName).getExternalPorts()) {
                    if (portTaskJsonFile.getName().equals(patternTaskPortName)) {
                        if (jCheckBoxAddConfidentiality.isSelected()) {
                            portTaskJsonFile.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY);
                        }
                        if (jComboBoxAddAuthenticity.getSelectedIndex() >= 0 && !jComboBoxAddAuthenticity.getSelectedItem().toString().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) {
                            portTaskJsonFile.setAuthenticity(jComboBoxAddAuthenticity.getSelectedItem().toString());
                        }
                        channelWithSecInfo.add(portTaskJsonFile);
                        channelsWithSecurity.put(patternTaskName, channelWithSecInfo);
                        break;
                    }
                }
            } 
        }*/

        jComboBoxPatternsTaskWithExternalPort.setSelectedIndex(-1);
        jCheckBoxConnectToNewPort.setSelected(false);
        jListConnectedPorts.setListData(connectedPorts);
        setButtons();
    }

    private void removeConnectionBetweenPorts() {
        int[] list = jListConnectedPorts.getSelectedIndices();
        List<PatternConnection> patternConnectionsToRemove = new ArrayList<PatternConnection>();
        for (int i = 0; i < list.length; i++) {
            PatternConnection patternConnection = patternConnectionList.get(list[i]);
            String patternTaskName = patternConnection.getPatternTaskName();
            String patternTaskPortName = patternConnection.getPatternChannel();
            String modelTaskName = patternConnection.getModelTaskName();
            String modelTaskPortName = patternConnection.getModelChannelName();
            for (String patternTask : patternTasksAll.keySet()) {
                for (PortTaskJsonFile  portTaskJsonFile : patternTasksAll.get(patternTask).getExternalPorts()) {
                    if (portTaskJsonFile.getName().equals(patternTaskPortName)) {
                        if (patternTasksNotConnected.containsKey(patternTaskName)) {
                            TaskPattern tp  = patternTasksNotConnected.get(patternTaskName);
                            tp.getExternalPorts().add(portTaskJsonFile);
                        } else {
                            List<PortTaskJsonFile> portTaskJsonFilesList = new ArrayList<PortTaskJsonFile>(Arrays.asList(portTaskJsonFile));
                            TaskPattern tp = new TaskPattern(patternTasksAll.get(patternTask).getAttributes(), patternTasksAll.get(patternTask).getInternalPorts(), portTaskJsonFilesList);
                            patternTasksNotConnected.put(patternTaskName, tp);
                            tasksOfPatternWithExternalPort.removeAllElements();
                            for (String pTaskName : patternTasksNotConnected.keySet()) {
                                if (patternTasksNotConnected.get(pTaskName).getExternalPorts().size() > 0) {
                                    tasksOfPatternWithExternalPort.add(pTaskName);
                                }
                            }
                        }
                        break;
                    }
                }
            }
            if (!patternConnection.isNewPort()) {
                TaskPorts pt = portsTaskOfModelLeft.get(modelTaskName);
                TaskPorts ptAll = portsTaskOfModelAll.get(modelTaskName);
                if (ptAll.getWriteChannels().contains(modelTaskPortName)) {
                    pt.getWriteChannels().add(modelTaskPortName);
                } else if (ptAll.getReadChannels().contains(modelTaskPortName)) {
                    pt.getReadChannels().add(modelTaskPortName);
                } else if (ptAll.getSendEvents().contains(modelTaskPortName)) {
                    pt.getSendEvents().add(modelTaskPortName);
                } else if (ptAll.getWaitEvents().contains(modelTaskPortName)) {
                    pt.getWaitEvents().add(modelTaskPortName);
                } 
            }
            connectedPorts.remove(list[i]);
            patternConnectionsToRemove.add(patternConnection);
            jComboBoxPatternsTaskWithExternalPort.setSelectedIndex(-1);
            jCheckBoxConnectToNewPort.setSelected(false);
        }
        patternConnectionList.removeAll(patternConnectionsToRemove);
        jListConnectedPorts.setListData(connectedPorts);
        setButtons();
    }

    private void addClonedTask() {
        String selectedTaskToClone = jComboBoxTaskToClone.getSelectedItem().toString();
        String nameNewTaskToClone = jFieldNewClonedTaskName.getText();
        
        if (!tasksCanBeCloned.contains(nameNewTaskToClone) && !tasksOfModel.contains(nameNewTaskToClone) && !nameNewTaskToClone.contains(" ")) {
            PatternCloneTask patternCloneTask = new PatternCloneTask(nameNewTaskToClone, selectedTaskToClone);
            clonedTasks.add(patternCloneTask.getStringDisplay());
            clonedTasksList.add(patternCloneTask);
            List<String> wcs = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getWriteChannels());
            List<String> rcs = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getReadChannels());
            List<String> ses = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getSendEvents());
            List<String> wes = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getWaitEvents());

            List<String> wcs1 = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getWriteChannels());
            List<String> rcs1 = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getReadChannels());
            List<String> ses1 = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getSendEvents());
            List<String> wes1 = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getWaitEvents());

            TaskPorts portTasksClone = new TaskPorts(wcs, rcs, ses, wes);
            TaskPorts portTasksClone1 = new TaskPorts(wcs1, rcs1, ses1, wes1);
            portsTaskOfModelLeft.put(nameNewTaskToClone, portTasksClone);
            portsTaskOfModelAll.put(nameNewTaskToClone, portTasksClone1);
        }
        tasksOfModel.removeAllElements();
        for (String pTaskName : portsTaskOfModelLeft.keySet()) {
            tasksOfModel.add(pTaskName);
        }
        jListClonedTasks.setListData(clonedTasks);
        setButtons();
    }

    private void removeClonedTask() {
        int[] list = jListClonedTasks.getSelectedIndices();
        List<PatternCloneTask> patternCloneTasksToRemove = new ArrayList<PatternCloneTask>();
        for (int i = 0; i < list.length; i++) {
            PatternCloneTask patternCloneTask = clonedTasksList.get(list[i]);
            patternCloneTasksToRemove.add(patternCloneTask);
            portsTaskOfModelLeft.remove(patternCloneTask.getClonedTask());
            portsTaskOfModelAll.remove(patternCloneTask.getClonedTask());
            List<PatternConnection> patternConnectionsToRemove = new ArrayList<PatternConnection>();
            for (PatternConnection pConnection : patternConnectionList) {
                String patternTaskName = pConnection.getPatternTaskName();
                String patternTaskPortName = pConnection.getPatternChannel();
                String modelTaskName = pConnection.getModelTaskName();

                if (modelTaskName.equals(patternCloneTask.getClonedTask())) {
                    for (String patternTask : patternTasksAll.keySet()) {
                        for (PortTaskJsonFile  portTaskJsonFile : patternTasksAll.get(patternTask).getExternalPorts()) {
                            if (portTaskJsonFile.getName().equals(patternTaskPortName)) {
                                if (patternTasksNotConnected.containsKey(patternTaskName)) {
                                    TaskPattern tp  = patternTasksNotConnected.get(patternTaskName);
                                    tp.getExternalPorts().add(portTaskJsonFile);
                                } else {
                                    List<PortTaskJsonFile> portTaskJsonFilesList = new ArrayList<PortTaskJsonFile>(Arrays.asList(portTaskJsonFile));
                                    TaskPattern tp = new TaskPattern(patternTasksAll.get(patternTask).getAttributes(), patternTasksAll.get(patternTask).getInternalPorts(), portTaskJsonFilesList);
                                    patternTasksNotConnected.put(patternTaskName, tp);
                                    tasksOfPatternWithExternalPort.removeAllElements();
                                    for (String pTaskName : patternTasksNotConnected.keySet()) {
                                        if (patternTasksNotConnected.get(pTaskName).getExternalPorts().size() > 0) {
                                            tasksOfPatternWithExternalPort.add(pTaskName);
                                        }
                                    }
                                }
                                break;
                            }
                        }
                    }
                    connectedPorts.remove(pConnection.getStringDisplay());
                    patternConnectionsToRemove.add(pConnection);
                }
            }
            clonedTasks.remove(list[i]);
            patternConnectionList.removeAll(patternConnectionsToRemove);
            jListConnectedPorts.setListData(connectedPorts);
        }
        clonedTasksList.removeAll(patternCloneTasksToRemove);

        tasksOfModel.removeAllElements();
        for (String pTaskName : portsTaskOfModelLeft.keySet()) {
            tasksOfModel.add(pTaskName);
        }
        jListClonedTasks.setListData(clonedTasks);
        setButtons();
    }

    private void addConfigPorts() {
        String selectedTaskToConfig = jComboBoxPortsConfig.getSelectedItem().toString();
        String[] taskAndChannelSelected = PatternPortsConfig.seperateTaskAndChannel(selectedTaskToConfig);
        PatternPortsConfig patternPortConfig = new PatternPortsConfig(taskAndChannelSelected[0], taskAndChannelSelected[1]);
        if (jRadioPortConfigRemove.isSelected()) {
            patternPortConfig.setIsChannelToRemove(true);
        } else if (jRadioPortConfigMerge.isSelected()) {
            patternPortConfig.setMergeWith(jComboBoxPortsConfigMerge.getSelectedItem().toString());
        }
        configuredPorts.add(patternPortConfig.getStringDisplay());
        configuredPortsList.add(patternPortConfig);
        portsConfig.remove(selectedTaskToConfig);
        jComboBoxPortsConfig.setSelectedIndex(-1);
        jListConfigPorts.setListData(configuredPorts);
        setButtons();
    }

    private void removeConfigPorts() {
        int[] list = jListConfigPorts.getSelectedIndices();
        List<PatternPortsConfig> patternPortsConfigToRemove = new ArrayList<PatternPortsConfig>();
        for (int i = 0; i < list.length; i++) {
            PatternPortsConfig patternPortConfigToRemove = configuredPortsList.get(list[i]);
            portsConfig.add(patternPortConfigToRemove.getTaskChannelToConfig());
            configuredPorts.remove(list[i]);
            patternPortsConfigToRemove.add(patternPortConfigToRemove);
        }
        configuredPortsList.removeAll(patternPortsConfigToRemove);
        jListConfigPorts.setListData(configuredPorts);
        jComboBoxPortsConfig.setSelectedIndex(-1);
        setButtons();
    }

    private void addMappedTask() {
        //String selectedTaskToMap = jComboBoxTaskToMap.getSelectedItem().toString();
        int selectedTaskToMapIndice = jComboBoxTaskToMap.getSelectedIndex();
        MappingPatternTask mappingPatternTask = tasksToMapList.get(selectedTaskToMapIndice);
        if (jRadioMapTaskInExistingHw.isSelected()) {
            int selectedTaskInSameHwIndice = jComboBoxMapTaskInSameHwAs.getSelectedIndex();
            MappingPatternTask sameHwTask = tasksToMapInSameHwList.get(selectedTaskInSameHwIndice);
            mappingPatternTask.setSameHwAs(sameHwTask.getTaskToMapName(), sameHwTask.getOrigin());
        } else if (jRadioMapTaskInNewHw.isSelected()) {
            mappingPatternTask.setBusNameForNewHw(jComboBoxMapTaskInNewHw.getSelectedItem().toString());
        }
        mappedTasks.add(mappingPatternTask.getStringDisplay());
        mappedTasksList.add(mappingPatternTask);
        tasksToMapInSameHw.add(tasksToMap.remove(selectedTaskToMapIndice));
        tasksToMapInSameHwList.add(tasksToMapList.remove(selectedTaskToMapIndice));
        jComboBoxTaskToMap.setSelectedIndex(-1);
        jListMappedTasks.setListData(mappedTasks);
        setButtons();
    }

    private void removeMappedTask() {
        int[] list = jListMappedTasks.getSelectedIndices();
        List<MappingPatternTask> mappingPatternTasksToRemove = new ArrayList<MappingPatternTask>();
        for (int i = 0; i < list.length; i++) {
            MappingPatternTask mappingPatternTaskSelected = mappedTasksList.get(list[i]);
            tasksToMap.add(mappingPatternTaskSelected.getTaskToMapName());
            tasksToMapList.add(mappingPatternTaskSelected);
            tasksToMapInSameHw.remove(mappingPatternTaskSelected.getSameHwAs());
            tasksToMapInSameHwList.remove(mappingPatternTaskSelected);
            mappingPatternTasksToRemove.add(mappingPatternTaskSelected);
            mappedTasks.remove(list[i]);
        }
        mappedTasksList.removeAll(mappingPatternTasksToRemove);
        jListMappedTasks.setListData(mappedTasks);
        jComboBoxTaskToMap.setSelectedIndex(-1);
        setButtons();
    }

    private void addMappedChannel() {
        //String selectedChannelToMap = jComboBoxChannelToMap.getSelectedItem().toString();
        int selectedChannelToMapIndex = jComboBoxChannelToMap.getSelectedIndex();
        //String[] taskAndChannelSelected = MappingPatternChannel.seperateTaskAndChannel(selectedChannelToMap);
        if (selectedChannelToMapIndex >= 0) {
            MappingPatternChannel mappingPatternChannel = channelsToMapList.get(selectedChannelToMapIndex);
            if (jRadioMapChannelInExistingMem.isSelected()) {
                int selectedChannelSameMemIndex = jComboBoxMapChannelInSameMemAs.getSelectedIndex();
                if (selectedChannelSameMemIndex >= 0) {
                    MappingPatternChannel mappingPatternChannelSameMem = channelsToMapInSameMemList.get(selectedChannelSameMemIndex);
                    mappingPatternChannel.setTaskAndChannelInSameMem(mappingPatternChannelSameMem.getTaskOfChannelToMap(), mappingPatternChannelSameMem.getChannelToMapName(), mappingPatternChannelSameMem.getOrigin());
                }
            } else if (jRadioMapChannelInNewMem.isSelected()) {
                mappingPatternChannel.setBusNameForNewMem(jComboBoxMapChannelInNewMem.getSelectedItem().toString());
            }
            mappedChannels.add(mappingPatternChannel.getStringDisplay());
            channelsToMap.remove(mappingPatternChannel.getTaskChannelToMap());
            channelsToMapList.remove(mappingPatternChannel);
            mappedChannelsList.add(mappingPatternChannel);
            channelsToMapInSameMem.add(mappingPatternChannel.getTaskChannelToMap());
            channelsToMapInSameMemList.add(mappingPatternChannel);
            jComboBoxChannelToMap.setSelectedIndex(-1);
            jListMappedChannels.setListData(mappedChannels);
            setButtons();
        }   
    }

    private void removeMappedChannel() {
        int[] list = jListMappedChannels.getSelectedIndices();
        List<MappingPatternChannel> mappingPatternChannelsToRemove = new ArrayList<MappingPatternChannel>();
        for (int i = 0; i < list.length; i++) {
            MappingPatternChannel mappingPatternChannelSelected = mappedChannelsList.get(list[i]);
            channelsToMap.add(mappingPatternChannelSelected.getTaskChannelToMap());
            channelsToMapList.add(mappingPatternChannelSelected);
            channelsToMapInSameMem.remove(mappingPatternChannelSelected.getTaskChannelToMap());
            channelsToMapInSameMemList.remove(mappingPatternChannelSelected);
            mappingPatternChannelsToRemove.add(mappingPatternChannelSelected);
            mappedChannels.remove(list[i]);
        }
        mappedChannelsList.removeAll(mappingPatternChannelsToRemove);
        jListMappedChannels.setListData(mappedChannels);
        jComboBoxChannelToMap.setSelectedIndex(-1);
        setButtons();
    }

    @Override
    public void actionPerformed(ActionEvent evt) {
        String command = evt.getActionCommand();

        switch (command) {
            case "Start":
                startProcess();
                break;
            case "Stop":
                stopProcess();
                break;
            case "Close":
                closeDialog();
                break;
            default:
                if (command.equals("addTaskAsPattern")) {
                    addTaskAsPattern();
                } else if (command.equals("removeTaskAsPattern")) {
                    removeTaskAsPattern();
                } else if (command.equals("allTasksSelectedAsPattern")) {
                    allTasksSelectedAsPattern();
                } else if (command.equals("allTasksNoSelectedAsPattern")) {
                    allTasksNoSelectedAsPattern();
                } else if (command.equals("cloneTask")) {
                    cloneTask();
                } else if (command.equals("mapTasksManuallyInArchitecture")) {
                    mapTasksManuallyInArchitecture();
                } else if (command.equals("mapChannelsManuallyInArchitecture")) {
                    mapChannelsManuallyInArchitecture();
                } else if (command.equals("updatePatternsAttributes")) {
                    updatePatternsAttributes();
                } else if (command.equals("addClonedTask")) {
                    addClonedTask();
                } else if (command.equals("removeClonedTask")) {
                    removeClonedTask();
                } else if (command.equals("addConnectionBetweenSelectedPorts")) {
                    addConnectionBetweenSelectedPorts();
                } else if (command.equals("removeConnectionBetweenPorts")) {
                    removeConnectionBetweenPorts();
                } else if (command.equals("addConfigPorts")) {
                    addConfigPorts();
                } else if (command.equals("removeConfigPorts")) {
                    removeConfigPorts();
                } else if (command.equals("addMappedTask")) {
                    addMappedTask();
                } else if (command.equals("removeMappedTask")) {
                    removeMappedTask();
                } else if (command.equals("addMappedChannel")) {
                    addMappedChannel();
                } else if (command.equals("removeMappedChannel")) {
                    removeMappedChannel();
                } else if (command.equals("updateTaskAttributeValue")) {
                    updateTaskAttributeValue();
                }
                if (evt.getSource() == jp1) {
                    listPatterns = getFoldersName(pathPatterns);
                    listPatternsJson = getFoldersName(pathPatterns);
                }
                if (evt.getSource() == jComboBoxPatterns) {
                    int selectedPatternIndex = jComboBoxPatterns.getSelectedIndex();
                    patternTasksAll = TaskPattern.parsePatternJsonFile(pathPatterns + listPatterns.get(selectedPatternIndex), listPatterns.get(selectedPatternIndex)+".json");
                    patternTasksNotConnected = TaskPattern.parsePatternJsonFile(pathPatterns + listPatterns.get(selectedPatternIndex), listPatterns.get(selectedPatternIndex)+".json");
                    portsTaskOfModelLeft = TaskPorts.getListPortsTask(mgui.gtm.getTMLMapping().getTMLModeling());
                    //Vector<String> patternTasksVector = new Vector<String>();
                    tasksOfPatternWithExternalPort.removeAllElements();
                    clonedTasks.removeAllElements();
                    clonedTasksList.clear();
                    for (String pTaskName : patternTasksNotConnected.keySet()) {
                        if (patternTasksNotConnected.get(pTaskName).getExternalPorts().size() > 0) {
                            tasksOfPatternWithExternalPort.add(pTaskName);
                        }
                    }
                    
                    //tasksOfPatternWithExternalPort = patternTasksVector;
                    //modelPatternsTaskWithExternalPort.removeAllElements();
                    
                    //modelPatternsTaskWithExternalPort.addAll(tasksOfPatternWithExternalPort);
                    jComboBoxPatternsTaskWithExternalPort.setEnabled(true);
                    jComboBoxPatternsTaskWithExternalPort.setSelectedIndex(-1);
                    buttonCloneTask.setEnabled(true);
                    removeConnectionBetweenPorts.setEnabled(true);
                    connectedPorts.removeAllElements();
                    patternConnectionList.clear();
                    jListConnectedPorts.setListData(connectedPorts);
                    portsConfig.removeAllElements();
                    configuredPorts.removeAllElements();
                    mappedTasks.removeAllElements();
                    mappedTasksList.clear();
                    tasksToMap.removeAllElements();
                    tasksToMapList.clear();
                    channelsToMap.removeAllElements();
                    channelsToMapList.clear();
                    mappedChannels.removeAllElements();
                    mappedChannelsList.clear();
                }
                if (evt.getSource() == jComboBoxPatternsTaskWithExternalPort) {
                    externalPortsOfTaskInPattern.removeAllElements();
                    if (jComboBoxPatternsTaskWithExternalPort.getSelectedIndex() >= 0) {
                        for (PortTaskJsonFile portTask : patternTasksNotConnected.get(jComboBoxPatternsTaskWithExternalPort.getSelectedItem().toString()).getExternalPorts()) {
                            externalPortsOfTaskInPattern.add(portTask.getName());
                        }
                        jComboBoxPatternExternalPortOfATask.setEnabled(true);
                    } else {
                        jComboBoxPatternExternalPortOfATask.setEnabled(false);
                    }
                    //modelPatternExternalPortOfATask.removeAllElements();
                    //modelPatternExternalPortOfATask.addAll(externalPortsOfTaskInPattern);
                    jComboBoxPatternExternalPortOfATask.setSelectedIndex(-1);
                    if (tasksOfPatternWithExternalPort.size() == 0) {
                        removeConfigPorts.setEnabled(true);
                        configuredPorts.removeAllElements();
                        portsConfig.removeAllElements();
                        List<String> clonedTasksAll = new ArrayList<String>();
                        for (PatternCloneTask cloneT : clonedTasksList) {
                            clonedTasksAll.add(cloneT.getClonedTask());
                        }
                        portsTaskConfig = PatternPortsConfig.getPortsToConfig(portsTaskOfModelAll, portsTaskOfModelLeft, clonedTasksAll, mgui.gtm.getTMLMapping().getTMLModeling());
                        for (PatternPortsConfig portTaskConfig : portsTaskConfig) {
                            portTaskConfig.setIsChannelToRemove(true);
                            configuredPorts.add(portTaskConfig.getStringDisplay());
                            configuredPortsList.add(portTaskConfig);
                        }
                        jListConfigPorts.setListData(configuredPorts);
                        jComboBoxPortsConfig.setSelectedIndex(-1);
                        jComboBoxPortsConfig.setEnabled(true);
                    } else {
                        configuredPorts.removeAllElements();
                        jListConfigPorts.setListData(configuredPorts);
                        portsConfig.removeAllElements();
                        jComboBoxPortsConfig.setEnabled(false);
                        removeConfigPorts.setEnabled(false);
                        mappedTasks.removeAllElements();
                        mappedTasksList.clear();
                        tasksToMap.removeAllElements();
                        tasksToMapList.clear();
                        channelsToMap.removeAllElements();
                        channelsToMapList.clear();
                        mappedChannels.removeAllElements();
                        mappedChannelsList.clear();
                        buttonTasksMapInArch.setEnabled(false);
                        buttonChannelsMapInArch.setEnabled(false);
                        buttonUpdatePatternsAttributes.setEnabled(false);
                    }
                }
                if (evt.getSource() == jComboBoxPatternExternalPortOfATask) {
                    if (jComboBoxPatternExternalPortOfATask.getSelectedIndex() >= 0) {
                        jComboBoxModelsTask.setEnabled(true);
                        tasksOfModel.removeAllElements();
                        for (String pTaskName : portsTaskOfModelLeft.keySet()) {
                            tasksOfModel.add(pTaskName);
                        }
                    } else {
                        jComboBoxModelsTask.setEnabled(false);
                    }
                    jComboBoxModelsTask.setSelectedIndex(-1);
                }
                if (evt.getSource() == jComboBoxModelsTask || evt.getSource() == jCheckBoxConnectToNewPort) {
                    if (jComboBoxModelsTask.getSelectedIndex() >= 0) {
                        jComboBoxModelsPortOfTask.setEnabled(true);
                        jCheckBoxConnectToNewPort.setEnabled(true);
                        String selectedModelTask = jComboBoxModelsTask.getSelectedItem().toString();
                        String selectedPatternTask = jComboBoxPatternsTaskWithExternalPort.getSelectedItem().toString();
                        int selectedIndexPatternPort = jComboBoxPatternExternalPortOfATask.getSelectedIndex();
                        
                        portsOfTaskInModel.removeAllElements();
                        if (!jCheckBoxConnectToNewPort.isSelected()) { 
                            String modeSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getMode();
                            String typeSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getType();
                            if (typeSelectedPatternPort.equals(PatternCreation.CHANNEL)) {
                                if (modeSelectedPatternPort.equals(PatternCreation.MODE_INPUT)) {
                                    for (String st : portsTaskOfModelLeft.get(selectedModelTask).getWriteChannels()) {
                                        portsOfTaskInModel.add(st);
                                    }
                                } else if (modeSelectedPatternPort.equals(PatternCreation.MODE_OUTPUT)) {
                                    for (String st : portsTaskOfModelLeft.get(selectedModelTask).getReadChannels()) {
                                        portsOfTaskInModel.add(st);
                                    }
                                }
                            } else if (typeSelectedPatternPort.equals(PatternCreation.EVENT)) {
                                if (modeSelectedPatternPort.equals(PatternCreation.MODE_INPUT)) {
                                    for (String st : portsTaskOfModelLeft.get(selectedModelTask).getSendEvents()) {
                                        portsOfTaskInModel.add(st);
                                    }
                                } else if (modeSelectedPatternPort.equals(PatternCreation.MODE_OUTPUT)) {
                                    for (String st : portsTaskOfModelLeft.get(selectedModelTask).getWaitEvents()) {
                                        portsOfTaskInModel.add(st);
                                    }
                                }
                            }
                        } else {
                            for (String st : portsTaskOfModelAll.get(selectedModelTask).getWriteChannels()) {
                                portsOfTaskInModel.add(st);
                            }
                            for (String st : portsTaskOfModelAll.get(selectedModelTask).getReadChannels()) {
                                portsOfTaskInModel.add(st);
                            }
                            for (String st : portsTaskOfModelAll.get(selectedModelTask).getSendEvents()) {
                                portsOfTaskInModel.add(st);
                            }
                            for (String st : portsTaskOfModelAll.get(selectedModelTask).getWaitEvents()) {
                                portsOfTaskInModel.add(st);
                            }
                        }
                        
                    } else {
                        jComboBoxModelsPortOfTask.setEnabled(false);
                        jCheckBoxConnectToNewPort.setEnabled(false);
                    }
                    jComboBoxModelsPortOfTask.setSelectedIndex(-1);
                }
                if (evt.getSource() == jComboBoxModelsPortOfTask) {
                    if (jComboBoxModelsPortOfTask.getSelectedIndex() >= 0) {
                        String selectedPatternTask = jComboBoxPatternsTaskWithExternalPort.getSelectedItem().toString();
                        int selectedIndexPatternPort = jComboBoxPatternExternalPortOfATask.getSelectedIndex();
                        String typeSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getType();
                        if (typeSelectedPatternPort.equals(PatternCreation.CHANNEL)){
                            String confSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getConfidentiality();
                            String authSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getAuthenticity();
                            jCheckBoxAddConfidentiality.setVisible(true);
                            jCheckBoxAddConfidentiality.setEnabled(true);
                            if (confSelectedPatternPort.toUpperCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toUpperCase())) {
                                jCheckBoxAddConfidentiality.setSelected(true);
                            }
                            for (int indexModeAuth = 0; indexModeAuth < authenticityModes.size(); indexModeAuth++) {
                                if (authSelectedPatternPort.toUpperCase().equals(authenticityModes.get(indexModeAuth).toUpperCase())) {
                                    jComboBoxAddAuthenticity.setSelectedIndex(indexModeAuth);
                                }
                            }
                            jComboBoxAddAuthenticity.setEnabled(true);
                            jComboBoxAddAuthenticity.setVisible(true);
                            jLabelAddAuthenticity.setVisible(true);
                        }
                        addConnectionBetweenSelectedPorts.setEnabled(true);
                    } else {
                        addConnectionBetweenSelectedPorts.setEnabled(false);
                        jCheckBoxAddConfidentiality.setVisible(false);
                        jCheckBoxAddConfidentiality.setEnabled(false);
                        jCheckBoxAddConfidentiality.setSelected(false);
                        jComboBoxAddAuthenticity.setEnabled(false);
                        jComboBoxAddAuthenticity.setVisible(false);
                        jComboBoxAddAuthenticity.setSelectedIndex(authenticityModes.indexOf(PatternCreation.WITHOUT_AUTHENTICITY));
                        jLabelAddAuthenticity.setVisible(false);
                    }
                }
                if (evt.getSource() == jComboBoxTaskToClone) {
                    if (jComboBoxTaskToClone.getSelectedIndex() >= 0) {
                        jFieldNewClonedTaskName.setEnabled(true);
                        addClonedTask.setEnabled(true);
                    } else {
                        jFieldNewClonedTaskName.setEnabled(false);
                        addClonedTask.setEnabled(false);
                    }
                }

                if (evt.getSource() == jComboBoxPortsConfig) {
                    if (jComboBoxPortsConfig.getSelectedIndex() >= 0) {
                        jRadioPortConfigRemove.setEnabled(true);
                        jRadioPortConfigMerge.setEnabled(true);
                        
                    } else {
                        jRadioPortConfigRemove.setEnabled(false);
                        jRadioPortConfigMerge.setEnabled(false);
                    }
                    if (portsConfig.size() == 0 && tasksOfPatternWithExternalPort.size() == 0) {
                        tasksToMap.removeAllElements();
                        tasksToMapList.clear();
                        tasksToMapInSameHw.removeAllElements();
                        tasksToMapInSameHwList.clear();
                        mappedTasks.removeAllElements();
                        mappedTasksList.clear();
                        channelsToMap.removeAllElements();
                        channelsToMapList.clear();
                        channelsToMapInSameMem.removeAllElements();
                        channelsToMapInSameMemList.clear();
                        mappedChannels.removeAllElements();
                        mappedChannelsList.clear();
                        List<String> clonedTasksName = new ArrayList<String>();
                        for(PatternCloneTask cloneT: clonedTasksList) {
                            tasksToMap.add(cloneT.getClonedTask());
                            MappingPatternTask mapTask = new MappingPatternTask(cloneT.getClonedTask(), MappingPatternTask.ORIGIN_CLONE);
                            tasksToMapList.add(mapTask);
                            clonedTasksName.add(cloneT.getClonedTask());
                        }
                        for(String st : patternTasksAll.keySet()) {
                            tasksToMap.add(st);
                            MappingPatternTask mapTask = new MappingPatternTask(st, MappingPatternTask.ORIGIN_PATTERN);
                            tasksToMapList.add(mapTask);
                        }
                        for(String st : portsTaskOfModelAll.keySet()) {
                            if (!clonedTasksName.contains(st)) {
                                tasksToMapInSameHw.add(st);
                                MappingPatternTask mapTask = new MappingPatternTask(st, MappingPatternTask.ORIGIN_MODEL);
                                tasksToMapInSameHwList.add(mapTask);
                            }
                        }
                        List<MappingPatternChannel> channelsToMapListA = MappingPatternChannel.getChannelsToMap(patternConnectionList, patternTasksAll, clonedTasksList);
                        for(MappingPatternChannel channelToMap : channelsToMapListA) {
                            channelsToMap.add(channelToMap.getTaskChannelToMap());
                            channelsToMapList.add(channelToMap);
                        }
                        
                        for(String st : portsTaskOfModelAll.keySet()) {
                            if (!clonedTasksName.contains(st)) {
                                for (String wc : portsTaskOfModelAll.get(st).getWriteChannels()) {
                                    if (!channelsToMapInSameMem.contains(MappingPatternChannel.getTaskChannel(st, wc))) {
                                        MappingPatternChannel mappingPatternChannel = new MappingPatternChannel(st, wc, MappingPatternChannel.ORIGIN_MODEL);
                                        channelsToMapInSameMem.add(mappingPatternChannel.getTaskChannelToMap());
                                        channelsToMapInSameMemList.add(mappingPatternChannel);
                                    } 
                                }
                            }
                        }
                        
                        buttonTasksMapInArch.setEnabled(true);
                        buttonChannelsMapInArch.setEnabled(true); 
                        buttonUpdatePatternsAttributes.setEnabled(true); 
                    } else {
                        buttonTasksMapInArch.setEnabled(false);
                        buttonChannelsMapInArch.setEnabled(false);
                        buttonUpdatePatternsAttributes.setEnabled(false);
                    }
                    
                    jRadioPortConfigRemove.setSelected(false);
                    jRadioPortConfigMerge.setSelected(false);
                    portsConfigGroup.clearSelection();
                    portsConfigMerge.removeAllElements();
                    jComboBoxPortsConfigMerge.setSelectedIndex(-1);
                }
                if (evt.getSource() == jRadioPortConfigRemove) {
                    jComboBoxPortsConfigMerge.setSelectedIndex(-1);
                    jComboBoxPortsConfigMerge.setEnabled(false);
                }

                if (evt.getSource() == jRadioPortConfigMerge) {
                    if (jRadioPortConfigMerge.isSelected()) {
                        jComboBoxPortsConfigMerge.setEnabled(true);
                        String jCo = jComboBoxPortsConfig.getSelectedItem().toString();
                        String[] taskPortSelected = PatternPortsConfig.seperateTaskAndChannel(jCo);
                        String taskSelected = taskPortSelected[0];
                        List<String> portsToConfOfTaskAll = new ArrayList<String>();
                        for (PatternPortsConfig portTaskConfig : portsTaskConfig) {
                            if (taskSelected.equals(portTaskConfig.getTaskOfChannelToConfig())) {
                                portsToConfOfTaskAll.add(portTaskConfig.getChannelToConfig());
                            }
                        }
                        for (String wc : portsTaskOfModelAll.get(taskSelected).getWriteChannels()) {
                            if (!portsToConfOfTaskAll.contains(wc)) {
                                portsConfigMerge.add(wc);
                            }
                        }
                        for (String rc : portsTaskOfModelAll.get(taskSelected).getReadChannels()) {
                            if (!portsToConfOfTaskAll.contains(rc)) {
                                portsConfigMerge.add(rc);
                            }
                        }
                        for (String se : portsTaskOfModelAll.get(taskSelected).getSendEvents()) {
                            if (!portsToConfOfTaskAll.contains(se)) {
                                portsConfigMerge.add(se);
                            }
                        }
                        for (String we : portsTaskOfModelAll.get(taskSelected).getWaitEvents()) {
                            if (!portsToConfOfTaskAll.contains(we)) {
                                portsConfigMerge.add(we);
                            }
                        } 
                        
                    } else {
                        jComboBoxPortsConfigMerge.setEnabled(false);
                    }
                    jComboBoxPortsConfigMerge.setSelectedIndex(-1);
                }

                if (evt.getSource() == jRadioPortConfigMerge || evt.getSource() == jRadioPortConfigRemove || evt.getSource() == jComboBoxPortsConfigMerge) {
                    if (portsConfig.size()>0 && (jRadioPortConfigRemove.isSelected() || (jRadioPortConfigMerge.isSelected() && jComboBoxPortsConfigMerge.getSelectedIndex() >= 0))) {
                        addConfigPorts.setEnabled(true);
                    } else {
                        addConfigPorts.setEnabled(false);
                    }
                }
                if (evt.getSource() == jComboBoxTaskToMap) {
                    if (jComboBoxTaskToMap.getSelectedIndex() >= 0) {
                        jRadioMapTaskInNewHw.setEnabled(true);
                        jRadioMapTaskInExistingHw.setEnabled(true);
                    } else {
                        jRadioMapTaskInNewHw.setEnabled(false);
                        jRadioMapTaskInExistingHw.setEnabled(false);
                    }
                    mapTaskGroup.clearSelection();
                    jComboBoxMapTaskInSameHwAs.setEnabled(false);
                    jComboBoxMapTaskInNewHw.setEnabled(false);
                    jComboBoxMapTaskInSameHwAs.setSelectedIndex(-1);
                    jComboBoxMapTaskInNewHw.setSelectedIndex(-1);
                }
                if (evt.getSource() == jRadioMapTaskInNewHw) {
                    if (jRadioMapTaskInNewHw.isSelected()) {
                        jComboBoxMapTaskInNewHw.setEnabled(true);
                        jComboBoxMapTaskInSameHwAs.setEnabled(false);
                        jComboBoxMapTaskInSameHwAs.setSelectedIndex(-1);
                    } else {
                        jComboBoxMapTaskInNewHw.setEnabled(false);
                    }
                }
                if (evt.getSource() == jRadioMapTaskInExistingHw) {
                    if (jRadioMapTaskInExistingHw.isSelected()) {
                        jComboBoxMapTaskInSameHwAs.setEnabled(true);
                        jComboBoxMapTaskInNewHw.setEnabled(false);
                        jComboBoxMapTaskInNewHw.setSelectedIndex(-1);
                    } else {
                        jComboBoxMapTaskInSameHwAs.setEnabled(false);
                    }
                }
                if (evt.getSource() == jComboBoxMapTaskInSameHwAs || evt.getSource() == jComboBoxMapTaskInNewHw) {
                    if (tasksToMap.size() > 0 && ((jRadioMapTaskInExistingHw.isSelected() &&  jComboBoxMapTaskInSameHwAs.getSelectedIndex() >= 0) || (jRadioMapTaskInNewHw.isSelected() && jComboBoxMapTaskInNewHw.getSelectedIndex() >= 0))) {
                        addMappedTask.setEnabled(true);
                    } else {
                        addMappedTask.setEnabled(false);
                    }
                }
                if (evt.getSource() == jComboBoxChannelToMap) {
                    if (jComboBoxChannelToMap.getSelectedIndex() >= 0) {
                        jRadioMapChannelInNewMem.setEnabled(true);
                        jRadioMapChannelInExistingMem.setEnabled(true);
                    } else {
                        jRadioMapChannelInNewMem.setEnabled(false);
                        jRadioMapChannelInExistingMem.setEnabled(false);
                    }
                    mapChannelGroup.clearSelection();
                    jComboBoxMapChannelInSameMemAs.setEnabled(false);
                    jComboBoxMapChannelInNewMem.setEnabled(false);
                    jComboBoxMapChannelInSameMemAs.setSelectedIndex(-1);
                    jComboBoxMapChannelInNewMem.setSelectedIndex(-1);
                }
                if (evt.getSource() == jRadioMapChannelInNewMem) {
                    if (jRadioMapChannelInNewMem.isSelected()) {
                        jComboBoxMapChannelInNewMem.setEnabled(true);
                        jComboBoxMapChannelInSameMemAs.setEnabled(false);
                        jComboBoxMapChannelInSameMemAs.setSelectedIndex(-1);
                    } else {
                        jComboBoxMapChannelInNewMem.setEnabled(false);
                    }
                }
                if (evt.getSource() == jRadioMapChannelInExistingMem) {
                    if (jRadioMapChannelInExistingMem.isSelected()) {
                        jComboBoxMapChannelInSameMemAs.setEnabled(true);
                        jComboBoxMapChannelInNewMem.setEnabled(false);
                        jComboBoxMapChannelInNewMem.setSelectedIndex(-1);
                    } else {
                        jComboBoxMapChannelInSameMemAs.setEnabled(false);
                    }
                }
                if (evt.getSource() == jComboBoxMapChannelInSameMemAs || evt.getSource() == jComboBoxMapChannelInNewMem) {
                    if (channelsToMap.size() > 0 && ((jRadioMapChannelInExistingMem.isSelected() &&  jComboBoxMapChannelInSameMemAs.getSelectedIndex() >= 0) || (jRadioMapChannelInNewMem.isSelected() && jComboBoxMapChannelInNewMem.getSelectedIndex() >= 0))) {
                        addMappedChannel.setEnabled(true);
                    } else {
                        addMappedChannel.setEnabled(false);
                    }
                }

                if (evt.getSource() == jComboBoxTasksToUpdateAttributes) {
                    attributesOfTaskToUpdate.removeAllElements();
                    if (jComboBoxTasksToUpdateAttributes.getSelectedIndex() >= 0) {
                        jComboBoxAttributesOfTaskToUpdate.setEnabled(true);
                        String selectedTaskToUpdateAttributes = jComboBoxTasksToUpdateAttributes.getSelectedItem().toString();
                        for (AttributeTaskJsonFile attributeTaskJsonFile : patternTasksAll.get(selectedTaskToUpdateAttributes).getAttributes()) {
                            attributesOfTaskToUpdate.add(attributeTaskJsonFile.getName());
                        }
                    } else {
                        jComboBoxAttributesOfTaskToUpdate.setEnabled(false);
                    }
                    jComboBoxAttributesOfTaskToUpdate.setSelectedIndex(-1);
                    jFieldNewTaskAttibuteValue.setText("");
                }

                if (evt.getSource() == jComboBoxAttributesOfTaskToUpdate) {
                    if (jComboBoxAttributesOfTaskToUpdate.getSelectedIndex() >= 0) {
                        jFieldNewTaskAttibuteValue.setEnabled(true);
                        buttonUpdateTaskAttributeValue.setEnabled(true);
                        String selectedTaskToUpdateAttributes = jComboBoxTasksToUpdateAttributes.getSelectedItem().toString();
                        String selectedAttributeToUpdate = jComboBoxAttributesOfTaskToUpdate.getSelectedItem().toString();
                        for (AttributeTaskJsonFile attributeTaskJsonFile : patternTasksAll.get(selectedTaskToUpdateAttributes).getAttributes()) {
                            if (attributeTaskJsonFile.getName().equals(selectedAttributeToUpdate)) {
                                jFieldNewTaskAttibuteValue.setText(attributeTaskJsonFile.getValue());
                            }
                        }
                    } else {
                        jFieldNewTaskAttibuteValue.setEnabled(false);
                        jFieldNewTaskAttibuteValue.setText("");
                        buttonUpdateTaskAttributeValue.setEnabled(false);
                    }
                }

                if (evt.getSource() == jComboBoxPatternsJson) {
                    if (jComboBoxPatternsJson.getSelectedIndex() >= 0) {
                        jFieldPatternJsonPath.setEnabled(true);
                        jFieldPatternJsonPath.setText(pathPatterns + listPatternsJson.get(jComboBoxPatternsJson.getSelectedIndex()) + "/"+listPatternsJson.get(jComboBoxPatternsJson.getSelectedIndex())+"-config.json");
                    } else {
                        jFieldPatternJsonPath.setEnabled(false);
                        jFieldPatternJsonPath.setText("");
                    }
                }
        }
    }

    private void closeDialog() {
        if (mode == STARTED) {
            stopProcess();
        }
        dispose();
    }

    private void stopProcess() {
        if (rshc != null) {
            try {
                rshc.stopCommand();
            } catch (LauncherException ignored) {
            }
        }
        rshc = null;
        mode = STOPPED;
        setButtons();
        go = false;
    }

    private void startProcess() {
        Thread t = new Thread(this);
        mode = STARTED;
        setButtons();
        go = true;
        t.start();
    }

    @Override
    public void run() {
        TraceManager.addDev("Thread started");
        int currentPosY = 0;
        int stepY = 10; 
        if (jp1.getSelectedIndex() == 0) {
            newPatternName = jFieldNewPatternName.getText();
            jta.removeAll();
            boolean findErr = false;
            if (selectedTasksAsPattern.size() == 0) {
                JLabel label = new JLabel("ERROR: No Task Selected As Pattern");
                label.setAlignmentX(Component.LEFT_ALIGNMENT);
                this.jta.add(label, this.createGbc(currentPosY));
                currentPosY += stepY;
                findErr = true;
            }
            if (newPatternName.length() <= 0) {
                JLabel label = new JLabel("ERROR: Pattern name is missing");
                label.setAlignmentX(Component.LEFT_ALIGNMENT);
                this.jta.add(label, this.createGbc(currentPosY));
                currentPosY += stepY;
                findErr = true;
            }
            /*if (selectedTasksAsPattern.size() > 1) {
                for (int i = 0; i < selectedTasksAsPattern.size(); i++) {
                    boolean isLinkedToPattern = false;
                    for (int j = 0; j < selectedTasksAsPattern.size(); j++) {
                        if (i != j) {
                            int nbChWr = getListChannelsBetweenTwoTasks(tasksFullName.get(selectedTasksAsPattern.get(i)), tasksFullName.get(selectedTasksAsPattern.get(j))).size();
                            int nbChRd = getListChannelsBetweenTwoTasks(tasksFullName.get(selectedTasksAsPattern.get(j)), tasksFullName.get(selectedTasksAsPattern.get(i))).size();
                            if (nbChWr != 0 || nbChRd != 0) {
                                isLinkedToPattern = true;
                                break;
                            }   
                        }
                    }
                    if (!isLinkedToPattern) {
                        JLabel label = new JLabel("ERROR: The task " + selectedTasksAsPattern.get(i) +" is not linked to the others selected tasks");
                        label.setAlignmentX(Component.LEFT_ALIGNMENT);
                        this.jta.add(label, this.createGbc(currentPosY));
                        currentPosY += stepY;
                        findErr = true;
                    }
                }
            }*/
    
            if (!findErr) {
                mgui.gtm.createPattern(selectedTasksAsPattern, newPatternName, pathPatterns);
                JLabel label = new JLabel("Pattern Creation Completed");
                label.setAlignmentX(Component.LEFT_ALIGNMENT);
                this.jta.add(label, this.createGbc(currentPosY));
            }
            mode = NOT_STARTED;
        } else  if (jp1.getSelectedIndex() == 1) {
            newPatternName = jFieldNewPatternName.getText();
            jta.removeAll();
            boolean findErr = false;
            if (tasksOfPatternWithExternalPort.size() > 0) {
                JLabel label = new JLabel("ERROR: Some connections between the pattern and the model are missing");
                label.setAlignmentX(Component.LEFT_ALIGNMENT);
                this.jta.add(label, this.createGbc(currentPosY));
                currentPosY += stepY;
                findErr = true;
            }
            if (portsConfig.size() > 0) {
                JLabel label = new JLabel("ERROR: There are some port's configurations left to do");
                label.setAlignmentX(Component.LEFT_ALIGNMENT);
                this.jta.add(label, this.createGbc(currentPosY));
                currentPosY += stepY;
                findErr = true;
            }
            if (!findErr) {
                int selectedPatternIndex = jComboBoxPatterns.getSelectedIndex();
                String selectedPatternPath = pathPatterns+listPatterns.get(selectedPatternIndex)+"/";
                String selectedPatternName = listPatterns.get(selectedPatternIndex);
                PatternConfiguration patternConfiguration = new PatternConfiguration(patternConnectionList, clonedTasksList, configuredPortsList, mappedTasksList, mappedChannelsList, updatedPatternAttributes, channelsWithSecurity);
                patternConfiguration.loadChannelsWithSecurity(patternTasksAll);
                GTURTLEModeling.createJsonPatternConfigFile(selectedPatternPath, selectedPatternName, patternConfiguration);
                mgui.gtm.integratePattern(mgui, selectedPatternPath, selectedPatternName);
                JLabel label = new JLabel("Pattern Configuration Completed");
                label.setAlignmentX(Component.LEFT_ALIGNMENT);
                this.jta.add(label, this.createGbc(currentPosY));
            }
            mode = NOT_STARTED;
        } else  if (jp1.getSelectedIndex() == 2) {
            jta.removeAll();
            boolean findErr = false;
            String textJFieldPathJson = jFieldPatternJsonPath.getText();
            File f = new File(textJFieldPathJson);
            
            if (jComboBoxPatternsJson.getSelectedIndex() == -1) {
                JLabel label = new JLabel("ERROR: Select a pattern");
                label.setAlignmentX(Component.LEFT_ALIGNMENT);
                this.jta.add(label, this.createGbc(currentPosY));
                currentPosY += stepY;
                findErr = true;
            }
            if (!f.isFile() || !f.exists()) { 
                JLabel label = new JLabel("ERROR: Json file doesn't exist");
                label.setAlignmentX(Component.LEFT_ALIGNMENT);
                this.jta.add(label, this.createGbc(currentPosY));
                currentPosY += stepY;
                findErr = true;
            }

            if (!findErr) {
                int selectedPatternIndex = jComboBoxPatternsJson.getSelectedIndex();
                String selectedPatternPath = pathPatterns+listPatternsJson.get(selectedPatternIndex) + "/";
                String selectedPatternName = listPatternsJson.get(selectedPatternIndex);
                mgui.gtm.integratePattern(mgui, selectedPatternPath, selectedPatternName, textJFieldPathJson);
                JLabel label = new JLabel("Pattern Integration Completed");
                label.setAlignmentX(Component.LEFT_ALIGNMENT);
                this.jta.add(label, this.createGbc(currentPosY));
            }
            mode = NOT_STARTED;
        }
        setButtons();
    }

    protected void setButtons() {
        switch (mode) {
            case NOT_STARTED:
                startButton.setEnabled(true);
                stop.setEnabled(false);
                close.setEnabled(true);
                getGlassPane().setVisible(false);
                break;
            case STARTED:
                startButton.setEnabled(false);
                stop.setEnabled(true);
                close.setEnabled(false);
                getGlassPane().setVisible(true);
                break;
            case STOPPED:
            default:
                startButton.setEnabled(false);
                stop.setEnabled(false);
                close.setEnabled(true);
                getGlassPane().setVisible(false);
                break;
        }
    }

    @Override
    public void setError() {
    }

    @Override
    public void appendOut(String s) {
    }

    @Override
    public boolean hasToContinue() {
        return this.go;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void valueChanged(ListSelectionEvent e) {

    }

}