001    package org.springframework.richclient.widget;
002    
003    import org.springframework.richclient.command.AbstractCommand;
004    
005    import javax.swing.*;
006    import java.util.List;
007    
008    /**
009     * Widget specifies the interface for Swing component factories
010     *
011     * General usage of implementations:
012     * <ol>
013     * <li>Instantiate the widget</li>
014     * <li>Set specific parameters for the widget or use overloaded constructors
015     * to combine this step and the previous one</li>
016     * <li>Get the component using {@link #getComponent()}</li>
017     * </ol>
018     */
019    public interface Widget
020    {
021        static Widget EMPTY_WIDGET = new AbstractWidget(){
022    
023            public JComponent getComponent()
024            {
025                return new JPanel();
026            }};
027    
028        /**
029         * @return A not <code>null</code> graphical component built using the
030         * parameters held in the widget instance.
031         */
032        public JComponent getComponent();
033    
034        /**
035         * Hook method called before showing the component on screen.
036         */
037        public void onAboutToShow();
038    
039        /**
040         * Hook method called before moving the component to the background (=hiding)
041         */
042        public void onAboutToHide();
043    
044        /**
045         * Encompasses the status of the widget between onAboutToShow() and onAboutToHide().
046         * A component does not know when it's active, even if there is an isShowing() method
047         * in it's API (due to tab panels or scroll panes).
048         *
049         * @return <code>true</code> if the widget is shown in the foreground.
050         */
051        public boolean isShowing();
052    
053        /**
054         * Checks whether this component can be closed visually, for example when there
055         * are no unsaved changes.
056         *
057         * @return <code>true</code> if the widget can be closed without problems.
058         */
059        public boolean canClose();
060    
061        /**
062         * Returns a list of commands for this widget.
063         */
064        public List<? extends AbstractCommand> getCommands();
065    }