Skip to content
Snippets Groups Projects
WeeklyView.java 4 KiB
Newer Older
  • Learn to ignore specific revisions
  • ArktikHunter's avatar
    ArktikHunter committed
    package com.example.schedulerapp;
    
    
    import javafx.geometry.HPos;
    import javafx.geometry.Pos;
    import javafx.scene.control.Button;
    
    ArktikHunter's avatar
    ArktikHunter committed
    import javafx.scene.control.Label;
    
    import javafx.scene.layout.GridPane;
    
    ArktikHunter's avatar
    ArktikHunter committed
    
    import java.util.ArrayList;
    import java.util.Arrays;
    
    
    public class WeeklyView extends GridPane implements ModelSubscriber{
        Model model;
        ArrayList<Label> times;
        ArrayList<Label> days;
    
    ArktikHunter's avatar
    ArktikHunter committed
    
    
        public WeeklyView(){
            //list of time labels
            times = new ArrayList<>();
            for (int i = 8; i < 24; i++){
                String j = i + "00";
                String k = i + "30";
                if (i < 10) {
                    j = "0" + j;
                    k = "0" + k;
                }
                Label jLabel = new Label(j);
                Label kLabel = new Label(k);
                times.add(jLabel);
                times.add(kLabel);
            }
            for (Label label : times){
                label.setPrefHeight(20);
                //label.setStyle(" -fx-border-color: black");
            }
    
    ArktikHunter's avatar
    ArktikHunter committed
    
    
            //list of day labels
            days = new ArrayList<>();
            days.addAll(Arrays.asList(new Label("Sunday"), new Label("Monday"), new Label("Tuesday"),
                    new Label("Wednesday"), new Label("Thursday"), new Label("Friday"), new Label("Saturday")));
    
    ArktikHunter's avatar
    ArktikHunter committed
    
    
            for (Label label : days){
                GridPane.setHalignment(label, HPos.CENTER);
                label.setAlignment(Pos.CENTER);
                label.setPrefWidth(80);
                //label.setStyle(" -fx-border-color: black");
            }
        }
    
    ArktikHunter's avatar
    ArktikHunter committed
    
    
        public void setModel(Model newModel) {
            this.model = newModel;
            //now can draw for first time
            draw();
        }
    
    ArktikHunter's avatar
    ArktikHunter committed
    
    
        @Override
        public void modelChanged() {
            draw();
        }
    
        public void draw(){
            //clear
            this.getChildren().clear();
    
            //add to gridpane - time axis never changes
            int i = 1;
            for (Label time : times){
                this.add(time, 0, i);
                i++;
            }
    
            //add to gridpane - day axis never changes
            i = 1;
            for (Label time : days){
                this.add(time, i, 0);
                i++;
            }
    
            int col;        //depends on day of week
            int row;        //depends on start time
            int length;     //depends on end time - start time
    
            //get updated schedule
            ArrayList<Shift> schedule = model.getWeeklySchedule();
    
            for (Shift shift : schedule){
                col = (shift.getStart().getDayOfWeek().getValue() % 7) + 1; //need Sunday=7 to be 1
    
                //convert from start time to offset, granularity in 30 min increments
                row = (shift.getStart().getHour() - 8 ) * 2 + 1;
                if (shift.getStart().getMinute() == 30) row++;
                //calculate length
                length = (shift.getEnd().getHour() - shift.getStart().getHour()) * 2;
                if (shift.getStart().getMinute() == 30) length--;
                if (shift.getEnd().getMinute() == 30) length++;
    
                //text formatting
                String text;
                if (shift.getStart().getHour() < 10) text = "0" + shift.getStart().getHour();
                else text = String.valueOf(shift.getStart().getHour());
                if (shift.getStart().getMinute() == 0) text += "00";
                else text += "30";      //only two options for minutes
                text += "\n   -   \n";
                if (shift.getEnd().getHour() < 10) text += "0" + shift.getEnd().getHour();
                else text += String.valueOf(shift.getEnd().getHour());
                if (shift.getEnd().getMinute() == 0) text += "00";
                else text += "30";      //only two options for minutes
    
                Button shiftRep = new Button(text);
                shiftRep.setMaxHeight(700);                 //so it always fills its region
                shiftRep.setMaxWidth(100);
                GridPane.setFillHeight(shiftRep, true);
                GridPane.setFillWidth(shiftRep, true);
                //css styling
                //todo: different colour for current day
                shiftRep.setStyle("-fx-background-color: skyblue");
    
                this.add(shiftRep, col, row, 1, length);
            }
        }
    
    ArktikHunter's avatar
    ArktikHunter committed
    }