Wadjet -GUI 5.3.0

Introduction

Wadjet-GUI supplies a set of classes that allow you to create complex Frame windows that will have the same structure under either Swing or SWT/JFace without programming directly to the GUI libraries.

The windows are constructed using descriptors for the different components that they are made up of and all the layout, construction and placement is handled by the library. The settings for a window are stored in user preferences so that the style, theme, platform position and size of the window will be same when you restart a program.

The library supports switching from Swing to SWT/JFace , dynamically changing language and changing the window style and theme in Swing without restarting the program.

Using Wadjet-GUI

The following sections describe how to use the Wadjet-GUI package

NOTE - All resources loaded using the classes in the WAdjet-GUI package when using SWT/JFace are disposed when the program exits.

Creating a Wadjet-GUI Application

To create a Wadjet-GUI application "all" you need to do is create an implementation of the IFrameComponentManager by extending the AFrameComponentManager abstract class and implementing the methods in it. Then just write a main like this:

    public static void main(String[] args) {
        IFrameComponentManager config = new FrameConfig();
        try {
            config.run();
        } catch(Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
        System.exit(0);
    }

The IFrameComponentManager implementation as you cans ee is the heart of the architecture and is quite a complex class, its purpose is to hide the complexities of programming the GUI, for example the above code shows this window:

Demo Window (SWT/JFace)

switching to Swing it looks like this

Demo Window (Swing)

back to top

The IFrameComponentManager

The frame window shown above contains just about all the possibilities available from Wadjet-GUI :

  • Menu with sub-menus and items with or without icons
  • Toolbar that can be moved or set free (in Swing)
  • StatusBar with a clock and and icon at the far right
  • Split panel contents
  • Tab pane and tree with a logical connection between nodes in the tree and the panel Node data and tabs with or without icons
  • The standard settings panel
  • Error dialog with a details pane
  • The ouput panel that can accept a stream input
  • The HTML view panel

The constructor for your IFrameComponentManager implementation should start by setting up a FrameSettings object and initialising the :

public class FrameConfig extends AFrameComponentManager {

    private ITabPanel m_tabPanel;

    /**
     * Create a new FrameConfig
     */
    public FrameConfig() {
        super();
        FrameSettings fs = getFrameSettings();
        fs.setResourceBundle(ResourceBundle.getBundle("com.addc.res"));
        fs.setWithMenuBar(true);
        fs.setWithStatusBar(true);
        fs.setWithToolBar(true);
        fs.setStatusBarIcon(new IconDescriptor("green_dot.gif", GUI.class));
        fs.setStatusBarWithClock(true);
    }

The AFrameComponentManager constructor will have initialised the default settings and read the preferences so you don't have to worry about any of that unless you need more settings than are handled by the AFrameComponentManager which are:

Key Description
DivPos The divider position for Swing
DivPos1 The first part of the SWT divider position
DivPos2 The second part of the SWT divider position
DivSize The width of the divider (only works correctly in Swing
Hight The height of the window in pixels
LAF.Theme.n A set of Theme classes available to Swing
locale The locale index
LookAnsFeel The index of the look and feel for Swing
tbPosition The position of the ToolBar (Swing only)
platform (0/1) Swing or SWT/JFace
tbOrientation The orientation of the ToolBar
tbPosition The position of the ToolBar (Swing only)
Theme The index of the theme being used
Width The width of the window in pixels
XPos The X coordinate of the window on the screen
YPos The Y coordinate of the window on the screen

During initialisation, the following methods are called in your implementation:

  • reInitialiseData() where you would initialise or re-initialise any data associated with your window. You can know whether this is initialisation or re-initialisation by checking the boolean m_reinitialise member variable (it is protected).
  • setWindowIcon() which sets the window icon
        /**
         * @see com.addc.gui.config.AFrameComponentManager#setWindowIcon()
         */
        protected IconDescriptor setWindowIcon() {
            return new IconDescriptor("eye.gif", this.getClass());
        }
    
  • getAvailableLocales(FrameSettings settings) This optional, there is a default that supports:
    1. Locale.UK English
    2. Locale.FRANCE French
    3. Locale("es", "ES") Spanish
    4. Locale.GERMANY German
    5. Locale("ca", "ES") Catalan

When you run() your FrameConfig, the following sequence is executed:

    /**
     * @see com.addc.gui.config.IFrameComponentManager#run()
     */
    public void run() {
        do {
            m_window = FrameWindowFactory.getFrameWindow();
            m_window.initialise(this);
            m_reinitialise = false;
            m_window.run();
            if (m_reinitialise) {
                saveSettings();
                init();
            }
        } while (m_reinitialise);
        dispose();
    }

The IFrameWindow implementation will pass the IFrameComponentManager to the its Menu, ToolBar and StatusBar implementation classes which will call back get the information they needs to build the components and request the contents from the IFrameComponentManager will invoke the createContentPanel(Object) of your implementation.


back to top

Creating Menus

The IMenuBar implementations create the menus using descriptors that are obtained from the IFrameComponentManager . To create a menu you implement the createMenuBarDescriptors() method to create a list of MenuDescritor objects. The code example below creates the menu for the demo window:

    /**
     * @see com.addc.gui.config.AFrameComponentManager#createMenuBarDescriptors()
     */
    protected List<MenuDescriptor> createMenuBarDescriptors() {
        List<MenuDescriptor> menus = new ArrayList<MenuDescriptor>();
        MenuDescriptor menu = new MenuDescriptor("key1", 
                "menuFile", 
                null, 
                0, 
                "hkMenuFile");
        menu.addMenuItem(new MenuDescriptor("fileOpen",
                "itemOpen",
                new IconDescriptor("open.gif", getClass()),
                1001,
                "hkItemOpen",
                "accItemOpen"));
        menu.addMenuItem(new MenuDescriptor("fileSave",
                "itemSave",
                new IconDescriptor("save.gif", getClass()),
                1002,
                "hkItemSave",
                "accItemSave"));
        menu.addMenuItem(new MenuDescriptor());
        MenuDescriptor submenu = new MenuDescriptor("fileSub", 
                "menuSub", 
                null, 
                0, 
                "hkMenuSub");
        menu.addMenuItem(submenu);
        submenu.addMenuItem(new MenuDescriptor("sub", 
                "itemSub", 
                null, 
                1005, 
                "hkItemSub", 
                "accItemSub"));
        menu.addMenuItem(new MenuDescriptor());
        menu.addMenuItem(new MenuDescriptor("exit", 
                "itemExit", null, 
                1006, 
                "hkItemExit", 
                "accItemExit"));
        menus.add(menu);
        menu = new MenuDescriptor("key2", 
                "menuSettings", 
                null, 
                0, 
                "hkMenuSettings");
        menu.addMenuItem(new MenuDescriptor("fileLAF", 
                "itemLAF", 
                null, 
                1010, 
                "hkItemLAF", 
                "accItemLAF"));
        menus.add(menu);
        return menus;
    }

Note that the MenuDescritor instances representing menu items have a non-zero command code, this is returned to the IActionCommandHandler instance created by the IFrameConfigurationManager in the createCommandHandler() method:

/**
 * @see com.addc.gui.config.AFrameComponentManager#createCommandHandler()
 */
protected IActionCommandHandler createCommandHandler() {
    
    final FrameConfig me = this;
    
    IActionCommandHandler handler = new IActionCommandHandler() {

        public void handleCommand(ActionCommandEvent command) {
            m_logger.info("Received command " + command.getCommand());
            switch (command.getCommand()) {
                case 1001: {
                    List<String> testMsgs = new ArrayList<String>();
                    testMsgs.add(
                        me.getFrameSettings().getResourceBundle().getString("line1"));
                    testMsgs.add(
                        me.getFrameSettings().getResourceBundle().getString("line2"));
                    testMsgs.add(
                        me.getFrameSettings().getResourceBundle().getString("line3"));
                    testMsgs.add(
                        me.getFrameSettings().getResourceBundle().getString("line4"));
                    DialogManagerFactory.getDialogManager().messageDialog(testMsgs, 
                        me.getFrameSettings().getResourceBundle().getString("msgTitle"));
                }
                    break;

                case 1002: {
                    DataInputDescriptor did = new DataInputDescriptor("", 
                                                me.getFrameSettings().getResourceBundle());
                    did.addField(
                        FldDescFactoryLocator.getFieldDescriptorFactory().getTextField("text1",
                            "text1",
                            "This is Mars calling"));
                    did.addField(
                        FldDescFactoryLocator.getFieldDescriptorFactory().getTextField("text2",
                            "text2",
                            "This is Mars calling"));
                    did.addField(
                        FldDescFactoryLocator.getFieldDescriptorFactory().getTextField("text3",
                            "text3",
                            "This is Mars calling"));
                    IDataInputPanel panel = DataInputPanelFactory.createPanel(null, did);
                    panel.setCommandHandler(null, 0);
                    IDataInputDialog dlg = 
                         DialogManagerFactory.getDialogManager().getDialog(
                            "Boo to the Gander", 
                            did);
                    dlg.wasOkPressed();
                    ITreePanel tp = 
                        (ITreePanel) ((ISplitPanel)getContentPanel(null)).getFirstContentPanel();
                    tp.getTreeManager().collapseCurrentNode();
                }
                    break;

                case 1005: {
                    List<String> msgs = new ArrayList<String>();
                    msgs.add(me.getFrameSettings().getResourceBundle().getString("err1"));
                    msgs.add(me.getFrameSettings().getResourceBundle().getString("err2"));
                    StringBuffer sb = new StringBuffer("This is a very long piece of " +
                    "Garbage for testing the SwtDialog packing and sizing stuff... " + 
                    "this doesn't seem to be working very well");
                    for (int i = 0; i < 50; i++) {
                        sb.append("\n")
                        sb.append("This is a very long piece of Garbage for testing ");
                        sb.append("the SwtDialog packing and sizing stuff...);
                        sb.append( this doesn't seem to ");
                        sb.append("be working very well");
                    }
                    DialogManagerFactory.getDialogManager().errorDialog(msgs,
                            me.getFrameSettings().getResourceBundle().getString("errTitle"),
                            sb.toString());
                    ITreePanel tp = 
                        (ITreePanel) ((ISplitPanel)getContentPanel(null)).getFirstContentPanel();
                    tp.getTreeManager().expandCurrentNode();
                }
                    break;

                case 1006:
                    FrameWindowFactory.getFrameWindow().closeWindow();
                    break;

                case 1010: {
                    List<String> testMsgs = new ArrayList<String>();
                    testMsgs.add(
                        me.getFrameSettings().getResourceBundle().getString("line1"));
                    testMsgs.add(
                        me.getFrameSettings().getResourceBundle().getString("line2"));
                    testMsgs.add(
                        me.getFrameSettings().getResourceBundle().getString("line3"));
                    testMsgs.add(
                        me.getFrameSettings().getResourceBundle().getString("line4"));
                    DialogManagerFactory.getDialogManager().errorDialog(testMsgs,
                            me.getFrameSettings().getResourceBundle().getString("msgTitle"),
                            new Exception("Whoops a daisy..."));
                }
                    break;

                default:
                    break;
            }
        }

    };
    return handler;
}

For a serious application you would create a separate class to handle the commands from the menuBar and ToolBar and return it from this method.

NOTE - The creation methods are only called once; all the lists and objects returned by them are held by the AFrameConfigurationManager class.


back to top

Creating ToolBars

Toolbars are created in the same way as MenuBars, using descriptors in the method:

    /**
     * @see com.addc.gui.config.AFrameComponentManager#createToolbarItemDescriptors()
     */
    protected List<ToolBarItemDescriptor> createToolbarItemDescriptors() {
        List<ToolBarItemDescriptor> tools = new ArrayList<ToolBarItemDescriptor>();
        ToolBarItemDescriptor tool = new ToolBarItemDescriptor("fileOpen", 
                new IconDescriptor("open.gif", this.getClass()), 
                1001,
                "ttFileOpen");
        tools.add(tool);
        tool = new ToolBarItemDescriptor("fileSave", 
                new IconDescriptor("save.gif", this.getClass()), 
                1003,
                "ttFileSave");
        tools.add(tool);
        return tools;
    }

The above example creates the ToolBar for the demo


back to top

Creating Content

Content is created in the createContentPanel(Object parent) method. Here you can create a combination of any of the available types. The example builds a split pane with a tree panel on the left and tab pane on the right containing a context panel see Creating TreePanes , a data panel etc..

    /**
     * @see com.addc.gui.config.AFrameComponentManager#createContentPanel(java.lang.Object)
     */
    protected IContentPanel createContentPanel(Object parent) {

        // Create the split pane
        ISplitPanel splitPanel = SplitPanelFactory.getSplitPanel();
        splitPanel.initialise(parent, ComponentOrientation.HORIZONTAL, getFrameSettings());

        // Create a tree panel and some nodes to go in it
        ITreePanel tree = TreePanelFactory.createTreePanel();
        tree.initialise(splitPanel.getComponent(), this);
        TreeElement root = new TreeElement("Root");
        root.setAllowsChildren(true);
        TreeElement node = new TreeElement("Node1");
        node.setAllowsChildren(false);
        root.addChild(node);
        node = new TreeElement("Node2");
        node.setAllowsChildren(true);
        TreeElement subnode = new TreeElement("SubNode");
        subnode.setAllowsChildren(false);
        node.addChild(subnode);
        root.addChild(node);
        node = new TreeElement("Node3");
        root.addChild(node);
        tree.getTreeManager().setRoot(root, true);
        splitPanel.setFirstContentPanel(tree);

        // Create the tab pages
        List<TabPageDescriptor> tabPages = new ArrayList<TabPageDescriptor>();
        m_logger.info("Creating tabbed pane for main window");
        
        IFieldDescriptorFactory ff = FldDescFactoryLocator.getFieldDescriptorFactory();

        INodeContextPanel ncpanel = NodeContextPanelFactory.getNodeContextPanel();
        ncpanel.initialise(parent, this, 6666);
        TabPageDescriptor tpd = new TabPageDescriptor("entry",  
                    getFrameSettings().getResourceBundle(), 
                    "node", 
                    null, 
                    ncpanel);
        tabPages.add(tpd);
        
        DataInputDescriptor did = new DataInputDescriptor("pane", 
                    getFrameSettings().getResourceBundle(), true);
        did.addField(ff.getLabelField("kl", "labelPane", "This is Mars calling"));
        IDataInputPanel dipanel = DataInputPanelFactory.createPanel(parent, did);
        dipanel.setCommandHandler(null, 0);
        tpd = new TabPageDescriptor("data",  
                    getFrameSettings().getResourceBundle(), 
                    "data", 
                    new IconDescriptor("save.gif", getClass()), 
                    dipanel);
        tabPages.add(tpd);

        did = new DataInputDescriptor("entry", getFrameSettings().getResourceBundle(), true);
        did.addField(FldDescFactoryLocator.getFieldDescriptorFactory().getTextField("text1", 
                    "text1", 
                    "This is Mars calling"));
        did.addField(FldDescFactoryLocator.getFieldDescriptorFactory().getTextField("text2", 
                    "text2", 
                    "This is Mars calling"));
        did.addField(FldDescFactoryLocator.getFieldDescriptorFactory().getTextField("text3", 
                    "text3", "This is Mars calling"));
        dipanel = DataInputPanelFactory.createPanel(null, did);
        dipanel.setCommandHandler(null, 0);
        tpd = new TabPageDescriptor("data1", 
                    getFrameSettings().getResourceBundle(), 
                    "entry", 
                    new IconDescriptor("open.gif", getClass()), 
                    dipanel);
        tabPages.add(tpd);

        IOutputResultPanel orp = OutputResultPanelFactory.getOutputResultPanel();
        orp.initialise(parent, this);
        tpd = new TabPageDescriptor("output",  
                    getFrameSettings().getResourceBundle(), 
                    "output", 
                    null, 
                    orp);
        tabPages.add(tpd);
        
        IReportViewPanel rvp = ReportViewPanelFactory.getOutputResultPanel();
        rvp.initialise(parent, this);
        tpd = new TabPageDescriptor("report",  
                    getFrameSettings().getResourceBundle(), 
                    "report", 
                    null, 
                    rvp);
        tabPages.add(tpd);
        
        ISettingsPanel spanel = SettingsPanelFactory.getSettingsPanel();
        spanel.initialise(parent, this);
        tpd = new TabPageDescriptor("settings",  
                    getFrameSettings().getResourceBundle(), 
                    "opts", 
                    null, 
                    spanel);
        tabPages.add(tpd);

        IAboutPanel panel = AboutPanelFactory.getAboutPanel();
        panel.initialise(parent, 
                    null, 
                    "2008", 
                    "ADDC Infotech GmbH (Peter Kanis)", 
                    "Wadjet-GUI", "5.3.0");
        tpd = new TabPageDescriptor("about",  
                    getFrameSettings().getResourceBundle(), 
                    "about", 
                    null, 
                    panel);
        tabPages.add(tpd);

        // Create the tab panel
        m_tabPanel = TabPanelFactory.getTabPanel();
        m_tabPanel.initialise(splitPanel.getComponent(), tabPages);
        splitPanel.setSecondContentPanel(m_tabPanel);

        return splitPanel;
    }

back to top

Creating TabPanes

Creating a tb pane is shown in the exaple code for Creating Content

Creating TreePanes

The tree pane is usually the controlling view of an application as the selected node will determine what is hown elsewhere, for example in browsers). The GUI framework is especially apt for making this kind of application allowing you to associate popup menus and context data panes with a node.

The tree nodes must be extensions of the TreeElement class, this supplies methods that are used to get the keys for the popup menu, the context panel and the icon that are shown for the node.

The context panel is created as a component in a Stacked panel through the INodeContextPanel implementation. This gets its structor by querying the IFrameConfigurationManager for the list of panel descriptors that are used to create stacked panels. these each have a key associted with them which must the same key as returned by the TreeElement.getContextPanelKey() method.

    /**
     * @see com.addc.gui.config.AFrameComponentManager#createContextPanelDescriptors()
     */
    protected List<DataInputDescriptor> createContextPanelDescriptors() {
        IFieldDescriptorFactory fdf = FldDescFactoryLocator.getFieldDescriptorFactory();
        ResourceBundle res = getFrameSettings().getResourceBundle();
        List<DataInputDescriptor> dids = new ArrayList<DataInputDescriptor>();
        
        DataInputDescriptor did = new DataInputDescriptor("Root", "rootTitle", res);
        did.setAlignOnTop(true);
        did.addField(fdf.getTextField("root1", "rootF1", ""));
        did.addField(fdf.getTextField("root2", "rootF2", ""));
        did.addField(fdf.getTextField("root3", "rootF3", ""));
        dids.add(did);
        
        did = new DataInputDescriptor("Node1", "node1Title", res);
        did.setAlignOnTop(true);
        did.addField(fdf.getTextField("node11", "node1F1", ""));
        did.addField(fdf.getTextField("node12", "node1F2", ""));
        did.addField(fdf.getCheckField("node13", "node1F3", true));
        dids.add(did);
        
        did = new DataInputDescriptor("Node2", res, true);
        did.addField(fdf.getTextField("node21", "node2F1", ""));
        did.addField(fdf.getTextField("node22", "node2F2", ""));
        File dir = new File(System.getProperty("user.dir"));
        did.addField(fdf.getTextWithButtonField("node23", 
                    "node2F3", 
                    "", 
                    DirectoryChooserFactory.getDirectoryChooser(dir)));
        dids.add(did);

        List<Object> values = new ArrayList<Object>();
        values.add("Nine green bottles");
        values.add("Eight green bottles");
        values.add("Seven green bottles");
        values.add("Six green bottles");
        values.add("Five green bottles");
        values.add("Four green bottles");
        values.add("Three green bottles");
        
        did = new DataInputDescriptor("Node3", "node3Title", res);
        did.setAlignOnTop(true);
        did.addField(fdf.getTextField("node31", "node3F1", ""));
        did.addField(fdf.getComboField("node33", "node3F2", values, false, 3));
        dids.add(did);

        did = new DataInputDescriptor("SubNode", res, true);
        did.addField(fdf.getLabelField("node41", "node4F1", ""));
        did.addField(fdf.getListField("node43", values, 4));
        dids.add(did);

        return dids;
    }

The icons shown for a node are obtained from an IContextIconManager which obtains a list of list of ContextIconDescriptors from the frame manager:

    /**
     * @see com.addc.gui.config.AFrameComponentManager#createContextIconDescriptors()
     */
    protected List<ContextIconDescriptor> createContextIconDescriptors() {
        List<ContextIconDescriptor> contextIcons = new ArrayList<ContextIconDescriptor>();
        ContextIconDescriptor icon = new ContextIconDescriptor(
                    new IconDescriptor("simulator.gif", getClass()), "Root");
        contextIcons.add(icon);

        icon = new ContextIconDescriptor(
                    new IconDescriptor("operation.gif", getClass()), "Node1");
        contextIcons.add(icon);
        ...
        ...
        icon = new ContextIconDescriptor(
                    new IconDescriptor("field.gif", getClass()), "SubNode");
        contextIcons.add(icon);

        return contextIcons;
    }

Each descriptor contains a key which must be same as the key returned by the TreeElement.getIconKey() method.

The TreePanel also associates a set of PopupMenu objects with each node to supply context sensitive menus. These are also obtained from the frame manager along with the IActionCommandHandler for handling selection events on these menus. The PopupMenu objects all contain a key that must be the same that returned by TreeElement.getPopupMenuKey() .

    /**
     * @see com.addc.gui.config.AFrameComponentManager#createPopupMenuDescriptors()
     */
    protected List<PopupMenuDescriptor> createPopupMenuDescriptors() {
        List<PopupMenuDescriptor> popups = new ArrayList<PopupMenuDescriptor>();

        List<PopupItemDescriptor> items = new ArrayList<PopupItemDescriptor>();
        PopupItemDescriptor item = new PopupItemDescriptor();
        item.setCommand(3000);
        item.setText("item1");
        item.setIcon(new IconDescriptor("simulator.gif", getClass()));
        items.add(item);
        item = new PopupItemDescriptor();
        item.setCommand(3001);
        item.setText("item2");
        item.setIcon(new IconDescriptor("save.gif", getClass()));
        items.add(item);
        PopupMenuDescriptor popup = new PopupMenuDescriptor("Root", items);
        popups.add(popup);

        items = new ArrayList<PopupItemDescriptor>();
        item = new PopupItemDescriptor();
        item.setCommand(3002);
        item.setText("item3");
        item.setIcon(new IconDescriptor("behaviour.gif", getClass()));
        items.add(item);
        item = new PopupItemDescriptor();
        item.setCommand(3001);
        item.setText("item4");
        item.setIcon(new IconDescriptor("open.gif", getClass()));
        items.add(item);
        popup = new PopupMenuDescriptor("Node1", items);
        popups.add(popup);
        ...
        ...
        return popups;
    }

    /**
     * @see com.addc.gui.config.AFrameComponentManager#createPopupCommandhandlers()
     */
    protected Map<String, IActionCommandHandler> createPopupCommandhandlers() {
        Map<String, IActionCommandHandler> popupHandlers = 
                new HashMap<String, IActionCommandHandler>();

        popupHandlers.put("Root", new IActionCommandHandler() {

            public void handleCommand(ActionCommandEvent command) {
                ResourceBundle bundle = getFrameSettings().getResourceBundle();
                m_logger.debug(command);
                List<String> msgs = new ArrayList<String>();
                msgs.add(bundle.getString("rootMsg") + command);
                DialogManagerFactory.getDialogManager().messageDialog(msgs, "Popup Message");
            }
        });

        popupHandlers.put("Node1", new IActionCommandHandler() {

            public void handleCommand(ActionCommandEvent command) {
                m_logger.debug(command);
                ResourceBundle bundle = getFrameSettings().getResourceBundle();
                List<String> msgs = new ArrayList<String>();
                msgs.add(bundle.getString("node1Msg") + command);
                DialogManagerFactory.getDialogManager().messageDialog(msgs, "Popup Message");
            }
        });
        ...
        ...
        return popupHandlers;
    }

back to top

Creating Data Input Panels

data Input Panels are also created using descriptors as you can see in the code examples above. You can also create these and show them as Dialogs using the IDialogManager instance for the platform:

    DataInputDescriptor did = new DataInputDescriptor("", resourceBundle);   
    did.addField(FldDescFactoryLocator.getFieldDescriptorFactory().getTextField("text1",
            "text1",
            "This is Mars calling"));
    did.addField(FldDescFactoryLocator.getFieldDescriptorFactory().getTextField("text2",
            "text2",
            "This is Mars calling"));
    did.addField(FldDescFactoryLocator.getFieldDescriptorFactory().getTextField("text3",
            "text3",
            "This is Mars calling"));
    IDataInputPanel panel = DataInputPanelFactory.createPanel(null, did);
    panel.setCommandHandler(null, 0);
    IDataInputDialog dlg = 
        DialogManagerFactory.getDialogManager().getDialog("Boo to the Gander", did);

back to top