csvsimulator.model.ModelSuonata.java Source code

Java tutorial

Introduction

Here is the source code for csvsimulator.model.ModelSuonata.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package csvsimulator.model;

import global.GlobalUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import javafx.stage.FileChooser;
import javafx.stage.Window;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 *
 * @author lion
 */
public class ModelSuonata implements Serializable {

    private static final long serialVersionUID = 1;

    private ModelConcerto concerto;
    private List<ModelBattuta> listaBattute;
    private double tempoSuonata;
    private double tempoRitorno;

    public ModelSuonata() {
        listaBattute = new ArrayList<>();
        tempoSuonata = 1200;
        tempoRitorno = tempoSuonata;
    }

    public void addBattuta(ModelBattuta b, Integer index) {
        listaBattute.add(index, b);
    }

    public void removeBattuta(int index) {
        listaBattute.remove(index);
    }

    public Integer pushBattuta(ModelBattuta b) {
        listaBattute.add(b);
        return listaBattute.indexOf(b);
    }

    public Map<String, Double> getSuonata() {
        Map<String, Double> battute = getTimeBattute();
        Map<String, Double> offsetBattute = new LinkedHashMap<>();

        double lastValue = 0;
        for (Map.Entry<String, Double> entry : battute.entrySet()) {
            String chiave = entry.getKey();
            Double double1 = entry.getValue();

            offsetBattute.put(chiave, (double1 - lastValue));
            lastValue = double1;
        }

        return offsetBattute;

    }

    public double getTotalTime() {
        Map<String, Double> suonata = this.getSuonata();
        double total = 0.0;
        for (Double val : suonata.values()) {
            total += val;
        }
        return total;
    }

    public Map<String, Double> getTimeBattute() {
        return getTimeBattute(true);
    }

    public Map<String, Double> getTimeBattute(Boolean contrattempi) {
        Map<String, Double> battute = new TreeMap<>();
        double lastValue = 0;
        ArrayList<Integer> prevBattuta = new ArrayList<>();

        for (ListIterator<ModelBattuta> it = listaBattute.listIterator(); it.hasNext();) {
            int index = it.nextIndex();
            ModelBattuta modelBattuta = it.next();

            //Aumentare lastValue se  un ritorno di campana
            double val = lastValue;
            prevBattuta.retainAll(modelBattuta.getListaCampane().keySet());

            double mainVal = val;
            Integer mainCampana = -1000;
            boolean isRitorno = (prevBattuta.size() > 0);

            prevBattuta = new ArrayList<>();
            for (Integer numeroCampana : modelBattuta.getListaCampane().keySet()) {

                //val  il tempo dell'dell'ultima campana pi la giusta pausa
                //la moltiplicazione aggiunge il contrattempo
                double intval = val;

                if (contrattempi) {
                    intval += modelBattuta.getTimeContrattempo(numeroCampana, tempoSuonata);
                }

                if (isRitorno) {
                    intval += getTempoRitorno();
                }

                battute.put(index + "||" + numeroCampana, intval);

                if (numeroCampana > mainCampana) {
                    mainCampana = numeroCampana;
                    mainVal = intval;
                }

                //Aggiorno la lista per controllare se  un ritorno
                prevBattuta.add(numeroCampana);

            }

            lastValue = mainVal + tempoSuonata;
        }

        battute = GlobalUtils.sortByValue(new TreeMap<>(battute));

        return battute;
    }

    /**
     * Restituisce quando una certa campana di una certa battuta viene eseguita
     *
     * @param nBattuta
     * @param nCampana
     * @return
     */
    public Double getTimeCampana(Integer numero_battuta, Integer numero_campana) {
        Map<String, Double> battute = getTimeBattute();
        return battute.get(numero_battuta + "||" + numero_campana);
    }

