Skip to content

Commit a6418ce

Browse files
Merge pull request #108 from solomonng2001/refactor-sorting
Refactor sorting of person list
2 parents 8b50b21 + 2285fc1 commit a6418ce

32 files changed

+135
-85
lines changed

src/main/java/seedu/address/logic/LogicManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public ReadOnlyAddressBook getAddressBook() {
6969

7070
@Override
7171
public ObservableList<Person> getFilteredPersonList() {
72-
return model.getFilteredPersonList();
72+
return model.getSortedFilteredPersonList();
7373
}
7474

7575
@Override

src/main/java/seedu/address/logic/commands/AddPolicyCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static java.util.Objects.requireNonNull;
44
import static seedu.address.logic.parser.CliSyntax.PREFIX_POLICYID;
55
import static seedu.address.logic.parser.CliSyntax.PREFIX_POLICYNAME;
6+
import static seedu.address.model.Model.COMPARATOR_SHOW_ORIGINAL_ORDER;
67
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
78

89
import java.util.List;
@@ -52,7 +53,7 @@ public AddPolicyCommand(Index index, Policy policy) {
5253
public CommandResult execute(Model model) throws CommandException {
5354
requireNonNull(model);
5455

55-
List<Person> lastShownList = model.getFilteredPersonList();
56+
List<Person> lastShownList = model.getSortedFilteredPersonList();
5657

5758
if (index.getZeroBased() >= lastShownList.size()) {
5859
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
@@ -74,6 +75,7 @@ public CommandResult execute(Model model) throws CommandException {
7475

7576
model.setPerson(personToAddPolicy, policyAddedPerson);
7677
model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
78+
model.updateSortPersonComparator(COMPARATOR_SHOW_ORIGINAL_ORDER);
7779
model.setDisplayClient(policyAddedPerson);
7880

7981
return new CommandResult(String.format(MESSAGE_SUCCESS, personToAddPolicy.getName()));

src/main/java/seedu/address/logic/commands/DeleteCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public DeleteCommand(Index targetIndex) {
3434
@Override
3535
public CommandResult execute(Model model) throws CommandException {
3636
requireNonNull(model);
37-
List<Person> lastShownList = model.getFilteredPersonList();
37+
List<Person> lastShownList = model.getSortedFilteredPersonList();
3838

3939
if (targetIndex.getZeroBased() >= lastShownList.size()) {
4040
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);

src/main/java/seedu/address/logic/commands/DeletePolicyCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static java.util.Objects.requireNonNull;
44
import static seedu.address.logic.parser.CliSyntax.PREFIX_POLICYID;
5+
import static seedu.address.model.Model.COMPARATOR_SHOW_ORIGINAL_ORDER;
56
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
67

78
import java.util.List;
@@ -48,7 +49,7 @@ public DeletePolicyCommand(Index index, String policyId) {
4849
public CommandResult execute(Model model) throws CommandException {
4950
requireNonNull(model);
5051

51-
List<Person> lastShownList = model.getFilteredPersonList();
52+
List<Person> lastShownList = model.getSortedFilteredPersonList();
5253

5354
if (index.getZeroBased() >= lastShownList.size()) {
5455
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
@@ -70,6 +71,7 @@ public CommandResult execute(Model model) throws CommandException {
7071

7172
model.setPerson(personToDeletePolicy, policyDeletedPerson);
7273
model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
74+
model.updateSortPersonComparator(COMPARATOR_SHOW_ORIGINAL_ORDER);
7375
model.setDisplayClient(policyDeletedPerson);
7476

7577
return new CommandResult(String.format(MESSAGE_SUCCESS, policyId, policyDeletedPerson.getName()));

src/main/java/seedu/address/logic/commands/EditCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
99
import static seedu.address.logic.parser.CliSyntax.PREFIX_PRIORITY;
1010
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
11+
import static seedu.address.model.Model.COMPARATOR_SHOW_ORIGINAL_ORDER;
1112
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
1213

1314
import java.util.Collections;
@@ -80,7 +81,7 @@ public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {
8081
@Override
8182
public CommandResult execute(Model model) throws CommandException {
8283
requireNonNull(model);
83-
List<Person> lastShownList = model.getFilteredPersonList();
84+
List<Person> lastShownList = model.getSortedFilteredPersonList();
8485

8586
if (index.getZeroBased() >= lastShownList.size()) {
8687
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
@@ -95,6 +96,7 @@ public CommandResult execute(Model model) throws CommandException {
9596

9697
model.setPerson(personToEdit, editedPerson);
9798
model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
99+
model.updateSortPersonComparator(COMPARATOR_SHOW_ORIGINAL_ORDER);
98100
model.setDisplayClient(editedPerson);
99101
return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));
100102
}

src/main/java/seedu/address/logic/commands/FindCommand.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,9 @@ public FindCommand(NameContainsKeywordsPredicate predicate) {
3030
public CommandResult execute(Model model) {
3131
requireNonNull(model);
3232
model.updateFilteredPersonList(predicate);
33-
if (model.getFilteredPersonList().isEmpty()) {
34-
model.setDisplayClient(null);
35-
} else {
36-
model.setDisplayClient(model.getFilteredPersonList().get(0));
37-
}
33+
model.setDisplayClientAsFirstInSortedFilteredPersonList();
3834
return new CommandResult(
39-
String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, model.getFilteredPersonList().size()));
35+
String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, model.getSortedFilteredPersonList().size()));
4036
}
4137

4238
@Override

src/main/java/seedu/address/logic/commands/LastMetCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static java.util.Objects.requireNonNull;
44
import static seedu.address.logic.parser.CliSyntax.PREFIX_LASTMET;
5+
import static seedu.address.model.Model.COMPARATOR_SHOW_ORIGINAL_ORDER;
56
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
67

78
import java.time.LocalDate;
@@ -56,7 +57,7 @@ public CommandResult execute(Model model) throws CommandException {
5657
throw new CommandException(Messages.MESSAGE_LASTMET_FUTURE);
5758
}
5859

59-
List<Person> lastShownList = model.getFilteredPersonList();
60+
List<Person> lastShownList = model.getSortedFilteredPersonList();
6061

6162
if (index.getZeroBased() >= lastShownList.size()) {
6263
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
@@ -71,6 +72,7 @@ public CommandResult execute(Model model) throws CommandException {
7172

7273
model.setPerson(personToMeet, metPerson);
7374
model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
75+
model.updateSortPersonComparator(COMPARATOR_SHOW_ORIGINAL_ORDER);
7476
model.setDisplayClient(metPerson);
7577

7678
return new CommandResult(String.format(MESSAGE_SUCCESS, personToMeet.getName()));

src/main/java/seedu/address/logic/commands/ListCommand.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package seedu.address.logic.commands;
22

33
import static java.util.Objects.requireNonNull;
4+
import static seedu.address.model.Model.COMPARATOR_SHOW_ORIGINAL_ORDER;
45
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
56

67
import seedu.address.model.Model;
@@ -19,11 +20,8 @@ public class ListCommand extends Command {
1920
public CommandResult execute(Model model) {
2021
requireNonNull(model);
2122
model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
22-
if (model.getFilteredPersonList().isEmpty()) {
23-
model.setDisplayClient(null);
24-
} else {
25-
model.setDisplayClient(model.getFilteredPersonList().get(0));
26-
}
23+
model.updateSortPersonComparator(COMPARATOR_SHOW_ORIGINAL_ORDER);
24+
model.setDisplayClientAsFirstInSortedFilteredPersonList();
2725
return new CommandResult(MESSAGE_SUCCESS);
2826
}
2927
}

src/main/java/seedu/address/logic/commands/MarkCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package seedu.address.logic.commands;
22

33
import static java.util.Objects.requireNonNull;
4+
import static seedu.address.model.Model.COMPARATOR_SHOW_ORIGINAL_ORDER;
45
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
56

67
import java.util.List;
@@ -40,7 +41,7 @@ public MarkCommand(Index index) {
4041
public CommandResult execute(Model model) throws CommandException {
4142
requireNonNull(model);
4243

43-
List<Person> lastShownList = model.getFilteredPersonList();
44+
List<Person> lastShownList = model.getSortedFilteredPersonList();
4445

4546
if (index.getZeroBased() >= lastShownList.size()) {
4647
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
@@ -63,6 +64,7 @@ public CommandResult execute(Model model) throws CommandException {
6364
metPerson.getSchedule().markIsDone();
6465
model.setPerson(personToMeet, metPerson);
6566
model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
67+
model.updateSortPersonComparator(COMPARATOR_SHOW_ORIGINAL_ORDER);
6668
model.setDisplayClient(metPerson);
6769

6870
return new CommandResult(String.format(MESSAGE_SUCCESS, personToMeet.getName()));

src/main/java/seedu/address/logic/commands/RemarkCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
44
import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK;
5+
import static seedu.address.model.Model.COMPARATOR_SHOW_ORIGINAL_ORDER;
56
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
67

78
import java.util.List;
@@ -48,7 +49,7 @@ public RemarkCommand(Index index, Remark remark) {
4849
}
4950
@Override
5051
public CommandResult execute(Model model) throws CommandException {
51-
List<Person> lastShownList = model.getFilteredPersonList();
52+
List<Person> lastShownList = model.getSortedFilteredPersonList();
5253

5354
if (index.getZeroBased() >= lastShownList.size()) {
5455
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
@@ -62,6 +63,7 @@ public CommandResult execute(Model model) throws CommandException {
6263

6364
model.setPerson(personToEdit, editedPerson);
6465
model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
66+
model.updateSortPersonComparator(COMPARATOR_SHOW_ORIGINAL_ORDER);
6567
model.setDisplayClient(editedPerson);
6668

6769
return new CommandResult(generateSuccessMessage(editedPerson));

src/main/java/seedu/address/logic/commands/ScheduleCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static java.util.Objects.requireNonNull;
44
import static seedu.address.logic.parser.CliSyntax.PREFIX_SCHEDULE;
5+
import static seedu.address.model.Model.COMPARATOR_SHOW_ORIGINAL_ORDER;
56
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
67

78
import java.time.LocalDateTime;
@@ -56,7 +57,7 @@ public CommandResult execute(Model model) throws CommandException {
5657
throw new CommandException(Messages.MESSAGE_SCHEDULE_PAST);
5758
}
5859

59-
List<Person> lastShownList = model.getFilteredPersonList();
60+
List<Person> lastShownList = model.getSortedFilteredPersonList();
6061

6162
if (index.getZeroBased() >= lastShownList.size()) {
6263
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
@@ -71,6 +72,7 @@ public CommandResult execute(Model model) throws CommandException {
7172

7273
model.setPerson(personToMeet, metPerson);
7374
model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
75+
model.updateSortPersonComparator(COMPARATOR_SHOW_ORIGINAL_ORDER);
7476
model.setDisplayClient(metPerson);
7577

7678
return new CommandResult(String.format(MESSAGE_SUCCESS, personToMeet.getName()));

src/main/java/seedu/address/logic/commands/SortCommand.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ public SortCommand(SortCriteria sortCriteria, SortOrder sortOrder) {
4444
@Override
4545
public CommandResult execute(Model model) throws CommandException {
4646
requireNonNull(model);
47-
model.sortFilteredPersonList(PersonComparator.getComparator(sortCriteria, sortOrder));
47+
model.updateSortPersonComparator(PersonComparator.getComparator(sortCriteria, sortOrder));
48+
model.setDisplayClientAsFirstInSortedFilteredPersonList();
4849
return new CommandResult(getMessageSuccess(sortCriteria, sortOrder));
4950
}
5051

src/main/java/seedu/address/logic/commands/ViewCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public ViewCommand(Index targetIndex) {
3636
@Override
3737
public CommandResult execute(Model model) throws CommandException {
3838
requireNonNull(model);
39-
List<Person> lastShownList = model.getFilteredPersonList();
39+
List<Person> lastShownList = model.getSortedFilteredPersonList();
4040

4141
if (targetIndex.getZeroBased() >= lastShownList.size()) {
4242
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);

src/main/java/seedu/address/model/Model.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public interface Model {
1616
/** {@code Predicate} that always evaluate to true */
1717
Predicate<Person> PREDICATE_SHOW_ALL_PERSONS = unused -> true;
1818

19+
Comparator<Person> COMPARATOR_SHOW_ORIGINAL_ORDER = (person1, person2) -> 0;
20+
1921
/**
2022
* Replaces user prefs data with the data in {@code userPrefs}.
2123
*/
@@ -79,7 +81,7 @@ public interface Model {
7981
void setPerson(Person target, Person editedPerson);
8082

8183
/** Returns an unmodifiable view of the filtered person list */
82-
ObservableList<Person> getFilteredPersonList();
84+
ObservableList<Person> getSortedFilteredPersonList();
8385

8486
/**
8587
* Updates the filter of the filtered person list to filter by the given {@code predicate}.
@@ -91,7 +93,7 @@ public interface Model {
9193
* Sorts the filtered person list by the given {@code comparator}.
9294
* @throws NullPointerException if {@code comparator} is null.
9395
*/
94-
void sortFilteredPersonList(Comparator<Person> comparator);
96+
void updateSortPersonComparator(Comparator<Person> comparator);
9597

9698
/**
9799
* Returns the client to be displayed in ClientViewPanel.
@@ -112,6 +114,9 @@ public interface Model {
112114
* Replaces the current client to be displayed to {@code person}.
113115
*/
114116
void setDisplayClient(Person person);
117+
118+
void setDisplayClientAsFirstInSortedFilteredPersonList();
119+
115120
/**
116121
* Returns the reminder list for the overdue last met to be displayed in RemindersPanel.
117122
*/

src/main/java/seedu/address/model/ModelManager.java

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import javafx.collections.ObservableList;
1212
import javafx.collections.transformation.FilteredList;
13+
import javafx.collections.transformation.SortedList;
1314
import seedu.address.commons.core.GuiSettings;
1415
import seedu.address.commons.core.LogsCenter;
1516
import seedu.address.model.person.DisplayClient;
@@ -28,7 +29,8 @@ public class ModelManager implements Model {
2829

2930
private final AddressBook addressBook;
3031
private final UserPrefs userPrefs;
31-
private FilteredList<Person> filteredPersons;
32+
private final FilteredList<Person> filteredPersons;
33+
private Comparator<Person> personComparator;
3234
private final DisplayClient displayClient;
3335

3436
/**
@@ -42,6 +44,7 @@ public ModelManager(ReadOnlyAddressBook addressBook, ReadOnlyUserPrefs userPrefs
4244
this.addressBook = new AddressBook(addressBook);
4345
this.userPrefs = new UserPrefs(userPrefs);
4446
filteredPersons = new FilteredList<>(this.addressBook.getPersonList());
47+
personComparator = COMPARATOR_SHOW_ORIGINAL_ORDER;
4548
displayClient = filteredPersons.isEmpty()
4649
? new DisplayClient(null)
4750
: new DisplayClient(filteredPersons.get(0));
@@ -113,6 +116,7 @@ public void deletePerson(Person target) {
113116
public void addPerson(Person person) {
114117
addressBook.addPerson(person);
115118
updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
119+
updateSortPersonComparator(COMPARATOR_SHOW_ORIGINAL_ORDER);
116120
}
117121

118122
@Override
@@ -157,8 +161,10 @@ public void deletePolicy(Person target, String policyId) {
157161
* {@code versionedAddressBook}
158162
*/
159163
@Override
160-
public ObservableList<Person> getFilteredPersonList() {
161-
return filteredPersons;
164+
public ObservableList<Person> getSortedFilteredPersonList() {
165+
SortedList<Person> sortedPersons = new SortedList<>(filteredPersons);
166+
sortedPersons.setComparator(personComparator);
167+
return sortedPersons;
162168
}
163169

164170
@Override
@@ -167,11 +173,16 @@ public void updateFilteredPersonList(Predicate<Person> predicate) {
167173
filteredPersons.setPredicate(predicate);
168174
}
169175

176+
/**
177+
* Updates the comparator used to sort the list of persons.
178+
* Comparator is used to sort when {@code getSortedFilteredPersonList()} is called.
179+
*
180+
* @param comparator Comparator to be used to sort the list of persons
181+
*/
170182
@Override
171-
public void sortFilteredPersonList(Comparator<Person> comparator) {
183+
public void updateSortPersonComparator(Comparator<Person> comparator) {
172184
requireNonNull(comparator);
173-
ObservableList<Person> sortedList = this.addressBook.getPersonList().sorted(comparator);
174-
filteredPersons = new FilteredList<>(sortedList);
185+
personComparator = comparator;
175186
}
176187

177188
@Override
@@ -212,6 +223,20 @@ public void setDisplayClient(Person person) {
212223
displayClient.setDisplayClient(person);
213224
}
214225

226+
/**
227+
* Sets the display client to be the first person in the sorted filtered person list.
228+
* If the list is empty, display client is set to null.
229+
*/
230+
@Override
231+
public void setDisplayClientAsFirstInSortedFilteredPersonList() {
232+
ObservableList<Person> sortedFilteredPersonList = getSortedFilteredPersonList();
233+
if (sortedFilteredPersonList.isEmpty()) {
234+
displayClient.setDisplayClient(null);
235+
} else {
236+
displayClient.setDisplayClient(sortedFilteredPersonList.get(0));
237+
}
238+
}
239+
215240
//=========== PolicyList Displayed =====================================================================
216241
@Override
217242
public ReminderList getOverDueLastMet() {

src/main/java/seedu/address/model/person/PersonComparator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package seedu.address.model.person;
22

3+
import static seedu.address.model.Model.COMPARATOR_SHOW_ORIGINAL_ORDER;
4+
35
import java.util.Comparator;
46

57
/**
@@ -41,7 +43,7 @@ public static Comparator<Person> getComparator(SortCriteria sortCriteria, SortOr
4143
comparator = Comparator.comparing(Person::getSchedule);
4244
break;
4345
default:
44-
return Comparator.comparing(Person::getName);
46+
return COMPARATOR_SHOW_ORIGINAL_ORDER;
4547
}
4648
if (sortOrder == SortOrder.DESC) {
4749
return comparator.reversed();

0 commit comments

Comments
 (0)