
/* =========================== Module _TE =========================== */

#include "Python.h"

#ifndef __LP64__


#include "pymactoolbox.h"

/* Macro to test whether a weak-loaded CFM function exists */
#define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL )  {\
    PyErr_SetString(PyExc_NotImplementedError, \
    "Not available in this shared library/OS version"); \
    return NULL; \
    }} while(0)


#include <Carbon/Carbon.h>

#ifdef USE_TOOLBOX_OBJECT_GLUE
extern PyObject *_TEObj_New(TEHandle);
extern int _TEObj_Convert(PyObject *, TEHandle *);

#define TEObj_New _TEObj_New
#define TEObj_Convert _TEObj_Convert
#endif

#define as_TE(h) ((TEHandle)h)
#define as_Resource(teh) ((Handle)teh)

/*
** Parse/generate TextStyle records
*/
static PyObject *
TextStyle_New(TextStylePtr itself)
{

    return Py_BuildValue("lllO&", (long)itself->tsFont, (long)itself->tsFace, (long)itself->tsSize, QdRGB_New,
                            &itself->tsColor);
}

static int
TextStyle_Convert(PyObject *v, TextStylePtr p_itself)
{
    long font, face, size;

    if( !PyArg_ParseTuple(v, "lllO&", &font, &face, &size, QdRGB_Convert, &p_itself->tsColor) )
        return 0;
    p_itself->tsFont = (short)font;
    p_itself->tsFace = (Style)face;
    p_itself->tsSize = (short)size;
    return 1;
}

static PyObject *TE_Error;

/* ------------------------- Object type TE ------------------------- */

PyTypeObject TE_Type;

#define TEObj_Check(x) ((x)->ob_type == &TE_Type || PyObject_TypeCheck((x), &TE_Type))

typedef struct TEObject {
    PyObject_HEAD
    TEHandle ob_itself;
} TEObject;

PyObject *TEObj_New(TEHandle itself)
{
    TEObject *it;
    if (itself == NULL) {
                                    PyErr_SetString(TE_Error,"Cannot create null TE");
                                    return NULL;
                            }
    it = PyObject_NEW(TEObject, &TE_Type);
    if (it == NULL) return NULL;
    it->ob_itself = itself;
    return (PyObject *)it;
}

int TEObj_Convert(PyObject *v, TEHandle *p_itself)
{
    if (!TEObj_Check(v))
    {
        PyErr_SetString(PyExc_TypeError, "TE required");
        return 0;
    }
    *p_itself = ((TEObject *)v)->ob_itself;
    return 1;
}

static void TEObj_dealloc(TEObject *self)
{
    TEDispose(self->ob_itself);
    self->ob_type->tp_free((PyObject *)self);
}

