"""Suite Standard Suite: Common classes and commands for most applications.
Level 1, version 1

Generated from /Applications/Utilities/Terminal.app
AETE/AEUT resource version 1/0, language 0, script 0
"""

import aetools
import MacOS

_code = '????'

class Standard_Suite_Events:

    _argmap_close = {
        'saving_in' : 'kfil',
        'saving' : 'savo',
    }

    def close(self, _object, _attributes={}, **_arguments):
        """close: Close an object.
        Required argument: the object for the command
        Keyword argument saving_in: The file in which to save the object.
        Keyword argument saving: Specifies whether changes should be saved before closing.
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'core'
        _subcode = 'clos'

        aetools.keysubst(_arguments, self._argmap_close)
        _arguments['----'] = _object

        aetools.enumsubst(_arguments, 'savo', _Enum_savo)

        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_count = {
        'each' : 'kocl',
    }

    def count(self, _object, _attributes={}, **_arguments):
        """count: Return the number of elements of a particular class within an object.
        Required argument: the object for the command
        Keyword argument each: The class of objects to be counted.
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: the reply for the command
        """
        _code = 'core'
        _subcode = 'cnte'

        aetools.keysubst(_arguments, self._argmap_count)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    def delete(self, _object, _attributes={}, **_arguments):
        """delete: Delete an object.
        Required argument: the object for the command
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'core'
        _subcode = 'delo'

        if _arguments: raise TypeError, 'No optional args expected'
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_duplicate = {
        'to' : 'insh',
        'with_properties' : 'prdt',
    }

    def duplicate(self, _object, _attributes={}, **_arguments):
        """duplicate: Copy object(s) and put the copies at a new location.
        Required argument: the object for the command
        Keyword argument to: The location for the new object(s).
        Keyword argument with_properties: Properties to be set in the new duplicated object(s).
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'core'
        _subcode = 'clon'

        aetools.keysubst(_arguments, self._argmap_duplicate)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    def exists(self, _object, _attributes={}, **_arguments):
        """exists: Verify if an object exists.
        Required argument: the object for the command
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: the reply for the command
        """
        _code = 'core'
        _subcode = 'doex'

        if _arguments: raise TypeError, 'No optional args expected'
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    def get(self, _object, _attributes={}, **_arguments):
        """get: Get the data for an object.
        Required argument: the object for the command
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: the reply for the command
        """
        _code = 'core'
        _subcode = 'getd'

        if _arguments: raise TypeError, 'No optional args expected'
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_make = {
        'at' : 'insh',
        'new' : 'kocl',
        'with_data' : 'data',
        'with_properties' : 'prdt',
    }

    def make(self, _no_object=None, _attributes={}, **_arguments):
        """make: Make a new object.
        Keyword argument at: The location at which to insert the object.
        Keyword argument new: The class of the new object.
        Keyword argument with_data: The initial data for the object.
        Keyword argument with_properties: The initial values for properties of the object.
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: the reply for the command
        """
        _code = 'core'
        _subcode = 'crel'

        aetools.keysubst(_arguments, self._argmap_make)
        if _no_object is not None: raise TypeError, 'No direct arg expected'


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_move = {
        'to' : 'insh',
    }

    def move(self, _object, _attributes={}, **_arguments):
        """move: Move object(s) to a new location.
        Required argument: the object for the command
        Keyword argument to: The new location for the object(s).
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'core'
        _subcode = 'move'

        aetools.keysubst(_arguments, self._argmap_move)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    def open(self, _object=None, _attributes={}, **_arguments):
        """open: Open an object.
        Required argument: list of objects
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'aevt'
        _subcode = 'odoc'

        if _arguments: raise TypeError, 'No optional args expected'
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    def print_(self, _object=None, _attributes={}, **_arguments):
        """print: Print an object.
        Required argument: list of objects
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'aevt'
        _subcode = 'pdoc'

        if _arguments: raise TypeError, 'No optional args expected'
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_quit = {
        'saving' : 'savo',
    }

    def quit(self, _object, _attributes={}, **_arguments):
        """quit: Quit an application.
        Required argument: the object for the command
        Keyword argument saving: Specifies whether changes should be saved before quitting.
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'aevt'
        _subcode = 'quit'

        aetools.keysubst(_arguments, self._argmap_quit)
        _arguments['----'] = _object

        aetools.enumsubst(_arguments, 'savo', _Enum_savo)

        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_save = {
        'in_' : 'kfil',
        'as' : 'fltp',
    }

    def save(self, _object, _attributes={}, **_arguments):
        """save: Save an object.
        Required argument: the object for the command
        Keyword argument in_: The file in which to save the object.
        Keyword argument as: The file type in which to save the data.
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'core'
        _subcode = 'save'

        aetools.keysubst(_arguments, self._argmap_save)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_set = {
        'to' : 'data',
    }

    def set(self, _object, _attributes={}, **_arguments):
        """set: Set an object's data.
        Required argument: the object for the command
        Keyword argument to: The new value.
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'core'
        _subcode = 'setd'

        aetools.keysubst(_arguments, self._argmap_set)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']


class application(aetools.ComponentItem):
    """application - An application's top level scripting object. """
    want = 'capp'
