1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 """Abstract base class for property implementations."""
17
18 from muntjac.data import property as prop
19 from muntjac.util import EventObject
20
21
22 -class AbstractProperty(prop.IProperty, prop.IValueChangeNotifier,
23 prop.IReadOnlyStatusChangeNotifier):
24 """Abstract base class for L{IProperty} implementations.
25
26 Handles listener management for L{ValueChangeListener}s and
27 L{IReadOnlyStatusChangeListener}s.
28 """
29
31
32
33 self._readOnlyStatusChangeListeners = list()
34
35
36
37 self._valueChangeListeners = list()
38
39
40 self._readOnly = None
41
42 self._readOnlyStatusChangeCallbacks = dict()
43
44 self._valueChangeCallbacks = dict()
45
46
47
49 """Override for additional restrictions on what is considered a
50 read-only property.
51 """
52 return self._readOnly
53
54
60
61
63 """Returns the value of the C{IProperty} in human readable
64 textual format. The return value should be assignable to the
65 C{setValue} method if the IProperty is not in read-only mode.
66
67 @return: String representation of the value stored in the IProperty
68 """
69 value = self.getValue()
70 if value is None:
71 return None
72 return str(value)
73
74
92
93
94 - def addCallback(self, callback, eventType=None, *args):
95 if eventType is None:
96 eventType = callback._eventType
97
98 if issubclass(eventType, prop.IReadOnlyStatusChangeEvent):
99 self._readOnlyStatusChangeCallbacks[callback] = args
100
101 elif issubclass(eventType, prop.ValueChangeEvent):
102 self._valueChangeCallbacks[callback] = args
103
104 else:
105 super(AbstractProperty, self).addCallback(callback,
106 eventType, *args)
107
108
110 """Removes a previously registered read-only status change listener.
111
112 @param listener:
113 the listener to be removed.
114 """
115 if (isinstance(listener, prop.IReadOnlyStatusChangeListener) and
116 (iface is None or
117 issubclass(iface, prop.IReadOnlyStatusChangeListener))):
118 if listener in self._readOnlyStatusChangeListeners:
119 self._readOnlyStatusChangeListeners.remove(listener)
120
121 if (isinstance(listener, prop.IValueChangeListener) and
122 (iface is None or
123 issubclass(iface, prop.IValueChangeListener))):
124 if listener in self._valueChangeListeners:
125 self._valueChangeListeners.remove(listener)
126
127
129 if eventType is None:
130 eventType = callback._eventType
131
132 if issubclass(eventType, prop.IReadOnlyStatusChangeEvent):
133 if callback in self._readOnlyStatusChangeCallbacks:
134 del self._readOnlyStatusChangeCallbacks[callback]
135
136 elif issubclass(eventType, prop.ValueChangeEvent):
137 if callback in self._valueChangeCallbacks:
138 del self._valueChangeCallbacks[callback]
139
140 else:
141 super(AbstractProperty, self).removeCallback(callback, eventType)
142
143
145 """Sends a read only status change event to all registered listeners.
146 """
147 event = prop.IReadOnlyStatusChangeEvent(self)
148 for listener in self._readOnlyStatusChangeListeners:
149 listener.readOnlyStatusChange(event)
150
151 for callback, args in self._readOnlyStatusChangeCallbacks.iteritems():
152 callback(event, *args)
153
154
156 """Sends a value change event to all registered listeners."""
157 event = ValueChangeEvent(self)
158 for listener in self._valueChangeListeners:
159 listener.valueChange(event)
160
161 for callback, args in self._valueChangeCallbacks.iteritems():
162 callback(event, *args)
163
164
166 if issubclass(eventType, prop.ValueChangeEvent):
167 return list(self._valueChangeListeners)
168
169 elif issubclass(eventType, prop.IReadOnlyStatusChangeEvent):
170 return list(self._readOnlyStatusChangeListeners)
171
172 return list()
173
174
176 if issubclass(eventType, ValueChangeEvent):
177 return dict(self._valueChangeCallbacks)
178
179 elif issubclass(eventType, prop.IReadOnlyStatusChangeEvent):
180 return dict(self._readOnlyStatusChangeCallbacks)
181
182 return dict()
183
184
187 """An C{Event} object specifying the IProperty whose read-only
188 status has been changed.
189 """
190
192 """Constructs a new read-only status change event for this object.
193
194 @param source:
195 source object of the event.
196 """
197 super(IReadOnlyStatusChangeEvent, self).__init__(source)
198
199
201 """Gets the IProperty whose read-only state has changed.
202
203 @return: source IProperty of the event.
204 """
205 return self.getSource()
206
207
209 """An C{Event} object specifying the IProperty whose value has
210 been changed.
211 """
212
214 """Constructs a new value change event for this object.
215
216 @param source:
217 source object of the event.
218 """
219 super(ValueChangeEvent, self).__init__(source)
220
221
223 """Gets the IProperty whose value has changed.
224
225 @return: source IProperty of the event.
226 """
227 return self.getSource()
228