view.popups.shift.ShiftManualPopup.java Source code

Java tutorial

Introduction

Here is the source code for view.popups.shift.ShiftManualPopup.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 view.popups.shift;

import control.Xray;
import exceptions.DatabaseException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.util.Callback;
import model.Employee;
import model.Room;
import model.TimeInvestment;
import org.joda.time.DateTimeConstants;
import static org.joda.time.DurationFieldType.hours;
import org.joda.time.Hours;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.joda.time.LocalTime;
import org.joda.time.Minutes;
import view.buttons.ImageButton;
import view.buttons.PopupMenuButton;
import view.popups.ExceptionPopup;
import view.popups.PopupWindow;
import view.schema.ScheduleHeader;

/**
 *
 * @author Yousef
 */
public class ShiftManualPopup extends PopupWindow {

    //Layouts
    private VBox contentPane, startTimePicker, endTimePicker;
    private HBox employeePicker, roomPicker, weekPicker, weekDayPicker, shiftTypePicker, startHourMinutePicker,
            endHourMinutePicker, startEndTimePicker;

    //Labels
    private Label lWeek, lEmployee, lRoom, lStart, lEnd;

    //Combobox
    private ComboBox cWeek, cEmployee, cRoom;

    //TextFields
    private TextField tStartHH, tStartMM, tEndHH, tEndMM;

    //Knapper
    private PopupMenuButton addShifts;

    private ImageButton dayShift, eveningShift, nightShift;
    LocalTime dayTime, eveningTime, nightTime;

    //Checkbokse
    private CheckBox monday, tuesday, wednesday, thursday, friday, saturday, sunday;

    //ExceptionPopup
    private ExceptionPopup exceptionPopup = new ExceptionPopup();

    //Lokal tid og 12 uger frem
    private LocalDateTime today = LocalDateTime.now(), twelveWeeks = today.plusWeeks(12);

    private TimeInvestment shift;

    public ShiftManualPopup() {
        initLayouts();
        initLabels();
        initTextFields();
        initComboboxes();
        initButtons();
        initCheckboxes();
        setup();
        initChangeListeners();

        //Gr at brugeren ikke kan ndre vinduets strrelse:
        super.getStage().setResizable(false);
    }

    private void initLayouts() {
        contentPane = new VBox(20);
        contentPane.setPadding(new Insets(0, 0, 15, 0));
        contentPane.setAlignment(Pos.CENTER);

        weekDayPicker = new HBox(25);
        weekDayPicker.setAlignment(Pos.CENTER);
        employeePicker = new HBox(25);
        employeePicker.setAlignment(Pos.CENTER);
        roomPicker = new HBox(25);
        roomPicker.setAlignment(Pos.CENTER);

        shiftTypePicker = new HBox(25);
        shiftTypePicker.setAlignment(Pos.CENTER);

        weekPicker = new HBox(25);
        weekPicker.setAlignment(Pos.CENTER);

        startEndTimePicker = new HBox(25);
        startEndTimePicker.setAlignment(Pos.CENTER);

        startTimePicker = new VBox(25);
        startTimePicker.setAlignment(Pos.CENTER);
        startHourMinutePicker = new HBox(25);
        startHourMinutePicker.setAlignment(Pos.CENTER);

        endTimePicker = new VBox(25);
        endTimePicker.setAlignment(Pos.CENTER);
        endHourMinutePicker = new HBox(25);
        endHourMinutePicker.setAlignment(Pos.CENTER);

    }

