From 66d78bf2a0cf34b7df153dee881e379fb3283ab8 Mon Sep 17 00:00:00 2001 From: Just van Rossum Date: Tue, 18 Dec 2001 12:47:47 +0000 Subject: Added support for tab controls and initial (incomplete) support for DataBrowser controls. --- Mac/Modules/ctl/_Ctlmodule.c | 396 +++++++++++++++++++++++++++++++++++++++++- Mac/Modules/ctl/ctlscan.py | 39 ++++- Mac/Modules/ctl/ctlsupport.py | 120 ++++++++++++- 3 files changed, 543 insertions(+), 12 deletions(-) diff --git a/Mac/Modules/ctl/_Ctlmodule.c b/Mac/Modules/ctl/_Ctlmodule.c index 68a31ca..5f27ed3 100644 --- a/Mac/Modules/ctl/_Ctlmodule.c +++ b/Mac/Modules/ctl/_Ctlmodule.c @@ -41,6 +41,7 @@ staticforward PyObject *CtlObj_WhichControl(ControlHandle); #define GetControlRect(ctl, rectp) (*(rectp) = ((*(ctl))->contrlRect)) #endif +#define MAXTABS 32 /* maximum number of tabs that we support in a tabs control */ /* ** Parse/generate ControlFontStyleRec records */ @@ -58,7 +59,7 @@ ControlFontStyle_New(ControlFontStyleRec *itself) static int ControlFontStyle_Convert(PyObject *v, ControlFontStyleRec *itself) { - return PyArg_ParseTuple(v, "hhhhhhO&O&", &itself->flags, + return PyArg_Parse(v, "(hhhhhhO&O&)", &itself->flags, &itself->font, &itself->size, &itself->style, &itself->mode, &itself->just, QdRGB_Convert, &itself->foreColor, QdRGB_Convert, &itself->backColor); @@ -77,9 +78,50 @@ PyControlID_New(ControlID *itself) static int PyControlID_Convert(PyObject *v, ControlID *itself) { - return PyArg_ParseTuple(v, "O&l", PyMac_GetOSType, &itself->signature, &itself->id); + return PyArg_Parse(v, "(O&l)", PyMac_GetOSType, &itself->signature, &itself->id); } +/* +** generate DataBrowserListViewColumnDesc records +*/ +static int +DataBrowserTableViewColumnDesc_Convert(PyObject *v, DataBrowserTableViewColumnDesc *itself) +{ + return PyArg_Parse(v, "(lO&l)", + &itself->propertyID, + PyMac_GetOSType, &itself->propertyType, + &itself->propertyFlags); +} + +static int +ControlButtonContentInfo_Convert(PyObject *v, ControlButtonContentInfo *itself) +{ + return PyArg_Parse(v, "(hO&)", + &itself->contentType, + OptResObj_Convert, &itself->u.iconSuite); +} + +static int +DataBrowserListViewHeaderDesc_Convert(PyObject *v, DataBrowserListViewHeaderDesc *itself) +{ + itself->version = kDataBrowserListViewLatestHeaderDesc; + return PyArg_Parse(v, "(HHhO&HO&O&)", + &itself->minimumWidth, + &itself->maximumWidth, + &itself->titleOffset, + CFStringRefObj_Convert, &itself->titleString, + &itself->initialOrder, + ControlFontStyle_Convert, &itself->btnFontStyle, + ControlButtonContentInfo_Convert, &itself->btnContentInfo); +} + +static int +DataBrowserListViewColumnDesc_Convert(PyObject *v, DataBrowserListViewColumnDesc *itself) +{ + return PyArg_Parse(v, "(O&O&)", + DataBrowserTableViewColumnDesc_Convert, &itself->propertyDesc, + DataBrowserListViewHeaderDesc_Convert, &itself->headerBtnDesc); +} /* TrackControl and HandleControlClick callback support */ static PyObject *tracker; @@ -1664,6 +1706,28 @@ static PyObject *CtlObj_GetBevelButtonMenuHandle(ControlObject *_self, PyObject return _res; } +#if TARGET_API_MAC_CARBON + +static PyObject *CtlObj_SetBevelButtonContentInfo(ControlObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSErr _err; + ControlButtonContentInfo inContent; +#ifndef SetBevelButtonContentInfo + PyMac_PRECHECK(SetBevelButtonContentInfo); +#endif + if (!PyArg_ParseTuple(_args, "O&", + ControlButtonContentInfo_Convert, &inContent)) + return NULL; + _err = SetBevelButtonContentInfo(_self->ob_itself, + &inContent); + if (_err != noErr) return PyMac_Error(_err); + Py_INCREF(Py_None); + _res = Py_None; + return _res; +} +#endif + static PyObject *CtlObj_SetBevelButtonTransform(ControlObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -1742,6 +1806,28 @@ static PyObject *CtlObj_SetTabEnabled(ControlObject *_self, PyObject *_args) return _res; } +#if TARGET_API_MAC_CARBON + +static PyObject *CtlObj_SetImageWellContentInfo(ControlObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSErr _err; + ControlButtonContentInfo inContent; +#ifndef SetImageWellContentInfo + PyMac_PRECHECK(SetImageWellContentInfo); +#endif + if (!PyArg_ParseTuple(_args, "O&", + ControlButtonContentInfo_Convert, &inContent)) + return NULL; + _err = SetImageWellContentInfo(_self->ob_itself, + &inContent); + if (_err != noErr) return PyMac_Error(_err); + Py_INCREF(Py_None); + _res = Py_None; + return _res; +} +#endif + static PyObject *CtlObj_SetImageWellTransform(ControlObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -3112,6 +3198,31 @@ static PyObject *CtlObj_AutoSizeDataBrowserListViewColumns(ControlObject *_self, #if TARGET_API_MAC_CARBON +static PyObject *CtlObj_AddDataBrowserListViewColumn(ControlObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + DataBrowserListViewColumnDesc columnDesc; + UInt32 position; +#ifndef AddDataBrowserListViewColumn + PyMac_PRECHECK(AddDataBrowserListViewColumn); +#endif + if (!PyArg_ParseTuple(_args, "O&l", + DataBrowserListViewColumnDesc_Convert, &columnDesc, + &position)) + return NULL; + _err = AddDataBrowserListViewColumn(_self->ob_itself, + &columnDesc, + position); + if (_err != noErr) return PyMac_Error(_err); + Py_INCREF(Py_None); + _res = Py_None; + return _res; +} +#endif + +#if TARGET_API_MAC_CARBON + static PyObject *CtlObj_SetDataBrowserListViewHeaderBtnHeight(ControlObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -3908,6 +4019,11 @@ static PyMethodDef CtlObj_methods[] = { "(SInt16 inValue) -> None"}, {"GetBevelButtonMenuHandle", (PyCFunction)CtlObj_GetBevelButtonMenuHandle, 1, "() -> (MenuHandle outHandle)"}, + +#if TARGET_API_MAC_CARBON + {"SetBevelButtonContentInfo", (PyCFunction)CtlObj_SetBevelButtonContentInfo, 1, + "(ControlButtonContentInfo inContent) -> None"}, +#endif {"SetBevelButtonTransform", (PyCFunction)CtlObj_SetBevelButtonTransform, 1, "(IconTransformType transform) -> None"}, {"SetDisclosureTriangleLastValue", (PyCFunction)CtlObj_SetDisclosureTriangleLastValue, 1, @@ -3916,6 +4032,11 @@ static PyMethodDef CtlObj_methods[] = { "() -> (Rect outContentRect)"}, {"SetTabEnabled", (PyCFunction)CtlObj_SetTabEnabled, 1, "(SInt16 inTabToHilite, Boolean inEnabled) -> None"}, + +#if TARGET_API_MAC_CARBON + {"SetImageWellContentInfo", (PyCFunction)CtlObj_SetImageWellContentInfo, 1, + "(ControlButtonContentInfo inContent) -> None"}, +#endif {"SetImageWellTransform", (PyCFunction)CtlObj_SetImageWellTransform, 1, "(IconTransformType inTransform) -> None"}, @@ -4210,6 +4331,11 @@ static PyMethodDef CtlObj_methods[] = { #endif #if TARGET_API_MAC_CARBON + {"AddDataBrowserListViewColumn", (PyCFunction)CtlObj_AddDataBrowserListViewColumn, 1, + "(DataBrowserListViewColumnDesc columnDesc, UInt32 position) -> None"}, +#endif + +#if TARGET_API_MAC_CARBON {"SetDataBrowserListViewHeaderBtnHeight", (PyCFunction)CtlObj_SetDataBrowserListViewHeaderBtnHeight, 1, "(UInt16 height) -> None"}, #endif @@ -4717,6 +4843,53 @@ static PyObject *Ctl_IsAutomaticControlDragTrackingEnabledForWindow(PyObject *_s #if TARGET_API_MAC_CARBON +static PyObject *Ctl_CreateBevelButtonControl(PyObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + WindowPtr window; + Rect boundsRect; + CFStringRef title; + UInt16 thickness; + UInt16 behavior; + ControlButtonContentInfo info; + SInt16 menuID; + UInt16 menuBehavior; + UInt16 menuPlacement; + ControlHandle outControl; +#ifndef CreateBevelButtonControl + PyMac_PRECHECK(CreateBevelButtonControl); +#endif + if (!PyArg_ParseTuple(_args, "O&O&O&HHO&hHH", + WinObj_Convert, &window, + PyMac_GetRect, &boundsRect, + CFStringRefObj_Convert, &title, + &thickness, + &behavior, + ControlButtonContentInfo_Convert, &info, + &menuID, + &menuBehavior, + &menuPlacement)) + return NULL; + _err = CreateBevelButtonControl(window, + &boundsRect, + title, + thickness, + behavior, + &info, + menuID, + menuBehavior, + menuPlacement, + &outControl); + if (_err != noErr) return PyMac_Error(_err); + _res = Py_BuildValue("O&", + CtlObj_New, outControl); + return _res; +} +#endif + +#if TARGET_API_MAC_CARBON + static PyObject *Ctl_CreateDisclosureTriangleControl(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -5003,6 +5176,35 @@ static PyObject *Ctl_CreatePopupGroupBoxControl(PyObject *_self, PyObject *_args #if TARGET_API_MAC_CARBON +static PyObject *Ctl_CreateImageWellControl(PyObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + WindowPtr window; + Rect boundsRect; + ControlButtonContentInfo info; + ControlHandle outControl; +#ifndef CreateImageWellControl + PyMac_PRECHECK(CreateImageWellControl); +#endif + if (!PyArg_ParseTuple(_args, "O&O&O&", + WinObj_Convert, &window, + PyMac_GetRect, &boundsRect, + ControlButtonContentInfo_Convert, &info)) + return NULL; + _err = CreateImageWellControl(window, + &boundsRect, + &info, + &outControl); + if (_err != noErr) return PyMac_Error(_err); + _res = Py_BuildValue("O&", + CtlObj_New, outControl); + return _res; +} +#endif + +#if TARGET_API_MAC_CARBON + static PyObject *Ctl_CreatePopupArrowControl(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -5192,6 +5394,70 @@ static PyObject *Ctl_CreateStaticTextControl(PyObject *_self, PyObject *_args) #if TARGET_API_MAC_CARBON +static PyObject *Ctl_CreatePictureControl(PyObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + WindowPtr window; + Rect boundsRect; + ControlButtonContentInfo content; + Boolean dontTrack; + ControlHandle outControl; +#ifndef CreatePictureControl + PyMac_PRECHECK(CreatePictureControl); +#endif + if (!PyArg_ParseTuple(_args, "O&O&O&b", + WinObj_Convert, &window, + PyMac_GetRect, &boundsRect, + ControlButtonContentInfo_Convert, &content, + &dontTrack)) + return NULL; + _err = CreatePictureControl(window, + &boundsRect, + &content, + dontTrack, + &outControl); + if (_err != noErr) return PyMac_Error(_err); + _res = Py_BuildValue("O&", + CtlObj_New, outControl); + return _res; +} +#endif + +#if TARGET_API_MAC_CARBON + +static PyObject *Ctl_CreateIconControl(PyObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + WindowPtr window; + Rect boundsRect; + ControlButtonContentInfo icon; + Boolean dontTrack; + ControlHandle outControl; +#ifndef CreateIconControl + PyMac_PRECHECK(CreateIconControl); +#endif + if (!PyArg_ParseTuple(_args, "O&O&O&b", + WinObj_Convert, &window, + PyMac_GetRect, &boundsRect, + ControlButtonContentInfo_Convert, &icon, + &dontTrack)) + return NULL; + _err = CreateIconControl(window, + &boundsRect, + &icon, + dontTrack, + &outControl); + if (_err != noErr) return PyMac_Error(_err); + _res = Py_BuildValue("O&", + CtlObj_New, outControl); + return _res; +} +#endif + +#if TARGET_API_MAC_CARBON + static PyObject *Ctl_CreateWindowHeaderControl(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -5250,6 +5516,41 @@ static PyObject *Ctl_CreatePushButtonControl(PyObject *_self, PyObject *_args) #if TARGET_API_MAC_CARBON +static PyObject *Ctl_CreatePushButtonWithIconControl(PyObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + WindowPtr window; + Rect boundsRect; + CFStringRef title; + ControlButtonContentInfo icon; + UInt16 iconAlignment; + ControlHandle outControl; +#ifndef CreatePushButtonWithIconControl + PyMac_PRECHECK(CreatePushButtonWithIconControl); +#endif + if (!PyArg_ParseTuple(_args, "O&O&O&O&H", + WinObj_Convert, &window, + PyMac_GetRect, &boundsRect, + CFStringRefObj_Convert, &title, + ControlButtonContentInfo_Convert, &icon, + &iconAlignment)) + return NULL; + _err = CreatePushButtonWithIconControl(window, + &boundsRect, + title, + &icon, + iconAlignment, + &outControl); + if (_err != noErr) return PyMac_Error(_err); + _res = Py_BuildValue("O&", + CtlObj_New, outControl); + return _res; +} +#endif + +#if TARGET_API_MAC_CARBON + static PyObject *Ctl_CreateRadioButtonControl(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; @@ -5498,6 +5799,67 @@ static PyObject *Ctl_as_Control(PyObject *_self, PyObject *_args) return _res; } +#if TARGET_API_MAC_CARBON + +static PyObject *Ctl_CreateTabsControl(PyObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + WindowPtr window; + Rect boundsRect; + UInt16 size; + UInt16 direction; + int i; + UInt16 numTabs; + ControlTabEntry tabArray[MAXTABS]; + ControlHandle outControl; + PyObject *tabArrayObj, *tabEntry; + +#ifndef CreateTabsControl + PyMac_PRECHECK(CreateTabsControl); +#endif + if (!PyArg_ParseTuple(_args, "O&O&HHO", + WinObj_Convert, &window, + PyMac_GetRect, &boundsRect, + &size, + &direction, + &tabArrayObj)) + return NULL; + + i = PySequence_Length(tabArrayObj); + if (i == -1) + return NULL; + if (i > MAXTABS) { + PyErr_SetString(Ctl_Error, "Too many tabs"); + return NULL; + } + numTabs = i; + for (i=0; i (ControlHandle _rv)"}, @@ -5544,6 +5906,11 @@ static PyMethodDef Ctl_methods[] = { #endif #if TARGET_API_MAC_CARBON + {"CreateBevelButtonControl", (PyCFunction)Ctl_CreateBevelButtonControl, 1, + "(WindowPtr window, Rect boundsRect, CFStringRef title, UInt16 thickness, UInt16 behavior, ControlButtonContentInfo info, SInt16 menuID, UInt16 menuBehavior, UInt16 menuPlacement) -> (ControlHandle outControl)"}, +#endif + +#if TARGET_API_MAC_CARBON {"CreateDisclosureTriangleControl", (PyCFunction)Ctl_CreateDisclosureTriangleControl, 1, "(WindowPtr window, Rect boundsRect, UInt16 orientation, CFStringRef title, SInt32 initialValue, Boolean drawTitle, Boolean autoToggles) -> (ControlHandle outControl)"}, #endif @@ -5584,6 +5951,11 @@ static PyMethodDef Ctl_methods[] = { #endif #if TARGET_API_MAC_CARBON + {"CreateImageWellControl", (PyCFunction)Ctl_CreateImageWellControl, 1, + "(WindowPtr window, Rect boundsRect, ControlButtonContentInfo info) -> (ControlHandle outControl)"}, +#endif + +#if TARGET_API_MAC_CARBON {"CreatePopupArrowControl", (PyCFunction)Ctl_CreatePopupArrowControl, 1, "(WindowPtr window, Rect boundsRect, UInt16 orientation, UInt16 size) -> (ControlHandle outControl)"}, #endif @@ -5614,6 +5986,16 @@ static PyMethodDef Ctl_methods[] = { #endif #if TARGET_API_MAC_CARBON + {"CreatePictureControl", (PyCFunction)Ctl_CreatePictureControl, 1, + "(WindowPtr window, Rect boundsRect, ControlButtonContentInfo content, Boolean dontTrack) -> (ControlHandle outControl)"}, +#endif + +#if TARGET_API_MAC_CARBON + {"CreateIconControl", (PyCFunction)Ctl_CreateIconControl, 1, + "(WindowPtr window, Rect boundsRect, ControlButtonContentInfo icon, Boolean dontTrack) -> (ControlHandle outControl)"}, +#endif + +#if TARGET_API_MAC_CARBON {"CreateWindowHeaderControl", (PyCFunction)Ctl_CreateWindowHeaderControl, 1, "(WindowPtr window, Rect boundsRect, Boolean isListHeader) -> (ControlHandle outControl)"}, #endif @@ -5624,6 +6006,11 @@ static PyMethodDef Ctl_methods[] = { #endif #if TARGET_API_MAC_CARBON + {"CreatePushButtonWithIconControl", (PyCFunction)Ctl_CreatePushButtonWithIconControl, 1, + "(WindowPtr window, Rect boundsRect, CFStringRef title, ControlButtonContentInfo icon, UInt16 iconAlignment) -> (ControlHandle outControl)"}, +#endif + +#if TARGET_API_MAC_CARBON {"CreateRadioButtonControl", (PyCFunction)Ctl_CreateRadioButtonControl, 1, "(WindowPtr window, Rect boundsRect, CFStringRef title, SInt32 initialValue, Boolean autoToggle) -> (ControlHandle outControl)"}, #endif @@ -5656,6 +6043,11 @@ static PyMethodDef Ctl_methods[] = { "(Point inWhere, WindowPtr inWindow) -> (ControlHandle _rv, SInt16 outPart)"}, {"as_Control", (PyCFunction)Ctl_as_Control, 1, "(Handle h) -> (ControlHandle _rv)"}, + +#if TARGET_API_MAC_CARBON + {"CreateTabsControl", (PyCFunction)Ctl_CreateTabsControl, 1, + NULL}, +#endif {NULL, NULL, 0} }; diff --git a/Mac/Modules/ctl/ctlscan.py b/Mac/Modules/ctl/ctlscan.py index b2a17d1..70b2866 100644 --- a/Mac/Modules/ctl/ctlscan.py +++ b/Mac/Modules/ctl/ctlscan.py @@ -87,7 +87,9 @@ class MyScanner(Scanner): 'SetControlProperty', 'GetControlPropertySize', 'SendControlMessage', # Parameter changed from long to void* from UH3.3 to UH3.4 - # unavailable in Just's CW6 + UH 3.4 libs + 'CreateTabsControl', # wrote manually + # these are part of Carbon, yet not in CarbonLib; OSX-only + 'CreateRoundButtonControl', 'CreateDisclosureButtonControl', 'CreateRelevanceBarControl', 'DisableControl', @@ -95,6 +97,10 @@ class MyScanner(Scanner): 'IsControlEnabled', 'CreateEditUnicodeTextControl', 'CopyDataBrowserEditText', + + # too lazy for now + 'GetImageWellContentInfo', + 'GetBevelButtonContentInfo', ] def makegreylist(self): @@ -127,6 +133,16 @@ class MyScanner(Scanner): 'HandleControlSetCursor', 'GetControlClickActivation', 'HandleControlContextualMenuClick', + + "CreateBevelButtonControl", + "CreateImageWellControl", + "CreatePictureControl", + "CreateIconControl", + "CreatePushButtonWithIconControl", + "SetBevelButtonContentInfo", + "SetImageWellContentInfo", + "AddDataBrowserListViewColumn", + "CreateDataBrowserControl", "CreateScrollingTextBoxControl", "CreateRadioGroupControl", @@ -242,7 +258,6 @@ class MyScanner(Scanner): return [ 'ProcPtr', 'ControlActionUPP', - 'ControlButtonContentInfoPtr', 'Ptr', 'ControlDefSpec', # Don't know how to do this yet 'ControlDefSpec_ptr', # ditto @@ -250,9 +265,10 @@ class MyScanner(Scanner): # not-yet-supported stuff in Universal Headers 3.4: 'ControlColorUPP', 'ControlKind', # XXX easy: 2-tuple containing 2 OSType's - 'ControlTabEntry_ptr', # XXX needed for tabs - 'ControlButtonContentInfo', # XXX ugh: a union - 'ControlButtonContentInfo_ptr', # XXX ugh: a union +# 'ControlTabEntry_ptr', # XXX needed for tabs +# 'ControlButtonContentInfoPtr', +# 'ControlButtonContentInfo', # XXX ugh: a union +# 'ControlButtonContentInfo_ptr', # XXX ugh: a union 'ListDefSpec_ptr', # XXX see _Listmodule.c, tricky but possible 'DataBrowserItemID_ptr', # XXX array of UInt32, for BrowserView 'DataBrowserItemUPP', @@ -261,8 +277,8 @@ class MyScanner(Scanner): 'DataBrowserCallbacks_ptr', 'DataBrowserCustomCallbacks', 'DataBrowserCustomCallbacks_ptr', - 'DataBrowserTableViewColumnDesc', - 'DataBrowserListViewColumnDesc', +## 'DataBrowserTableViewColumnDesc', +## 'DataBrowserListViewColumnDesc', 'CFDataRef', ] @@ -292,6 +308,15 @@ class MyScanner(Scanner): ([("Rect_ptr", "*", "ReturnMode")], # GetControlBounds [("void", "*", "ReturnMode")]), + + ([("DataBrowserListViewColumnDesc", "*", "OutMode")], + [("DataBrowserListViewColumnDesc", "*", "InMode")]), + + ([("ControlButtonContentInfoPtr", 'outContent', "InMode")], + [("ControlButtonContentInfoPtr", '*', "OutMode")]), + + ([("ControlButtonContentInfo", '*', "OutMode")], + [("ControlButtonContentInfo", '*', "InMode")]), ] if __name__ == "__main__": diff --git a/Mac/Modules/ctl/ctlsupport.py b/Mac/Modules/ctl/ctlsupport.py index 42213b6..4529484 100644 --- a/Mac/Modules/ctl/ctlsupport.py +++ b/Mac/Modules/ctl/ctlsupport.py @@ -78,7 +78,21 @@ DataBrowserTableViewColumnIndex = UInt32 DataBrowserPropertyType = OSType ControlDisclosureTriangleOrientation = UInt16 - +DataBrowserTableViewColumnDesc = OpaqueType("DataBrowserTableViewColumnDesc", + "DataBrowserTableViewColumnDesc") +DataBrowserListViewColumnDesc = OpaqueType("DataBrowserListViewColumnDesc", + "DataBrowserListViewColumnDesc") +ControlButtonContentInfo = OpaqueType("ControlButtonContentInfo", + "ControlButtonContentInfo") +ControlButtonContentInfoPtr = ControlButtonContentInfo_ptr = ControlButtonContentInfo + +ControlTabEntry_ptr = OpaqueType("ControlTabEntry", "ControlTabEntry") + +ControlBevelThickness = UInt16 +ControlBevelButtonBehavior = UInt16 +ControlBevelButtonMenuBehavior = UInt16 +ControlBevelButtonMenuPlacement = UInt16 +ControlPushButtonIconAlignment = UInt16 includestuff = includestuff + """ #ifdef WITHOUT_FRAMEWORKS @@ -106,6 +120,7 @@ staticforward PyObject *CtlObj_WhichControl(ControlHandle); #define GetControlRect(ctl, rectp) (*(rectp) = ((*(ctl))->contrlRect)) #endif +#define MAXTABS 32 /* maximum number of tabs that we support in a tabs control */ /* ** Parse/generate ControlFontStyleRec records */ @@ -123,7 +138,7 @@ ControlFontStyle_New(ControlFontStyleRec *itself) static int ControlFontStyle_Convert(PyObject *v, ControlFontStyleRec *itself) { - return PyArg_ParseTuple(v, "hhhhhhO&O&", &itself->flags, + return PyArg_Parse(v, "(hhhhhhO&O&)", &itself->flags, &itself->font, &itself->size, &itself->style, &itself->mode, &itself->just, QdRGB_Convert, &itself->foreColor, QdRGB_Convert, &itself->backColor); @@ -142,9 +157,50 @@ PyControlID_New(ControlID *itself) static int PyControlID_Convert(PyObject *v, ControlID *itself) { - return PyArg_ParseTuple(v, "O&l", PyMac_GetOSType, &itself->signature, &itself->id); + return PyArg_Parse(v, "(O&l)", PyMac_GetOSType, &itself->signature, &itself->id); } +/* +** generate DataBrowserListViewColumnDesc records +*/ +static int +DataBrowserTableViewColumnDesc_Convert(PyObject *v, DataBrowserTableViewColumnDesc *itself) +{ + return PyArg_Parse(v, "(lO&l)", + &itself->propertyID, + PyMac_GetOSType, &itself->propertyType, + &itself->propertyFlags); +} + +static int +ControlButtonContentInfo_Convert(PyObject *v, ControlButtonContentInfo *itself) +{ + return PyArg_Parse(v, "(hO&)", + &itself->contentType, + OptResObj_Convert, &itself->u.iconSuite); +} + +static int +DataBrowserListViewHeaderDesc_Convert(PyObject *v, DataBrowserListViewHeaderDesc *itself) +{ + itself->version = kDataBrowserListViewLatestHeaderDesc; + return PyArg_Parse(v, "(HHhO&HO&O&)", + &itself->minimumWidth, + &itself->maximumWidth, + &itself->titleOffset, + CFStringRefObj_Convert, &itself->titleString, + &itself->initialOrder, + ControlFontStyle_Convert, &itself->btnFontStyle, + ControlButtonContentInfo_Convert, &itself->btnContentInfo); +} + +static int +DataBrowserListViewColumnDesc_Convert(PyObject *v, DataBrowserListViewColumnDesc *itself) +{ + return PyArg_Parse(v, "(O&O&)", + DataBrowserTableViewColumnDesc_Convert, &itself->propertyDesc, + DataBrowserListViewHeaderDesc_Convert, &itself->headerBtnDesc); +} /* TrackControl and HandleControlClick callback support */ static PyObject *tracker; @@ -665,6 +721,64 @@ f = ManualGenerator("SetPopupData", setpopupdata_body, condition="#if !TARGET_AP object.add(f) +createtabscontrol_body = """\ +OSStatus _err; +WindowPtr window; +Rect boundsRect; +UInt16 size; +UInt16 direction; +int i; +UInt16 numTabs; +ControlTabEntry tabArray[MAXTABS]; +ControlHandle outControl; +PyObject *tabArrayObj, *tabEntry; + +#ifndef CreateTabsControl +PyMac_PRECHECK(CreateTabsControl); +#endif +if (!PyArg_ParseTuple(_args, "O&O&HHO", + WinObj_Convert, &window, + PyMac_GetRect, &boundsRect, + &size, + &direction, + &tabArrayObj)) + return NULL; + +i = PySequence_Length(tabArrayObj); +if (i == -1) + return NULL; +if (i > MAXTABS) { + PyErr_SetString(Ctl_Error, "Too many tabs"); + return NULL; +} +numTabs = i; +for (i=0; i