
/* ========================== Module _Mlte ========================== */

#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>

/* For now we declare them forward here. They'll go to mactoolbox later */
static PyObject *TXNObj_New(TXNObject);
static int TXNObj_Convert(PyObject *, TXNObject *);
static PyObject *TXNFontMenuObj_New(TXNFontMenuObject);
static int TXNFontMenuObj_Convert(PyObject *, TXNFontMenuObject *);

// ADD declarations
#ifdef NOTYET_USE_TOOLBOX_OBJECT_GLUE
//extern PyObject *_CFTypeRefObj_New(CFTypeRef);
//extern int _CFTypeRefObj_Convert(PyObject *, CFTypeRef *);

//#define CFTypeRefObj_New _CFTypeRefObj_New
//#define CFTypeRefObj_Convert _CFTypeRefObj_Convert
#endif

/*
** Parse an optional fsspec
*/
static int
OptFSSpecPtr_Convert(PyObject *v, FSSpec **p_itself)
{
    static FSSpec fss;
    if (v == Py_None)
    {
        *p_itself = NULL;
        return 1;
    }
    *p_itself = &fss;
    return PyMac_GetFSSpec(v, *p_itself);
}

/*
** Parse an optional GWorld
*/
static int
OptGWorldObj_Convert(PyObject *v, GWorldPtr *p_itself)
{
    if (v == Py_None)
    {
        *p_itself = NULL;
        return 1;
    }
    return GWorldObj_Convert(v, p_itself);
}


static PyObject *Mlte_Error;

/* --------------------- Object type TXNObject ---------------------- */

PyTypeObject TXNObject_Type;

#define TXNObj_Check(x) ((x)->ob_type == &TXNObject_Type || PyObject_TypeCheck((x), &TXNObject_Type))

typedef struct TXNObjectObject {
    PyObject_HEAD
    TXNObject ob_itself;
} TXNObjectObject;

PyObject *TXNObj_New(TXNObject itself)
{
    TXNObjectObject *it;
    if (itself == NULL) return PyMac_Error(resNotFound);
    it = PyObject_NEW(TXNObjectObject, &TXNObject_Type);
    if (it == NULL) return NULL;
    it->ob_itself = itself;
    return (PyObject *)it;
}

int TXNObj_Convert(PyObject *v, TXNObject *p_itself)
{
    if (!TXNObj_Check(v))
    {
        PyErr_SetString(PyExc_TypeError, "TXNObject required");
        return 0;
    }
    *p_itself = ((TXNObjectObject *)v)->ob_itself;
    return 1;
}

static void TXNObj_dealloc(TXNObjectObject *self)
{
    /* Cleanup of self->ob_itself goes here */
    self->ob_type->tp_free((PyObject *)self);
}

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

static PyObject *TXNObj_TXNResizeFrame(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    UInt32 iWidth;
    UInt32 iHeight;
    TXNFrameID iTXNFrameID;
#ifndef TXNResizeFrame
    PyMac_PRECHECK(TXNResizeFrame);
#endif
    if (!PyArg_ParseTuple(_args, "lll",
                          &iWidth,
                          &iHeight,
                          &iTXNFrameID))
        return NULL;
    TXNResizeFrame(_self->ob_itself,
                   iWidth,
                   iHeight,
                   iTXNFrameID);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNSetFrameBounds(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    SInt32 iTop;
    SInt32 iLeft;
    SInt32 iBottom;
    SInt32 iRight;
    TXNFrameID iTXNFrameID;
#ifndef TXNSetFrameBounds
    PyMac_PRECHECK(TXNSetFrameBounds);
#endif
    if (!PyArg_ParseTuple(_args, "lllll",
                          &iTop,
                          &iLeft,
                          &iBottom,
                          &iRight,
                          &iTXNFrameID))
        return NULL;
    TXNSetFrameBounds(_self->ob_itself,
                      iTop,
                      iLeft,
                      iBottom,
                      iRight,
                      iTXNFrameID);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNKeyDown(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    EventRecord iEvent;
#ifndef TXNKeyDown
    PyMac_PRECHECK(TXNKeyDown);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetEventRecord, &iEvent))
        return NULL;
    TXNKeyDown(_self->ob_itself,
               &iEvent);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNAdjustCursor(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    RgnHandle ioCursorRgn;
#ifndef TXNAdjustCursor
    PyMac_PRECHECK(TXNAdjustCursor);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          OptResObj_Convert, &ioCursorRgn))
        return NULL;
    TXNAdjustCursor(_self->ob_itself,
                    ioCursorRgn);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNClick(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    EventRecord iEvent;
#ifndef TXNClick
    PyMac_PRECHECK(TXNClick);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetEventRecord, &iEvent))
        return NULL;
    TXNClick(_self->ob_itself,
             &iEvent);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

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

static PyObject *TXNObj_TXNFocus(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Boolean iBecomingFocused;
#ifndef TXNFocus
    PyMac_PRECHECK(TXNFocus);
#endif
    if (!PyArg_ParseTuple(_args, "b",
                          &iBecomingFocused))
        return NULL;
    TXNFocus(_self->ob_itself,
             iBecomingFocused);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

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

static PyObject *TXNObj_TXNDraw(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    GWorldPtr iDrawPort;
#ifndef TXNDraw
    PyMac_PRECHECK(TXNDraw);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          OptGWorldObj_Convert, &iDrawPort))
        return NULL;
    TXNDraw(_self->ob_itself,
        iDrawPort);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

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

