Package muntjac :: Package data :: Package util :: Module abstract_property
[hide private]
[frames] | no frames]

Source Code for Module muntjac.data.util.abstract_property

  1  # Copyright (C) 2012 Vaadin Ltd.  
  2  # Copyright (C) 2012 Richard Lincoln 
  3  #  
  4  # Licensed under the Apache License, Version 2.0 (the "License");  
  5  # you may not use this file except in compliance with the License.  
  6  # You may obtain a copy of the License at  
  7  #  
  8  #     http://www.apache.org/licenses/LICENSE-2.0  
  9  #  
 10  # Unless required by applicable law or agreed to in writing, software  
 11  # distributed under the License is distributed on an "AS IS" BASIS,  
 12  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
 13  # See the License for the specific language governing permissions and  
 14  # limitations under the License. 
 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
30 - def __init__(self):
31 #: List of listeners who are interested in the read-only status 32 # changes of the IProperty 33 self._readOnlyStatusChangeListeners = list() 34 35 #: List of listeners who are interested in the value changes of 36 # the IProperty 37 self._valueChangeListeners = list() 38 39 #: Is the IProperty read-only? 40 self._readOnly = None 41 42 self._readOnlyStatusChangeCallbacks = dict() 43 44 self._valueChangeCallbacks = dict()
45 46 47
48 - def isReadOnly(self):
49 """Override for additional restrictions on what is considered a 50 read-only property. 51 """ 52 return self._readOnly
53 54
55 - def setReadOnly(self, newStatus):
56 oldStatus = self.isReadOnly() 57 self._readOnly = newStatus 58 if oldStatus != self.isReadOnly(): 59 self.fireReadOnlyStatusChange()
60 61
62 - def __str__(self):
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
75 - def addListener(self, listener, iface=None):
76 """Registers a new read-only status change listener for this IProperty. 77 78 @param listener: 79 the new Listener to be registered. 80 """ 81 if (isinstance(listener, prop.IReadOnlyStatusChangeListener) and 82 (iface is None or 83 issubclass(iface, prop.IReadOnlyStatusChangeListener))): 84 85 self._readOnlyStatusChangeListeners.append(listener) 86 87 if (isinstance(listener, prop.IValueChangeListener) and 88 (iface is None or 89 issubclass(iface, prop.IValueChangeListener))): 90 91 self._valueChangeListeners.append(listener)
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
109 - def removeListener(self, listener, iface=None):
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
128 - def removeCallback(self, callback, eventType=None):
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
144 - def fireReadOnlyStatusChange(self):
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
155 - def fireValueChange(self):
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
165 - def getListeners(self, eventType):
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
175 - def getCallbacks(self, eventType):
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
185 -class IReadOnlyStatusChangeEvent(EventObject, prop.IProperty, 186 prop.IReadOnlyStatusChangeEvent):
187 """An C{Event} object specifying the IProperty whose read-only 188 status has been changed. 189 """ 190
191 - def __init__(self, source):
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
200 - def getProperty(self):
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
208 -class ValueChangeEvent(EventObject, prop.ValueChangeEvent):
209 """An C{Event} object specifying the IProperty whose value has 210 been changed. 211 """ 212
213 - def __init__(self, source):
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
222 - def getProperty(self):
223 """Gets the IProperty whose value has changed. 224 225 @return: source IProperty of the event. 226 """ 227 return self.getSource()
228