/Mac/Modules/te/tesupport.py

http://unladen-swallow.googlecode.com/ · Python · 216 lines · 176 code · 22 blank · 18 comment · 3 complexity · ea1ef5c64c5d716179c978801e923382 MD5 · raw file

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