ž oyMayDc@svdZddlZddlZddlZddlmZdZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZZd[Zd\Zd]Z d^Z!d_Z"ej#ƒrddZ$eee!e"fZ%ndiZ$eeee fZ%e&d!d"„e'e(e$ƒƒDƒƒZ)Gd#d$„d$ƒZ*e'de(e$ƒ>ƒZ+d%d"„e+DƒZ,d&d'„Z-e-e+ƒZ.gZ/x]e+D]UZ0dZ1x9e'e(e$ƒƒD]%Z2de2>e0@rÌe1e%e2OZ1qÌqÌWe/j3e1ƒq­WGd(d)„d)ƒZ4dZ5e4fde*fe(e5ƒdZ6e&dCd"„e'e(e5ƒƒDƒƒZ7ej8dDƒZ9ej8dEƒZ:dFdG„Z;dHdI„Z<iZ=dJdK„Z>e?dLkrrej@ƒZAe>ejBƒeAƒZCeCjDƒdgdMdN„ZEeEdOƒeEdPƒeEdQƒeEdRƒeEdSƒeEdTƒeEdUƒeEdVƒeEdWƒeEdXƒeEdYƒeAjFƒndS(‚u˜ MultiCall - a class which inherits its methods from a Tkinter widget (Text, for example), but enables multiple calls of functions per virtual event - all matching events will be called, not only the most specific one. This is done by wrapping the event functions - event_add, event_delete and event_info. MultiCall recognizes only a subset of legal event sequences. Sequences which are not recognized are treated by the original Tk handling mechanism. A more-specific event will be called before a less-specific event. The recognized sequences are complete one-event sequences (no emacs-style Ctrl-X Ctrl-C, no shortcuts like <3>), for all types of events. Key/Button Press/Release events can have modifiers. The recognized modifiers are Shift, Control, Option and Command for Mac, and Control, Alt, Shift, Meta/M for other platforms. For all events which were handled by MultiCall, a new member is added to the event instance passed to the binded functions - mc_type. This is one of the event type constants defined in this module (such as MC_KEYPRESS). For Key/Button events (which are handled by MultiCall and may receive modifiers), another member is added - mc_state. This member gives the state of the recognized modifiers, as a combination of the modifier constants also defined in this module (for example, MC_SHIFT). Using these members is absolutely portable. The order by which events are called is defined by these rules: 1. A more-specific event will be called before a less-specific event. 2. A recently-binded event will be called before a previously-binded event, unless this conflicts with the first rule. Each function will be called at most once for each event. iN(u macosxSupportiiiiiiiii i i i i iiiiiiiiiuShiftuControluOptionuCommanduAltuMetauMcCs-g|]#}t|D]}||f‘qqS((u _modifiers(u.0unumberuname((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu 8s u cBsD|EeZdZdd„Zdd„Zdd„Zdd„Zd S( u _SimpleBindercCsJ||_dt|dd|_||_||_g|_d|_dS(Nu(utypeu_typesusequenceuwidgetu widgetinstu bindedfuncsuNoneu handlerid(uselfutypeuwidgetu widgetinst((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu__init__Es     u_SimpleBinder.__init__cCsY|jsE|j|jdd„}|jj|j|j|ƒ|_n|jj|ƒdS(NcSss||_i}x]tt|ƒdddƒD]?}||}||kr,d||<||ƒ}|rk|Sq,q,WdS(NiiÿÿÿÿiÿÿÿÿT(umc_typeurangeulenuTrue(ueventulumc_typeu wascalleduiufuncur((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyuhandlerOs #    u#_SimpleBinder.bind..handler(u handleridu bindedfuncsutypeuwidgetubindu widgetinstusequenceuappend(uselfutripletufuncuhandler((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyubindMs   u_SimpleBinder.bindcCsH|jj|ƒ|jsD|jj|j|j|jƒd|_ndS(N(u bindedfuncsuremoveuwidgetuunbindu widgetinstusequenceu handleriduNone(uselfutripletufunc((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyuunbind]s u_SimpleBinder.unbindcCs/|jr+|jj|j|j|jƒndS(N(u handleriduwidgetuunbindu widgetinstusequence(uself((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu__del__cs u_SimpleBinder.__del__N(u__name__u __module__u __qualname__u__init__ubinduunbindu__del__(u __locals__((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu _SimpleBinderDs   u _SimpleBindercs8g|].‰dj‡fdd†ttƒDƒƒ‘qS(uc3s1|]'\}}d|>ˆ@r|ddVqdS(iiu-N((u.0uium(us(u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu ms u.(ujoinu enumerateu _modifiers(u.0((usu6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu ms csodd„}g}xV|D]N‰tt‡fdd†|Dƒƒƒ}|jd|ddƒ|j|ƒqW|S(u•For each item of states return a list containing all combinations of that item with individual bits reset, sorted by the number of set bits. cSs6d}x)|r1t|dƒ\}}||7}q W|S(unumber of bits set in n base 2ii(udivmod(ununburem((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyunbitsvs  uexpand_substates..nbitsc3s|]}ˆ|@VqdS(N((u.0ux(ustate(u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu su#expand_substates..ukeyureverseT(ulistusetusortuTrueuappend(ustatesunbitsu statelistu substates((ustateu6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyuexpand_substatesrs  %uexpand_substatescBsP|EeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S( u_ComplexBindercCs%||||j|jdd„}|S(Nc Ssödg|dd…<||_||_i}d}x||D]t}xatt|ƒdddƒD]C} || } | |kr[d|| <|| |ƒ}|ržPqžq[q[W|r8Pq8q8Wg|dd….handler(uishandlerrunningudoafterhandler(uselfulistsumc_typeumc_stateuhandler((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu__create_handler—s u_ComplexBinder.__create_handlercsó|ˆ_t|dˆ_|ˆ_|ˆ_idd„tDƒd6ˆ_gˆ_gˆ_ gˆ_ xˆtD]€}‡fdd†t |Dƒ}ˆj ||t |ƒ}dt|ˆjd}ˆjj|ˆjjˆj||ƒfƒqkWdS(NicSsg|] }g‘qS(((u.0us((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu ¹s u+_ComplexBinder.__init__..cs!g|]}ˆjd|‘qS(N(u bindedfuncsuNone(u.0ui(uself(u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu Ås u(utypeu_typesutypenameuwidgetu widgetinstu_statesuNoneu bindedfuncsu handleridsuishandlerrunningudoafterhandleru_state_subsetsu_ComplexBinder__create_handleru _state_codesu _state_namesuappendubind(uselfutypeuwidgetu widgetinstusulistsuhandleruseq((uselfu6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu__init__´s       u_ComplexBinder.__init__csˆdˆjkrÐdd„tDƒˆjˆdÍs u'_ComplexBinder.bind..cs2g|](}tˆD]}ˆj||‘qqS((u_state_subsetsu bindedfuncs(u.0udetailui(usuself(u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu Ïs u <%s%s-%s>cs ˆjˆdˆdjˆƒS(Nii(u bindedfuncsuappend((ufuncuselfutriplet(u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu×su%_ComplexBinder.bind..(u bindedfuncsu_statesuNoneu_ComplexBinder__create_handlerutypeu _state_codesu _state_namesutypenameu handleridsuappenduwidgetubindu widgetinstuishandlerrunningudoafterhandler(uselfutripletufunculistsuhandlerusequdoit((ufuncususelfutripletu6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyubindËs    u_ComplexBinder.bindcs?‡‡‡fdd†}ˆjs+|ƒnˆjj|ƒdS(Ncs ˆjˆdˆdjˆƒS(Nii(u bindedfuncsuremove((ufuncuselfutriplet(u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyuÞsu'_ComplexBinder.unbind..(uishandlerrunningudoafterhandleruappend(uselfutripletufuncudoit((ufuncuselfutripletu6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyuunbindÝs  u_ComplexBinder.unbindcCs7x0|jD]%\}}|jj|j||ƒq WdS(N(u handleridsuwidgetuunbindu widgetinst(uselfusequid((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu__del__äsu_ComplexBinder.__del__N(u__name__u __module__u __qualname__u_ComplexBinder__create_handleru__init__ubinduunbindu__del__(u __locals__((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu_ComplexBinders     u_ComplexBinderuKeyPressuKeyu KeyReleaseu ButtonPressuButtonu ButtonReleaseuActivateu CirculateuColormapu Configureu DeactivateuDestroyuEnteruExposeuFocusInuFocusOutuGravityuLeaveuMapuMotionu MouseWheeluPropertyuReparentuUnmapu VisibilitycCs-g|]#}t|D]}||f‘qqS((u_types(u.0unumberuname((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu ÷s u^\w+$u^[1-5]$cCsY| s'|ddks'|d dkr+d S|dd …jdƒ}d}x7|rƒ|dtkrƒ|dt|d>O}|d=qMW|r²|dtkr²t|d}|d=nd St|tkrß|sÒ|rÖd Sd }nm|dd„d Dƒkrt}nt}|sd }n6t|ƒdkrH|j |dƒrH|d}nd S|||fS(u-Get a string which should describe an event sequence. If it is successfully parsed as one, return a tuple containing the state (as an int), the event type (as an index of _types), and the detail - None if none, or a string if there is one. If the parsing is unsuccessful, return None. iuu-cSsg|]}t|‘qS((u _type_names(u.0us((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu s u#_parse_sequence..uKeyPressu KeyReleaseiÿÿÿÿNiÿÿÿÿ(uKeyPressu KeyRelease( uNoneusplitu_modifier_namesu _type_namesu_binder_classesu _SimpleBinderu _keysym_reu _button_reulenumatch(usequenceuwordsu modifiersutypeudetailutype_re((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu_parse_sequenceýs0'      % u_parse_sequencecCsb|dr:dt|dt|ddd|ddSdt|dt|dddSdS(Niu(u _state_namesu_types(utriplet((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu_triplet_to_sequence$s 0u_triplet_to_sequencecs>ˆtkrtˆSG‡fdd†dˆƒ}|tˆ<|S(u©Return a MultiCall class which inherits its methods from the given widget class (for example, Tkinter.Text). This is used instead of a templating mechanism. cs³|EeZdZeˆejƒs(t‚‡fdd†Zddd‡fdd†Z d‡fdd†Z ‡fdd†Z ‡fd d †Z d‡fd d †Z d d„ZdS(u#MultiCallCreator..MultiCallcsKˆjˆ||Žiˆ_‡‡fdd†tttƒƒDƒˆ_dS(Ncs&g|]}t||ˆˆƒ‘qS((u_binder_classes(u.0ui(uselfuwidget(u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu =s u@MultiCallCreator..MultiCall.__init__..(u__init__u_MultiCall__eventinfourangeulenu_typesu_MultiCall__binders(uselfuargsukwargs(uwidget(uselfu6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu__init__7s u,MultiCallCreator..MultiCall.__init__cs/t|ƒtkrt|ƒdkr|dd…dkr|dd…dkr||jkr|j|}|ddk r³x4|dD]%}|j|dj||dƒq‡Wn||d<|ddk rx0|dD]!}|j|dj||ƒqØWqq|gg|j|>iiiþÿÿÿ(utypeustrulenu_MultiCall__eventinfouNoneu_MultiCall__bindersuunbindubind(uselfusequenceufuncuaddueiutriplet(uwidget(u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyubind@s$, & %u(MultiCallCreator..MultiCall.bindcsÔt|ƒtkrÁt|ƒdkrÁ|dd…dkrÁ|dd…dkrÁ||jkrÁ|j|\}}|dk rÁx)|D]!}|j|dj||ƒq…Wd|j|d>iiiþÿÿÿ(utypeustrulenu_MultiCall__eventinfouNoneu_MultiCall__bindersuunbind(uselfusequenceufuncidufuncutripletsutriplet(uwidget(u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyuunbindRs$,  u*MultiCallCreator..MultiCall.unbindcs²||jkr%dgg|j|.MultiCall.event_addcs ||jkrdS|j|\}}xs|D]k}t|ƒ}|dkraˆj|||ƒq-|dk r‹|j|dj||ƒn|j|ƒq-WdS(Ni(u_MultiCall__eventinfou_parse_sequenceuNoneu event_deleteu_MultiCall__bindersuunbinduremove(uselfuvirtualu sequencesufuncutripletsusequtriplet(uwidget(u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu event_deletens    u0MultiCallCreator..MultiCall.event_deletecs]|dks||jkr+ˆj||ƒSttt|j|dƒƒˆj||ƒSdS(Ni(uNoneu_MultiCall__eventinfou event_infoutupleumapu_triplet_to_sequence(uselfuvirtual(uwidget(u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu event_info|s  u.MultiCallCreator..MultiCall.event_infocSs`xY|jD]N}|j|\}}|r x,|D]!}|j|dj||ƒq0Wq q WdS(Ni(u_MultiCall__eventinfou_MultiCall__bindersuunbind(uselfuvirtualufuncutripletsutriplet((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu__del__„s  u+MultiCallCreator..MultiCall.__del__N(u__name__u __module__u __qualname__u issubclassutkinteruMiscuAssertionErroru__init__uNoneubinduunbindu event_addu event_deleteu event_infou__del__(u __locals__(uwidget(u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyu MultiCall4s  u MultiCall(u_multicall_dict(uwidgetu MultiCall((uwidgetu6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyuMultiCallCreator,s  X uMultiCallCreatoru__main__csT‡fdd†}tjd|d|ƒtjd|dˆƒ|dd7.handleru <>ii(utextubindu event_add(usequnuhandler((usequ6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyubindseq”subindsequu u uuuuuu uuiiii i@i€(uShift(uControl(uOption(uCommand((uShift(uControl(uOption(uCommand(uControl(uAlt(uShift(uMetauM((uControl(uAlt(uShift(uMetauM(uKeyPressuKey(u KeyRelease(u ButtonPressuButton(u ButtonRelease(uActivate(u Circulate(uColormap(u Configure(u Deactivate(uDestroy(uEnter(uExpose(uFocusIn(uFocusOut(uGravity(uLeave(uMap(uMotion(u MouseWheel(uProperty(uReparent(uUnmap(u Visibility((uKeyPressuKey(u KeyRelease(u ButtonPressuButton(u ButtonRelease(uActivate(u Circulate(uColormap(u Configure(u Deactivate(uDestroy(uEnter(uExpose(uFocusIn(uFocusOut(uGravity(uLeave(uMap(uMotion(u MouseWheel(uProperty(uReparent(uUnmap(u Visibility(Gu__doc__usysureutkinteruidlelibu macosxSupportu MC_KEYPRESSu MC_KEYRELEASEuMC_BUTTONPRESSuMC_BUTTONRELEASEu MC_ACTIVATEu MC_CIRCULATEu MC_COLORMAPu MC_CONFIGUREu MC_DEACTIVATEu MC_DESTROYuMC_ENTERu MC_EXPOSEu MC_FOCUSINu MC_FOCUSOUTu MC_GRAVITYuMC_LEAVEuMC_MAPu MC_MOTIONu MC_MOUSEWHEELu MC_PROPERTYu MC_REPARENTuMC_UNMAPu MC_VISIBILITYuMC_SHIFTu MC_CONTROLuMC_ALTuMC_METAu MC_OPTIONu MC_COMMANDurunningAsOSXAppu _modifiersu_modifier_masksudicturangeulenu_modifier_namesu _SimpleBinderu_statesu _state_namesuexpand_substatesu_state_subsetsu _state_codesusuruiuappendu_ComplexBinderu_typesu_binder_classesu _type_namesucompileu _keysym_reu _button_reu_parse_sequenceu_triplet_to_sequenceu_multicall_dictuMultiCallCreatoru__name__uTkurootuTextutextupackubindsequmainloop(((u6/opt/alt/python33/lib64/python3.3/idlelib/MultiCall.pyus¬      (     \"  '  c