Home | History | Annotate | Download | only in te
      1 # This script generates a Python interface for an Apple Macintosh Manager.
      2 # It uses the "bgen" package to generate C code.
      3 # The function specifications are generated by scanning the mamager's header file,
      4 # using the "scantools" package (customized for this particular manager).
      5 
      6 import string
      7 
      8 # Declarations that change for each manager
      9 MACHEADERFILE = 'TextEdit.h'            # The Apple header file
     10 MODNAME = '_TE'                         # The name of the module
     11 OBJECTNAME = 'TE'                       # The basic name of the objects used here
     12 KIND = 'Handle'                         # Usually 'Ptr' or 'Handle'
     13 
     14 # The following is *usually* unchanged but may still require tuning
     15 MODPREFIX = 'TE'                        # The prefix for module-wide routines
     16 OBJECTTYPE = "TEHandle"         # The C type used to represent them
     17 OBJECTPREFIX = MODPREFIX + 'Obj'        # The prefix for object methods
     18 INPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
     19 OUTPUTFILE = MODNAME + "module.c"       # The file generated by this program
     20 
     21 from macsupport import *
     22 
     23 # Create the type objects
     24 TEHandle = OpaqueByValueType("TEHandle", "TEObj")
     25 CharsHandle = OpaqueByValueType("CharsHandle", "ResObj")
     26 Handle = OpaqueByValueType("Handle", "ResObj")
     27 StScrpHandle = OpaqueByValueType("StScrpHandle", "ResObj")
     28 TEStyleHandle = OpaqueByValueType("TEStyleHandle", "ResObj")
     29 RgnHandle = OpaqueByValueType("RgnHandle", "ResObj")
     30 
     31 TextStyle = OpaqueType("TextStyle", "TextStyle")
     32 TextStyle_ptr = TextStyle
     33 
     34 includestuff = includestuff + """
     35 #include <Carbon/Carbon.h>
     36 
     37 #ifdef USE_TOOLBOX_OBJECT_GLUE
     38 extern PyObject *_TEObj_New(TEHandle);
     39 extern int _TEObj_Convert(PyObject *, TEHandle *);
     40 
     41 #define TEObj_New _TEObj_New
     42 #define TEObj_Convert _TEObj_Convert
     43 #endif
     44 
     45 #define as_TE(h) ((TEHandle)h)
     46 #define as_Resource(teh) ((Handle)teh)
     47 
     48 /*
     49 ** Parse/generate TextStyle records
     50 */
     51 static PyObject *
     52 TextStyle_New(TextStylePtr itself)
     53 {
     54 
     55         return Py_BuildValue("lllO&", (long)itself->tsFont, (long)itself->tsFace, (long)itself->tsSize, QdRGB_New,
     56                                 &itself->tsColor);
     57 }
     58 
     59 static int
     60 TextStyle_Convert(PyObject *v, TextStylePtr p_itself)
     61 {
     62         long font, face, size;
     63 
     64         if( !PyArg_ParseTuple(v, "lllO&", &font, &face, &size, QdRGB_Convert, &p_itself->tsColor) )
     65                 return 0;
     66         p_itself->tsFont = (short)font;
     67         p_itself->tsFace = (Style)face;
     68         p_itself->tsSize = (short)size;
     69         return 1;
     70 }
     71 """
     72 
     73 initstuff = initstuff + """
     74         PyMac_INIT_TOOLBOX_OBJECT_NEW(TEHandle, TEObj_New);
     75         PyMac_INIT_TOOLBOX_OBJECT_CONVERT(TEHandle, TEObj_Convert);
     76 """
     77 
     78 class TEMethodGenerator(OSErrWeakLinkMethodGenerator):
     79     """Similar to MethodGenerator, but has self as last argument"""
     80 
     81     def parseArgumentList(self, args):
     82         args, a0 = args[:-1], args[-1]
     83         t0, n0, m0 = a0
     84         if m0 != InMode:
     85             raise ValueError, "method's 'self' must be 'InMode'"
     86         self.itself = Variable(t0, "_self->ob_itself", SelfMode)
     87         FunctionGenerator.parseArgumentList(self, args)
     88         self.argumentList.append(self.itself)
     89 
     90 
     91 
     92 class MyObjectDefinition(PEP253Mixin, GlobalObjectDefinition):
     93     # XXXX Could be subtype of Resource
     94     # Attributes that can be set.
     95     getsetlist = [
     96             (
     97             'destRect',
     98             'return Py_BuildValue("O&", PyMac_BuildRect, &(*self->ob_itself)->destRect);',
     99             None,
    100             'Destination rectangle'
    101             ), (
    102             'viewRect',
    103             'return Py_BuildValue("O&", PyMac_BuildRect, &(*self->ob_itself)->viewRect);',
    104             None,
    105             'Viewing rectangle'
    106             ), (
    107             'selRect',
    108             'return Py_BuildValue("O&", PyMac_BuildRect, &(*self->ob_itself)->selRect);',
    109             None,
    110             'Selection rectangle'
    111             ), (
    112             'lineHeight',
    113             'return Py_BuildValue("h", (*self->ob_itself)->lineHeight);',
    114             None,
    115             'Height of a line'
    116             ), (
    117             'fontAscent',
    118             'return Py_BuildValue("h", (*self->ob_itself)->fontAscent);',
    119             None,
    120             'Ascent of a line'
    121             ), (
    122             "selPoint",
    123             'return Py_BuildValue("O&", PyMac_BuildPoint, (*self->ob_itself)->selPoint);',
    124             None,
    125             'Selection Point'
    126             ), (
    127             'selStart',
    128             'return Py_BuildValue("h", (*self->ob_itself)->selStart);',
    129             None,
    130             'Start of selection'
    131             ), (
    132             'selEnd',
    133             'return Py_BuildValue("h", (*self->ob_itself)->selEnd);',
    134             None,
    135             'End of selection'
    136             ), (
    137             'active',
    138             'return Py_BuildValue("h", (*self->ob_itself)->active);',
    139             None,
    140             'TBD'
    141             ), (
    142             'just',
    143             'return Py_BuildValue("h", (*self->ob_itself)->just);',
    144             None,
    145             'Justification'
    146             ), (
    147             'teLength',
    148             'return Py_BuildValue("h", (*self->ob_itself)->teLength);',
    149             None,
    150             'TBD'
    151             ), (
    152             'txFont',
    153             'return Py_BuildValue("h", (*self->ob_itself)->txFont);',
    154             None,
    155             'Current font'
    156             ), (
    157             'txFace',
    158             'return Py_BuildValue("h", (*self->ob_itself)->txFace);',
    159             None,
    160             'Current font variant'
    161             ), (
    162             'txMode',
    163             'return Py_BuildValue("h", (*self->ob_itself)->txMode);',
    164             None,
    165             'Current text-drawing mode'
    166             ), (
    167             'txSize',
    168             'return Py_BuildValue("h", (*self->ob_itself)->txSize);',
    169             None,
    170             'Current font size'
    171             ), (
    172             'nLines',
    173             'return Py_BuildValue("h", (*self->ob_itself)->nLines);',
    174             None,
    175             'TBD'
    176             )]
    177 
    178     def outputCheckNewArg(self):
    179         Output("""if (itself == NULL) {
    180                                 PyErr_SetString(TE_Error,"Cannot create null TE");
    181                                 return NULL;
    182                         }""")
    183     def outputFreeIt(self, itselfname):
    184         Output("TEDispose(%s);", itselfname)
    185 
    186 
    187 # From here on it's basically all boiler plate...
    188 
    189 # Create the generator groups and link them
    190 module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
    191 object = MyObjectDefinition(OBJECTNAME, OBJECTPREFIX, OBJECTTYPE)
    192 module.addobject(object)
    193 
    194 # Create the generator classes used to populate the lists
    195 Function = OSErrWeakLinkFunctionGenerator
    196 Method = TEMethodGenerator
    197 
    198 # Create and populate the lists
    199 functions = []
    200 methods = []
    201 execfile(INPUTFILE)
    202 
    203 # Converter from/to handle
    204 f = Function(TEHandle, 'as_TE', (Handle, 'h', InMode))
    205 functions.append(f)
    206 f = Method(Handle, 'as_Resource', (TEHandle, 'teh', InMode))
    207 methods.append(f)
    208 
    209 # add the populated lists to the generator groups
    210 # (in a different wordl the scan program would generate this)
    211 for f in functions: module.add(f)
    212 for f in methods: object.add(f)
    213 
    214 # generate output (open the output file as late as possible)
    215 SetOutputFileName(OUTPUTFILE)
    216 module.generate()
    217