Source code: dexter/core/AbstractService.java
1 /*
2 * AbstractService.java
3 *
4 * Created on November 7, 2002, 3:24 PM
5 */
6
7 package dexter.core;
8
9 import javax.swing.tree.*;
10 import java.util.HashMap;
11 import java.util.Vector;
12 import javax.swing.JPopupMenu;
13 import javax.swing.JMenu;
14 import javax.swing.JMenuBar;
15 import javax.swing.ImageIcon;
16 import javax.swing.JPanel;
17 import javax.swing.JMenuItem;
18 import dexter.swingExtensions.*;
19 import dexter.property.*;
20
21
22 /**
23 *
24 * @author Tobias Riemer
25 */
26 abstract public class AbstractService implements Service, Entry, Trayable {
27
28 int id = 0;
29 protected JPopupMenu popup = new JPopupMenu();
30 protected JMenuItem optionMenuItem = new JMenuItem();
31 protected PluginMenu pluginMenu = new PluginMenu();
32 protected OptionAction optionAction;
33 protected String classname = "";
34 Vector dataChangeListeners = new Vector();
35 Vector trayListeners = new Vector();
36 protected DefaultMutableTreeNode root = new DefaultMutableTreeNode(this);
37 String name = new String();
38 String toolTipText = new String();
39 javax.swing.ImageIcon icon;
40
41 protected TreePanel treePanel = null;
42
43 protected Property pTray = new Property("Show in Tray",Property.BOOLEAN_VALUE);
44 protected PropertyFile propertyFile = new PropertyFile();
45
46 /** Creates a new instance of Service */
47 public AbstractService() {
48 classname = this.getClass().getName();
49 int ci = classname.lastIndexOf('.');
50 if (ci != -1) classname = classname.substring(ci+1);
51 classname = classname + ":" + this.getId();
52
53 treePanel = new TreePanel(root, this);
54 updateUI();
55 this.addDataChangeListener((dexter.core.DataChangeListener) treePanel);
56 fireNodeChanged(root);
57 }
58
59 public void addDataChangeListener(DataChangeListener dcl) {
60 dataChangeListeners.add(dcl);
61 }
62
63 public void removeDataChangeListener(DataChangeListener dcl) {
64 dataChangeListeners.remove(dcl);
65 }
66
67 public void addTrayListener(TrayListener tcl) {
68 trayListeners.add(tcl);
69 }
70
71 public void removeTrayListener(TrayListener tcl) {
72 trayListeners.remove(tcl);
73 }
74
75 public void fireNodeRemoved(DefaultMutableTreeNode node) {
76 for(int i=0;i<dataChangeListeners.size();i++) {
77 DataChangeListener dcl = (DataChangeListener) dataChangeListeners.get(i);
78 dcl.removeNode(node);
79 }
80 }
81
82 public void fireNodeRemoveAll(DefaultMutableTreeNode node) {
83 for(int i=0;i<dataChangeListeners.size();i++) {
84 DataChangeListener dcl = (DataChangeListener) dataChangeListeners.get(i);
85 while (node.getChildCount() > 0) {
86 dcl.removeNode((DefaultMutableTreeNode) node.getChildAt(0));
87 }
88 }
89 }
90
91
92 public void fireNodeAdded(DefaultMutableTreeNode parent, DefaultMutableTreeNode node) {
93 for(int i=0;i<dataChangeListeners.size();i++) {
94 DataChangeListener dcl = (DataChangeListener) dataChangeListeners.get(i);
95 dcl.addNode(parent, node);
96 }
97 }
98
99 public void fireAddToTray() {
100 for(int i=0;i<trayListeners.size();i++) {
101 TrayListener tcl = (TrayListener) trayListeners.get(i);
102 tcl.addTrayIcon((Trayable) this);
103 }
104 for(int i=0;i<dataChangeListeners.size();i++) {
105 DataChangeListener dcl = (DataChangeListener) dataChangeListeners.get(i);
106 dcl.hideRoot();
107 }
108 }
109
110 public void fireRemoveFromTray() {
111 for(int i=0;i<trayListeners.size();i++) {
112 TrayListener tcl = (TrayListener) trayListeners.get(i);
113 tcl.removeTrayIcon((Trayable) this);
114 }
115 for(int i=0;i<dataChangeListeners.size();i++) {
116 DataChangeListener dcl = (DataChangeListener) dataChangeListeners.get(i);
117 dcl.showRoot();
118 }
119 }
120
121 public void fireChangeTray() {
122 for(int i=0;i<trayListeners.size();i++) {
123 TrayListener tcl = (TrayListener) trayListeners.get(i);
124 tcl.changeTrayIcon((Trayable) this);
125 }
126 }
127
128 public void fireNodeMoved(DefaultMutableTreeNode newParent, DefaultMutableTreeNode node) {
129 for(int i=0;i<dataChangeListeners.size();i++) {
130 DataChangeListener dcl = (DataChangeListener) dataChangeListeners.get(i);
131 dcl.moveNode(newParent, node);
132 }
133 }
134
135 public void fireNodeChanged(DefaultMutableTreeNode node) {
136 for(int i=0;i<dataChangeListeners.size();i++) {
137 DataChangeListener dcl = (DataChangeListener) dataChangeListeners.get(i);
138 dcl.changeNode(node);
139 }
140 if (node == root) {
141 fireChangeTray();
142 }
143 }
144
145 public DefaultMutableTreeNode getRootTreeNode() {
146 return root;
147 }
148
149 public void setServiceName(String name) {
150 this.name = name;
151 }
152
153 public void setToolTipText(String ttt) {
154 this.toolTipText = ttt;
155 }
156
157 public void fireSelected() {}
158
159 public javax.swing.ImageIcon getIcon() {
160 return icon;
161 }
162
163 public void setIcon(javax.swing.ImageIcon icon) {
164 this.icon = icon;
165 }
166
167
168 public String getToolTipText() {
169 return toolTipText;
170 }
171
172 public String toString() {
173 return name;
174 }
175
176 protected void invokePropertyDlg() {
177 new PropertiesDlg(null, propertyFile).show();
178 }
179
180 public JPopupMenu getPopupMenu() {
181 return popup;
182 }
183
184 public PropertyFile getPropertyFile() {
185 return propertyFile;
186 }
187
188 public void init() {
189
190
191 PluginMenu m1 = new PluginMenu("OPTIONS", pluginMenu);
192 PluginMenu m2 = new PluginMenu("PLUGINS", m1);
193 m1.add(m2);
194 optionAction = new OptionAction();
195 m2.add(optionAction);
196 pluginMenu.add(m1);
197
198 optionMenuItem = new JMenuItem("Options");
199
200 propertyFile.setId(id);
201 optionMenuItem.addActionListener(new java.awt.event.ActionListener() {
202 public void actionPerformed(java.awt.event.ActionEvent evt) {
203 invokePropertyDlg();
204 }
205 });
206 popup.add(optionMenuItem);
207
208 popup.addSeparator();
209
210 propertyFile.getHiddenPropertyGroup().addProperty(pTray);
211 if (!propertyFile.loadFile()) {
212 PropertyWizard setupWizard = Dexter.getInstance().getSetupWizard();
213 setupWizard.addPropertyFile(propertyFile);
214 setupWizard.setVisible(true);
215 }
216 pTray.addPropertyChangedListener(new dexter.property.PropertyChangedListener() {
217 public void propertyChanged(Property p) {
218 System.out.println("tray prop");
219 if (pTray.booleanValue()) {
220 fireAddToTray();
221 } else {
222 fireRemoveFromTray();
223 }
224 }
225 });
226 if (isTray()) fireAddToTray();
227 }
228
229 public void destroy() {
230 propertyFile.saveFile();
231 }
232
233 public java.awt.Font getFont() {
234 return null;
235 }
236
237 public JPanel getPanel() {
238 return treePanel;
239 }
240
241 /** Getter for property id.
242 * @return Value of property id.
243 */
244 public int getId() {
245 return id;
246 }
247
248 /** Setter for property id.
249 * @param id New value of property id.
250 */
251 public void setId(int id) {
252 this.id = id;
253 }
254
255 public ImageIcon getRollOverIcon() {
256 return getIcon();
257 }
258
259 public ImageIcon getTrayIcon() {
260 return getIcon();
261 }
262
263 public JPopupMenu getTrayPopupMenu() {
264 return null;
265 }
266
267 public boolean isTray() {
268 return pTray.booleanValue();
269 }
270
271 public void removeFromTray() {
272 pTray.setValue(false);
273 pTray.commitValue();
274 }
275
276 abstract public boolean isDestroyed() ;
277
278 public void sendToTray() {
279 pTray.setValue(true);
280 pTray.commitValue();
281 }
282
283 public void updateUI() {
284 System.out.println("updateUI: " + name);
285 treePanel.setIcons(
286 dexter.core.Dexter.resourceFactory().getIcon("dexter","PANEL_MAXIMIZE"),
287 dexter.core.Dexter.resourceFactory().getIcon("dexter","PANEL_MINIMIZE"),
288 dexter.core.Dexter.resourceFactory().getIcon("dexter","PANEL_FULLSCREEN"),
289 dexter.core.Dexter.resourceFactory().getIcon("dexter","PANEL_TO_TRAY"));
290 treePanel.setBarIcon(dexter.core.Dexter.resourceFactory().getIcon("dexter","TREE_BARICON"));
291 Integer end = (Integer) javax.swing.UIManager.get("BAR_END");
292 if (end != null)
293 treePanel.setBarEnd(end.intValue());
294 Integer beg = (Integer) javax.swing.UIManager.get("BAR_BEG");
295 if (beg != null)
296 treePanel.setBarEnd(beg.intValue());
297 //treePanel.updateUI();
298 };
299
300 public PluginMenu getPluginMenu() {
301 return pluginMenu;
302 }
303
304
305 public class OptionAction extends javax.swing.AbstractAction {
306
307 /**
308 * @todo Provide an Icon for Send
309 */
310 public OptionAction() {
311 super(classname);
312 }
313
314 /** Invoked when an action occurs.
315 */
316 public void actionPerformed(java.awt.event.ActionEvent e) {
317 invokePropertyDlg();
318 }
319 }
320
321 }