UI implemented as an external class

Why is this change necessary?
To isolate different components of TextBuddy so that:
- Code is more organised hence more readable
- Logical structure of code is enforced
- OO requirement of CE2

How does it address the issue?
Having a class to encapsulate the UI methods just organises everything.

What side effects does this change have?
All other methods that call UI methods will now need to do so using
different method signatures.
Implemented sort task description alphabetically

Why is this change necessary?
- Requirement of CE2
- But other than that, it's practically useless. Sorting by date/time
  will be much more useful. Perhaps this is good coding practice (since
  I learnt to use comparators) for sorting tasks by properties.
- So perhaps it's an inferior/vain attempt to organise tasks, just so
  users can find their tasks

How does it address the issue?
- The sort function, which is implemented in the TaskManager class, does
  what it says - sorts task descriptions alphabetically (ignoring cases)
  in ascending order.

What side effects does this change have?
- executeCommand() of UserInterface class will have to be re-written to
  cater for this new functionality.
- Will have to implement exception handling for this functionality, e.g.
  sorting an empty list will warn user that this is an invalid sort.
Write test case for search

Why is this change necessary?
- To show that test case is written before implementation of 'search'
  functionality, i.e. TDD is used.

How does it address the issue?
- NIL

What side effects does this change have?
- Have to implement search functionality.

Additional comments:
- I forgot to commit just after writing the test case for 'sort'
  functionality earlier.
- Though the TaskManager class has the method search, it is generated by
  Eclipse's quickfix from writing the test case. Generating it
  automatically is too irresistible.
Implement backend support for search functionality

Why is this change necessary?
- CE2 requirement
- Allows user to find tasks easily. For example, if Jim had keyed in a
  task whose description is "lunch with dad tmr 1300hrs", but
  subsequently forgot his appointment time, keying in a search string
  (perhaps "lunch") can bring up the entire task description including
  whatever details Jim needs.

How does it address the issue?
Specifically, having the search method in TaskManager class allows for
- The user to search for strings in all task descriptions,
- Which allows the user to dig up details (1300hrs in our example of
  Jim) though he only vaguely remembers some content in the task
  description (lunch in Jim's case).
- The searched tasks are returned as ArrayList<Tasks>, so that the
  formatting and more importantly, specific information to display can
  be flexibly implemented by another method.

What side effects does this change have?
- A method to format the search results output as a string is needed.
- executeCommand() in UserInterface class will need to cater for this
  search functionality.
Write test case for formatting search results
Add toString functionality for search results

Why is this change necessary?
- As mentioned previously, having a toString method for search results
  (specifically searchResultsToString here) allows for better
  abstraction and flexibility, e.g. in case future developers want to
  selectively include other fields in the Task object.

How does it address the issue?
- NIL

What side effects does this change have?
- Need to display the toString-ed search results to user (handled by
  UserInterface)
Write test case for executing sort command
Implement sort execution triggered by sort string

Why is this change necessary?
- Execution of sort functionality triggered by string "sort" bridges the
  gap between user input and the actual execution
= Sort results also need to be displayed to user.

How does it address the issue?
Having the case "sort" in executeCommand method of UserInterface class
- Sorts the tasks stored in the program
- And displays the results by returning the latter as a string

What side effects does this change have?
- User can sort their tasks by typing "sort" in the command line.
Write test case for executing search command
Implement search execution from user command input

Why is this change necessary?
- To trigger execution of search method from user input, otherwise
  search is unusable

How does it address the issue?
- "search" case in executeCommand of UserInterface class executes
   search for searchString
- And returns search results

What side effects does this change have?
- User can now search by typing "search <searchString>" from the command
  line interface.
Create new class for managing log file

Why is this change necessary?
- To apply OO in CE2
- Neater organisation for better readability and logic flow

How does it address the issue?
- Having a class LogFileManager abstracts and encapsulates log file
  management.

What side effects does this change have?
- Need to re-write the methods called for reading/writing tasks from/to
  log files.
Complete implemented LogFileManager class

Why is this change necessary?
As mentioned previously, the LogFileManager class
- Abstracts all relevant log file managing methods and data
- Forces me to apply OO to CE2.

What side effects does this change have?
The above allows for better logic flow, code readability and scalability
(perhaps some code can be used for the group project?)
Add javadocs comments
Format and refactored more
Final implementation for CE2