1 package org.glassbox.gui;
2
3 import org.glassbox.SwingThread;
4
5 import java.util.HashMap;
6 import java.util.Iterator;
7
8 /***
9 Abstract implementation of group.
10 */
11 public abstract class AbstractGroup implements Group {
12 protected HashMap _members;
13 protected HashMap _properties;
14
15 public AbstractGroup() {
16 _members = new HashMap();
17 _properties = new HashMap();
18 }
19
20 public void addMember(Member member) {
21 Member oldmember = (Member)_members.put(member.getIdentifier(), member);
22 member.setGroup(this);
23
24
25 if (oldmember != null) oldmember.setGroup(null);
26 }
27
28 public void removeMember(String identifier) {
29 Member member = (Member)_members.remove(identifier);
30 if (member!=null) member.setGroup(null);
31 }
32
33 public void setProperty(String name, Object value) {
34 Object oldvalue = _properties.get(name);
35 _properties.put(name, value);
36 firePropertyChanged(name, oldvalue, value);
37 }
38
39 public Object getProperty(String name) {
40 return _properties.get(name);
41 }
42
43 public Member getMember(String name) {
44 return (Member)_members.get(name);
45 }
46
47 /***
48 Fire a property change.
49 The event is only fired, if the old value is not equal to the new value.
50 */
51 protected void firePropertyChanged(final String name, final Object oldvalue, final Object newvalue) {
52 if (!((oldvalue == null && newvalue == null) ||
53 (oldvalue != null && oldvalue.equals(newvalue)))) {
54 SwingThread.invokeAndWaitSilently(new Runnable() {
55 public void run() {
56 Iterator members = _members.values().iterator(); while(members.hasNext()) {
57 ((Member)members.next()).groupPropertyChanged(name, oldvalue, newvalue);
58 }
59 }
60 });
61 }
62 }
63 }