class _Prop__3c_Inheritance_3e_(aetools.NProperty):
    """<Inheritance> - All of the properties of the superclass. """
    which = 'c@#^'
    want = 'cobj'
_3c_Inheritance_3e_ = _Prop__3c_Inheritance_3e_()
class _Prop_frontmost(aetools.NProperty):
    """frontmost - Is this the frontmost (active) application? """
    which = 'pisf'
    want = 'bool'
frontmost = _Prop_frontmost()
class _Prop_name(aetools.NProperty):
    """name - The name of the application. """
    which = 'pnam'
    want = 'utxt'
name = _Prop_name()
class _Prop_version(aetools.NProperty):
    """version - The version of the application. """
    which = 'vers'
    want = 'utxt'
version = _Prop_version()
#        element 'cwin' as ['name', 'indx', 'rele', 'rang', 'test', 'ID  ']
#        element 'docu' as ['name', 'indx', 'rele', 'rang', 'test']

applications = application

class item(aetools.ComponentItem):
    """item - A scriptable object. """
    want = 'cobj'
class _Prop_class_(aetools.NProperty):
    """class - The class of the object. """
    which = 'pcls'
    want = 'type'
class _Prop_properties(aetools.NProperty):
    """properties - All of the object's properties. """
    which = 'pALL'
    want = 'reco'

items = item

class color(aetools.ComponentItem):
    """color - A color. """
    want = 'colr'

colors = color

class window(aetools.ComponentItem):
    """window - A window. """
    want = 'cwin'
class _Prop_bounds(aetools.NProperty):
    """bounds - The bounding rectangle of the window. """
    which = 'pbnd'
    want = 'qdrt'
class _Prop_closeable(aetools.NProperty):
    """closeable - Whether the window has a close box. """
    which = 'hclb'
    want = 'bool'
class _Prop_document(aetools.NProperty):
    """document - The document whose contents are being displayed in the window. """
    which = 'docu'
    want = 'docu'
class _Prop_floating(aetools.NProperty):
    """floating - Whether the window floats. """
    which = 'isfl'
    want = 'bool'
class _Prop_id(aetools.NProperty):
    """id - The unique identifier of the window. """
    which = 'ID  '
    want = 'long'
class _Prop_index(aetools.NProperty):
    """index - The index of the window in the back-to-front window ordering. """
    which = 'pidx'
    want = 'long'
class _Prop_miniaturizable(aetools.NProperty):
    """miniaturizable - Whether the window can be miniaturized. """
    which = 'ismn'
    want = 'bool'
class _Prop_miniaturized(aetools.NProperty):
    """miniaturized - Whether the window is currently miniaturized. """
    which = 'pmnd'
    want = 'bool'
class _Prop_modal(aetools.NProperty):
    """modal - Whether the window is the application's current modal window. """
    which = 'pmod'
    want = 'bool'
class _Prop_resizable(aetools.NProperty):
    """resizable - Whether the window can be resized. """
    which = 'prsz'
    want = 'bool'
class _Prop_titled(aetools.NProperty):
    """titled - Whether the window has a title bar. """
    which = 'ptit'
    want = 'bool'
class _Prop_visible(aetools.NProperty):
    """visible - Whether the window is currently visible. """
    which = 'pvis'
    want = 'bool'
class _Prop_zoomable(aetools.NProperty):
    """zoomable - Whether the window can be zoomed. """
    which = 'iszm'
    want = 'bool'
class _Prop_zoomed(aetools.NProperty):
    """zoomed - Whether the window is currently zoomed. """
    which = 'pzum'
    want = 'bool'

windows = window

