001    package nl.cwi.sen1.tide.tool;
002    
003    import java.net.URL;
004    
005    import javax.swing.Icon;
006    import javax.swing.ImageIcon;
007    import javax.swing.JComponent;
008    import javax.swing.JPanel;
009    import javax.swing.event.EventListenerList;
010    
011    import nl.cwi.sen1.gui.StatusMessageEvent;
012    import nl.cwi.sen1.gui.component.NameChangedListener;
013    import nl.cwi.sen1.gui.component.StudioComponent;
014    import nl.cwi.sen1.gui.component.StudioComponentListener;
015    import nl.cwi.sen1.gui.component.TooltipChangedListener;
016    import nl.cwi.sen1.tide.tool.support.Expr;
017    
018    public abstract class TideTool extends JPanel implements StudioComponent {
019        private static int next_id = 0;
020    
021        private int id;
022    
023        private ToolManager manager;
024    
025        private String name;
026        
027        private String tooltip;
028    
029        private Object target;
030    
031        private String statusMessage;
032    
033        private EventListenerList listenerList = new EventListenerList();
034    
035        public TideTool(ToolManager manager) {
036    
037            this.manager = manager;
038    
039            id = next_id++;
040        }
041    
042        public ToolManager getManager() {
043            return manager;
044        }
045    
046        public int getId() {
047            return id;
048        }
049    
050        public String getName() {
051            return name;
052        }
053        
054        public String getTooltip() {
055            return tooltip;
056        }
057    
058        public Object getTarget() {
059            return target;
060        }
061    
062        public void setName(String name) {
063            this.name = name;
064        }
065    
066        public void setTooltip(String tooltip) {
067            this.tooltip = tooltip;
068        }
069        
070        public void setTarget(Object target) {
071            this.target = target;
072        }
073    
074        protected Icon loadIcon(String name) {
075            URL url = getClass().getResource("/resources/images/" + name);
076            return new ImageIcon(url);
077        }
078    
079        public void displayError(Expr error) {
080            displayError(error.getErrorMessage(), error.getErrorData());
081        }
082    
083        public void displayError(String msg, Expr data) {
084            String string = data.toString();
085            if (!string.equals("[]")) {
086                msg += ": " + string;
087            }
088    
089            manager.displayError(msg);
090        }
091    
092        public void destroy() {
093            manager.removeTool(this);
094        }
095    
096        public Icon getIcon() {
097            return null;
098        }
099    
100        public JComponent getViewComponent() {
101            return this;
102        }
103    
104        public void addStudioComponentListener(StudioComponentListener l) {
105            listenerList.add(StudioComponentListener.class, l);
106        }
107    
108        public void removeStudioComponentListener(StudioComponentListener l) {
109            listenerList.remove(StudioComponentListener.class, l);
110        }
111    
112        public void addNameChangedListener(NameChangedListener l) {}
113    
114        public void removeNameChangedListener(NameChangedListener l) {}
115    
116        public void addTooltipChangedListener(TooltipChangedListener l) {}
117    
118        public void removeTooltipChangedListener(TooltipChangedListener l) {}
119    
120        // Take from javax.swing.event.EventListenerList example
121        protected void fireStatusMessageChanged(String oldMessage, String newMessage) {
122            StatusMessageEvent event = new StatusMessageEvent(this, oldMessage,
123                    newMessage);
124            Object[] listeners = listenerList.getListenerList();
125            for (int i = listeners.length - 2; i >= 0; i -= 2) {
126                if (listeners[i] == StudioComponentListener.class) {
127                    ((StudioComponentListener) listeners[i + 1])
128                            .statusMessageChanged(event);
129                }
130            }
131        }
132    
133        protected void fireComponentFocusReceived() {
134            Object[] listeners = listenerList.getListenerList();
135            for (int i = listeners.length - 2; i >= 0; i -= 2) {
136                if (listeners[i] == StudioComponentListener.class) {
137                    ((StudioComponentListener) listeners[i + 1])
138                            .componentFocusReceived();
139                }
140            }
141        }
142    
143        public void receiveFocus() {
144            fireComponentFocusReceived();
145        }
146    
147        public String getStatusMessage() {
148            return statusMessage;
149        }
150    
151        public JComponent[] getStatusBarComponents() {
152            return null;
153        }
154    
155        public void setStatusMessage(String newMessage) {
156            String oldMessage = statusMessage;
157            statusMessage = newMessage;
158            if (newMessage == null || !newMessage.equals(oldMessage)) {
159                fireStatusMessageChanged(oldMessage, newMessage);
160            }
161        }
162    
163        public void requestClose() {}
164    
165        public void close() {}
166    }