001    package nl.cwi.sen1.gui.component;
002    
003    import javax.swing.Icon;
004    import javax.swing.JComponent;
005    import javax.swing.event.EventListenerList;
006    
007    import nl.cwi.sen1.gui.CloseAbortedException;
008    
009    /**
010     * A default implementation of a StudioComponent. This is the starting
011     * point for any StudioComponent. This convience class wraps a JComponent,
012     * and implements the default behavior for the StudioComponent interface.
013     */
014    public class StudioComponentImpl implements StudioComponent {
015        private Icon icon;
016    
017        private EventListenerList listenerList = new EventListenerList();
018    
019        private String name;
020    
021        private String tooltip;
022        
023        private JComponent viewComponent;
024    
025        /**
026         * Construct a new component.
027         * @param name the name of the component (for a tab label).
028         * @param viewComponent the Swing component to show in the tab.
029         */
030        public StudioComponentImpl(String name, JComponent viewComponent) {
031            this.name = name;
032            this.viewComponent = viewComponent;
033        }
034        
035        public StudioComponentImpl(String name, JComponent viewComonent, String tooltip) {
036            this.name = name;
037            this.viewComponent = viewComonent;
038            this.tooltip = tooltip;
039        }
040    
041        public String getName() {
042            return name;
043        }
044    
045        public void setName(String name) {
046            this.name = name;
047            fireNameChangedEvent();
048        }
049        
050        public String getTooltip() {
051            return tooltip;
052        }
053        
054        public void setTooltip(String tooltip) {
055            this.tooltip = tooltip;
056            fireTooltipChangedEvent();
057        }
058    
059        public JComponent getViewComponent() {
060            return viewComponent;
061        }
062    
063        public void addStudioComponentListener(StudioComponentListener l) {
064            listenerList.add(StudioComponentListener.class, l);
065        }
066    
067        public void removeStudioComponentListener(StudioComponentListener l) {
068            listenerList.remove(StudioComponentListener.class, l);
069        }
070    
071        // Take from javax.swing.event.EventListenerList example
072        protected void fireComponentRequestClose() throws CloseAbortedException {
073            Object[] listeners = listenerList.getListenerList();
074            for (int i = listeners.length - 2; i >= 0; i -= 2) {
075                if (listeners[i] == StudioComponentListener.class) {
076                    ((StudioComponentListener) listeners[i + 1])
077                            .componentRequestClose();
078                }
079            }
080        }
081    
082        protected void fireComponentClose() {
083            Object[] listeners = listenerList.getListenerList();
084            for (int i = listeners.length - 2; i >= 0; i -= 2) {
085                if (listeners[i] == StudioComponentListener.class) {
086                    ((StudioComponentListener) listeners[i + 1]).componentClose();
087                }
088            }
089        }
090    
091        protected void fireComponentFocusReceived() {
092            Object[] listeners = listenerList.getListenerList();
093            for (int i = listeners.length - 2; i >= 0; i -= 2) {
094                if (listeners[i] == StudioComponentListener.class) {
095                    ((StudioComponentListener) listeners[i + 1])
096                            .componentFocusReceived();
097                }
098            }
099        }
100    
101        public Icon getIcon() {
102            return icon;
103        }
104    
105        public void setIcon(Icon icon) {
106            this.icon = icon;
107        }
108    
109        public void requestClose() throws CloseAbortedException {
110            fireComponentRequestClose();
111        }
112    
113        public void close() {
114            fireComponentClose();
115        }
116    
117        public void receiveFocus() {
118            fireComponentFocusReceived();
119        }
120    
121        public JComponent[] getStatusBarComponents() {
122            return new JComponent[] {};
123        }
124    
125        public void addNameChangedListener(NameChangedListener l) {
126            listenerList.add(NameChangedListener.class, l);
127        }
128    
129        public void removeNameChangedListener(NameChangedListener l) {
130            listenerList.remove(NameChangedListener.class, l);
131        }
132    
133        public void fireNameChangedEvent() {
134            Object[] listeners = listenerList.getListenerList();
135            for (int i = listeners.length - 2; i >= 0; i -= 2) {
136                if (listeners[i] == NameChangedListener.class) {
137                    ((NameChangedListener) listeners[i + 1])
138                            .componentNameChanged();
139                }
140            }
141        }
142    
143            public void addTooltipChangedListener(TooltipChangedListener l) {
144            listenerList.add(TooltipChangedListener.class, l);
145            }
146    
147            public void removeTooltipChangedListener(TooltipChangedListener l) {
148            listenerList.remove(TooltipChangedListener.class, l);
149            }
150    
151            public void fireTooltipChangedEvent() {
152            Object[] listeners = listenerList.getListenerList();
153            for (int i = listeners.length - 2; i >= 0; i -= 2) {
154                if (listeners[i] == TooltipChangedListener.class) {
155                    ((TooltipChangedListener) listeners[i + 1])
156                            .componentTooltipChanged();
157                }
158            }
159        }
160    
161    }