    private void initComboboxes() {
        cWeek = new ComboBox();
        cWeek.setPrefWidth(170);

        ArrayList<LocalDateTime> mondays = getTwelveMondays();
        for (int i = 0; i < mondays.size(); i++) {
            cWeek.getItems().add(mondays.get(i));
        }

        Callback<ListView<LocalDateTime>, ListCell<LocalDateTime>> cellFactory = new Callback<ListView<LocalDateTime>, ListCell<LocalDateTime>>() {
            @Override
            public ListCell<LocalDateTime> call(ListView<LocalDateTime> param) {

                return new ListCell<LocalDateTime>() {
                    @Override
                    public void updateItem(LocalDateTime item, boolean empty) {
                        super.updateItem(item, empty);
                        if (!empty) {
                            String value = ScheduleHeader.WEEK_DAY_NAMES[item.getDayOfWeek() - 1];
                            value = value.replaceFirst(value.substring(1, value.length()),
                                    value.substring(1, value.length()).toLowerCase());
                            setText("Uge " + item.getWeekOfWeekyear() + " den " + item.getDayOfMonth() + "/"
                                    + item.getMonthOfYear() + " - " + value);
                        }
                    }

                };
            }
        };

        cWeek.setButtonCell(cellFactory.call(null));
        cWeek.setCellFactory(cellFactory);

        cEmployee = new ComboBox();
        cEmployee.setPrefWidth(170);
        cEmployee.setDisable(true);

        cRoom = new ComboBox();
        cRoom.setPrefWidth(170);
        cRoom.setDisable(true);

    }

    private void initButtons() {

        addShifts = new PopupMenuButton("Tilfj vagter");
        addShifts.setOnAction(e -> {
            ArrayList<TimeInvestment> shifts = new ArrayList<>();
            //Henter datoerne p de valgte ugedage, hvor hvert index passer til en ugedag
            //s mandag er index 0 osv. Hvis ugedagen ikke er valgt er indexet null.
            int weekCounter = 0;

            //Initialisere start slut time og minutvrdierne med ikke legitime tal 
            int startHH = -1;
            int startMM = -1;
            int endHH = -1;
            int endMM = -1;

            //Tjekker om der er skrevet tekst i de fire tekstfields der skal indeholde 
            //time og minutvrdi.
            String inputErrorMessage = "Der kan kun indtastes tal i de 4 felter";
            try {
                startHH = Integer.parseInt(tStartHH.getText());
                startMM = Integer.parseInt(tStartMM.getText());
                endHH = Integer.parseInt(tEndHH.getText());
                endMM = Integer.parseInt(tEndMM.getText());
            } catch (NumberFormatException ex) {
                exceptionPopup.display(inputErrorMessage);
            }

            String wrongHourSize = "Der kan kun indtastes et validt timetal";
            String wrongMinSize = "Der kan kun indtastes et validt Minuttal";

            if (cWeek.getSelectionModel().getSelectedItem() == null) {
                exceptionPopup.display("Vlg en uge");
            } else if (cEmployee.getSelectionModel().getSelectedItem() == null) {
                exceptionPopup.display("Vlg en ansat");
            } else if (cRoom.getSelectionModel().getSelectedItem() == null) {
                exceptionPopup.display("Vlg et Rum");
            } else if (!monday.isSelected() && !tuesday.isSelected() && !wednesday.isSelected()
                    && !thursday.isSelected() && !friday.isSelected() && !saturday.isSelected()
                    && !sunday.isSelected()) {
                exceptionPopup.display("Vlg mindst en dag p ugen");

            } else if (startHH < 0 || startHH >= 24 || endHH < 0 || endHH >= 24) {
                exceptionPopup.display(wrongHourSize);
            } else if (startMM < 0 || startMM >= 60 || endMM < 0 || endMM >= 60) {
                exceptionPopup.display(wrongMinSize);
            } else {

                ArrayList<LocalDate> chosenDays = getCheckBoxLocalDate();
                ArrayList<LocalDateTime> chosenDaysNTime = new ArrayList<>();

                Hours hours = null;
                try {
                    hours = getEndLocalHours();
                } catch (Exception ex) {
                    System.out.println(ex.getMessage());
                }

                Minutes minutes = null;
                try {
                    minutes = getEndLocalMinutes();
                } catch (Exception ex) {
                    System.out.println(ex.getMessage());

                }

                LocalTime startTime = null;
                try {
                    startTime = getStartLocalTime();
                } catch (Exception ex) {
                    System.out.println(ex.getMessage());

                }

                if (hours != null || minutes != null || startTime != null) {

                    Employee employee = (Employee) cEmployee.getValue();
                    Room room = (Room) cRoom.getValue();

                    for (LocalDate chosenDay : chosenDays) {
                        if (chosenDay != null) {
                            //Her omdannes alle LocalDates til LocalDateTimes og indsttes i chosenDaysNTime arrayet
                            LocalDateTime dateToDateTime = chosenDay.toLocalDateTime(startTime);
                            chosenDaysNTime.add(dateToDateTime);
                        }
                    }

                    if (!chosenDaysNTime.isEmpty()) {
                        for (LocalDateTime chosenDaysNTime1 : chosenDaysNTime) {
                            TimeInvestment tm = new TimeInvestment(hours, minutes, chosenDaysNTime1, employee,
                                    room);
                            shifts.add(tm);
                        }
                    }

                    //TimeInvestmenthandler skal indstte dem i databasen.
                    try {
                        Xray.getInstance().getTimeInvestmentControl().addTimeInvestments(shifts);
                    } catch (DatabaseException ex) {
                        System.out.println(ex.getMessage());
                    }
                } else {
                    exceptionPopup.display("Tidsperioden for vagten kunne ikke kalkuleres, "
                            + "kontakt venligst systemadministratoren");
                }
            }
        });

        dayShift = new ImageButton("pictures/morgen 60.png", "pictures/morgen 60 dark.png");
        dayShift.setOnAction(e -> {
            eveningShift.setUnPressed();
            nightShift.setUnPressed();

            tStartHH.setText("7");
            tStartMM.setText("30");
            tEndHH.setText("15");
            tEndMM.setText("15");
        });

        eveningShift = new ImageButton("pictures/aften 60.png", "pictures/aften 60 dark.png");
        eveningShift.setOnAction(e -> {
            dayShift.setUnPressed();
            nightShift.setUnPressed();

            tStartHH.setText("15");
            tStartMM.setText("15");
            tEndHH.setText("23");
            tEndMM.setText("30");
        });

        nightShift = new ImageButton("pictures/nat 60.png", "pictures/nat 60 dark.png");
        nightShift.setOnAction(e -> {
            dayShift.setUnPressed();
            eveningShift.setUnPressed();

            tStartHH.setText("23");
            tStartMM.setText("30");
            tEndHH.setText("7");
            tEndMM.setText("30");
        });

    }

