package fi.lpam.gui; import com.dlsc.gemsfx.MultiColumnListView; import fi.lpam.dataluokat.Asiakas; import fi.lpam.dataluokat.Kierros; import fi.lpam.gui.elementit.AsiakasMCLVListCell; import fi.lpam.gui.elementit.FontLabel; import fi.lpam.gui.elementit.TabPohja; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import java.util.ArrayList; import java.util.HashSet; import java.util.Objects; public class Kierroshallinta extends TabPohja { private final MultiColumnListView mclv = new MultiColumnListView<>(); private final ArrayList kierrokset = Kierros.haeKaikki(); private ArrayList kaikkiAsiakkaat = Asiakas.haeKaikki(); public Kierroshallinta() { super("Kierroshallinta"); root.setCenter(mclv); mclv.setCellFactory(_ -> new AsiakasMCLVListCell(mclv)); mclv.setPlaceholderFrom(new Asiakas("")); mclv.setPlaceholderTo(new Asiakas("")); rakennaSarakkeet(); BorderPane yläpalkki = new BorderPane(); root.setTop(yläpalkki); Label infoTeksti = new FontLabel(TEKSTI_FONT, "Siirrä asiakkaat haluamallesi kierrokselle. Kierroksia voit lisätä painamalla lisää uusi kierros painiketta.\nKierrosnumerot päivittyvät, sekä tyhjät poistuvat kierroksia tallentaessa."); yläpalkki.setLeft(infoTeksti); HBox yläpalkinNapit = new HBox(); yläpalkinNapit.setSpacing(5); yläpalkki.setRight(yläpalkinNapit); Button lisääKierros = new Button("Lisää uusi kierros"); lisääKierros.setOnAction(_ -> { int uudenKierroksenNumero = mclv.getColumns().size(); lisaaKierros(new Kierros(uudenKierroksenNumero, FXCollections.observableArrayList(new ArrayList<>()))); }); lisääKierros.setFont(BUTTON_FONT); yläpalkinNapit.getChildren().add(lisääKierros); Button tallenna = new Button("Tallenna kierrokset"); tallenna.setFont(BUTTON_FONT); tallenna.setOnAction(_ ->tallennaKierrokset()); yläpalkinNapit.getChildren().add(tallenna); } private void rakennaSarakkeet() { mclv.getColumns().clear(); kaikkiAsiakkaat = Asiakas.haeKaikki(); ObservableList eiKierroksella = FXCollections.observableArrayList(new ArrayList<>()); HashSet kierroksellaOlevatAsiakasIDt = new HashSet<>(); if (!kierrokset.isEmpty()) { for (Kierros kierros : kierrokset) { lisaaKierros(kierros); for (Asiakas asiakas : kierros.getAsiakkaat()) { kierroksellaOlevatAsiakasIDt.add(asiakas.getId()); } } } for (Asiakas k : Objects.requireNonNull(kaikkiAsiakkaat)) { if (!kierroksellaOlevatAsiakasIDt.contains(k.getId())) { eiKierroksella.add(k); } } MultiColumnListView.ListViewColumn colEiKierroksella = new MultiColumnListView.ListViewColumn<>(); Label labelEiKierroksella = new FontLabel(TEKSTI_FONT, "Ei vielä kierroksella"); colEiKierroksella.setHeader(labelEiKierroksella); colEiKierroksella.setItems(FXCollections.observableArrayList(eiKierroksella)); mclv.getColumns().add(colEiKierroksella); } private void lisaaKierros(Kierros kierros) { if (kierros.getId() == -1) kierrokset.add(kierros); MultiColumnListView.ListViewColumn uusiSarake = new MultiColumnListView.ListViewColumn<>(); uusiSarake.setHeader(new FontLabel(TEKSTI_FONT, "Kierros " + kierros.getKierrosNumero())); uusiSarake.setItems(kierros.getAsiakkaat()); mclv.getColumns().add(kierros.getKierrosNumero()-1, uusiSarake); } private void tallennaKierrokset() { int kierrosNumero = 1; int index = 0; for (int i = 0; i < kierrokset.size();) { Kierros k = kierrokset.get(i); k.setAsiakkaat(FXCollections.observableArrayList(new ArrayList<>())); k.setAsiakkaat(mclv.getColumns().get(index).getItems()); index++; if (k.getAsiakkaat().isEmpty()) { k.poista(); kierrokset.remove(i); continue; } k.setKierrosNumero(kierrosNumero); kierrosNumero++; k.tallenna(); i++; } rakennaSarakkeet(); Alert info = new Alert(Alert.AlertType.INFORMATION); info.setTitle("Kierrokset tallennettu"); info.setHeaderText("Kierrokset tallennettu onnistuneesti"); info.setContentText(null); info.showAndWait(); } @Override public void päivitä() { rakennaSarakkeet(); } }