class document(aetools.ComponentItem):
    """document - A document. """
    want = 'docu'
class _Prop_modified(aetools.NProperty):
    """modified - Has the document been modified since the last save? """
    which = 'imod'
    want = 'bool'
class _Prop_path(aetools.NProperty):
    """path - The document's path. """
    which = 'ppth'
    want = 'utxt'

documents = document
application._superclassnames = ['item']
application._privpropdict = {
    '_3c_Inheritance_3e_' : _Prop__3c_Inheritance_3e_,
    'frontmost' : _Prop_frontmost,
    'name' : _Prop_name,
    'version' : _Prop_version,
}
application._privelemdict = {
    'document' : document,
    'window' : window,
}
item._superclassnames = []
item._privpropdict = {
    'class_' : _Prop_class_,
    'properties' : _Prop_properties,
}
item._privelemdict = {
}
color._superclassnames = ['item']
color._privpropdict = {
    '_3c_Inheritance_3e_' : _Prop__3c_Inheritance_3e_,
}
color._privelemdict = {
}
window._superclassnames = ['item']
window._privpropdict = {
    '_3c_Inheritance_3e_' : _Prop__3c_Inheritance_3e_,
    'bounds' : _Prop_bounds,
    'closeable' : _Prop_closeable,
    'document' : _Prop_document,
    'floating' : _Prop_floating,
    'id' : _Prop_id,
    'index' : _Prop_index,
    'miniaturizable' : _Prop_miniaturizable,
    'miniaturized' : _Prop_miniaturized,
    'modal' : _Prop_modal,
    'name' : _Prop_name,
    'resizable' : _Prop_resizable,
    'titled' : _Prop_titled,
    'visible' : _Prop_visible,
    'zoomable' : _Prop_zoomable,
    'zoomed' : _Prop_zoomed,
}
window._privelemdict = {
}
document._superclassnames = ['item']
document._privpropdict = {
    '_3c_Inheritance_3e_' : _Prop__3c_Inheritance_3e_,
    'modified' : _Prop_modified,
    'name' : _Prop_name,
    'path' : _Prop_path,
}
document._privelemdict = {
}
class _3c_(aetools.NComparison):
    """< - Less than """
class _3d_(aetools.NComparison):
    """= - Equal """
class _3e_(aetools.NComparison):
    """> - Greater than """
class contains(aetools.NComparison):
    """contains - Contains """
class ends_with(aetools.NComparison):
    """ends with - Ends with """
class starts_with(aetools.NComparison):
    """starts with - Starts with """
class _b2_(aetools.NComparison):
    """\xb2 - Less than or equal to """
class _b3_(aetools.NComparison):
    """\xb3 - Greater than or equal to """
_Enum_savo = {
    'ask' : 'ask ',     # Ask the user whether or not to save the file.
    'yes' : 'yes ',     # Save the file.
    'no' : 'no  ',      # Do not save the file.
}


#
# Indices of types declared in this module
#
_classdeclarations = {
    'capp' : application,
    'cobj' : item,
    'colr' : color,
    'cwin' : window,
    'docu' : document,
}

_propdeclarations = {
    'ID  ' : _Prop_id,
    'c@#^' : _Prop__3c_Inheritance_3e_,
    'docu' : _Prop_document,
    'hclb' : _Prop_closeable,
    'imod' : _Prop_modified,
    'isfl' : _Prop_floating,
    'ismn' : _Prop_miniaturizable,
    'iszm' : _Prop_zoomable,
    'pALL' : _Prop_properties,
    'pbnd' : _Prop_bounds,
    'pcls' : _Prop_class_,
    'pidx' : _Prop_index,
    'pisf' : _Prop_frontmost,
    'pmnd' : _Prop_miniaturized,
    'pmod' : _Prop_modal,
    'pnam' : _Prop_name,
    'ppth' : _Prop_path,
    'prsz' : _Prop_resizable,
    'ptit' : _Prop_titled,
    'pvis' : _Prop_visible,
    'pzum' : _Prop_zoomed,
    'vers' : _Prop_version,
}

_compdeclarations = {
    '<   ' : _3c_,
    '<=  ' : _b2_,
    '=   ' : _3d_,
    '>   ' : _3e_,
    '>=  ' : _b3_,
    'bgwt' : starts_with,
    'cont' : contains,
    'ends' : ends_with,
}

_enumdeclarations = {
    'savo' : _Enum_savo,
}