    private void setup() {
        super.addToCenter(contentPane);

        endHourMinutePicker.getChildren().addAll(tEndHH, tEndMM);
        startHourMinutePicker.getChildren().addAll(tStartHH, tStartMM);
        endTimePicker.getChildren().addAll(lEnd, endHourMinutePicker);
        startTimePicker.getChildren().addAll(lStart, startHourMinutePicker);
        startEndTimePicker.getChildren().addAll(startTimePicker, endTimePicker);
        weekDayPicker.getChildren().addAll(monday, tuesday, wednesday, thursday, friday, saturday, sunday);
        shiftTypePicker.getChildren().addAll(dayShift, eveningShift, nightShift);
        roomPicker.getChildren().addAll(lRoom, cRoom);
        employeePicker.getChildren().addAll(lEmployee, cEmployee);
        weekPicker.getChildren().addAll(lWeek, cWeek);
        contentPane.getChildren().addAll(weekPicker, employeePicker, roomPicker, shiftTypePicker, weekDayPicker,
                startEndTimePicker);

        super.getBottomHBox().getChildren().add(0, addShifts);

    }

    private void initLabels() {
        lWeek = new Label("Vlg uge");
        lWeek.setPrefWidth(85);
        lEmployee = new Label("Vlg ansat");
        lEmployee.setPrefWidth(85);
        lRoom = new Label("Vlg rum");
        lRoom.setPrefWidth(85);

        lStart = new Label("Start");
        lStart.setPrefWidth(85);
        lEnd = new Label("Slut");
        lEnd.setPrefWidth(85);
    }