static PyObject *TEObj_TESetText(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    char *text__in__;
    long text__len__;
    int text__in_len__;
#ifndef TESetText
    PyMac_PRECHECK(TESetText);
#endif
    if (!PyArg_ParseTuple(_args, "s#",
                          &text__in__, &text__in_len__))
        return NULL;
    text__len__ = text__in_len__;
    TESetText(text__in__, text__len__,
              _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEGetText(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    CharsHandle _rv;
#ifndef TEGetText
    PyMac_PRECHECK(TEGetText);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TEGetText(_self->ob_itself);
    _res = Py_BuildValue("O&",
                         ResObj_New, _rv);
    return _res;
}

static PyObject *TEObj_TEIdle(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
#ifndef TEIdle
    PyMac_PRECHECK(TEIdle);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TEIdle(_self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TESetSelect(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    long selStart;
    long selEnd;
#ifndef TESetSelect
    PyMac_PRECHECK(TESetSelect);
#endif
    if (!PyArg_ParseTuple(_args, "ll",
                          &selStart,
                          &selEnd))
        return NULL;
    TESetSelect(selStart,
                selEnd,
                _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEActivate(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
#ifndef TEActivate
    PyMac_PRECHECK(TEActivate);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TEActivate(_self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEDeactivate(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
#ifndef TEDeactivate
    PyMac_PRECHECK(TEDeactivate);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TEDeactivate(_self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEKey(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    CharParameter key;
#ifndef TEKey
    PyMac_PRECHECK(TEKey);
#endif
    if (!PyArg_ParseTuple(_args, "h",
                          &key))
        return NULL;
    TEKey(key,
          _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TECut(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
#ifndef TECut
    PyMac_PRECHECK(TECut);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TECut(_self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TECopy(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
#ifndef TECopy
    PyMac_PRECHECK(TECopy);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TECopy(_self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEPaste(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
#ifndef TEPaste
    PyMac_PRECHECK(TEPaste);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TEPaste(_self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEDelete(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
#ifndef TEDelete
    PyMac_PRECHECK(TEDelete);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TEDelete(_self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEInsert(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    char *text__in__;
    long text__len__;
    int text__in_len__;
#ifndef TEInsert
    PyMac_PRECHECK(TEInsert);
#endif
    if (!PyArg_ParseTuple(_args, "s#",
                          &text__in__, &text__in_len__))
        return NULL;
    text__len__ = text__in_len__;
    TEInsert(text__in__, text__len__,
             _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TESetAlignment(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    short just;
#ifndef TESetAlignment
    PyMac_PRECHECK(TESetAlignment);
#endif
    if (!PyArg_ParseTuple(_args, "h",
                          &just))
        return NULL;
    TESetAlignment(just,
                   _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEUpdate(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Rect rUpdate;
#ifndef TEUpdate
    PyMac_PRECHECK(TEUpdate);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetRect, &rUpdate))
        return NULL;
    TEUpdate(&rUpdate,
             _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEScroll(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    short dh;
    short dv;
#ifndef TEScroll
    PyMac_PRECHECK(TEScroll);
#endif
    if (!PyArg_ParseTuple(_args, "hh",
                          &dh,
                          &dv))
        return NULL;
    TEScroll(dh,
             dv,
             _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TESelView(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
#ifndef TESelView
    PyMac_PRECHECK(TESelView);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TESelView(_self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEPinScroll(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    short dh;
    short dv;
#ifndef TEPinScroll
    PyMac_PRECHECK(TEPinScroll);
#endif
    if (!PyArg_ParseTuple(_args, "hh",
                          &dh,
                          &dv))
        return NULL;
    TEPinScroll(dh,
                dv,
                _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEAutoView(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Boolean fAuto;
#ifndef TEAutoView
    PyMac_PRECHECK(TEAutoView);
#endif
    if (!PyArg_ParseTuple(_args, "b",
                          &fAuto))
        return NULL;
    TEAutoView(fAuto,
               _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TECalText(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
#ifndef TECalText
    PyMac_PRECHECK(TECalText);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TECalText(_self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEGetOffset(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    short _rv;
    Point pt;
#ifndef TEGetOffset
    PyMac_PRECHECK(TEGetOffset);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetPoint, &pt))
        return NULL;
    _rv = TEGetOffset(pt,
                      _self->ob_itself);
    _res = Py_BuildValue("h",
                         _rv);
    return _res;
}

static PyObject *TEObj_TEGetPoint(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Point _rv;
    short offset;
#ifndef TEGetPoint
    PyMac_PRECHECK(TEGetPoint);
#endif
    if (!PyArg_ParseTuple(_args, "h",
                          &offset))
        return NULL;
    _rv = TEGetPoint(offset,
                     _self->ob_itself);
    _res = Py_BuildValue("O&",
                         PyMac_BuildPoint, _rv);
    return _res;
}

static PyObject *TEObj_TEClick(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Point pt;
    Boolean fExtend;
#ifndef TEClick
    PyMac_PRECHECK(TEClick);
#endif
    if (!PyArg_ParseTuple(_args, "O&b",
                          PyMac_GetPoint, &pt,
                          &fExtend))
        return NULL;
    TEClick(pt,
        fExtend,
        _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TESetStyleHandle(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    TEStyleHandle theHandle;
#ifndef TESetStyleHandle
    PyMac_PRECHECK(TESetStyleHandle);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          ResObj_Convert, &theHandle))
        return NULL;
    TESetStyleHandle(theHandle,
                     _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEGetStyleHandle(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    TEStyleHandle _rv;
#ifndef TEGetStyleHandle
    PyMac_PRECHECK(TEGetStyleHandle);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TEGetStyleHandle(_self->ob_itself);
    _res = Py_BuildValue("O&",
                         ResObj_New, _rv);
    return _res;
}

static PyObject *TEObj_TEGetStyle(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    short offset;
    TextStyle theStyle;
    short lineHeight;
    short fontAscent;
#ifndef TEGetStyle
    PyMac_PRECHECK(TEGetStyle);
#endif
    if (!PyArg_ParseTuple(_args, "h",
                          &offset))
        return NULL;
    TEGetStyle(offset,
               &theStyle,
               &lineHeight,
               &fontAscent,
               _self->ob_itself);
    _res = Py_BuildValue("O&hh",
                         TextStyle_New, &theStyle,
                         lineHeight,
                         fontAscent);
    return _res;
}

static PyObject *TEObj_TEStylePaste(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
#ifndef TEStylePaste
    PyMac_PRECHECK(TEStylePaste);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TEStylePaste(_self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TESetStyle(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    short mode;
    TextStyle newStyle;
    Boolean fRedraw;
#ifndef TESetStyle
    PyMac_PRECHECK(TESetStyle);
#endif
    if (!PyArg_ParseTuple(_args, "hO&b",
                          &mode,
                          TextStyle_Convert, &newStyle,
                          &fRedraw))
        return NULL;
    TESetStyle(mode,
               &newStyle,
               fRedraw,
               _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEReplaceStyle(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    short mode;
    TextStyle oldStyle;
    TextStyle newStyle;
    Boolean fRedraw;
#ifndef TEReplaceStyle
    PyMac_PRECHECK(TEReplaceStyle);
#endif
    if (!PyArg_ParseTuple(_args, "hO&O&b",
                          &mode,
                          TextStyle_Convert, &oldStyle,
                          TextStyle_Convert, &newStyle,
                          &fRedraw))
        return NULL;
    TEReplaceStyle(mode,
                   &oldStyle,
                   &newStyle,
                   fRedraw,
                   _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEGetStyleScrapHandle(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    StScrpHandle _rv;
#ifndef TEGetStyleScrapHandle
    PyMac_PRECHECK(TEGetStyleScrapHandle);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TEGetStyleScrapHandle(_self->ob_itself);
    _res = Py_BuildValue("O&",
                         ResObj_New, _rv);
    return _res;
}

static PyObject *TEObj_TEStyleInsert(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    char *text__in__;
    long text__len__;
    int text__in_len__;
    StScrpHandle hST;
#ifndef TEStyleInsert
    PyMac_PRECHECK(TEStyleInsert);
#endif
    if (!PyArg_ParseTuple(_args, "s#O&",
                          &text__in__, &text__in_len__,
                          ResObj_Convert, &hST))
        return NULL;
    text__len__ = text__in_len__;
    TEStyleInsert(text__in__, text__len__,
                  hST,
                  _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TEGetHeight(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    long _rv;
    long endLine;
    long startLine;
#ifndef TEGetHeight
    PyMac_PRECHECK(TEGetHeight);
#endif
    if (!PyArg_ParseTuple(_args, "ll",
                          &endLine,
                          &startLine))
        return NULL;
    _rv = TEGetHeight(endLine,
                      startLine,
                      _self->ob_itself);
    _res = Py_BuildValue("l",
                         _rv);
    return _res;
}

static PyObject *TEObj_TEContinuousStyle(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Boolean _rv;
    short mode;
    TextStyle aStyle;
#ifndef TEContinuousStyle
    PyMac_PRECHECK(TEContinuousStyle);
#endif
    if (!PyArg_ParseTuple(_args, "hO&",
                          &mode,
                          TextStyle_Convert, &aStyle))
        return NULL;
    _rv = TEContinuousStyle(&mode,
                            &aStyle,
                            _self->ob_itself);
    _res = Py_BuildValue("bhO&",
                         _rv,
                         mode,
                         TextStyle_New, &aStyle);
    return _res;
}

static PyObject *TEObj_TEUseStyleScrap(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    long rangeStart;
    long rangeEnd;
    StScrpHandle newStyles;
    Boolean fRedraw;
#ifndef TEUseStyleScrap
    PyMac_PRECHECK(TEUseStyleScrap);
#endif
    if (!PyArg_ParseTuple(_args, "llO&b",
                          &rangeStart,
                          &rangeEnd,
                          ResObj_Convert, &newStyles,
                          &fRedraw))
        return NULL;
    TEUseStyleScrap(rangeStart,
                    rangeEnd,
                    newStyles,
                    fRedraw,
                    _self->ob_itself);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_TENumStyles(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    long _rv;
    long rangeStart;
    long rangeEnd;
#ifndef TENumStyles
    PyMac_PRECHECK(TENumStyles);
#endif
    if (!PyArg_ParseTuple(_args, "ll",
                          &rangeStart,
                          &rangeEnd))
        return NULL;
    _rv = TENumStyles(rangeStart,
                      rangeEnd,
                      _self->ob_itself);
    _res = Py_BuildValue("l",
                         _rv);
    return _res;
}

static PyObject *TEObj_TEFeatureFlag(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    short _rv;
    short feature;
    short action;
#ifndef TEFeatureFlag
    PyMac_PRECHECK(TEFeatureFlag);
#endif
    if (!PyArg_ParseTuple(_args, "hh",
                          &feature,
                          &action))
        return NULL;
    _rv = TEFeatureFlag(feature,
                        action,
                        _self->ob_itself);
    _res = Py_BuildValue("h",
                         _rv);
    return _res;
}

static PyObject *TEObj_TEGetHiliteRgn(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    RgnHandle region;
#ifndef TEGetHiliteRgn
    PyMac_PRECHECK(TEGetHiliteRgn);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          ResObj_Convert, &region))
        return NULL;
    _err = TEGetHiliteRgn(region,
                          _self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TEObj_as_Resource(TEObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Handle _rv;
#ifndef as_Resource
    PyMac_PRECHECK(as_Resource);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = as_Resource(_self->ob_itself);
    _res = Py_BuildValue("O&",
                         ResObj_New, _rv);
    return _res;
}

static PyMethodDef TEObj_methods[] = {
    {"TESetText", (PyCFunction)TEObj_TESetText, 1,
     PyDoc_STR("(Buffer text) -> None")},
    {"TEGetText", (PyCFunction)TEObj_TEGetText, 1,
     PyDoc_STR("() -> (CharsHandle _rv)")},
    {"TEIdle", (PyCFunction)TEObj_TEIdle, 1,
     PyDoc_STR("() -> None")},
    {"TESetSelect", (PyCFunction)TEObj_TESetSelect, 1,
     PyDoc_STR("(long selStart, long selEnd) -> None")},
    {"TEActivate", (PyCFunction)TEObj_TEActivate, 1,
     PyDoc_STR("() -> None")},
    {"TEDeactivate", (PyCFunction)TEObj_TEDeactivate, 1,
     PyDoc_STR("() -> None")},
    {"TEKey", (PyCFunction)TEObj_TEKey, 1,
     PyDoc_STR("(CharParameter key) -> None")},
    {"TECut", (PyCFunction)TEObj_TECut, 1,
     PyDoc_STR("() -> None")},
    {"TECopy", (PyCFunction)TEObj_TECopy, 1,
     PyDoc_STR("() -> None")},
    {"TEPaste", (PyCFunction)TEObj_TEPaste, 1,
     PyDoc_STR("() -> None")},
    {"TEDelete", (PyCFunction)TEObj_TEDelete, 1,
     PyDoc_STR("() -> None")},
    {"TEInsert", (PyCFunction)TEObj_TEInsert, 1,
     PyDoc_STR("(Buffer text) -> None")},
    {"TESetAlignment", (PyCFunction)TEObj_TESetAlignment, 1,
     PyDoc_STR("(short just) -> None")},
    {"TEUpdate", (PyCFunction)TEObj_TEUpdate, 1,
     PyDoc_STR("(Rect rUpdate) -> None")},
    {"TEScroll", (PyCFunction)TEObj_TEScroll, 1,
     PyDoc_STR("(short dh, short dv) -> None")},
    {"TESelView", (PyCFunction)TEObj_TESelView, 1,
     PyDoc_STR("() -> None")},
    {"TEPinScroll", (PyCFunction)TEObj_TEPinScroll, 1,
     PyDoc_STR("(short dh, short dv) -> None")},
    {"TEAutoView", (PyCFunction)TEObj_TEAutoView, 1,
     PyDoc_STR("(Boolean fAuto) -> None")},
    {"TECalText", (PyCFunction)TEObj_TECalText, 1,
     PyDoc_STR("() -> None")},
    {"TEGetOffset", (PyCFunction)TEObj_TEGetOffset, 1,
     PyDoc_STR("(Point pt) -> (short _rv)")},
    {"TEGetPoint", (PyCFunction)TEObj_TEGetPoint, 1,
     PyDoc_STR("(short offset) -> (Point _rv)")},
    {"TEClick", (PyCFunction)TEObj_TEClick, 1,
     PyDoc_STR("(Point pt, Boolean fExtend) -> None")},
    {"TESetStyleHandle", (PyCFunction)TEObj_TESetStyleHandle, 1,
     PyDoc_STR("(TEStyleHandle theHandle) -> None")},
    {"TEGetStyleHandle", (PyCFunction)TEObj_TEGetStyleHandle, 1,
     PyDoc_STR("() -> (TEStyleHandle _rv)")},
    {"TEGetStyle", (PyCFunction)TEObj_TEGetStyle, 1,
     PyDoc_STR("(short offset) -> (TextStyle theStyle, short lineHeight, short fontAscent)")},
    {"TEStylePaste", (PyCFunction)TEObj_TEStylePaste, 1,
     PyDoc_STR("() -> None")},
    {"TESetStyle", (PyCFunction)TEObj_TESetStyle, 1,
     PyDoc_STR("(short mode, TextStyle newStyle, Boolean fRedraw) -> None")},
    {"TEReplaceStyle", (PyCFunction)TEObj_TEReplaceStyle, 1,
     PyDoc_STR("(short mode, TextStyle oldStyle, TextStyle newStyle, Boolean fRedraw) -> None")},
    {"TEGetStyleScrapHandle", (PyCFunction)TEObj_TEGetStyleScrapHandle, 1,
     PyDoc_STR("() -> (StScrpHandle _rv)")},
    {"TEStyleInsert", (PyCFunction)TEObj_TEStyleInsert, 1,
     PyDoc_STR("(Buffer text, StScrpHandle hST) -> None")},
    {"TEGetHeight", (PyCFunction)TEObj_TEGetHeight, 1,
     PyDoc_STR("(long endLine, long startLine) -> (long _rv)")},
    {"TEContinuousStyle", (PyCFunction)TEObj_TEContinuousStyle, 1,
     PyDoc_STR("(short mode, TextStyle aStyle) -> (Boolean _rv, short mode, TextStyle aStyle)")},
    {"TEUseStyleScrap", (PyCFunction)TEObj_TEUseStyleScrap, 1,
     PyDoc_STR("(long rangeStart, long rangeEnd, StScrpHandle newStyles, Boolean fRedraw) -> None")},
    {"TENumStyles", (PyCFunction)TEObj_TENumStyles, 1,
     PyDoc_STR("(long rangeStart, long rangeEnd) -> (long _rv)")},
    {"TEFeatureFlag", (PyCFunction)TEObj_TEFeatureFlag, 1,
     PyDoc_STR("(short feature, short action) -> (short _rv)")},
    {"TEGetHiliteRgn", (PyCFunction)TEObj_TEGetHiliteRgn, 1,
     PyDoc_STR("(RgnHandle region) -> None")},
    {"as_Resource", (PyCFunction)TEObj_as_Resource, 1,
     PyDoc_STR("() -> (Handle _rv)")},
    {NULL, NULL, 0}
};

static PyObject *TEObj_get_destRect(TEObject *self, void *closure)
{
    return Py_BuildValue("O&", PyMac_BuildRect, &(*self->ob_itself)->destRect);
}

#define TEObj_set_destRect NULL

static PyObject *TEObj_get_viewRect(TEObject *self, void *closure)
{
    return Py_BuildValue("O&", PyMac_BuildRect, &(*self->ob_itself)->viewRect);
}

#define TEObj_set_viewRect NULL

static PyObject *TEObj_get_selRect(TEObject *self, void *closure)
{
    return Py_BuildValue("O&", PyMac_BuildRect, &(*self->ob_itself)->selRect);
}

#define TEObj_set_selRect NULL

static PyObject *TEObj_get_lineHeight(TEObject *self, void *closure)
{
    return Py_BuildValue("h", (*self->ob_itself)->lineHeight);
}

#define TEObj_set_lineHeight NULL

static PyObject *TEObj_get_fontAscent(TEObject *self, void *closure)
{
    return Py_BuildValue("h", (*self->ob_itself)->fontAscent);
}

#define TEObj_set_fontAscent NULL

static PyObject *TEObj_get_selPoint(TEObject *self, void *closure)
{
    return Py_BuildValue("O&", PyMac_BuildPoint, (*self->ob_itself)->selPoint);
}

#define TEObj_set_selPoint NULL

static PyObject *TEObj_get_selStart(TEObject *self, void *closure)
{
    return Py_BuildValue("h", (*self->ob_itself)->selStart);
}

#define TEObj_set_selStart NULL

static PyObject *TEObj_get_selEnd(TEObject *self, void *closure)
{
    return Py_BuildValue("h", (*self->ob_itself)->selEnd);
}

#define TEObj_set_selEnd NULL

static PyObject *TEObj_get_active(TEObject *self, void *closure)
{
    return Py_BuildValue("h", (*self->ob_itself)->active);
}

#define TEObj_set_active NULL

static PyObject *TEObj_get_just(TEObject *self, void *closure)
{
    return Py_BuildValue("h", (*self->ob_itself)->just);
}

#define TEObj_set_just NULL

static PyObject *TEObj_get_teLength(TEObject *self, void *closure)
{
    return Py_BuildValue("h", (*self->ob_itself)->teLength);
}

#define TEObj_set_teLength NULL

static PyObject *TEObj_get_txFont(TEObject *self, void *closure)
{
    return Py_BuildValue("h", (*self->ob_itself)->txFont);
}

#define TEObj_set_txFont NULL

static PyObject *TEObj_get_txFace(TEObject *self, void *closure)
{
    return Py_BuildValue("h", (*self->ob_itself)->txFace);
}

#define TEObj_set_txFace NULL

static PyObject *TEObj_get_txMode(TEObject *self, void *closure)
{
    return Py_BuildValue("h", (*self->ob_itself)->txMode);
}

#define TEObj_set_txMode NULL

static PyObject *TEObj_get_txSize(TEObject *self, void *closure)
{
    return Py_BuildValue("h", (*self->ob_itself)->txSize);
}

#define TEObj_set_txSize NULL

static PyObject *TEObj_get_nLines(TEObject *self, void *closure)
{
    return Py_BuildValue("h", (*self->ob_itself)->nLines);
}

#define TEObj_set_nLines NULL

static PyGetSetDef TEObj_getsetlist[] = {
    {"destRect", (getter)TEObj_get_destRect, (setter)TEObj_set_destRect, "Destination rectangle"},
    {"viewRect", (getter)TEObj_get_viewRect, (setter)TEObj_set_viewRect, "Viewing rectangle"},
    {"selRect", (getter)TEObj_get_selRect, (setter)TEObj_set_selRect, "Selection rectangle"},
    {"lineHeight", (getter)TEObj_get_lineHeight, (setter)TEObj_set_lineHeight, "Height of a line"},
    {"fontAscent", (getter)TEObj_get_fontAscent, (setter)TEObj_set_fontAscent, "Ascent of a line"},
    {"selPoint", (getter)TEObj_get_selPoint, (setter)TEObj_set_selPoint, "Selection Point"},
    {"selStart", (getter)TEObj_get_selStart, (setter)TEObj_set_selStart, "Start of selection"},
    {"selEnd", (getter)TEObj_get_selEnd, (setter)TEObj_set_selEnd, "End of selection"},
    {"active", (getter)TEObj_get_active, (setter)TEObj_set_active, "TBD"},
    {"just", (getter)TEObj_get_just, (setter)TEObj_set_just, "Justification"},
    {"teLength", (getter)TEObj_get_teLength, (setter)TEObj_set_teLength, "TBD"},
    {"txFont", (getter)TEObj_get_txFont, (setter)TEObj_set_txFont, "Current font"},
    {"txFace", (getter)TEObj_get_txFace, (setter)TEObj_set_txFace, "Current font variant"},
    {"txMode", (getter)TEObj_get_txMode, (setter)TEObj_set_txMode, "Current text-drawing mode"},
    {"txSize", (getter)TEObj_get_txSize, (setter)TEObj_set_txSize, "Current font size"},
    {"nLines", (getter)TEObj_get_nLines, (setter)TEObj_set_nLines, "TBD"},
    {NULL, NULL, NULL, NULL},
};


#define TEObj_compare NULL

#define TEObj_repr NULL

#define TEObj_hash NULL
#define TEObj_tp_init 0

#define TEObj_tp_alloc PyType_GenericAlloc

static PyObject *TEObj_tp_new(PyTypeObject *type, PyObject *_args, PyObject *_kwds)
{
    PyObject *_self;
    TEHandle itself;
    char *kw[] = {"itself", 0};

    if (!PyArg_ParseTupleAndKeywords(_args, _kwds, "O&", kw, TEObj_Convert, &itself)) return NULL;
    if ((_self = type->tp_alloc(type, 0)) == NULL) return NULL;
    ((TEObject *)_self)->ob_itself = itself;
    return _self;
}

#define TEObj_tp_free PyObject_Del


PyTypeObject TE_Type = {
    PyObject_HEAD_INIT(NULL)
    0, /*ob_size*/
    "_TE.TE", /*tp_name*/
    sizeof(TEObject), /*tp_basicsize*/
    0, /*tp_itemsize*/
    /* methods */
    (destructor) TEObj_dealloc, /*tp_dealloc*/
    0, /*tp_print*/
    (getattrfunc)0, /*tp_getattr*/
    (setattrfunc)0, /*tp_setattr*/
    (cmpfunc) TEObj_compare, /*tp_compare*/
    (reprfunc) TEObj_repr, /*tp_repr*/
    (PyNumberMethods *)0, /* tp_as_number */
    (PySequenceMethods *)0, /* tp_as_sequence */
    (PyMappingMethods *)0, /* tp_as_mapping */
    (hashfunc) TEObj_hash, /*tp_hash*/
    0, /*tp_call*/
    0, /*tp_str*/
    PyObject_GenericGetAttr, /*tp_getattro*/
    PyObject_GenericSetAttr, /*tp_setattro */
    0, /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
    0, /*tp_doc*/
    0, /*tp_traverse*/
    0, /*tp_clear*/
    0, /*tp_richcompare*/
    0, /*tp_weaklistoffset*/
    0, /*tp_iter*/
    0, /*tp_iternext*/
    TEObj_methods, /* tp_methods */
    0, /*tp_members*/
    TEObj_getsetlist, /*tp_getset*/
    0, /*tp_base*/
    0, /*tp_dict*/
    0, /*tp_descr_get*/
    0, /*tp_descr_set*/
    0, /*tp_dictoffset*/
    TEObj_tp_init, /* tp_init */
    TEObj_tp_alloc, /* tp_alloc */
    TEObj_tp_new, /* tp_new */
    TEObj_tp_free, /* tp_free */
};

/* ----------------------- End object type TE ----------------------- */


static PyObject *TE_TEScrapHandle(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Handle _rv;
#ifndef TEScrapHandle
    PyMac_PRECHECK(TEScrapHandle);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TEScrapHandle();
    _res = Py_BuildValue("O&",
                         ResObj_New, _rv);
    return _res;
}

static PyObject *TE_TEGetScrapLength(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    long _rv;
#ifndef TEGetScrapLength
    PyMac_PRECHECK(TEGetScrapLength);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TEGetScrapLength();
    _res = Py_BuildValue("l",
                         _rv);
    return _res;
}

static PyObject *TE_TENew(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    TEHandle _rv;
    Rect destRect;
    Rect viewRect;
#ifndef TENew
    PyMac_PRECHECK(TENew);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&",
                          PyMac_GetRect, &destRect,
                          PyMac_GetRect, &viewRect))
        return NULL;
    _rv = TENew(&destRect,
                &viewRect);
    _res = Py_BuildValue("O&",
                         TEObj_New, _rv);
    return _res;
}

static PyObject *TE_TETextBox(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    char *text__in__;
    long text__len__;
    int text__in_len__;
    Rect box;
    short just;
#ifndef TETextBox
    PyMac_PRECHECK(TETextBox);
#endif
    if (!PyArg_ParseTuple(_args, "s#O&h",
                          &text__in__, &text__in_len__,
                          PyMac_GetRect, &box,
                          &just))
        return NULL;
    text__len__ = text__in_len__;
    TETextBox(text__in__, text__len__,
              &box,
              just);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TE_TEStyleNew(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    TEHandle _rv;
    Rect destRect;
    Rect viewRect;
#ifndef TEStyleNew
    PyMac_PRECHECK(TEStyleNew);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&",
                          PyMac_GetRect, &destRect,
                          PyMac_GetRect, &viewRect))
        return NULL;
    _rv = TEStyleNew(&destRect,
                     &viewRect);
    _res = Py_BuildValue("O&",
                         TEObj_New, _rv);
    return _res;
}

static PyObject *TE_TESetScrapLength(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    long length;
#ifndef TESetScrapLength
    PyMac_PRECHECK(TESetScrapLength);
#endif
    if (!PyArg_ParseTuple(_args, "l",
                          &length))
        return NULL;
    TESetScrapLength(length);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TE_TEFromScrap(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
#ifndef TEFromScrap
    PyMac_PRECHECK(TEFromScrap);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = TEFromScrap();
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TE_TEToScrap(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
#ifndef TEToScrap
    PyMac_PRECHECK(TEToScrap);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = TEToScrap();
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TE_TEGetScrapHandle(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Handle _rv;
#ifndef TEGetScrapHandle
    PyMac_PRECHECK(TEGetScrapHandle);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TEGetScrapHandle();
    _res = Py_BuildValue("O&",
                         ResObj_New, _rv);
    return _res;
}

static PyObject *TE_TESetScrapHandle(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Handle value;
#ifndef TESetScrapHandle
    PyMac_PRECHECK(TESetScrapHandle);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          ResObj_Convert, &value))
        return NULL;
    TESetScrapHandle(value);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TE_LMGetWordRedraw(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    UInt8 _rv;
#ifndef LMGetWordRedraw
    PyMac_PRECHECK(LMGetWordRedraw);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = LMGetWordRedraw();
    _res = Py_BuildValue("b",
                         _rv);
    return _res;
}

static PyObject *TE_LMSetWordRedraw(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    UInt8 value;
#ifndef LMSetWordRedraw
    PyMac_PRECHECK(LMSetWordRedraw);
#endif
    if (!PyArg_ParseTuple(_args, "b",
                          &value))
        return NULL;
    LMSetWordRedraw(value);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TE_as_TE(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    TEHandle _rv;
    Handle h;
#ifndef as_TE
    PyMac_PRECHECK(as_TE);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          ResObj_Convert, &h))
        return NULL;
    _rv = as_TE(h);
    _res = Py_BuildValue("O&",
                         TEObj_New, _rv);
    return _res;
}
#endif /* __LP64__ */

static PyMethodDef TE_methods[] = {
#ifndef __LP64__
    {"TEScrapHandle", (PyCFunction)TE_TEScrapHandle, 1,
     PyDoc_STR("() -> (Handle _rv)")},
    {"TEGetScrapLength", (PyCFunction)TE_TEGetScrapLength, 1,
     PyDoc_STR("() -> (long _rv)")},
    {"TENew", (PyCFunction)TE_TENew, 1,
     PyDoc_STR("(Rect destRect, Rect viewRect) -> (TEHandle _rv)")},
    {"TETextBox", (PyCFunction)TE_TETextBox, 1,
     PyDoc_STR("(Buffer text, Rect box, short just) -> None")},
    {"TEStyleNew", (PyCFunction)TE_TEStyleNew, 1,
     PyDoc_STR("(Rect destRect, Rect viewRect) -> (TEHandle _rv)")},
    {"TESetScrapLength", (PyCFunction)TE_TESetScrapLength, 1,
     PyDoc_STR("(long length) -> None")},
    {"TEFromScrap", (PyCFunction)TE_TEFromScrap, 1,
     PyDoc_STR("() -> None")},
    {"TEToScrap", (PyCFunction)TE_TEToScrap, 1,
     PyDoc_STR("() -> None")},
    {"TEGetScrapHandle", (PyCFunction)TE_TEGetScrapHandle, 1,
     PyDoc_STR("() -> (Handle _rv)")},
    {"TESetScrapHandle", (PyCFunction)TE_TESetScrapHandle, 1,
     PyDoc_STR("(Handle value) -> None")},
    {"LMGetWordRedraw", (PyCFunction)TE_LMGetWordRedraw, 1,
     PyDoc_STR("() -> (UInt8 _rv)")},
    {"LMSetWordRedraw", (PyCFunction)TE_LMSetWordRedraw, 1,
     PyDoc_STR("(UInt8 value) -> None")},
    {"as_TE", (PyCFunction)TE_as_TE, 1,
     PyDoc_STR("(Handle h) -> (TEHandle _rv)")},
#endif /* __LP64__ */
    {NULL, NULL, 0}
};




void init_TE(void)
{
    PyObject *m;
#ifndef __LP64__
    PyObject *d;



        PyMac_INIT_TOOLBOX_OBJECT_NEW(TEHandle, TEObj_New);
        PyMac_INIT_TOOLBOX_OBJECT_CONVERT(TEHandle, TEObj_Convert);

#endif /* __LP64__ */

    m = Py_InitModule("_TE", TE_methods);
#ifndef __LP64__
    d = PyModule_GetDict(m);
    TE_Error = PyMac_GetOSErrException();
    if (TE_Error == NULL ||
        PyDict_SetItemString(d, "Error", TE_Error) != 0)
        return;
    TE_Type.ob_type = &PyType_Type;
    if (PyType_Ready(&TE_Type) < 0) return;
    Py_INCREF(&TE_Type);
    PyModule_AddObject(m, "TE", (PyObject *)&TE_Type);
    /* Backward-compatible name */
    Py_INCREF(&TE_Type);
    PyModule_AddObject(m, "TEType", (PyObject *)&TE_Type);
#endif /* __LP64__ */
}

/* ========================= End module _TE ========================= */

