1
2
3
4 """
5 Compatibility classes/functions for Flex.
6
7 @note: Not available in ActionScript 1.0 and 2.0.
8 @see: U{Flex on Wikipedia (external)
9 <http://en.wikipedia.org/wiki/Adobe_Flex>}
10
11 @since: 0.1.0
12 """
13
14 import pyamf
15
16 __all__ = ['ArrayCollection', 'ObjectProxy']
17
18
20 """
21 I represent the ActionScript 3 based class
22 C{flex.messaging.io.ArrayCollection} used in the Flex framework.
23
24 The C{ArrayCollection} class is a wrapper class that exposes an Array
25 as a collection that can be accessed and manipulated using the
26 methods and properties of the C{ICollectionView} or C{IList}
27 interfaces in the Flex framework.
28
29 @see: U{ArrayCollection on Livedocs (external)
30 <http://livedocs.adobe.com/flex/201/langref/mx/collections/ArrayCollection.html>}
31
32 @note: This class does not implement the RemoteObject part of the
33 documentation.
34
35 @ivar length: [read-only] The number of items in this collection.
36 Introduced in 0.4.
37 @type length: C{int}
38 """
39
45
47 if source is not None:
48 if isinstance(source, dict):
49 raise TypeError('Cannot convert dicts to ArrayCollection')
50
51 if hasattr(source, '__iter__'):
52 self.extend(source)
53
55 return "<flex.messaging.io.ArrayCollection %s>" % list.__repr__(self)
56
68
70 output.encoder.writeList(
71 list(self), use_references=True, use_proxies=False)
72
75
77 raise RuntimeError("Property length is read-only")
78
79 length = property(_get_length, _set_length)
80
82 """
83 Adds the specified item to the end of the list.
84
85 @param item: The object to add to the collection.
86 @type item: C{mixed}.
87 @since: 0.4
88 """
89 self.append(item)
90
92 """
93 Adds the item at the specified index.
94
95 @param item: The object to add to the collection.
96 @type item: C{mixed}.
97 @param index: The index at which to place the item.
98 @raise IndexError: If index is less than 0 or greater than the length
99 of the list.
100 @since: 0.4
101 """
102 if index < 0:
103 raise IndexError
104
105 if index > len(self):
106 raise IndexError
107
108 self.insert(index, item)
109
111 """
112 Gets the item at the specified index.
113
114 @param index: The index in the list from which to retrieve the item.
115 @type index: C{int}
116 @param prefetch: This param is ignored and is only here as part of the
117 interface.
118 @raise IndexError: if C{index < 0} or C{index >= length}
119 @return: The item at index C{index}.
120 @rtype: C{mixed}.
121 @since: 0.4
122 """
123 if index < 0:
124 raise IndexError
125
126 if index > len(self):
127 raise IndexError
128
129 return self.__getitem__(index)
130
132 """
133 Returns the index of the item if it is in the list such that
134 C{getItemAt(index) == item}.
135
136 @param item: The item to find.
137 @type item: C{mixed}.
138 @return: The index of the item or -1 if the item is not in the list.
139 @rtype: C{int}
140 @since: 0.4
141 """
142 try:
143 return self.index(item)
144 except ValueError:
145 return -1
146
148 """
149 Removes all items from the list.
150
151 @since: 0.4
152 """
153 while len(self) > 0:
154 self.pop()
155
157 """
158 Removes the item at the specified index and returns it. Any items that
159 were after this index are now one index earlier.
160
161 @param index: The index from which to remove the item.
162 @return: The item that was removed.
163 @rtype: C{mixed}.
164 @raise IndexError: If index is less than 0 or greater than length.
165 @since: 0.4
166 """
167 if index < 0:
168 raise IndexError
169
170 if index > len(self):
171 raise IndexError
172
173 x = self[index]
174
175 del self[index]
176
177 return x
178
180 """
181 Places the item at the specified index. If an item was already at that
182 index the new item will replace it and it will be returned.
183
184 @param item: The new item to be placed at the specified index.
185 @type item: C{mixed}.
186 @param index: The index at which to place the item.
187 @type index: C{int}
188 @return: The item that was replaced, or C{None}.
189 @rtype: C{mixed} or C{None}.
190 @raise IndexError: If index is less than 0 or greater than length.
191 @since: 0.4
192 """
193 if index < 0:
194 raise IndexError
195
196 if index > len(self):
197 raise IndexError
198
199 tmp = self.__getitem__(index)
200 self.__setitem__(index, item)
201
202 return tmp
203
205 """
206 Returns an Array that is populated in the same order as the C{IList}
207 implementation.
208
209 @return: The array.
210 @rtype: C{list}
211 """
212 return self
213
214
216 """
217 I represent the ActionScript 3 based class C{flex.messaging.io.ObjectProxy}
218 used in the Flex framework. Flex's C{ObjectProxy} class allows an anonymous,
219 dynamic ActionScript Object to be bindable and report change events.
220
221 @see: U{ObjectProxy on Livedocs (external)
222 <http://livedocs.adobe.com/flex/201/langref/mx/utils/ObjectProxy.html>}
223 """
224
228
230 if object is None:
231 self._amf_object = pyamf.ASObject()
232 else:
233 self._amf_object = object
234
236 return "<flex.messaging.io.ObjectProxy %s>" % self._amf_object
237
239 if name == '_amf_object':
240 return self.__dict__['_amf_object']
241
242 return getattr(self.__dict__['_amf_object'], name)
243
245 if name == '_amf_object':
246 self.__dict__['_amf_object'] = value
247 else:
248 setattr(self._amf_object, name, value)
249
252
254 output.writeObject(self._amf_object, use_proxies=False)
255
256
258 """
259 Returns the unproxied version of the object.
260 """
261 if isinstance(obj, ArrayCollection):
262 return list(obj)
263 elif isinstance(obj, ObjectProxy):
264 return obj._amf_object
265
266 return obj
267
268
269 pyamf.register_package(globals(), package='flex.messaging.io')
270