    private void initChangeListeners() {
        cWeek.valueProperty().addListener(new ChangeListener<LocalDateTime>() {

            @Override
            public void changed(ObservableValue observable, LocalDateTime oldValue, LocalDateTime newValue) {
                if (newValue != null) {

                    try {
                        //Indst alle ansatte i comboboxen
                        ArrayList<Employee> employees;

                        //Fejlhndter exceptions og giv ordentlige fejlbeskeder.
                        employees = Xray.getInstance().getPersonControl().getEmployees();

                        //Hver employee tilfjes til comboboksen
                        for (Employee employee : employees) {
                            cEmployee.getItems().add(employee);
                        }
                    } catch (DatabaseException ex) {
                        //                        String error = "Der kunne ikke hentes ansatte ind i drop-ned menuen"
                        //                                + " kontakt venligst systemadministrator.";
                        exceptionPopup.display(ex.getMessage());
                    }
                    //                        catch (ClassNotFoundException ex) {
                    //                        String error = "Der kunne ikke oprettes forbindelse til databasen, kontakt venligst"
                    //                                + "din systemadministrator.";
                    //                        exceptionPopup.display(error);
                    //                    }
                    //Nr man har valgt en dato skal comboboksen med ansatte komme frem
                    cEmployee.setDisable(false);
                }
            }

        });

        if (cEmployee != null) {
            cEmployee.valueProperty().addListener(new ChangeListener<Employee>() {

                @Override
                public void changed(ObservableValue observable, Employee oldValue, Employee newValue) {
                    if (newValue != null) {
                        //Hent rum
                        try {
                            //Indst alle rum i comboboxen
                            ArrayList<Room> rooms;

                            //Fejlhndter exceptions og giv ordentlige fejlbeskeder.
                            rooms = Xray.getInstance().getRoomControl().getRooms();

                            //Hver room tilfjes til comboboksen
                            for (Room room : rooms) {
                                cRoom.getItems().add(room);
                            }
                        } catch (DatabaseException ex) {
                            //                            String error = "Der kunne ikke hentes rum ind i drop-ned menuen"
                            //                                    + " kontakt venligst systemadministrator.";
                            exceptionPopup.display(ex.getMessage());
                        }
                        //                        catch (ClassNotFoundException ex) {
                        //                            String error = "Der kunne ikke oprettes forbindelse til databasen, kontakt venligst"
                        //                                    + "din systemadministrator.";
                        //                            exceptionPopup.display(error);
                        //                        }
                        //Nr man har valgt en dato skal comboboksen med ansatte komme frem
                        cRoom.setDisable(false);
                    }
                }
            });
        }
    }

    private void initCheckboxes() {
        monday = new CheckBox("Mandag");
        tuesday = new CheckBox("Tirsdag");
        wednesday = new CheckBox("Onsdag");
        thursday = new CheckBox("Torsdag");
        friday = new CheckBox("Fredag");
        saturday = new CheckBox("Lrdag");
        sunday = new CheckBox("Sndag");
    }

    public LocalTime getStartLocalTime() throws Exception {
        String inputErrorMessage = "Der kan kun indtastes tal i de 4 felter";
        LocalTime startTime = null;

        int startHH = Integer.parseInt(tStartHH.getText());
        int startMM = Integer.parseInt(tStartMM.getText());

        startTime = new LocalTime(startHH, startMM, 0);

        return startTime;
    }

    public Hours getEndLocalHours() throws Exception {
        String inputErrorMessage = "Der kan kun indtastes tal i de 4 felter";

        Hours startToEnd;
        LocalTime endTime = null;
        LocalTime startTime = getStartLocalTime();

        int endHH = Integer.parseInt(tEndHH.getText());
        int endMM = Integer.parseInt(tEndMM.getText());

        endTime = new LocalTime(endHH, endMM, 0);

        startToEnd = Hours.hoursBetween(startTime, endTime);

        return startToEnd;
    }

