diff --git a/src/Welsh Vocabulary Tutor/src/main/java/uk/ac/aber/cs22120/group20/javafx/PracticeListController.java b/src/Welsh Vocabulary Tutor/src/main/java/uk/ac/aber/cs22120/group20/javafx/PracticeListController.java index 535faf5..27ef770 100644 --- a/src/Welsh Vocabulary Tutor/src/main/java/uk/ac/aber/cs22120/group20/javafx/PracticeListController.java +++ b/src/Welsh Vocabulary Tutor/src/main/java/uk/ac/aber/cs22120/group20/javafx/PracticeListController.java @@ -1,5 +1,5 @@ /** - * @(#) DictionaryController.java 0,1 2020/04/07 + * @(#) PracticeListController.java 0.2 2020/04/30 *

* Copyright (c) 2020 Aberystwyth University. * All rights reserved. @@ -11,16 +11,15 @@ import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.collections.transformation.FilteredList; import javafx.collections.transformation.SortedList; -import javafx.css.converter.DurationConverter; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.paint.Color; -import javafx.stage.Stage; import uk.ac.aber.cs22120.group20.json.DictionaryEntry; import java.util.ArrayList; +import java.util.Comparator; /** * A class that handles the keyboard and mouse input and interaction for the 'Dictionary Page' which is @@ -38,207 +37,219 @@ import java.util.ArrayList; * @see DictionaryEntry * @see Application */ -public class PracticeListController extends SharedCodeController{ - public static Stage primaryStage = null; +public class PracticeListController extends SharedCodeController { - @FXML - private ImageView alphaSort; - @FXML - private ImageView langSort; - @FXML - private TextField searchBox; - @FXML - private TableView table; - @FXML - private TableColumn english = new TableColumn<>(); - @FXML - private TableColumn welsh = new TableColumn<>(); + @FXML + private ImageView alphaSort; + @FXML + private ImageView langSort; + @FXML + private TextField searchBox; + @FXML + private TableView table; + @FXML + private TableColumn english = new TableColumn<>(); + @FXML + private TableColumn welsh = new TableColumn<>(); - public ObservableList list = FXCollections.observableArrayList(); + public ObservableList list = FXCollections.observableArrayList(); - /** - * Initializes the table of dictionary entries. - *

- * An observable list of DictionaryEntries is loaded from the Application class into a local instance of ObservableList. - * It also sets up Lambda expressions related to live searching functionality and the display of DictionaryEntries. - * -// * @param url -// * @param resourceBundle - * @see Application - * @see DictionaryEntry - */ - public void initialize() { - setup(); - currentPageIcon.setImage(new Image("file:src/main/resources/assets/icons/white_icons/50px/rating-50.png")); - currentPageText.setText("Practice List"); + /** + * + */ + @FXML + private void switchLangSort() { + if (isSortedByEnglish) { + if (welsh.getSortType().equals(TableColumn.SortType.ASCENDING)) { + alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-50.png")); + } + else if (welsh.getSortType().equals(TableColumn.SortType.DESCENDING)) { + alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-reversed-50.png")); + } + table.getSortOrder().clear(); + table.getSortOrder().add(welsh); + isSortedByEnglish = false; + } + else { + if (english.getSortType().equals(TableColumn.SortType.ASCENDING)) { + alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-50.png")); + } + else if (english.getSortType().equals(TableColumn.SortType.DESCENDING)) { + alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-reversed-50.png")); + } + table.getSortOrder().clear(); + table.getSortOrder().add(english); + isSortedByEnglish = true; + } + table.sort(); + searchBox.textProperty().setValue(searchBox.textProperty().getValue() + " "); + searchBox.textProperty().setValue(searchBox.textProperty().getValue().substring(0, searchBox.textProperty().getValue().length()-1)); + searchBox.positionCaret(searchBox.textProperty().getValue().length()); + } - practiceListIcon.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/rating-50.png")); - practiceListTest.setFill(Color.BLACK); - - alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-50.png")); - langSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-lang-50.png")); - -// list.addAll(Application.dictionary); - list.addAll(Application.practiceList); -// for (DictionaryEntry entry : Application.dictionary) { -// if (entry.isPracticeWord()) -// list.add(entry); -// } + /** + * + */ + @FXML + private void switchAlphaSort() { + if (isSortedByEnglish) { + if (english.getSortType().equals(TableColumn.SortType.ASCENDING)) { + english.setSortType(TableColumn.SortType.DESCENDING); + alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-reversed-50.png")); + } else { + english.setSortType(TableColumn.SortType.ASCENDING); + alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-50.png")); + } + } else { + if (welsh.getSortType().equals(TableColumn.SortType.ASCENDING)) { + welsh.setSortType(TableColumn.SortType.DESCENDING); + alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-reversed-50.png")); + } else { + welsh.setSortType(TableColumn.SortType.ASCENDING); + alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-50.png")); + } + } + } - FilteredList filteredList = new FilteredList<>(list, p -> true); // Wrap list in a FilteredList + /** + * Initializes the table of dictionary entries. + *

+ * An observable list of DictionaryEntries is loaded from the Application class into a local instance of ObservableList. + * It also sets up Lambda expressions related to live searching functionality and the display of DictionaryEntries. + * + // * @param url + // * @param resourceBundle + * @see Application + * @see DictionaryEntry + */ + public void initialize() { + setup(); - searchBox.textProperty().addListener((observable, oldSearchTerm, newSearchTerm) -> { - filteredList.setPredicate(dictionaryEntry -> { // returns true on a filter match, false if no match - boolean result = false; + english.setComparator(new Comparator() { + @Override + public int compare(String s, String t1) { + s = s.toLowerCase(); + t1 = t1.toLowerCase(); + if (s.startsWith("to ")) { + return s.substring(3).compareTo(t1); + } + if (t1.startsWith("to ")) { + return s.compareTo(t1.substring(3)); + } + return s.compareTo(t1); + } + }); - table.refresh(); // This fixes the table highlighting issue + currentPageIcon.setImage(new Image(getClass().getResourceAsStream("/assets/icons/white_icons/50px/rating-50.png"))); + currentPageText.setText("Practice List"); - if (newSearchTerm == null || newSearchTerm.isEmpty()) { // If filter text is empty, display all dictionary entries - result = true; - } else { - // need all same case for compare. - final String lowerCaseSearchFilter = newSearchTerm.toLowerCase(); - if (dictionaryEntry.getWelsh().toLowerCase().contains(lowerCaseSearchFilter)) { - result = true; // Filter matches Welsh - } else if (dictionaryEntry.getEnglish().toLowerCase().contains(lowerCaseSearchFilter)) { - result = true; // Filter matches English -// } else if (dictionaryEntry.getWordType().toLowerCase().contains(lowerCaseSearchFilter)) { -// result = true; // Filter matches Word Type - } else if (dictionaryEntry.getWordType().equals(DictionaryEntry.wordTypeEnum.verb) && ("to " + dictionaryEntry.getEnglish()).toLowerCase().contains(lowerCaseSearchFilter)) { - result = true; // Filter matches ['to' + a word] or [a word] if word is a verb + alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-50.png")); + langSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-lang-50.png")); + + practiceListIcon.setImage(new Image(getClass().getResourceAsStream("/assets/icons/black_icons/50px/rating-50.png"))); + practiceListTest.setFill(Color.BLACK); + list.addAll(Application.practiceList); + + table.setPlaceholder(new Label("No practice words found. Please try adding a practice word from the 'Dictionary' page.")); + table.setRowFactory(tv -> { + TableRow row = new TableRow() { + @Override + protected void updateItem(DictionaryEntry dictionaryEntry, boolean b) { + super.updateItem(dictionaryEntry, b); + if (!isEmpty()) { +// if (dictionaryEntry.isPracticeWord()) { +// setStyle("-fx-background-color: gray;"); +// } else { + setStyle(" "); +// } + } } - } - return result; - }); - }); + }; + row.setOnMouseClicked(mouseEvent -> { + if (mouseEvent.getClickCount() == 1 && (!row.isEmpty())) { + if (row.getItem().isPracticeWord()) { + Application.dictionary.get(list.indexOf(row.getItem())).setPracticeWord(false); + ArrayList toRemove = new ArrayList(); + for (DictionaryEntry entry : Application.practiceList) { + if (entry.equals(row.getItem())) { + toRemove.add(entry); + } + } + Application.practiceList.removeAll(toRemove); +// row.getItem().setPracticeWord(false); + } else if (!row.getItem().isPracticeWord()) { + Application.dictionary.get(list.indexOf(row.getItem())).setPracticeWord(true); + Application.practiceList.add(row.getItem()); +// row.getItem().setPracticeWord(true); + } + table.getSelectionModel().clearSelection(); + } + }); + return row; + } + ); + welsh.setCellValueFactory(dictionaryEntryStringCellDataFeatures -> { + if (dictionaryEntryStringCellDataFeatures.getValue().getWordType().equals(DictionaryEntry.wordTypeEnum.nm)) { + return new SimpleStringProperty(dictionaryEntryStringCellDataFeatures.getValue().getWelsh() + " {nm}"); + } else if (dictionaryEntryStringCellDataFeatures.getValue().getWordType().equals(DictionaryEntry.wordTypeEnum.nf)) { + return new SimpleStringProperty(dictionaryEntryStringCellDataFeatures.getValue().getWelsh() + " {nf}"); + } else { + return new SimpleStringProperty(dictionaryEntryStringCellDataFeatures.getValue().getWelsh()); + } + }); - SortedList sortedList = new SortedList<>(filteredList); //Wrap the filtered list in a SortedList - sortedList.comparatorProperty().bind(table.comparatorProperty()); //Bind the sorted list comparator to the table comparator -// welsh.setCellValueFactory(new PropertyValueFactory("welsh")); -// english.setCellValueFactory(new PropertyValueFactory("english")); + english.setCellValueFactory(dictionaryEntryStringCellDataFeatures -> { + if (dictionaryEntryStringCellDataFeatures.getValue().getWordType().equals(DictionaryEntry.wordTypeEnum.verb)) { + return new SimpleStringProperty("to " + dictionaryEntryStringCellDataFeatures.getValue().getEnglish()); + } else { + return new SimpleStringProperty(dictionaryEntryStringCellDataFeatures.getValue().getEnglish()); + } + }); - table.setPlaceholder(new Label("No practice words found. Please try adding a practice word from the 'Dictionary' page.")); - table.setRowFactory(tv -> { - TableRow row = new TableRow() { - @Override - protected void updateItem(DictionaryEntry dictionaryEntry, boolean b) { - super.updateItem(dictionaryEntry, b); - if (!isEmpty()) { - setStyle(" "); -// if (dictionaryEntry.isPracticeWord()) { -// setStyle("-fx-background-color: gray;"); -// } else { -// setStyle(" "); -// } - } - } - }; - row.setOnMouseClicked(mouseEvent -> { - if (mouseEvent.getClickCount() == 1 && (!row.isEmpty())) { - for (DictionaryEntry entry : Application.dictionary) { - if (entry.equals(row.getItem())) { - entry.setPracticeWord(false); - list.remove(row.getItem()); - table.refresh(); - } + FilteredList filteredList = new FilteredList<>(list, p -> true); // Wrap list in a FilteredList - } + searchBox.textProperty().addListener((observable, oldSearchTerm, newSearchTerm) -> { + filteredList.setPredicate(dictionaryEntry -> { // returns true on a filter match, false if no match + boolean result = false; + table.refresh(); // This fixes the table highlighting issue - ArrayList toRemove = new ArrayList(); - for (DictionaryEntry entry : Application.practiceList) { - if (entry.equals(row.getItem())) { - toRemove.add(entry); - list.remove(row.getItem()); - } - } - Application.practiceList.removeAll(toRemove); - table.getSelectionModel().clearSelection(); - } - }); - return row; - } - ); - - welsh.setCellValueFactory(dictionaryEntryStringCellDataFeatures -> { - - if (dictionaryEntryStringCellDataFeatures.getValue().getWordType().equals(DictionaryEntry.wordTypeEnum.nm)) { - return new SimpleStringProperty(dictionaryEntryStringCellDataFeatures.getValue().getWelsh() + " {nm}"); - } else if (dictionaryEntryStringCellDataFeatures.getValue().getWordType().equals(DictionaryEntry.wordTypeEnum.nf)) { - return new SimpleStringProperty(dictionaryEntryStringCellDataFeatures.getValue().getWelsh() + " {nf}"); + if (newSearchTerm == null || newSearchTerm.isEmpty()) { // If filter text is empty, display all dictionary entries + result = true; } else { - return new SimpleStringProperty(dictionaryEntryStringCellDataFeatures.getValue().getWelsh()); + // need all same case for compare. + final String lowerCaseSearchFilter = newSearchTerm.toLowerCase(); + if (isSortedByEnglish) { + if (dictionaryEntry.getEnglish().toLowerCase().startsWith(lowerCaseSearchFilter)) { + result = true; // Filter matches English + } + else if(lowerCaseSearchFilter.startsWith("to ")){ + if (dictionaryEntry.getWordType().equals(DictionaryEntry.wordTypeEnum.verb) && ("to " + dictionaryEntry.getEnglish()).toLowerCase().startsWith(lowerCaseSearchFilter)) { + result = true; // Filter matches ['to' + a word] or [a word] if word is a verb + } + } + } + else { + if (dictionaryEntry.getWelsh().toLowerCase().startsWith(lowerCaseSearchFilter)) { + result = true; // Filter matches Welsh + } + } } - }); + return result; + }); + }); - english.setCellValueFactory(dictionaryEntryStringCellDataFeatures -> { - if (dictionaryEntryStringCellDataFeatures.getValue().getWordType().equals(DictionaryEntry.wordTypeEnum.verb)) { - return new SimpleStringProperty("to " + dictionaryEntryStringCellDataFeatures.getValue().getEnglish()); - } else { - return new SimpleStringProperty(dictionaryEntryStringCellDataFeatures.getValue().getEnglish()); - } - }); - - table.setItems(sortedList); - if(isSortedByEnglish){ - table.getSortOrder().add(english); - } else{ - table.getSortOrder().add(welsh); - } - - } - - @FXML - private void switchLangSort() { - if (isSortedByEnglish) { - if (welsh.getSortType().equals(TableColumn.SortType.ASCENDING)) { - alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-50.png")); - } - else if (welsh.getSortType().equals(TableColumn.SortType.DESCENDING)) { - alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-reversed-50.png")); - } - table.getSortOrder().clear(); - table.getSortOrder().add(welsh); - - isSortedByEnglish = false; - } - else { - if (english.getSortType().equals(TableColumn.SortType.ASCENDING)) { - alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-50.png")); - } - else if (english.getSortType().equals(TableColumn.SortType.DESCENDING)) { - alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-reversed-50.png")); - } - table.getSortOrder().clear(); - table.getSortOrder().add(english); - - isSortedByEnglish = true; - } - table.sort(); - } - - @FXML - private void switchAlphaSort() { - if (table.getSortOrder().contains(english)) { - if (english.getSortType().equals(TableColumn.SortType.ASCENDING)) { - english.setSortType(TableColumn.SortType.DESCENDING); - alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-reversed-50.png")); - } else { - english.setSortType(TableColumn.SortType.ASCENDING); - alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-50.png")); - } - } else if (table.getSortOrder().contains(welsh)) { - if (welsh.getSortType().equals(TableColumn.SortType.ASCENDING)) { - welsh.setSortType(TableColumn.SortType.DESCENDING); - alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-reversed-50.png")); - } else { - welsh.setSortType(TableColumn.SortType.ASCENDING); - alphaSort.setImage(new Image("file:src/main/resources/assets/icons/black_icons/50px/sort-alpha-up-50.png")); - } - } - } + SortedList sortedList = new SortedList<>(filteredList); //Wrap the filtered list in a SortedList + sortedList.comparatorProperty().bind(table.comparatorProperty()); //Bind the sorted list comparator to the table comparator + table.setItems(sortedList); + if(isSortedByEnglish){ + table.getSortOrder().add(english); + } else{ + table.getSortOrder().add(welsh); + } + } }