001    package nl.cwi.sen1.gui;
002    
003    import javax.swing.Action;
004    import javax.swing.JMenu;
005    
006    import nl.cwi.sen1.configapi.types.Event;
007    import nl.cwi.sen1.gui.component.StudioComponent;
008    import toolbus.AbstractTool;
009    import aterm.ATermFactory;
010    
011    /**
012     * The interface to the toplevel studio window.
013     * The Studio interface provides StudioPlugins with functionality
014     * for modifying properties of the toplevel window of a MetaStudio,
015     * as well as some convenience methods (functionality that is needed
016     * by virtually all StudioPlugins). 
017     */
018    public interface Studio {
019        /**
020         * Get 'The' ATermFactory. For memory efficiency it is beneficial
021         * to share a single ATermFactory between all StudioPlugins. If ATerms
022         * are communicated between them, this is also a requirement.
023         *
024         * @return A reference to The ATerm Factory.
025         */
026        public ATermFactory getATermFactory();
027    
028        /**
029         * Connect to the ToolBus. Many StudioPlugins will have their private
030         * connection to the ToolBus. This is the method to start it up. Note
031         * that a single plugin may use this method several times.
032         *
033         * @param toolName Name of the tool as it occurs in the ToolBus script.
034         * @param tool     Java implementation of a ToolBus tool.
035         */ 
036        public void connect(String toolName, AbstractTool tool);
037    
038        /**
039         * Register a StudioComponent. One StudioComponent corresponds to a
040         * single 'tab' somewhere in the GUI framework of the MetaStudio. The
041         * component will become immediately visible.
042         *
043         * @param component Component to add.
044         */
045        public void addComponent(StudioComponent component);
046    
047        /**
048         * Unregister a StudioComponent. This is the inverse of addComponent.
049         * The component will become invisible immediately.
050         *
051         * @param component Component to remove.
052         */ 
053        public void removeComponent(StudioComponent component);
054    
055        /**
056         * Register a menu that is linked with a particular component. The
057         * studio manages menus, such that the menus for a particular component
058         * are visible if and only if that component has the focus.
059         *
060         * @param component Component to link a menu with.
061         * @param menu      JMenu to link to a component.
062         */
063        public void addComponentMenu(StudioComponent component, JMenu menu);
064    
065        /**
066         * Register a menu that is linked with a particular component. The
067         * studio manages menus, such that the menus for a particular component
068         * are visible if and only if that component has the focus. 
069         */
070        public void addComponentMenu(StudioComponent component, Event menu,
071                Action action);
072    
073        /**
074         * Make the Studio move the focus to a specific Component.
075         * @param component Component to move the focus to.
076         */
077        public void requestFocus(StudioComponent component);
078        
079        /**
080         * Make a specific Component visible.
081         * @param component Component to make visible.
082         */    
083        public void makeVisible(StudioComponent component);
084    }