/* * 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 hoteldraft; import java.io.IOException; import java.net.URL; import java.sql.Date; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.util.List; import java.util.ResourceBundle; import javafx.animation.RotateTransition; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.DateCell; import javafx.scene.control.DatePicker; import javafx.scene.control.Label; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.effect.ColorAdjust; import javafx.scene.effect.Light; import javafx.scene.effect.Lighting; import javafx.scene.image.ImageView; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import static javafx.scene.paint.Color.rgb; import javafx.scene.text.Text; import javafx.stage.Stage; import javafx.util.Callback; import javafx.util.Duration; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; /** * * @author Hala */ public class NewReservationController implements Initializable { private double xOffSet = 0; private double yOffSet = 0; private Stage stage; private Scene scene; private Parent root; @FXML private Button submitBtn; @FXML private TextField ID; @FXML private TextField firstNameTextfield; @FXML private TextField LastNameTextfield; @FXML private TextField emailTextfield; @FXML private ComboBox<String> roomTypeCB; @FXML private Button decrementGuest; @FXML private TextField guestCount; @FXML private Button incrementGuest; @FXML private Text NoOfGuestsAlert; @FXML private DatePicker arrivalDate; @FXML private DatePicker departureDate; @FXML private TextArea specialRequests; @FXML private ComboBox<Integer> roomNumCb; @FXML private Label exit; @FXML private Label minimize; @FXML private ImageView settingsImg; @FXML private Button settingsImgBtn; @FXML private Text fieldsAlert; @Override public void initialize(URL location, ResourceBundle resources) { //retrieve from DB //Initilize combobox items Session session = HibernateUtil.getSessionFactory().openSession(); Query q = session.createQuery("from Rooms"); List<Rooms> RList = q.list(); session.close(); for (Rooms R : RList) { if (!roomTypeCB.getItems().contains(R.getRoomType())) { roomTypeCB.getItems().add(R.getRoomType()); } } //To make guestcount uneditable guestCount.setEditable(false); //to make special requests, textarea limited without scrollbar specialRequests.setWrapText(true); //initialize and make disabled roomNumCb.setDisable(true); //for disabling date before now final Callback<DatePicker, DateCell> dayCellFactory = new Callback<DatePicker, DateCell>() { @Override public DateCell call(final DatePicker datePicker) { return new DateCell() { @Override public void updateItem(LocalDate item, boolean empty) { super.updateItem(item, empty); if (item.isBefore(LocalDate.now())) { setDisable(true); setStyle("-fx-background-color: #b4d0e2;"); } } }; } }; arrivalDate.setDayCellFactory(dayCellFactory); //disable departure date until the arrival date is chosen departureDate.setDisable(true); //Listener to not allow chars ID.textProperty().addListener(new ChangeListener<String>() { public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { if (!newValue.matches("\\d*")) { ID.setText(newValue.replaceAll("[^\\d]", "")); } } }); //Listener to limit textfield to 20 letters length firstNameTextfield.textProperty().addListener(new ChangeListener<String>() { @Override public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) { if (firstNameTextfield.getText().length() > 20) { String s = firstNameTextfield.getText().substring(0, 20); firstNameTextfield.setText(s); } } }); //Listener to limit textfield to 20 letters length LastNameTextfield.textProperty().addListener(new ChangeListener<String>() { @Override public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) { if (LastNameTextfield.getText().length() > 20) { String s = LastNameTextfield.getText().substring(0, 20); LastNameTextfield.setText(s); } } }); //Listener to limit textfield to 30 letters length emailTextfield.textProperty().addListener(new ChangeListener<String>() { @Override public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) { if (emailTextfield.getText().length() > 30) { String s = emailTextfield.getText().substring(0, 30); emailTextfield.setText(s); } } }); //to change settings imageview color Lighting lighting = new Lighting(new Light.Distant(45, 90, rgb(105, 152, 171))); ColorAdjust bright = new ColorAdjust(0, 1, 1, 1); lighting.setContentInput(bright); lighting.setSurfaceScale(0.0); settingsImg.setEffect(lighting); // to rotate settings button on hover RotateTransition rotation = new RotateTransition(Duration.seconds(0.5), settingsImgBtn); rotation.setCycleCount(1); rotation.setByAngle(180); settingsImgBtn.setOnMouseEntered(e -> rotation.play()); settingsImgBtn.setOnMouseExited(e -> rotation.pause()); } //To assign room Number that is attatched to the room type @FXML private void RTCBtoRN(ActionEvent event) { Session session = HibernateUtil.getSessionFactory().openSession(); Query q = session.createQuery("from Rooms"); List<Rooms> RList = q.list(); session.close(); if (roomTypeCB.getValue().equals("Single")) { roomNumCb.getItems().clear(); for (Rooms R : RList) { if (R.getRoomType().equals("Single")) { roomNumCb.getItems().add(R.getRoomNum()); } } } else if (roomTypeCB.getValue().equals("Twin")) { roomNumCb.getItems().clear(); for (Rooms R : RList) { if (R.getRoomType().equals("Twin")) { roomNumCb.getItems().add(R.getRoomNum()); } } } else if (roomTypeCB.getValue().equals("Queen")) { roomNumCb.getItems().clear(); for (Rooms R : RList) { if (R.getRoomType().equals("Queen")) { roomNumCb.getItems().add(R.getRoomNum()); } } } else if (roomTypeCB.getValue().equals("King")) { roomNumCb.getItems().clear(); for (Rooms R : RList) { if (R.getRoomType().equals("King")) { roomNumCb.getItems().add(R.getRoomNum()); } } } else if (roomTypeCB.getValue().equals("Suite")) { roomNumCb.getItems().clear(); for (Rooms R : RList) { if (R.getRoomType().equals("Suite")) { roomNumCb.getItems().add(R.getRoomNum()); } } } else if (roomTypeCB.getValue().equals("Mini Suite")) { roomNumCb.getItems().clear(); for (Rooms R : RList) { if (R.getRoomType().equals("Mini Suite")) { roomNumCb.getItems().add(R.getRoomNum()); } } } roomNumCb.setDisable(false); } //To decrement count on guestcount textfield @FXML private void decrementGuest(ActionEvent event) { if (Integer.parseInt(guestCount.getText()) > 1) { int decrement = Integer.parseInt(guestCount.getText()) - 1; guestCount.setText(Integer.toString(decrement)); NoOfGuestsAlert.setText(""); } else if (Integer.parseInt(guestCount.getText()) == 1) { NoOfGuestsAlert.setText("1 MINIMUM"); } } //To increment count on guestcount textfield @FXML private void incrementGuest(ActionEvent event) { if (Integer.parseInt(guestCount.getText()) < 10) { int increment = Integer.parseInt(guestCount.getText()) + 1; guestCount.setText(Integer.toString(increment)); NoOfGuestsAlert.setText(""); } else if (Integer.parseInt(guestCount.getText()) == 10) { NoOfGuestsAlert.setText("10 MAXIMUM"); } } //Change the start of the departure date until after the arrival date by 1 day @FXML private void arrivalDateVaild(ActionEvent event) { departureDate.setDisable(false); final Callback<DatePicker, DateCell> dayCellFactory = new Callback<DatePicker, DateCell>() { @Override public DateCell call(final DatePicker datePicker) { return new DateCell() { @Override public void updateItem(LocalDate item, boolean empty) { super.updateItem(item, empty); if (item.isBefore(arrivalDate.getValue().plusDays(1))) { setDisable(true); setStyle("-fx-background-color: #b4d0e2;"); } } }; } }; departureDate.setDayCellFactory(dayCellFactory); } //Submitting @FXML private void submit(ActionEvent event) throws IOException { boolean validateFillAllFields = ((ID.getText().isEmpty()) || roomNumCb.getSelectionModel().isEmpty()) || (firstNameTextfield.getText().isEmpty()) || (LastNameTextfield.getText().isEmpty()) || (emailTextfield.getText().isEmpty()) || (roomTypeCB.getSelectionModel().isEmpty()) || (guestCount.getText().isEmpty()) || (arrivalDate.getValue() == null) || (departureDate.getValue() == null); List<Reservation> RList = null; Session session2 = HibernateUtil.getSessionFactory().openSession(); Query q = session2.createQuery("from Reservation"); RList = q.list(); session2.close(); for (Reservation R : RList) { if (Integer.parseInt(ID.getText()) == R.getID()) { fieldsAlert.setText("you're already has reservation"); return; } else if (R.getRoomNo() == roomNumCb.getValue()) { if (R.getArrivalDate().before(Date.valueOf(arrivalDate.getValue())) || R.getDepartureDate().after(Date.valueOf(departureDate.getValue()))) { fieldsAlert.setText("not available"); return; } else if (R.getArrivalDate().equals(Date.valueOf(arrivalDate.getValue()))) { fieldsAlert.setText("not available"); return; } } } if (validateFillAllFields == true) { fieldsAlert.setText("*Please fill all required fields"); } else { int id = Integer.parseInt(ID.getText()); String fn = firstNameTextfield.getText(); String ln = LastNameTextfield.getText(); String em = emailTextfield.getText(); String rt = roomTypeCB.getValue(); int rn = roomNumCb.getValue(); int gc = Integer.valueOf(guestCount.getText()); Date ad = Date.valueOf(arrivalDate.getValue()); Date dd = Date.valueOf(departureDate.getValue()); String sr = specialRequests.getText(); if (specialRequests.getText().isEmpty()) { sr = "none"; } Reservation R = new Reservation(id, fn, ln, em, rt, rn, gc, ad, dd, sr); Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); session.save(R); tx.commit(); session.close(); Parent root = FXMLLoader.load(getClass().getResource("Reservations.fxml")); root.setOnMousePressed((e) -> { xOffSet = e.getSceneX(); yOffSet = e.getSceneY(); }); root.setOnMouseDragged((e) -> { stage.setX(e.getScreenX() - xOffSet); stage.setY(e.getScreenY() - yOffSet); }); stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); scene = new Scene(root, Color.TRANSPARENT); stage.setScene(scene); stage.show(); } } //Methods to close and minimize window. @FXML private void close_app(javafx.scene.input.MouseEvent event) { System.exit(0); } @FXML private void minimize_app(javafx.scene.input.MouseEvent event) { stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); stage.setIconified(true); } /*---------------------class switching events---------------------*/ @FXML public void switchToReservations(ActionEvent e) throws IOException { Parent root = FXMLLoader.load(getClass().getResource("Reservations.fxml")); root.setOnMousePressed((event) -> { xOffSet = event.getSceneX(); yOffSet = event.getSceneY(); }); root.setOnMouseDragged((event) -> { stage.setX(event.getScreenX() - xOffSet); stage.setY(event.getScreenY() - yOffSet); }); stage = (Stage) ((Node) e.getSource()).getScene().getWindow(); scene = new Scene(root, Color.TRANSPARENT); stage.setScene(scene); stage.show(); } public void switchToNewReservation(ActionEvent e) throws IOException { Parent root = FXMLLoader.load(getClass().getResource("NewReservation.fxml")); root.setOnMousePressed((event) -> { xOffSet = event.getSceneX(); yOffSet = event.getSceneY(); }); root.setOnMouseDragged((event) -> { stage.setX(event.getScreenX() - xOffSet); stage.setY(event.getScreenY() - yOffSet); }); stage = (Stage) ((Node) e.getSource()).getScene().getWindow(); scene = new Scene(root, Color.TRANSPARENT); stage.setScene(scene); stage.show(); } @FXML public void switchToLoggedIn(ActionEvent e) throws IOException { Parent root = FXMLLoader.load(getClass().getResource("LoggedIn.fxml")); root.setOnMousePressed((event) -> { xOffSet = event.getSceneX(); yOffSet = event.getSceneY(); }); root.setOnMouseDragged((event) -> { stage.setX(event.getScreenX() - xOffSet); stage.setY(event.getScreenY() - yOffSet); }); stage = (Stage) ((Node) e.getSource()).getScene().getWindow(); scene = new Scene(root, Color.TRANSPARENT); stage.setScene(scene); stage.show(); } @FXML public void switchToRooms(ActionEvent e) throws IOException { Parent root = FXMLLoader.load(getClass().getResource("Rooms.fxml")); root.setOnMousePressed((event) -> { xOffSet = event.getSceneX(); yOffSet = event.getSceneY(); }); root.setOnMouseDragged((event) -> { stage.setX(event.getScreenX() - xOffSet); stage.setY(event.getScreenY() - yOffSet); }); stage = (Stage) ((Node) e.getSource()).getScene().getWindow(); scene = new Scene(root, Color.TRANSPARENT); stage.setScene(scene); stage.show(); } @FXML public void switchToServices(ActionEvent e) throws IOException { Parent root = FXMLLoader.load(getClass().getResource("Services.fxml")); root.setOnMousePressed((event) -> { xOffSet = event.getSceneX(); yOffSet = event.getSceneY(); }); root.setOnMouseDragged((event) -> { stage.setX(event.getScreenX() - xOffSet); stage.setY(event.getScreenY() - yOffSet); }); stage = (Stage) ((Node) e.getSource()).getScene().getWindow(); scene = new Scene(root, Color.TRANSPARENT); stage.setScene(scene); stage.show(); } @FXML public void switchToSearch(ActionEvent e) throws IOException { Parent root = FXMLLoader.load(getClass().getResource("Search.fxml")); root.setOnMousePressed((event) -> { xOffSet = event.getSceneX(); yOffSet = event.getSceneY(); }); root.setOnMouseDragged((event) -> { stage.setX(event.getScreenX() - xOffSet); stage.setY(event.getScreenY() - yOffSet); }); stage = (Stage) ((Node) e.getSource()).getScene().getWindow(); scene = new Scene(root, Color.TRANSPARENT); stage.setScene(scene); stage.show(); } @FXML public void switchToSettings(ActionEvent e) throws IOException { Parent root = FXMLLoader.load(getClass().getResource("Settings.fxml")); root.setOnMousePressed((event) -> { xOffSet = event.getSceneX(); yOffSet = event.getSceneY(); }); root.setOnMouseDragged((event) -> { stage.setX(event.getScreenX() - xOffSet); stage.setY(event.getScreenY() - yOffSet); }); stage = (Stage) ((Node) e.getSource()).getScene().getWindow(); scene = new Scene(root, Color.TRANSPARENT); stage.setScene(scene); stage.show(); } }