@Override
    public void actionPerformed(ActionEvent e) {

      if (comunication.isConnected()) {

        try {
          comunication.close();
        } catch (IOException e1) {
          view.popupErrorMessage(e1.getMessage());
          e1.printStackTrace();
        }

      } else {

        Serial.DATA_RATE[] arrDataRate = Serial.DATA_RATE.values();
        try {
          serial.setDataRate(arrDataRate[view.getItemDataRate()]);
        } catch (SerialPortException e1) {
          view.popupErrorMessage(e1.getMessage());
          e1.printStackTrace();
        }
        try {
          refreshNameSerialPort();
          String namePort = view.getNameSerialPortSelected();
          comunication.open(namePort);
        } catch (SerialPortException e1) {
          if (e1.getExceptionType().equals(SerialPortException.TYPE_NULL_NOT_PERMITTED)) {
            view.popupErrorMessage("Porta seriale non selezionata");
          } else if (e1.getExceptionType().equals(SerialPortException.TYPE_PORT_NOT_FOUND)) {
            view.popupErrorMessage("Porta seriale " + e1.getPortName() + " non trovata");
          } else if (e1.getExceptionType().equals(SerialPortException.TYPE_PORT_ALREADY_OPENED)) {
            view.popupErrorMessage("Porta seriale " + e1.getPortName() + " � gi� in uso.");
          } else {
            view.popupErrorMessage(e1.getMessage());
            e1.printStackTrace();
          }
        }
      }
    }
  public Controller(final View view) {
    this.view = view;

    try {
      PreferenceData.init();
    } catch (InvalidPropertiesFormatException e2) {
      JOptionPane.showMessageDialog(
          view, "Errore - " + e2.getMessage(), "Errore", JOptionPane.ERROR_MESSAGE);
      e2.printStackTrace();
    } catch (IOException e2) {
      JOptionPane.showMessageDialog(
          view, "Errore - " + e2.getMessage(), "Errore", JOptionPane.ERROR_MESSAGE);
      e2.printStackTrace();
    }

    // Inizializzazione progetto vuoto
    project = new Project("Senza Titolo");
    view.setTitle(project.getTitle());

    // Inizializzazione array delle penne
    pens = new Pen[Project.PENS_MAX];

    // Inizializzazione model della view lista penne
    modelListPens = new ModelListPens(pens);
    view.setModelListPens(modelListPens);
    // Inizializzazione model delle penne
    inizializePens(project.getPenModels());

    // Settaggi di default della classe Trend
    view.trend.addPens(pens);
    view.trend.setModel(
        new TrendModel(5, 5, 20000, 0, 100, TrendModel.TYPE_SCALE_AXIS_Y.AUTOMATIC));

    // Gestione chiusura applicazione
    view.addWindowListener(new ListenerCloseApplication());

    // Inizializzazione porta seriale
    serial =
        new Serial(
            Serial.DATA_RATE.DATARATE_57600,
            Serial.DATA_BITS.DATABITS_8,
            Serial.STOP_BITS.STOPBITS_1,
            Serial.PARITY.NONE);

    // Inizializzazione protocollo di comunicazione
    protocollo = new Protocollo(serial, Protocollo.TYPE_ARDUINO.DUEMILANOVE);
    protocollo.addObserver(modelListPens);

    // Inizializzazione comunicazione
    comunication = new Comunication(protocollo, serial, pens);
    comunication.addObserver(this);

    // Setting dei listener del menu della view principale
    view.addListenerMenuComunicazione(new ListenerMenuComunicazione());
    view.addListenerAtConnectionCommand(new ListenerConnection());
    view.addListenerAtInfo(new ListenerInfo());
    view.addListenerAddPen(new ListenerAddPen());
    view.addListenerAtListPens(new ListenerSelectedPen());
    view.addListenerMntmEditListPens(new ListenerEditPen());
    view.addListenerMntmRemoveListPens(new ListenerRemovePen());
    view.addListenerAtSettings(new ListenerSettingsTrend());
    view.addListenerAtNew(new ListenerNewProject());
    view.addListenerAtOpen(new ListenerOpenProject());
    view.addListendrAtSave(new ListenerSaveProject());
    view.addListendrAtSaveWithName(new ListenerSaveWithNameProject());
    view.addListenerAtImport(new ListenerImportData());
    view.addListenerAtExport(new ListenerExportData());

    // Popolamento lista datarate e settaggio del datarate di default
    Serial.DATA_RATE[] arrDataRate = Serial.DATA_RATE.values();
    String[] arrStringDataRate = new String[arrDataRate.length];
    for (int i = 0; i < arrStringDataRate.length; i++) {
      arrStringDataRate[i] = Integer.toString(arrDataRate[i].getValue());
    }
    view.setListDataRate(
        arrStringDataRate, PreferenceData.getValue(PreferenceData.SERIAL_BAUD_RATE));
  }