Anthony Lie's Project Portfolio Page
Project: HelloFile
HelloFile is a file management application created as an extension to AddressBook - Level 3 (AB3), specifically made for tech savvy CS2103T CS students. By using HelloFile, students can tag frequently used files/folders with a short nickname, and open their files with intuitive commands.
Given below are my contributions to the project.
-
New Feature: Added
showcommand (Pull request #88)- What it does: Allows the user to see the file path and label information of a tag.
- Justification: This feature helps the user to see a specific tag’s information if the information is too long for the UI to display it properly.
- Highlights: This feature needs to find the tag according to the tag’s nickname provided by the user.
Hence, I implemented
TagNameEqualsKeywordPredicateto get the specified tag easier, and potentially helps to implement commands that takes in tag’s nickname as argument in the future.
-
New Feature: Added
unlabelcommand (Pull request #193)- What it does: Allows the user to delete multiple labels of a certain tag.
- Justification: This feature improves the product significantly as managing tag’s labels is important since labels can be used to open multiple files at the same time.
- Highlights: This feature is able to take in multiple labels as argument and delete them. This helps the users to save time if a certain tag has a lot of labels that needed to be deleted at the same time.
-
Code contributed: RepoSense link
-
Project management:
- Created some GitHub issues and assign them the corresponding labels and milestone.
- Maintaining team tasks with other members.
- Enhancements to existing features:
-
Documentation:
- User Guide:
- Developer Guide:
- Community:
Contributions to the User Guide (Extract)
Expressions with ... at the end can be provided any number of times.
e.g. t/TAG [l/LABEL]... can be used as t/TAG, t/TAG l/label, or t/TAG l/label1 l/label2 l/label3.
Warning for multiple expressions
Expressions without ... at the end takes the last parameter as the argument when provided with multiple same expressions.
e.g. tag t/TAG1 t/TAG2 will take TAG2 as the parameter, ignoring the parameter TAG1.
4.1 Adding a tag with filepath : tag
Examples:
-
tag t>Tag1 f>C:\Users(Adds a tag with nicknameTag1using absolute path. The tag has no label and points toC:\Users) -
tag t>Tag2 f>C:\Users l>Important(Adds a tag with nicknameTag2using absolute path. The tag has a labelimportantand points toC:\Users) -
tag t>Tag3 f>.\Users(Adds a tag with nicknameTag3using relative path. The tag has no label and points to a folderUsersin the current directory) -
tag t>Tag4 f>.\Users l>folder l>readonly(Adds a tag with nicknameTag4using relative path. The tag has labelsfolderas well asreadonlyand points to a folderUsersin the current directory)
4.5 Renaming a tag : retag
Renames a tag.
Changes the specified tag’s nickname into the new one in order to make the tag’s nickname more descriptive for the user.
Note that this command can only change nickname. It can’t change any other information such as label and file path.
Existing data will be carried over.
4.7 Deleting multiple labels from a tag : unlabel
Deletes one or more labels from a tag.
This command lets you to uncategorized a certain tag.
If some labels are invalid, all the other valid labels will be deleted from the tag,
and the invalid ones will be shown to the user.
FAQ
A: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous HelloFile home folder.
Q: What if the name or the directory of the file I tagged is changed? Can I still access the file using HelloFile?
A: No. HelloFile cannot trace the file if its name or directory is changed, but if you still want to manage the file, you can tag it again.
Q: Can tag name be duplicated?
A: No. The tag names must be unique for all files being managed.
Contributions to the Developer Guide (Extract)
Storage component
The Storage component converts java objects into json format and store it to the hard drive.
It is also used for converting data in json format to java objects when executing the app.
- can save
UserPrefobjects in json format and read it back. - can save the address book data in json format and read it back.
This diagram shows how the AddressBook is saved to json file after executing a command.

This diagram shows how the AddressBook is read from json file when executing the app.

Showing a tag’s file path: ShowCommand
ShowCommand
searches the list of Tags stored in AddressBook and shows the tag’s file path in the ResultDisplay.
CommandException is thrown if tag is not present.
This diagram shows a successful execution of ShowCommand to show the information of the specified tag.

ShowCommand gets the specified tag by applying TagNameEqualsKeywordPredicate that extends from java.util.function.predicate to ObservableList<Tag> using model.findFilteredTagList().
Listing out all the tags: ListCommand
ListCommand
lists the Tags stored in AddressBook and shows them as TagCard which is contained in TagListPanel.
ListCommand shouldn’t take in any argument. A CommandException will be thrown if the user’s input contains an argument.
This diagram shows a successful execution of ListCommand.

ListCommand updates the ObservableList<Tag> by using java.util.function.predicate.
Deleting a tag’s label: UnlabelCommand
UnlabelCommand
searches the list of Tags stored in AddressBook and deletes the specified labels.
The user can provide 1 or more labels to be deleted simultaneously.
If any of the input is invalid, this command will delete all the valid input from the specified Tag and show all the invalid input back to the user.
This diagram shows a successful execution of UnlabelCommand using 1 label as the argument.

UnlabelCommand checks the existence of the specified Tag using model.findFilteredTagList().
It takes the Set<Label> of the Tag and deletes all the labels that matches with user’s input with the help of java.util.stream.
Then, a new Tag is created using the modified Set<Label> and added back to the AddressBook using model.setTag().