Example 65: Make the label scrollable.
Example 64: Scroll to the bottom of the window on new text.
Example 66: A generic TextInput that responds to enter keypress.

This is our introduction to how easy it is to create and dispatch events of our own devising.
Example 67: Use the EnterTextInput as base for AccountDetailsTextInput.

Removing duplicate code is the main catalyst here. This is perhaps more readable, but it's definitely more maintainable.
Example 68: Hook up an EnterTextInput to send messages when the enter key is pressed.
Add a sound for incoming notifications. This sound came from
http://www.freesound.org/people/TwistedLemon/sounds/2054/
Example 69: Play a sound on every incoming message.
Example 70: Add a set to store new messages on.

We use a set because the primary purpose is to determine if something is in that set, and sets are extremely efficient at that operation.
Example 71: Add a method for forcing the list view to redraw itself.

This really shouldn't be necessary given a well designed and used API, but it's the easiest way to work around the deficiencies.
Example 72: Redraw buddy list to include new or read 'new' notification.
Example 73: Displaying users with new messages in a different color.