TODO List:

    * Add editors for defining file sets, and other "sets".

    * Write wizzard framework.

    * Implement a build progress reporter.

    * Implement a "Worker Thread" pattern that allows workers to have
      their work done in a thread property registered with Antidote, and
      provide support to that worker to provide progress updates via
      the GUI. Should also provide support for hour-glass cursor
      handling, and AWT event blocking until task is completed. This
      would be used for things such as loading files or other tasks
      that the user must wait for completion.

    * Add menu option to select the compiler to use, which then sets
      the "build.compiler" property. Better yet, create a generic menu 
      building capability that allows the setting of a property from a 
      list of options.

    * Add ability to put an "all" or "don't care" specifyer on the action
      "enableOn" and "disableOn" properties.

    * Add ability to view task dependencies more fully.

    * Add better editors for specific tasks.

    * Add a Progress Monitor for file loading (especially for slow boxen like
      mine) .

    * Implement some for of refid hyperlinking functionality.

    * Implement context sensitive menus for the console window, allowing
      an error to be selected and invoked in IDE.

    * Write preferences framwork, including persistence support.

    * Provide some sort of class path debugging support.

    * Add "syntax" colorization to the console window {done}, 
      with a preferences editor for setting up the styles {not-done}.

    * Figure out an approach to gracefully stopping a running build.

    * Add error handler for SAX parser to better report loading errors.

    * Add support to ActionManager to handle toggle actions in tool bar. Also
      need a better way of detecting the selected state of the action button.

    * Project properties viewer, including the ability to view
      dependencies (local and cascading).

    * Acquire or implement a logging facility.

    * Eat more dog food.

(pending Ant 2.0)
    
    * Need Ant API access to:
        - Tasks within a Target
        - The topo sorted task list to get flattened dependencies
        - The build setup code to recduce code replication.
        - Normalize the Ant data model to represent a more consistent
          tree structure, and more bean-like API.

    * Better define the data model architecture, and how it interfaces
      with the Ant data model.

