Package pyamf :: Package flex |
[hide private]
[frames] | no frames]

# Source Code for Package pyamf.flex

      1  # Copyright (c) 2007-2009 The PyAMF Project.
      2  # See LICENSE.txt for details.
      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
     19 -class ArrayCollection(list):
     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
     40 -    class __amf__:
     41          external = True
     42          amf3 = True
     43
     44          exclude = ('length',)
     45
     46 -    def __init__(self, source=None):
     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
     54 -    def __repr__(self):
     55          return "<flex.messaging.io.ArrayCollection %s>" % list.__repr__(self)
     56
     57 -    def __readamf__(self, input):
     58          data = input.readObject()
     59
     60          if hasattr(data, 'source'):
     61              data = data.source
     62          else:
     63              if not hasattr(data, '__iter__'):
     64                  raise pyamf.DecodeError('Unable to read a list when decoding '
     65                      'ArrayCollection')
     66
     67          self.extend(data)
     68
     69 -    def __writeamf__(self, output):
     70          output.encoder.writeList(
     71              list(self), use_references=True, use_proxies=False)
     72
     73 -    def _get_length(self):
     74          return len(self)
     75
     76 -    def _set_length(self, length):
     77          raise RuntimeError("Property length is read-only")
     78
     79      length = property(_get_length, _set_length)
     80
     81 -    def addItem(self, item):
     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
     91 -    def addItemAt(self, item, index):
     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
    110 -    def getItemAt(self, index, prefetch=0):
    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
    131 -    def getItemIndex(self, item):
    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
    147 -    def removeAll(self):
    148          """
    149          Removes all items from the list.
    150
    151          @since: 0.4
    152          """
    153          while len(self) > 0:
    154              self.pop()
    155
    156 -    def removeItemAt(self, index):
    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
    179 -    def setItemAt(self, item, index):
    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
    204 -    def toArray(self):
    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
    215 -class ObjectProxy(object):
    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
    225 -    class __amf__:
    226          external = True
    227          amf3 = True
    228
    229 -    def __init__(self, object=None):
    230          if object is None:
    231              self._amf_object = pyamf.ASObject()
    232          else:
    233              self._amf_object = object
    234
    235 -    def __repr__(self):
    236          return "<flex.messaging.io.ObjectProxy %s>" % self._amf_object
    237
    238 -    def __getattr__(self, name):
    239          if name == '_amf_object':
    240              return self.__dict__['_amf_object']
    241
    242          return getattr(self.__dict__['_amf_object'], name)
    243
    244 -    def __setattr__(self, name, value):
    245          if name == '_amf_object':
    246              self.__dict__['_amf_object'] = value
    247          else:
    248              setattr(self._amf_object, name, value)
    249
    250 -    def __readamf__(self, input):
    251          self._amf_object = input.readObject()
    252
    253 -    def __writeamf__(self, output):
    254          output.writeObject(self._amf_object, use_proxies=False)
    255
    256
    257 -def unproxy_object(obj):
    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