# Accessor functions for control properties

from Controls import *
import struct

# These needn't go through this module, but are here for completeness
def SetControlData_Handle(control, part, selector, data):
    control.SetControlData_Handle(part, selector, data)

def GetControlData_Handle(control, part, selector):
    return control.GetControlData_Handle(part, selector)

_accessdict = {
    kControlPopupButtonMenuHandleTag: (SetControlData_Handle, GetControlData_Handle),
}

_codingdict = {
    kControlPushButtonDefaultTag : ("b", None, None),

    kControlEditTextTextTag: (None, None, None),
    kControlEditTextPasswordTag: (None, None, None),

    kControlPopupButtonMenuIDTag: ("h", None, None),

    kControlListBoxDoubleClickTag: ("b", None, None),
}

def SetControlData(control, part, selector, data):
    if _accessdict.has_key(selector):
        setfunc, getfunc = _accessdict[selector]
        setfunc(control, part, selector, data)
        return
    if not _codingdict.has_key(selector):
        raise KeyError, ('Unknown control selector', selector)
    structfmt, coder, decoder = _codingdict[selector]
    if coder:
        data = coder(data)
    if structfmt:
        data = struct.pack(structfmt, data)
    control.SetControlData(part, selector, data)

def GetControlData(control, part, selector):
    if _accessdict.has_key(selector):
        setfunc, getfunc = _accessdict[selector]
        return getfunc(control, part, selector, data)
    if not _codingdict.has_key(selector):
        raise KeyError, ('Unknown control selector', selector)
    structfmt, coder, decoder = _codingdict[selector]
    data = control.GetControlData(part, selector)
    if structfmt:
        data = struct.unpack(structfmt, data)
    if decoder:
        data = decoder(data)
    if type(data) == type(()) and len(data) == 1:
        data = data[0]
    return data