    /**
     *
     * @param numero_battuta
     * @param numero_campana
     * @return
     */
    public Double getMinContrattempoSec(Integer numero_battuta, Integer numero_campana) {
        //Se  la prima battuta non pu anticipare al messimo si fa ritardare la seconda battuta per far sembrare un anticipo
        if (numero_battuta == 0) {
            return 0.0;
        }

        //poi se deve fare un ritorno non pu anticipare troppo senza fare ribattute o cali, ma pu strozzare quindi gli si pu annullare parte del tempo
        //per ora tolgo al massimo il tempo suonata
        Set<Integer> campanePrecendi = new LinkedHashSet<>(
                listaBattute.get(numero_battuta - 1).getListaCampane().keySet());
        boolean mioRitorno = campanePrecendi.contains(numero_campana);
        if (mioRitorno) {
            return tempoSuonata / 1000;
        }

        //Nel caso di un doppio con ritorno e la campana selezionata non  quella implicata nel ritorno pu anticipare di pi
        Set<Integer> campaneBattua = new LinkedHashSet<>(
                listaBattute.get(numero_battuta).getListaCampane().keySet());
        campaneBattua.retainAll(campanePrecendi);
        boolean isRitorno = (campaneBattua.size() > 0);
        if (isRitorno && !mioRitorno) {
            return (tempoSuonata + getTempoRitorno()) / 1000;
        }

        return tempoSuonata / 1000;
    }

    //restituire il minimo dei massimi
    public Double getMaxContrattempoSec(Integer numero_battuta, Integer numero_campana) {
        return tempoSuonata / 1000;
    }

    public Integer getNumberBattutaFromModelBattuta(ModelBattuta mb) {
        int numero_battuta;
        for (ListIterator it = listaBattute.listIterator(); it.hasNext();) {
            numero_battuta = it.nextIndex();
            ModelBattuta o = (ModelBattuta) it.next();
            if (o.hashCode() == mb.hashCode()) {
                return numero_battuta;
            }
        }
        return null;
    }

    public void saveFileSuonata(final Window w, File dir) {
        FileChooser fileChooser = new FileChooser();
        if (dir != null) {
            fileChooser.setInitialDirectory(dir);
        }

        FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter(
                "Suonata campane sistema veronese (*.csvs)", "*.csvs");
        fileChooser.getExtensionFilters().add(extFilter);

        File file = fileChooser.showSaveDialog(w);

        if (file != null) {
            SaveFile(file);
        }
    }

    private void SaveFile(File file) {
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream(file));
            oos.writeObject(this);
            oos.close();
        } catch (IOException e) {
            System.err.println(e.toString());
        }
        System.out.println("Salvataggio suonata completato");
    }

    public void saveOnExcel(int numero_colonne, final Window w) {
        FileChooser fileChooser = new FileChooser();
        FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("Excel (*.xlsx)", "*.xlsx");
        fileChooser.getExtensionFilters().add(extFilter);

        File file = fileChooser.showSaveDialog(w);

        if (file != null) {

            Workbook wb = new XSSFWorkbook();
            Sheet sheet = wb.createSheet("Spartito_Suonata");
            int rowIndex = 0;
            int columnIndex = 0;
            Cell cell;
            Row row = sheet.createRow(rowIndex);
            for (ModelBattuta modelBattuta : this.getListaBattute()) {
                cell = row.createCell(columnIndex);
                cell.setCellValue(modelBattuta.getNomeBattuta(this.concerto));

                columnIndex++;
                if (columnIndex >= numero_colonne) {
                    rowIndex++;
                    columnIndex = 0;
                    row = sheet.createRow(rowIndex);
                }
            }

            // Write the output to a file
            try {
                FileOutputStream out = new FileOutputStream(file);
                wb.write(out);
                out.close();
            } catch (Exception e) {
            }

        }
    }

    /**
     * @return the concerto
     */
    public ModelConcerto getConcerto() {
        return concerto;
    }

    /**
     * @param concerto the concerto to set
     */
    public void setConcerto(ModelConcerto concerto) {
        this.concerto = concerto;
    }

    /**
     * @return the listaBattute
     */
    public List<ModelBattuta> getListaBattute() {
        return listaBattute;
    }

    /**
     * @param listaBattute the listaBattute to set
     */
    public void setListaBattute(List<ModelBattuta> listaBattute) {
        this.listaBattute = listaBattute;
    }

    /**
     * @return the tempoRitorno
     */
    public double getTempoRitorno() {
        return tempoRitorno;
    }

    /**
     * @param tempoRitorno the tempoRitorno to set
     */
    public void setTempoRitorno(double tempoRitorno) {
        this.tempoRitorno = tempoRitorno;
    }

    /**
     * @return the tempoSuonata
     */
    public double getTempoSuonata() {
        return tempoSuonata;
    }

    /**
     * @param tempoSuonata the tempoSuonata to set
     */
    public void setTempoSuonata(double tempoSuonata) {
        this.tempoSuonata = tempoSuonata;
    }

}