package com.example.schedulerapp; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.scene.Node; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.VBox; import javafx.stage.Popup; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; public class ScheduleView extends ScrollPane implements ModelSubscriber{ Model model; ArrayList<Label> times; Popup dropShift; DateTimeFormatter dateFormatView; DateTimeFormatter timeFormat; GridPane contents; // must be implemented by the child class public void draw(){} public ScheduleView(){ contents = new GridPane(); this.setContent(contents); //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(18); //label.setStyle(" -fx-border-color: black"); } dateFormatView = DateTimeFormatter.ofPattern("MMM dd, yyyy"); timeFormat = DateTimeFormatter.ofPattern("kk:mm"); } public void setModel(Model newModel) { this.model = newModel; //now can draw for first time Timer drawTimer = new Timer(true); drawTimer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { Platform.runLater(() -> { draw(); }); } }, 1000, 1000); } public void drawPopUp(Shift shift){ dropShift = new Popup(); dropShift.setHeight(300); dropShift.setWidth(300); VBox details = new VBox(); details.setStyle("-fx-background-color: papayawhip; -fx-border-color: black"); details.setPadding(new Insets(20)); details.setSpacing(20); Label name = new Label("Name: " + model.getEmployeeByID(shift.getEmployeeID())); Label position = new Label("Position: " + shift.getPosition()); Label date = new Label("Date: " + shift.getStart().format(dateFormatView)); Label start = new Label("Start: " + shift.getStart().format(timeFormat)); Label end = new Label("End: " + shift.getEnd().format(timeFormat)); GridPane buttons = new GridPane(); buttons.setHgap(10); buttons.setVgap(10); //Buttons Button cancel = new Button("Cancel"); cancel.setCancelButton(true); cancel.setOnAction(cancelDrop); //debug Button drop = new Button("Drop Shift"); drop.setOnAction(dropShiftConfirm); //debug //Manager Buttons Button remove = new Button("Remove Shift"); remove.setOnAction(e -> removeShiftTest(shift.getShiftID())); Button edit = new Button("Edit Shift"); edit.setOnAction(editShift); buttons.add(cancel, 0, 0); if (model.getThisEmployee() == shift.getEmployeeID()){ buttons.add(drop, 1, 0); } if (model.getIsManager()) { buttons.add(edit, 0, 1); buttons.add(remove, 1, 1); } for (Node button : buttons.getChildren()){ ((Button) button).setMaxWidth(200); } details.getChildren().addAll(name, position, date, start, end, buttons); dropShift.getContent().add(details); dropShift.setAutoHide(true); } public void modelChanged() { draw(); } public String formatShiftTimeLabel(Shift shift){ String text = shift.getStart().format(timeFormat); text += "\n - \n"; text += shift.getEnd().format(timeFormat); return text; } public ShiftButton formatShiftButton(Shift shift){ ShiftButton shiftRep = new ShiftButton(formatShiftTimeLabel(shift), shift); 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 user shiftRep.setStyle("-fx-background-color: skyblue"); shiftRep.setOnAction(dropShiftPopUp); return shiftRep; } public int shiftGetRow(Shift shift){ //convert from start time to offset, granularity in 30 min increments int row = (shift.getStart().getHour() - 8 ) * 2 + 1; if (shift.getStart().getMinute() == 30) row++; return row; } public int shiftGetLength(Shift shift){ //calculate length int length = (shift.getEnd().getHour() - shift.getStart().getHour()) * 2; if (shift.getStart().getMinute() == 30) length--; if (shift.getEnd().getMinute() == 30) length++; return length; } //event handlers EventHandler<ActionEvent> dropShiftPopUp = new EventHandler<>() { @Override public void handle(ActionEvent e) { drawPopUp(((ShiftButton) e.getSource()).getShift()); dropShift.show(((Node) e.getSource()).getScene().getWindow()); } }; EventHandler<ActionEvent> dropShiftConfirm = new EventHandler<>() { @Override public void handle(ActionEvent e) { System.out.println("todo: drop shift :)"); dropShift.hide(); } }; EventHandler<ActionEvent> cancelDrop = new EventHandler<>() { @Override public void handle(ActionEvent actionEvent) { System.out.println("Shift drop cancelled."); dropShift.hide(); } }; EventHandler<ActionEvent> removeShift = new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent actionEvent) { System.out.println("todo: delete shift"); //model.removeShift(); dropShift.hide(); } }; private void removeShiftTest(int shiftID){ model.removeShift(shiftID); } EventHandler<ActionEvent> editShift = new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent actionEvent) { System.out.println("todo: edit shift"); dropShift.hide(); } }; private class DrawMe extends TimerTask { /** * The action to be performed by this timer task. */ @Override public void run() { draw(); } } }