private void newProject() {
   project = new Project("Senza Titolo");
   file = null;
   view.setTitle(project.getTitle());
   inizializePens(project.getPenModels());
   modelListPens.update(null, null);
   view.setTitle(project.getTitle());
   view.trend.setModel(project.getTrendModel());
 }
 private boolean areEqual(Project a, Project b, boolean compareIDs) {
   if (compareIDs) {
     if (a.getId() != b.getId()) {
       return false;
     }
   }
   return (safeEquals(a.getTitle(), b.getTitle())
       && safeEquals(a.getRecordsperimage(), b.getRecordsperimage())
       && safeEquals(a.getFirstycoord(), b.getFirstycoord())
       && safeEquals(a.getRecordheight(), b.getRecordheight())
       && safeEquals(a.getNumfields(), b.getNumfields()));
 }
  private void importProjectAndData() {
    JFileChooser fileChooser = new JFileChooser();
    fileChooser.setApproveButtonText("Importa");
    fileChooser.setDialogTitle("Importa progetto e  dati");
    fileChooser.addChoosableFileFilter(new GenericFileFilter(".atd", "Arduino Trend Data"));
    int n = fileChooser.showOpenDialog(view);

    if (n == JFileChooser.APPROVE_OPTION) {

      try {
        project.importProjectAndData(fileChooser.getSelectedFile());
        file = null;
        inizializePens(project.getPenModels());
        modelListPens.update(null, null);
        view.setTitle(project.getTitle());
        view.trend.setModel(project.getTrendModel());
        view.trend.setMillsAtFirstRecord();
      } catch (IOException e) {
        view.popupErrorMessage(e.getMessage());
        e.printStackTrace();
      } catch (ClassNotFoundException e) {
        view.popupErrorMessage("File non trovato");
        e.printStackTrace();
      }
    }
  }
  private void doList() {
    System.out.printf("%-3s %-20s %-10s %-10s %-40s\n", "No", "Title", "Start", "End", "Members");

    Project project = null;
    for (int i = 0; i < projects.size(); i++) {
      project = projects.get(i);
      if (project == null) // 배열의 항목이 null인 경우, 다음 항목으로 바로 이동.
      continue;
      System.out.printf(
          "% 3d %-20s %3$tY-%3$tm-%3$td %4$s %5$-40s\n",
          i, project.getTitle(), project.getStartDate(), project.getEndDate(), project.getMember());
    }
  }
  private void openProject() {
    JFileChooser fileChooser = new JFileChooser();
    fileChooser.addChoosableFileFilter(new GenericFileFilter(".atp", "Arduino Trend Progetto"));
    int n = fileChooser.showOpenDialog(view);

    if (n == JFileChooser.APPROVE_OPTION) {

      try {
        project.load(fileChooser.getSelectedFile());
        file = fileChooser.getSelectedFile();
        inizializePens(project.getPenModels());
        modelListPens.update(null, null);
        view.setTitle(project.getTitle());
        view.trend.setModel(project.getTrendModel());
      } catch (IOException e) {
        view.popupErrorMessage(e.getMessage());
        e.printStackTrace();
      } catch (ClassNotFoundException e) {
        view.popupErrorMessage("File non trovato");
        e.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));
  }