1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 """Abstract container class that manages event listeners and sending events
17 to them."""
18
19 from muntjac.util import EventObject
20
21 from muntjac.data.container import \
22 (IContainer, IItemSetChangeEvent, IPropertySetChangeEvent,
23 IPropertySetChangeListener, IItemSetChangeListener)
24
25
27 """Abstract container class that manages event listeners and sending events
28 to them (L{PropertySetChangeNotifier}, L{ItemSetChangeNotifier}).
29
30 Note that this class provides the internal implementations for both types
31 of events and notifiers as protected methods, but does not implement the
32 L{IPropertySetChangeNotifier} and L{ItemSetChangeNotifier} interfaces
33 directly. This way, subclasses can choose not to implement them.
34 Subclasses implementing those interfaces should also override the
35 corresponding L{addListener} and L{removeListener} methods to make them
36 public.
37 """
38
40
41 self._propertySetChangeListeners = list()
42
43
44 self._itemSetChangeListeners = list()
45
46 self._propertySetChangeCallbacks = dict()
47
48 self._itemSetChangeCallbacks = dict()
49
50
69
70
71 - def addCallback(self, callback, eventType=None, *args):
72 if eventType is None:
73 eventType = callback._eventType
74
75 if issubclass(eventType, IItemSetChangeEvent):
76 self._itemSetChangeCallbacks[callback] = args
77
78 elif issubclass(eventType, IPropertySetChangeEvent):
79 self._propertySetChangeCallbacks[callback] = args
80
81 else:
82 super(AbstractContainer, self).addCallback(callback,
83 eventType, args)
84
85
104
105
107 if eventType is None:
108 eventType = callback._eventType
109
110 if (issubclass(eventType, IItemSetChangeEvent) and
111 callback in self._itemSetChangeCallbacks):
112 del self._itemSetChangeCallbacks[callback]
113
114 elif (issubclass(eventType, IPropertySetChangeEvent) and
115 callback in self._propertySetChangeCallbacks):
116 del self._propertySetChangeCallbacks[callback]
117
118 else:
119 super(AbstractContainer, self).removeCallback(callback, eventType)
120
121
123 """Sends a simple Property set change event to all interested
124 listeners.
125
126 Use L{fireContainerPropertySetChange} instead of this method
127 unless additional information about the exact changes is available and
128 should be included in the event.
129
130 @param event:
131 the property change event to send, optionally with
132 additional information
133 """
134 if event is None:
135 event = BasePropertySetChangeEvent(self)
136
137 for listener in self.getPropertySetChangeListeners():
138 listener.containerPropertySetChange(event)
139
140 for callback, args in self._propertySetChangeCallbacks.iteritems():
141 callback(event, *args)
142
143
145 """Sends a simple Item set change event to all interested listeners,
146 indicating that anything in the contents may have changed (items added,
147 removed etc.).
148
149 @param event:
150 the item set change event to send, optionally with
151 additional information
152 """
153 if event is None:
154 event = BaseItemSetChangeEvent(self)
155
156 for listener in self.getItemSetChangeListeners():
157 listener.containerItemSetChange(event)
158
159 for callback, args in self._itemSetChangeCallbacks.iteritems():
160 callback(event, *args)
161
162
164 """Sets the property set change listener collection. For internal
165 use only.
166 """
167 self._propertySetChangeListeners = propertySetChangeListeners
168
169
171 """Returns the property set change listener collection. For internal
172 use only.
173 """
174 return self._propertySetChangeListeners
175
176
178 """Sets the item set change listener collection. For internal use only.
179 """
180 self._itemSetChangeListeners = itemSetChangeListeners
181
182
184 """Returns the item set change listener collection. For internal use
185 only."""
186 return self._itemSetChangeListeners
187
188
190 if issubclass(eventType, IPropertySetChangeEvent):
191 return list(self._propertySetChangeListeners)
192
193 elif issubclass(eventType, IItemSetChangeEvent):
194 return list(self._itemSetChangeListeners)
195
196 return list()
197
198
200 if issubclass(eventType, IPropertySetChangeEvent):
201 return dict(self._propertySetChangeCallbacks)
202
203 elif issubclass(eventType, IItemSetChangeEvent):
204 return dict(self._itemSetChangeCallbacks)
205
206 return dict()
207
208
211 """An C{event} object specifying the container whose Property
212 set has changed.
213
214 This class does not provide information about which properties were
215 concerned by the change, but subclasses can provide additional
216 information about the changes.
217 """
218
221
222
225
226
228 """An C{event} object specifying the container whose Item set
229 has changed.
230
231 This class does not provide information about the exact changes
232 performed, but subclasses can add provide additional information about
233 the changes.
234 """
235
238
239
242