How to Build an Agent's View

In this section, we explain how a view of the agent is created. All our agents follow the same approach. If you want to see the code while reading the notes, go to source:ome.git/components/insight/SRC/org/openmicroscopy/shoola/agents/treeviewer/view.

Let's go back to our example MyBrowserAgent (see How To Build An Agent).

  1. Create a view package in the mybrowser package.
  2. Create the following classes MyBrowser (I/F), MyBrowserComponent, MyBrowserModel, MyBrowserControl, and MyBrowserUI. If you browse the source code, you will notice that we usually have a class used as a toolbar and a class used as a status bar. Both classes are initialised by the BrowserUI. For clarity, they have been omitted in the following diagram.
  3. Create a MyBrowserFactory. This class keeps trach of the MyBrowser instances created and not yet discarded. A component is only created if none of the tracked ones is displaying the data otherwise the existing component is recycled.

Typical life-cycle of an Agent View

The object is first created using the MyBrowserFactory

//Somewhere in the MyBrowserFactory code

    /** The sole instance. */
    private static final MyBrowserFactory  singleton = new MyBrowserFactory();
    
    /**
     * Returns a viewer to display the specified images.
     * 
     * @param images The <code>ImageData</code> objects.
     */
    public static MyBrowser getViewer(Set<ImageData> images)
    {
        MyBrowserModel model = new MyBrowserModel(images);
        return singleton.getViewer(model);
    }


    /**
     * Creates or recycles a viewer component for the specified 
     * <code>model</code>.
     * 
     * @param model The component's Model.
     * @return A {@link MyBrowser} for the specified <code>model</code>.  
     */
    private MyBrowser getViewer(MyBrowserModel model)
    {
        Iterator v = viewers.iterator();
        MyBrowserComponent comp;
        while (v.hasNext()) {
            comp = (MyBrowserComponent) v.next();
            if (model.isSameDisplay(comp.getModel())) {
            	comp.refresh(); //refresh the view.
            	return comp;
            }
        }
        comp = new MyBrowserComponent(model);
        comp.initialize();
        comp.addChangeListener(this);
        viewers.add(comp);
        return comp;
    }

After creation, the object is in the MyBrowser#NEW state and is waiting for the MyBrowser#activate() method to be called. Such a call usually triggers of the objects on the server. The object is now in the MyBrowser#LOADING state. After all the data have been retrieved, the object is the MyBrowser#READY state and the data display is built and set on screen.

When the user quits the window, the MyBrower#discard() method is invoked and the object transitions to the MyBrowser#DISCARDED state. At which point, all clients should de-reference the component to allow for garbage collection.

Attachments

1.3.2-PRO © 2008-2010 agile42 all rights reserved (this page was served in: 0.60609 sec.)

We're Hiring!