    public Minutes getEndLocalMinutes() throws Exception {
        String inputErrorMessage = "Der kan kun indtastes tal i de 4 felter";

        Minutes startToEnd;
        LocalTime endTime = null;
        LocalTime startTime = getStartLocalTime();

        int endHH = Integer.parseInt(tEndHH.getText());
        int endMM = Integer.parseInt(tEndMM.getText());

        endTime = new LocalTime(endHH, endMM, 0);

        //samlede minutter fra start til slut
        startToEnd = Minutes.minutesBetween(startTime, endTime);
        //Da vi allerede fr timer fra getEndLocalHours, s har vi kun brug for
        //det ekstra minutantal der er i en time. Ellers fr vi det samlede minutantal
        //for hele vagten. Vi har kun brug for dem der gr ud over timerne. 
        //Alts minuser vi det samlede minuttantal med det afrundede timeantal for at f "addedMinutes"
        Minutes addedMinutes = startToEnd.minus(getEndLocalHours().toStandardMinutes());

        return addedMinutes;
    }

    public ArrayList<LocalDate> getCheckBoxLocalDate() {
        ArrayList<LocalDate> chosenDays = new ArrayList<>();
        LocalDateTime dateTimeMon = (LocalDateTime) cWeek.getSelectionModel().getSelectedItem();

        //Checker om checkboxene er checkede, henter dato udfra den valgte mandag
        //i cWeek og ndre det til LocalDate s der senere kan sttes LocalTime
        if (monday.isSelected()) {
            LocalDate mon = dateTimeMon.toLocalDate();
            chosenDays.add(0, mon);
        } else if (!monday.isSelected()) {
            LocalDate mon = null;
            chosenDays.add(0, mon);
        }

        if (tuesday.isSelected()) {
            LocalDate mon = dateTimeMon.toLocalDate();
            chosenDays.add(1, mon.plusDays(1));
        } else if (!tuesday.isSelected()) {
            LocalDate mon = null;
            chosenDays.add(1, mon);
        }

        if (wednesday.isSelected()) {
            LocalDate mon = dateTimeMon.toLocalDate();
            chosenDays.add(2, mon.plusDays(2));
        } else if (!wednesday.isSelected()) {
            LocalDate mon = null;
            chosenDays.add(2, mon);
        }

        if (thursday.isSelected()) {
            LocalDate mon = dateTimeMon.toLocalDate();
            chosenDays.add(3, mon.plusDays(3));
        } else if (!thursday.isSelected()) {
            LocalDate mon = null;
            chosenDays.add(3, mon);
        }

        if (friday.isSelected()) {
            LocalDate mon = dateTimeMon.toLocalDate();
            chosenDays.add(4, mon.plusDays(4));
        } else if (!friday.isSelected()) {
            LocalDate mon = null;
            chosenDays.add(4, mon);
        }

        if (saturday.isSelected()) {
            LocalDate mon = dateTimeMon.toLocalDate();
            chosenDays.add(5, mon.plusDays(5));
        } else if (!saturday.isSelected()) {
            LocalDate mon = null;
            chosenDays.add(5, mon);
        }

        if (sunday.isSelected()) {
            LocalDate mon = dateTimeMon.toLocalDate();
            chosenDays.add(6, mon.plusDays(6));
            System.out.println(mon + "" + mon.plusDays(6) + "Whatethef");
        } else if (!sunday.isSelected()) {
            LocalDate mon = null;
            chosenDays.add(6, mon);
        }

        return chosenDays;
    }

    public ArrayList<LocalDateTime> getTwelveMondays() {
        ArrayList<LocalDateTime> mondays = new ArrayList<>();
        LocalDateTime monday;

        //Denne her uges mandag
        LocalDateTime thisMonday = today.withDayOfWeek(DateTimeConstants.MONDAY);

        //Starter monday p denne her uges mandag
        monday = thisMonday;

        //En lkke der tller alle mandage op 12 uger frem og stter dem i arrayListen
        for (int i = 0; i < 13; i++) {
            mondays.add(monday);

            if (monday.isBefore(twelveWeeks)) {
                monday = thisMonday.plusWeeks(i);

                System.out.println(monday);
            }
        }

        return mondays;
    }

    private void initTextFields() {
        tStartHH = new TextField("HH");
        tStartHH.setPrefWidth(50);

        tStartMM = new TextField("MM");
        tStartMM.setPrefWidth(50);

        tEndHH = new TextField("HH");
        tEndHH.setPrefWidth(50);

        tEndMM = new TextField("MM");
        tEndMM.setPrefWidth(50);

    }

}