static PyObject *TXNObj_TXNGetSleepTicks(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    UInt32 _rv;
#ifndef TXNGetSleepTicks
    PyMac_PRECHECK(TXNGetSleepTicks);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TXNGetSleepTicks(_self->ob_itself);
    _res = Py_BuildValue("l",
                         _rv);
    return _res;
}

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

static PyObject *TXNObj_TXNGrowWindow(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    EventRecord iEvent;
#ifndef TXNGrowWindow
    PyMac_PRECHECK(TXNGrowWindow);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetEventRecord, &iEvent))
        return NULL;
    TXNGrowWindow(_self->ob_itself,
                  &iEvent);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNZoomWindow(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    SInt16 iPart;
#ifndef TXNZoomWindow
    PyMac_PRECHECK(TXNZoomWindow);
#endif
    if (!PyArg_ParseTuple(_args, "h",
                          &iPart))
        return NULL;
    TXNZoomWindow(_self->ob_itself,
                  iPart);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNCanUndo(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Boolean _rv;
    TXNActionKey oTXNActionKey;
#ifndef TXNCanUndo
    PyMac_PRECHECK(TXNCanUndo);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TXNCanUndo(_self->ob_itself,
                     &oTXNActionKey);
    _res = Py_BuildValue("bl",
                         _rv,
                         oTXNActionKey);
    return _res;
}

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

static PyObject *TXNObj_TXNCanRedo(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Boolean _rv;
    TXNActionKey oTXNActionKey;
#ifndef TXNCanRedo
    PyMac_PRECHECK(TXNCanRedo);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TXNCanRedo(_self->ob_itself,
                     &oTXNActionKey);
    _res = Py_BuildValue("bl",
                         _rv,
                         oTXNActionKey);
    return _res;
}

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

static PyObject *TXNObj_TXNCut(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
#ifndef TXNCut
    PyMac_PRECHECK(TXNCut);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = TXNCut(_self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNCopy(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
#ifndef TXNCopy
    PyMac_PRECHECK(TXNCopy);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = TXNCopy(_self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNPaste(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
#ifndef TXNPaste
    PyMac_PRECHECK(TXNPaste);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = TXNPaste(_self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNClear(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
#ifndef TXNClear
    PyMac_PRECHECK(TXNClear);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = TXNClear(_self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNGetSelection(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    TXNOffset oStartOffset;
    TXNOffset oEndOffset;
#ifndef TXNGetSelection
    PyMac_PRECHECK(TXNGetSelection);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TXNGetSelection(_self->ob_itself,
                    &oStartOffset,
                    &oEndOffset);
    _res = Py_BuildValue("ll",
                         oStartOffset,
                         oEndOffset);
    return _res;
}

static PyObject *TXNObj_TXNShowSelection(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Boolean iShowEnd;
#ifndef TXNShowSelection
    PyMac_PRECHECK(TXNShowSelection);
#endif
    if (!PyArg_ParseTuple(_args, "b",
                          &iShowEnd))
        return NULL;
    TXNShowSelection(_self->ob_itself,
                     iShowEnd);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNIsSelectionEmpty(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Boolean _rv;
#ifndef TXNIsSelectionEmpty
    PyMac_PRECHECK(TXNIsSelectionEmpty);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TXNIsSelectionEmpty(_self->ob_itself);
    _res = Py_BuildValue("b",
                         _rv);
    return _res;
}

static PyObject *TXNObj_TXNSetSelection(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    TXNOffset iStartOffset;
    TXNOffset iEndOffset;
#ifndef TXNSetSelection
    PyMac_PRECHECK(TXNSetSelection);
#endif
    if (!PyArg_ParseTuple(_args, "ll",
                          &iStartOffset,
                          &iEndOffset))
        return NULL;
    _err = TXNSetSelection(_self->ob_itself,
                           iStartOffset,
                           iEndOffset);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNCountRunsInRange(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    TXNOffset iStartOffset;
    TXNOffset iEndOffset;
    ItemCount oRunCount;
#ifndef TXNCountRunsInRange
    PyMac_PRECHECK(TXNCountRunsInRange);
#endif
    if (!PyArg_ParseTuple(_args, "ll",
                          &iStartOffset,
                          &iEndOffset))
        return NULL;
    _err = TXNCountRunsInRange(_self->ob_itself,
                               iStartOffset,
                               iEndOffset,
                               &oRunCount);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("l",
                         oRunCount);
    return _res;
}

static PyObject *TXNObj_TXNDataSize(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    ByteCount _rv;
#ifndef TXNDataSize
    PyMac_PRECHECK(TXNDataSize);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TXNDataSize(_self->ob_itself);
    _res = Py_BuildValue("l",
                         _rv);
    return _res;
}

static PyObject *TXNObj_TXNGetData(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    TXNOffset iStartOffset;
    TXNOffset iEndOffset;
    Handle oDataHandle;
#ifndef TXNGetData
    PyMac_PRECHECK(TXNGetData);
#endif
    if (!PyArg_ParseTuple(_args, "ll",
                          &iStartOffset,
                          &iEndOffset))
        return NULL;
    _err = TXNGetData(_self->ob_itself,
                      iStartOffset,
                      iEndOffset,
                      &oDataHandle);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         ResObj_New, oDataHandle);
    return _res;
}

static PyObject *TXNObj_TXNGetDataEncoded(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    TXNOffset iStartOffset;
    TXNOffset iEndOffset;
    Handle oDataHandle;
    TXNDataType iEncoding;
#ifndef TXNGetDataEncoded
    PyMac_PRECHECK(TXNGetDataEncoded);
#endif
    if (!PyArg_ParseTuple(_args, "llO&",
                          &iStartOffset,
                          &iEndOffset,
                          PyMac_GetOSType, &iEncoding))
        return NULL;
    _err = TXNGetDataEncoded(_self->ob_itself,
                             iStartOffset,
                             iEndOffset,
                             &oDataHandle,
                             iEncoding);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         ResObj_New, oDataHandle);
    return _res;
}

static PyObject *TXNObj_TXNSetDataFromFile(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    SInt16 iFileRefNum;
    OSType iFileType;
    ByteCount iFileLength;
    TXNOffset iStartOffset;
    TXNOffset iEndOffset;
#ifndef TXNSetDataFromFile
    PyMac_PRECHECK(TXNSetDataFromFile);
#endif
    if (!PyArg_ParseTuple(_args, "hO&lll",
                          &iFileRefNum,
                          PyMac_GetOSType, &iFileType,
                          &iFileLength,
                          &iStartOffset,
                          &iEndOffset))
        return NULL;
    _err = TXNSetDataFromFile(_self->ob_itself,
                              iFileRefNum,
                              iFileType,
                              iFileLength,
                              iStartOffset,
                              iEndOffset);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNGetChangeCount(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    ItemCount _rv;
#ifndef TXNGetChangeCount
    PyMac_PRECHECK(TXNGetChangeCount);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TXNGetChangeCount(_self->ob_itself);
    _res = Py_BuildValue("l",
                         _rv);
    return _res;
}

static PyObject *TXNObj_TXNSave(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    TXNFileType iType;
    OSType iResType;
    TXNPermanentTextEncodingType iPermanentEncoding;
    FSSpec iFileSpecification;
    SInt16 iDataReference;
    SInt16 iResourceReference;
#ifndef TXNSave
    PyMac_PRECHECK(TXNSave);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&lO&hh",
                          PyMac_GetOSType, &iType,
                          PyMac_GetOSType, &iResType,
                          &iPermanentEncoding,
                          PyMac_GetFSSpec, &iFileSpecification,
                          &iDataReference,
                          &iResourceReference))
        return NULL;
    _err = TXNSave(_self->ob_itself,
                   iType,
                   iResType,
                   iPermanentEncoding,
                   &iFileSpecification,
                   iDataReference,
                   iResourceReference);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNRevert(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
#ifndef TXNRevert
    PyMac_PRECHECK(TXNRevert);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = TXNRevert(_self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNPageSetup(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
#ifndef TXNPageSetup
    PyMac_PRECHECK(TXNPageSetup);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = TXNPageSetup(_self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNPrint(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
#ifndef TXNPrint
    PyMac_PRECHECK(TXNPrint);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = TXNPrint(_self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNGetViewRect(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Rect oViewRect;
#ifndef TXNGetViewRect
    PyMac_PRECHECK(TXNGetViewRect);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TXNGetViewRect(_self->ob_itself,
                   &oViewRect);
    _res = Py_BuildValue("O&",
                         PyMac_BuildRect, &oViewRect);
    return _res;
}

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

static PyObject *TXNObj_TXNAttachObjectToWindow(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    GWorldPtr iWindow;
    Boolean iIsActualWindow;
#ifndef TXNAttachObjectToWindow
    PyMac_PRECHECK(TXNAttachObjectToWindow);
#endif
    if (!PyArg_ParseTuple(_args, "O&b",
                          GWorldObj_Convert, &iWindow,
                          &iIsActualWindow))
        return NULL;
    _err = TXNAttachObjectToWindow(_self->ob_itself,
                                   iWindow,
                                   iIsActualWindow);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNIsObjectAttachedToWindow(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Boolean _rv;
#ifndef TXNIsObjectAttachedToWindow
    PyMac_PRECHECK(TXNIsObjectAttachedToWindow);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TXNIsObjectAttachedToWindow(_self->ob_itself);
    _res = Py_BuildValue("b",
                         _rv);
    return _res;
}

static PyObject *TXNObj_TXNDragTracker(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    TXNFrameID iTXNFrameID;
    DragTrackingMessage iMessage;
    WindowPtr iWindow;
    DragReference iDragReference;
    Boolean iDifferentObjectSameWindow;
#ifndef TXNDragTracker
    PyMac_PRECHECK(TXNDragTracker);
#endif
    if (!PyArg_ParseTuple(_args, "lhO&O&b",
                          &iTXNFrameID,
                          &iMessage,
                          WinObj_Convert, &iWindow,
                          DragObj_Convert, &iDragReference,
                          &iDifferentObjectSameWindow))
        return NULL;
    _err = TXNDragTracker(_self->ob_itself,
                          iTXNFrameID,
                          iMessage,
                          iWindow,
                          iDragReference,
                          iDifferentObjectSameWindow);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNDragReceiver(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    TXNFrameID iTXNFrameID;
    WindowPtr iWindow;
    DragReference iDragReference;
    Boolean iDifferentObjectSameWindow;
#ifndef TXNDragReceiver
    PyMac_PRECHECK(TXNDragReceiver);
#endif
    if (!PyArg_ParseTuple(_args, "lO&O&b",
                          &iTXNFrameID,
                          WinObj_Convert, &iWindow,
                          DragObj_Convert, &iDragReference,
                          &iDifferentObjectSameWindow))
        return NULL;
    _err = TXNDragReceiver(_self->ob_itself,
                           iTXNFrameID,
                           iWindow,
                           iDragReference,
                           iDifferentObjectSameWindow);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNActivate(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    TXNFrameID iTXNFrameID;
    TXNScrollBarState iActiveState;
#ifndef TXNActivate
    PyMac_PRECHECK(TXNActivate);
#endif
    if (!PyArg_ParseTuple(_args, "ll",
                          &iTXNFrameID,
                          &iActiveState))
        return NULL;
    _err = TXNActivate(_self->ob_itself,
                       iTXNFrameID,
                       iActiveState);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNEchoMode(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    UniChar iEchoCharacter;
    TextEncoding iEncoding;
    Boolean iOn;
#ifndef TXNEchoMode
    PyMac_PRECHECK(TXNEchoMode);
#endif
    if (!PyArg_ParseTuple(_args, "hlb",
                          &iEchoCharacter,
                          &iEncoding,
                          &iOn))
        return NULL;
    _err = TXNEchoMode(_self->ob_itself,
                       iEchoCharacter,
                       iEncoding,
                       iOn);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNDoFontMenuSelection(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    TXNFontMenuObject iTXNFontMenuObject;
    SInt16 iMenuID;
    SInt16 iMenuItem;
#ifndef TXNDoFontMenuSelection
    PyMac_PRECHECK(TXNDoFontMenuSelection);
#endif
    if (!PyArg_ParseTuple(_args, "O&hh",
                          TXNFontMenuObj_Convert, &iTXNFontMenuObject,
                          &iMenuID,
                          &iMenuItem))
        return NULL;
    _err = TXNDoFontMenuSelection(_self->ob_itself,
                                  iTXNFontMenuObject,
                                  iMenuID,
                                  iMenuItem);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNPrepareFontMenu(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    TXNFontMenuObject iTXNFontMenuObject;
#ifndef TXNPrepareFontMenu
    PyMac_PRECHECK(TXNPrepareFontMenu);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          TXNFontMenuObj_Convert, &iTXNFontMenuObject))
        return NULL;
    _err = TXNPrepareFontMenu(_self->ob_itself,
                              iTXNFontMenuObject);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *TXNObj_TXNPointToOffset(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    Point iPoint;
    TXNOffset oOffset;
#ifndef TXNPointToOffset
    PyMac_PRECHECK(TXNPointToOffset);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetPoint, &iPoint))
        return NULL;
    _err = TXNPointToOffset(_self->ob_itself,
                            iPoint,
                            &oOffset);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("l",
                         oOffset);
    return _res;
}

static PyObject *TXNObj_TXNOffsetToPoint(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    TXNOffset iOffset;
    Point oPoint;
#ifndef TXNOffsetToPoint
    PyMac_PRECHECK(TXNOffsetToPoint);
#endif
    if (!PyArg_ParseTuple(_args, "l",
                          &iOffset))
        return NULL;
    _err = TXNOffsetToPoint(_self->ob_itself,
                            iOffset,
                            &oPoint);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         PyMac_BuildPoint, oPoint);
    return _res;
}

static PyObject *TXNObj_TXNGetLineCount(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    ItemCount oLineTotal;
#ifndef TXNGetLineCount
    PyMac_PRECHECK(TXNGetLineCount);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = TXNGetLineCount(_self->ob_itself,
                           &oLineTotal);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("l",
                         oLineTotal);
    return _res;
}

static PyObject *TXNObj_TXNGetLineMetrics(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    UInt32 iLineNumber;
    Fixed oLineWidth;
    Fixed oLineHeight;
#ifndef TXNGetLineMetrics
    PyMac_PRECHECK(TXNGetLineMetrics);
#endif
    if (!PyArg_ParseTuple(_args, "l",
                          &iLineNumber))
        return NULL;
    _err = TXNGetLineMetrics(_self->ob_itself,
                             iLineNumber,
                             &oLineWidth,
                             &oLineHeight);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&O&",
                         PyMac_BuildFixed, oLineWidth,
                         PyMac_BuildFixed, oLineHeight);
    return _res;
}

static PyObject *TXNObj_TXNIsObjectAttachedToSpecificWindow(TXNObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    WindowPtr iWindow;
    Boolean oAttached;
#ifndef TXNIsObjectAttachedToSpecificWindow
    PyMac_PRECHECK(TXNIsObjectAttachedToSpecificWindow);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          WinObj_Convert, &iWindow))
        return NULL;
    _err = TXNIsObjectAttachedToSpecificWindow(_self->ob_itself,
                                               iWindow,
                                               &oAttached);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("b",
                         oAttached);
    return _res;
}

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

static PyMethodDef TXNObj_methods[] = {
    {"TXNDeleteObject", (PyCFunction)TXNObj_TXNDeleteObject, 1,
     PyDoc_STR("() -> None")},
    {"TXNResizeFrame", (PyCFunction)TXNObj_TXNResizeFrame, 1,
     PyDoc_STR("(UInt32 iWidth, UInt32 iHeight, TXNFrameID iTXNFrameID) -> None")},
    {"TXNSetFrameBounds", (PyCFunction)TXNObj_TXNSetFrameBounds, 1,
     PyDoc_STR("(SInt32 iTop, SInt32 iLeft, SInt32 iBottom, SInt32 iRight, TXNFrameID iTXNFrameID) -> None")},
    {"TXNKeyDown", (PyCFunction)TXNObj_TXNKeyDown, 1,
     PyDoc_STR("(EventRecord iEvent) -> None")},
    {"TXNAdjustCursor", (PyCFunction)TXNObj_TXNAdjustCursor, 1,
     PyDoc_STR("(RgnHandle ioCursorRgn) -> None")},
    {"TXNClick", (PyCFunction)TXNObj_TXNClick, 1,
     PyDoc_STR("(EventRecord iEvent) -> None")},
    {"TXNSelectAll", (PyCFunction)TXNObj_TXNSelectAll, 1,
     PyDoc_STR("() -> None")},
    {"TXNFocus", (PyCFunction)TXNObj_TXNFocus, 1,
     PyDoc_STR("(Boolean iBecomingFocused) -> None")},
    {"TXNUpdate", (PyCFunction)TXNObj_TXNUpdate, 1,
     PyDoc_STR("() -> None")},
    {"TXNDraw", (PyCFunction)TXNObj_TXNDraw, 1,
     PyDoc_STR("(GWorldPtr iDrawPort) -> None")},
    {"TXNForceUpdate", (PyCFunction)TXNObj_TXNForceUpdate, 1,
     PyDoc_STR("() -> None")},
    {"TXNGetSleepTicks", (PyCFunction)TXNObj_TXNGetSleepTicks, 1,
     PyDoc_STR("() -> (UInt32 _rv)")},
    {"TXNIdle", (PyCFunction)TXNObj_TXNIdle, 1,
     PyDoc_STR("() -> None")},
    {"TXNGrowWindow", (PyCFunction)TXNObj_TXNGrowWindow, 1,
     PyDoc_STR("(EventRecord iEvent) -> None")},
    {"TXNZoomWindow", (PyCFunction)TXNObj_TXNZoomWindow, 1,
     PyDoc_STR("(SInt16 iPart) -> None")},
    {"TXNCanUndo", (PyCFunction)TXNObj_TXNCanUndo, 1,
     PyDoc_STR("() -> (Boolean _rv, TXNActionKey oTXNActionKey)")},
    {"TXNUndo", (PyCFunction)TXNObj_TXNUndo, 1,
     PyDoc_STR("() -> None")},
    {"TXNCanRedo", (PyCFunction)TXNObj_TXNCanRedo, 1,
     PyDoc_STR("() -> (Boolean _rv, TXNActionKey oTXNActionKey)")},
    {"TXNRedo", (PyCFunction)TXNObj_TXNRedo, 1,
     PyDoc_STR("() -> None")},
    {"TXNCut", (PyCFunction)TXNObj_TXNCut, 1,
     PyDoc_STR("() -> None")},
    {"TXNCopy", (PyCFunction)TXNObj_TXNCopy, 1,
     PyDoc_STR("() -> None")},
    {"TXNPaste", (PyCFunction)TXNObj_TXNPaste, 1,
     PyDoc_STR("() -> None")},
    {"TXNClear", (PyCFunction)TXNObj_TXNClear, 1,
     PyDoc_STR("() -> None")},
    {"TXNGetSelection", (PyCFunction)TXNObj_TXNGetSelection, 1,
     PyDoc_STR("() -> (TXNOffset oStartOffset, TXNOffset oEndOffset)")},
    {"TXNShowSelection", (PyCFunction)TXNObj_TXNShowSelection, 1,
     PyDoc_STR("(Boolean iShowEnd) -> None")},
    {"TXNIsSelectionEmpty", (PyCFunction)TXNObj_TXNIsSelectionEmpty, 1,
     PyDoc_STR("() -> (Boolean _rv)")},
    {"TXNSetSelection", (PyCFunction)TXNObj_TXNSetSelection, 1,
     PyDoc_STR("(TXNOffset iStartOffset, TXNOffset iEndOffset) -> None")},
    {"TXNCountRunsInRange", (PyCFunction)TXNObj_TXNCountRunsInRange, 1,
     PyDoc_STR("(TXNOffset iStartOffset, TXNOffset iEndOffset) -> (ItemCount oRunCount)")},
    {"TXNDataSize", (PyCFunction)TXNObj_TXNDataSize, 1,
     PyDoc_STR("() -> (ByteCount _rv)")},
    {"TXNGetData", (PyCFunction)TXNObj_TXNGetData, 1,
     PyDoc_STR("(TXNOffset iStartOffset, TXNOffset iEndOffset) -> (Handle oDataHandle)")},
    {"TXNGetDataEncoded", (PyCFunction)TXNObj_TXNGetDataEncoded, 1,
     PyDoc_STR("(TXNOffset iStartOffset, TXNOffset iEndOffset, TXNDataType iEncoding) -> (Handle oDataHandle)")},
    {"TXNSetDataFromFile", (PyCFunction)TXNObj_TXNSetDataFromFile, 1,
     PyDoc_STR("(SInt16 iFileRefNum, OSType iFileType, ByteCount iFileLength, TXNOffset iStartOffset, TXNOffset iEndOffset) -> None")},
    {"TXNGetChangeCount", (PyCFunction)TXNObj_TXNGetChangeCount, 1,
     PyDoc_STR("() -> (ItemCount _rv)")},
    {"TXNSave", (PyCFunction)TXNObj_TXNSave, 1,
     PyDoc_STR("(TXNFileType iType, OSType iResType, TXNPermanentTextEncodingType iPermanentEncoding, FSSpec iFileSpecification, SInt16 iDataReference, SInt16 iResourceReference) -> None")},
    {"TXNRevert", (PyCFunction)TXNObj_TXNRevert, 1,
     PyDoc_STR("() -> None")},
    {"TXNPageSetup", (PyCFunction)TXNObj_TXNPageSetup, 1,
     PyDoc_STR("() -> None")},
    {"TXNPrint", (PyCFunction)TXNObj_TXNPrint, 1,
     PyDoc_STR("() -> None")},
    {"TXNGetViewRect", (PyCFunction)TXNObj_TXNGetViewRect, 1,
     PyDoc_STR("() -> (Rect oViewRect)")},
    {"TXNSetViewRect", (PyCFunction)TXNObj_TXNSetViewRect, 1,
     PyDoc_STR("(Rect iViewRect) -> None")},
    {"TXNAttachObjectToWindow", (PyCFunction)TXNObj_TXNAttachObjectToWindow, 1,
     PyDoc_STR("(GWorldPtr iWindow, Boolean iIsActualWindow) -> None")},
    {"TXNIsObjectAttachedToWindow", (PyCFunction)TXNObj_TXNIsObjectAttachedToWindow, 1,
     PyDoc_STR("() -> (Boolean _rv)")},
    {"TXNDragTracker", (PyCFunction)TXNObj_TXNDragTracker, 1,
     PyDoc_STR("(TXNFrameID iTXNFrameID, DragTrackingMessage iMessage, WindowPtr iWindow, DragReference iDragReference, Boolean iDifferentObjectSameWindow) -> None")},
    {"TXNDragReceiver", (PyCFunction)TXNObj_TXNDragReceiver, 1,
     PyDoc_STR("(TXNFrameID iTXNFrameID, WindowPtr iWindow, DragReference iDragReference, Boolean iDifferentObjectSameWindow) -> None")},
    {"TXNActivate", (PyCFunction)TXNObj_TXNActivate, 1,
     PyDoc_STR("(TXNFrameID iTXNFrameID, TXNScrollBarState iActiveState) -> None")},
    {"TXNEchoMode", (PyCFunction)TXNObj_TXNEchoMode, 1,
     PyDoc_STR("(UniChar iEchoCharacter, TextEncoding iEncoding, Boolean iOn) -> None")},
    {"TXNDoFontMenuSelection", (PyCFunction)TXNObj_TXNDoFontMenuSelection, 1,
     PyDoc_STR("(TXNFontMenuObject iTXNFontMenuObject, SInt16 iMenuID, SInt16 iMenuItem) -> None")},
    {"TXNPrepareFontMenu", (PyCFunction)TXNObj_TXNPrepareFontMenu, 1,
     PyDoc_STR("(TXNFontMenuObject iTXNFontMenuObject) -> None")},
    {"TXNPointToOffset", (PyCFunction)TXNObj_TXNPointToOffset, 1,
     PyDoc_STR("(Point iPoint) -> (TXNOffset oOffset)")},
    {"TXNOffsetToPoint", (PyCFunction)TXNObj_TXNOffsetToPoint, 1,
     PyDoc_STR("(TXNOffset iOffset) -> (Point oPoint)")},
    {"TXNGetLineCount", (PyCFunction)TXNObj_TXNGetLineCount, 1,
     PyDoc_STR("() -> (ItemCount oLineTotal)")},
    {"TXNGetLineMetrics", (PyCFunction)TXNObj_TXNGetLineMetrics, 1,
     PyDoc_STR("(UInt32 iLineNumber) -> (Fixed oLineWidth, Fixed oLineHeight)")},
    {"TXNIsObjectAttachedToSpecificWindow", (PyCFunction)TXNObj_TXNIsObjectAttachedToSpecificWindow, 1,
     PyDoc_STR("(WindowPtr iWindow) -> (Boolean oAttached)")},
    {"TXNRecalcTextLayout", (PyCFunction)TXNObj_TXNRecalcTextLayout, 1,
     PyDoc_STR("() -> None")},
    {NULL, NULL, 0}
};

#define TXNObj_getsetlist NULL


#define TXNObj_compare NULL

#define TXNObj_repr NULL

#define TXNObj_hash NULL
#define TXNObj_tp_init 0

#define TXNObj_tp_alloc PyType_GenericAlloc

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

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

#define TXNObj_tp_free PyObject_Del


PyTypeObject TXNObject_Type = {
    PyObject_HEAD_INIT(NULL)
    0, /*ob_size*/
    "_Mlte.TXNObject", /*tp_name*/
    sizeof(TXNObjectObject), /*tp_basicsize*/
    0, /*tp_itemsize*/
    /* methods */
    (destructor) TXNObj_dealloc, /*tp_dealloc*/
    0, /*tp_print*/
    (getattrfunc)0, /*tp_getattr*/
    (setattrfunc)0, /*tp_setattr*/
    (cmpfunc) TXNObj_compare, /*tp_compare*/
    (reprfunc) TXNObj_repr, /*tp_repr*/
    (PyNumberMethods *)0, /* tp_as_number */
    (PySequenceMethods *)0, /* tp_as_sequence */
    (PyMappingMethods *)0, /* tp_as_mapping */
    (hashfunc) TXNObj_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*/
    TXNObj_methods, /* tp_methods */
    0, /*tp_members*/
    TXNObj_getsetlist, /*tp_getset*/
    0, /*tp_base*/
    0, /*tp_dict*/
    0, /*tp_descr_get*/
    0, /*tp_descr_set*/
    0, /*tp_dictoffset*/
    TXNObj_tp_init, /* tp_init */
    TXNObj_tp_alloc, /* tp_alloc */
    TXNObj_tp_new, /* tp_new */
    TXNObj_tp_free, /* tp_free */
};

/* ------------------- End object type TXNObject -------------------- */


/* ----------------- Object type TXNFontMenuObject ------------------ */

PyTypeObject TXNFontMenuObject_Type;

#define TXNFontMenuObj_Check(x) ((x)->ob_type == &TXNFontMenuObject_Type || PyObject_TypeCheck((x), &TXNFontMenuObject_Type))

typedef struct TXNFontMenuObjectObject {
    PyObject_HEAD
    TXNFontMenuObject ob_itself;
} TXNFontMenuObjectObject;

PyObject *TXNFontMenuObj_New(TXNFontMenuObject itself)
{
    TXNFontMenuObjectObject *it;
    if (itself == NULL) return PyMac_Error(resNotFound);
    it = PyObject_NEW(TXNFontMenuObjectObject, &TXNFontMenuObject_Type);
    if (it == NULL) return NULL;
    it->ob_itself = itself;
    return (PyObject *)it;
}

int TXNFontMenuObj_Convert(PyObject *v, TXNFontMenuObject *p_itself)
{
    if (!TXNFontMenuObj_Check(v))
    {
        PyErr_SetString(PyExc_TypeError, "TXNFontMenuObject required");
        return 0;
    }
    *p_itself = ((TXNFontMenuObjectObject *)v)->ob_itself;
    return 1;
}

static void TXNFontMenuObj_dealloc(TXNFontMenuObjectObject *self)
{
    /* Cleanup of self->ob_itself goes here */
    self->ob_type->tp_free((PyObject *)self);
}

static PyObject *TXNFontMenuObj_TXNGetFontMenuHandle(TXNFontMenuObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    MenuHandle oFontMenuHandle;
#ifndef TXNGetFontMenuHandle
    PyMac_PRECHECK(TXNGetFontMenuHandle);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = TXNGetFontMenuHandle(_self->ob_itself,
                                &oFontMenuHandle);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         MenuObj_New, oFontMenuHandle);
    return _res;
}

static PyObject *TXNFontMenuObj_TXNDisposeFontMenuObject(TXNFontMenuObjectObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
#ifndef TXNDisposeFontMenuObject
    PyMac_PRECHECK(TXNDisposeFontMenuObject);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = TXNDisposeFontMenuObject(_self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyMethodDef TXNFontMenuObj_methods[] = {
    {"TXNGetFontMenuHandle", (PyCFunction)TXNFontMenuObj_TXNGetFontMenuHandle, 1,
     PyDoc_STR("() -> (MenuHandle oFontMenuHandle)")},
    {"TXNDisposeFontMenuObject", (PyCFunction)TXNFontMenuObj_TXNDisposeFontMenuObject, 1,
     PyDoc_STR("() -> None")},
    {NULL, NULL, 0}
};

#define TXNFontMenuObj_getsetlist NULL


#define TXNFontMenuObj_compare NULL

#define TXNFontMenuObj_repr NULL

#define TXNFontMenuObj_hash NULL
#define TXNFontMenuObj_tp_init 0

#define TXNFontMenuObj_tp_alloc PyType_GenericAlloc

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

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

#define TXNFontMenuObj_tp_free PyObject_Del


PyTypeObject TXNFontMenuObject_Type = {
    PyObject_HEAD_INIT(NULL)
    0, /*ob_size*/
    "_Mlte.TXNFontMenuObject", /*tp_name*/
    sizeof(TXNFontMenuObjectObject), /*tp_basicsize*/
    0, /*tp_itemsize*/
    /* methods */
    (destructor) TXNFontMenuObj_dealloc, /*tp_dealloc*/
    0, /*tp_print*/
    (getattrfunc)0, /*tp_getattr*/
    (setattrfunc)0, /*tp_setattr*/
    (cmpfunc) TXNFontMenuObj_compare, /*tp_compare*/
    (reprfunc) TXNFontMenuObj_repr, /*tp_repr*/
    (PyNumberMethods *)0, /* tp_as_number */
    (PySequenceMethods *)0, /* tp_as_sequence */
    (PyMappingMethods *)0, /* tp_as_mapping */
    (hashfunc) TXNFontMenuObj_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*/
    TXNFontMenuObj_methods, /* tp_methods */
    0, /*tp_members*/
    TXNFontMenuObj_getsetlist, /*tp_getset*/
    0, /*tp_base*/
    0, /*tp_dict*/
    0, /*tp_descr_get*/
    0, /*tp_descr_set*/
    0, /*tp_dictoffset*/
    TXNFontMenuObj_tp_init, /* tp_init */
    TXNFontMenuObj_tp_alloc, /* tp_alloc */
    TXNFontMenuObj_tp_new, /* tp_new */
    TXNFontMenuObj_tp_free, /* tp_free */
};

/* --------------- End object type TXNFontMenuObject ---------------- */


static PyObject *Mlte_TXNNewObject(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    FSSpec * iFileSpec;
    WindowPtr iWindow;
    Rect iFrame;
    TXNFrameOptions iFrameOptions;
    TXNFrameType iFrameType;
    TXNFileType iFileType;
    TXNPermanentTextEncodingType iPermanentEncoding;
    TXNObject oTXNObject;
    TXNFrameID oTXNFrameID;
#ifndef TXNNewObject
    PyMac_PRECHECK(TXNNewObject);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&O&llO&l",
                          OptFSSpecPtr_Convert, &iFileSpec,
                          WinObj_Convert, &iWindow,
                          PyMac_GetRect, &iFrame,
                          &iFrameOptions,
                          &iFrameType,
                          PyMac_GetOSType, &iFileType,
                          &iPermanentEncoding))
        return NULL;
    _err = TXNNewObject(iFileSpec,
                        iWindow,
                        &iFrame,
                        iFrameOptions,
                        iFrameType,
                        iFileType,
                        iPermanentEncoding,
                        &oTXNObject,
                        &oTXNFrameID,
                        (TXNObjectRefcon)0);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&l",
                         TXNObj_New, oTXNObject,
                         oTXNFrameID);
    return _res;
}

static PyObject *Mlte_TXNTerminateTextension(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
#ifndef TXNTerminateTextension
    PyMac_PRECHECK(TXNTerminateTextension);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    TXNTerminateTextension();
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

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

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

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

static PyObject *Mlte_TXNNewFontMenuObject(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSStatus _err;
    MenuHandle iFontMenuHandle;
    SInt16 iMenuID;
    SInt16 iStartHierMenuID;
    TXNFontMenuObject oTXNFontMenuObject;
#ifndef TXNNewFontMenuObject
    PyMac_PRECHECK(TXNNewFontMenuObject);
#endif
    if (!PyArg_ParseTuple(_args, "O&hh",
                          MenuObj_Convert, &iFontMenuHandle,
                          &iMenuID,
                          &iStartHierMenuID))
        return NULL;
    _err = TXNNewFontMenuObject(iFontMenuHandle,
                                iMenuID,
                                iStartHierMenuID,
                                &oTXNFontMenuObject);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         TXNFontMenuObj_New, oTXNFontMenuObject);
    return _res;
}

static PyObject *Mlte_TXNVersionInformation(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    TXNVersionValue _rv;
    TXNFeatureBits oFeatureFlags;
#ifndef TXNVersionInformation
    PyMac_PRECHECK(TXNVersionInformation);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = TXNVersionInformation(&oFeatureFlags);
    _res = Py_BuildValue("ll",
                         _rv,
                         oFeatureFlags);
    return _res;
}

static PyObject *Mlte_TXNInitTextension(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;

    OSStatus _err;
    TXNMacOSPreferredFontDescription * iDefaultFonts = NULL;
    ItemCount iCountDefaultFonts = 0;
    TXNInitOptions iUsageFlags;
    PyMac_PRECHECK(TXNInitTextension);
    if (!PyArg_ParseTuple(_args, "l", &iUsageFlags))
        return NULL;
    _err = TXNInitTextension(iDefaultFonts,
                             iCountDefaultFonts,
                             iUsageFlags);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;

}

#endif /* __LP64__ */

static PyMethodDef Mlte_methods[] = {
#ifndef __LP64__
    {"TXNNewObject", (PyCFunction)Mlte_TXNNewObject, 1,
     PyDoc_STR("(FSSpec * iFileSpec, WindowPtr iWindow, Rect iFrame, TXNFrameOptions iFrameOptions, TXNFrameType iFrameType, TXNFileType iFileType, TXNPermanentTextEncodingType iPermanentEncoding) -> (TXNObject oTXNObject, TXNFrameID oTXNFrameID)")},
    {"TXNTerminateTextension", (PyCFunction)Mlte_TXNTerminateTextension, 1,
     PyDoc_STR("() -> None")},
    {"TXNIsScrapPastable", (PyCFunction)Mlte_TXNIsScrapPastable, 1,
     PyDoc_STR("() -> (Boolean _rv)")},
    {"TXNConvertToPublicScrap", (PyCFunction)Mlte_TXNConvertToPublicScrap, 1,
     PyDoc_STR("() -> None")},
    {"TXNConvertFromPublicScrap", (PyCFunction)Mlte_TXNConvertFromPublicScrap, 1,
     PyDoc_STR("() -> None")},
    {"TXNNewFontMenuObject", (PyCFunction)Mlte_TXNNewFontMenuObject, 1,
     PyDoc_STR("(MenuHandle iFontMenuHandle, SInt16 iMenuID, SInt16 iStartHierMenuID) -> (TXNFontMenuObject oTXNFontMenuObject)")},
    {"TXNVersionInformation", (PyCFunction)Mlte_TXNVersionInformation, 1,
     PyDoc_STR("() -> (TXNVersionValue _rv, TXNFeatureBits oFeatureFlags)")},
    {"TXNInitTextension", (PyCFunction)Mlte_TXNInitTextension, 1,
     PyDoc_STR("(TXNInitOptions) -> None")},
#endif /* __LP64__ */
    {NULL, NULL, 0}
};




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



    //      PyMac_INIT_TOOLBOX_OBJECT_NEW(xxxx);

#endif /* __LP64__ */

    m = Py_InitModule("_Mlte", Mlte_methods);
#ifndef __LP64__
    d = PyModule_GetDict(m);
    Mlte_Error = PyMac_GetOSErrException();
    if (Mlte_Error == NULL ||
        PyDict_SetItemString(d, "Error", Mlte_Error) != 0)
        return;
    TXNObject_Type.ob_type = &PyType_Type;
    if (PyType_Ready(&TXNObject_Type) < 0) return;
    Py_INCREF(&TXNObject_Type);
    PyModule_AddObject(m, "TXNObject", (PyObject *)&TXNObject_Type);
    /* Backward-compatible name */
    Py_INCREF(&TXNObject_Type);
    PyModule_AddObject(m, "TXNObjectType", (PyObject *)&TXNObject_Type);
    TXNFontMenuObject_Type.ob_type = &PyType_Type;
    if (PyType_Ready(&TXNFontMenuObject_Type) < 0) return;
    Py_INCREF(&TXNFontMenuObject_Type);
    PyModule_AddObject(m, "TXNFontMenuObject", (PyObject *)&TXNFontMenuObject_Type);
    /* Backward-compatible name */
    Py_INCREF(&TXNFontMenuObject_Type);
    PyModule_AddObject(m, "TXNFontMenuObjectType", (PyObject *)&TXNFontMenuObject_Type);
#endif /* __LP64__ */
}

/* ======================== End module _Mlte ======================== */

