package library.assistant.ui.listbook; import java.io.IOException; import java.net.URL; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; import javafx.beans.property.SimpleStringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.ButtonType; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.StackPane; import javafx.stage.Stage; import javafx.stage.StageStyle; import library.assistant.alert.AlertMaker; import library.assistant.database.DatabaseHandler; import library.assistant.ui.addbook.BookAddController; import library.assistant.ui.main.MainController; import library.assistant.util.LibraryAssistantUtil; public class BookListController implements Initializable { ObservableList<Book> list = FXCollections.observableArrayList(); @FXML private StackPane rootPane; @FXML private TableView<Book> tableView; @FXML private TableColumn<Book, String> titleCol; @FXML private TableColumn<Book, String> idCol; @FXML private TableColumn<Book, String> authorCol; @FXML private TableColumn<Book, String> publisherCol; @FXML private TableColumn<Book, Boolean> availabilityCol; @FXML private AnchorPane contentPane; @Override public void initialize(URL url, ResourceBundle rb) { initCol(); loadData(); } private Stage getStage() { return (Stage) tableView.getScene().getWindow(); } private void initCol() { titleCol.setCellValueFactory(new PropertyValueFactory<>("title")); idCol.setCellValueFactory(new PropertyValueFactory<>("id")); authorCol.setCellValueFactory(new PropertyValueFactory<>("author")); publisherCol.setCellValueFactory(new PropertyValueFactory<>("publisher")); availabilityCol.setCellValueFactory(new PropertyValueFactory<>("availabilty")); } private void loadData() { list.clear(); DatabaseHandler handler = DatabaseHandler.getInstance(); String qu = "SELECT * FROM BOOK"; ResultSet rs = handler.execQuery(qu); try { while (rs.next()) { String titlex = rs.getString("title"); String author = rs.getString("author"); String id = rs.getString("id"); String publisher = rs.getString("publisher"); Boolean avail = rs.getBoolean("isAvail"); list.add(new Book(titlex, id, author, publisher, avail)); } } catch (SQLException ex) { Logger.getLogger(BookAddController.class.getName()).log(Level.SEVERE, null, ex); } tableView.setItems(list); } @FXML private void handleBookDeleteOption(ActionEvent event) { //Fetch the selected row Book selectedForDeletion = tableView.getSelectionModel().getSelectedItem(); if (selectedForDeletion == null) { AlertMaker.showErrorMessage("No book selected", "Please select a book for deletion."); return; } if (DatabaseHandler.getInstance().isBookAlreadyIssued(selectedForDeletion)) { AlertMaker.showErrorMessage("Cant be deleted", "This book is already issued and cant be deleted."); return; } Alert alert = new Alert(Alert.AlertType.CONFIRMATION); alert.setTitle("Deleting book"); alert.setContentText("Are you sure want to delete the book " + selectedForDeletion.getTitle() + " ?"); Optional<ButtonType> answer = alert.showAndWait(); if (answer.get() == ButtonType.OK) { Boolean result = DatabaseHandler.getInstance().deleteBook(selectedForDeletion); if (result) { AlertMaker.showSimpleAlert("Book deleted", selectedForDeletion.getTitle() + " was deleted successfully."); list.remove(selectedForDeletion); } else { AlertMaker.showSimpleAlert("Failed", selectedForDeletion.getTitle() + " could not be deleted"); } } else { AlertMaker.showSimpleAlert("Deletion cancelled", "Deletion process cancelled"); } } @FXML private void handleBookEditOption(ActionEvent event) { //Fetch the selected row Book selectedForEdit = tableView.getSelectionModel().getSelectedItem(); if (selectedForEdit == null) { AlertMaker.showErrorMessage("No book selected", "Please select a book for edit."); return; } try { FXMLLoader loader = new FXMLLoader(getClass().getResource("/library/assistant/ui/addbook/add_book.fxml")); Parent parent = loader.load(); BookAddController controller = (BookAddController) loader.getController(); controller.inflateUI(selectedForEdit); Stage stage = new Stage(StageStyle.DECORATED); stage.setTitle("Edit Book"); stage.setScene(new Scene(parent)); stage.show(); LibraryAssistantUtil.setStageIcon(stage); stage.setOnHiding((e) -> { handleRefresh(new ActionEvent()); }); } catch (IOException ex) { Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex); } } @FXML private void handleRefresh(ActionEvent event) { loadData(); } @FXML private void exportAsPDF(ActionEvent event) { List<List> printData = new ArrayList<>(); String[] headers = {" Title ", "ID", " Author ", " Publisher ", "Avail"}; printData.add(Arrays.asList(headers)); for (Book book : list) { List<String> row = new ArrayList<>(); row.add(book.getTitle()); row.add(book.getId()); row.add(book.getAuthor()); row.add(book.getPublisher()); row.add(book.getAvailabilty()); printData.add(row); } LibraryAssistantUtil.initPDFExprot(rootPane, contentPane, getStage(), printData); } @FXML private void closeStage(ActionEvent event) { getStage().close(); } public static class Book { private final SimpleStringProperty title; private final SimpleStringProperty id; private final SimpleStringProperty author; private final SimpleStringProperty publisher; private final SimpleStringProperty availabilty; public Book(String title, String id, String author, String pub, Boolean avail) { this.title = new SimpleStringProperty(title); this.id = new SimpleStringProperty(id); this.author = new SimpleStringProperty(author); this.publisher = new SimpleStringProperty(pub); if (avail) { this.availabilty = new SimpleStringProperty("Available"); } else { this.availabilty = new SimpleStringProperty("Issued"); } } public String getTitle() { return title.get(); } public String getId() { return id.get(); } public String getAuthor() { return author.get(); } public String getPublisher() { return publisher.get(); } public String getAvailabilty() { return availabilty.get(); } } }