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 }