TransformedList and ListEvents

Each of the issues contains a 'reported by' user. With the appropriate transformation, you can create an EventList of users from that EventList of issues. As issues list is changed, the users list changes automatically. If your first issue's user is "jessewilson", then the first element in the derived users list will be "jessewilson". There will be a simple one-to-one relationship between the issues list and the users list.

For this kind of arbitrary list transformation, extend the abstract TransformedList. By overriding the get() method to return an issue's user rather than the issue itself, you make the issues list look like a users list!

We're required to write some boilerplate code to complete our users list transformation. First, we must observe the source issues list by registering a listener: source.addListEventListener(this). Second, when the source EventList changes, we forward an equivalent event to our listeners as well. This is taken care of by calling updates.forwardEvent() within the listChanged() method.

// glazed lists
import ca.odell.glazedlists.*;
import ca.odell.glazedlists.event.*;
// a simple issues library
import ca.odell.issuezilla.*;

/**
 * An IssuesToUserList is a list of users that is obtained by getting
 * the reporters from the issues list.
 * 
 * @author <a href="mailto:jesse@odel.on.ca">Jesse Wilson</a>
 */
public class IssueToUserList extends TransformedList {
  
  /**
   * Construct an IssuesToUserList from an EventList that contains only 
   * Issue objects.
   */
  public IssuesToUserList(EventList source) {
    super(source);
    source.addListEventListener(this);
  }
  
  /**
   * Gets the user at the specified index.
   */
  public Object get(int index) {
    Issue issue = (Issue)source.get(index);
    return issue.getReporter();
  }
  
  /**
   * When the source issues list changes, propogate the exact same changes
   * for the users list.
   */
  public void listChanged(ListEvent listChanges) {
    updates.forwardEvent(listChanges);
  }
}