\dH\dZddlZddlZddlZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZd ZdZdZdZ ej!dkr dZ"eeee fZ#ndZ"eeeefZ#de$e%e"DZ&d Z'Gd!d"Z(e$de%e"zZ)d#e)DZ*d$Z+e+e)Z,gZ-e)D]CZ.dZ/e$e%e"D]Z0de0ze.zr e/e#e0zZ/e-1e/DGd%d&Z2d'Z3e2fdze(fe%e3dz zzZ4d(e$e%e3DZ5ej6d)Z7ej6d*Z8d+Z9d,Z:iZ;d-Zd/kr'dd0l?m@Z@e@d1dd23dd4lAmBZBeBe=dSdS)5a 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. N  @darwin)ShiftControl)Option)Command)r)Altr)MetaMc4i|]}t|D]}||S) _modifiers.0numbernames "..\python\lib\idlelib\multicall.py r.7sD999#%/%799!9999zapplication has been destroyedc&eZdZdZdZdZdZdS) _SimpleBinderc||_dt|dzdz|_||_||_g|_d|_dS)N)type_typessequencewidget widgetinst bindedfuncs handlerid)selfr5r8r9s r-__init__z_SimpleBinder.__init__JsC F4LO+C/  $r/c|js;|j|jfd}|j|j|j||_|j|dS)Nc||_i}tt|dz ddD]$}||}||vrd||<||}|r|cS%dS)NrT)mc_typerangelen)eventlrA wascalledifuncrs r-handlerz#_SimpleBinder.bind..handlerTsy '  s1vvaxR00%%AQ4D9,,*. $ DKK%#$HHH %%r/)r;r:r5r8bindr9r7append)r<tripletrHrJs r-rKz_SimpleBinder.bindRsp~ F#'#3ty % % % %"[--do.2mWFFDN %%%%%r/c|j||js4|j|j|j|jd|_dSdSN)r:remover8unbindr9r7r;)r<rMrHs r-rQz_SimpleBinder.unbindbsY %%% " K  t t~ N N N!DNNN " "r/c|jr` |j|j|j|jdS#t j$r }t|jdvrYd}~dSd}~wwxYwdSNr) r;r8rQr9r7tkinterTclErrorAPPLICATION_GONEargs)r<es r-__del__z_SimpleBinder.__del__hs >   ""4?DM(((((#   '16!944544444    s+6A%A  A%N)__name__ __module__ __qualname__r=rKrQrYr'r/r-r1r1IsP&&& """ r/r1cvg|]5dfdttD6S)c3DK|]\}}d|zz |ddzVdS)rr-Nr')r*rGmss r- z.wsP)) AqFa<)!S))))))r/)join enumerater(r*rbs @r- rgwsg"""))))$-j$9$9)))))"""r/cd}g}|D]Itfd|D}||d||J|S)zFor each item of states return a list containing all combinations of that item with individual bits reset, sorted by the number of set bits. cBd}|rt|d\}}||z }||S)znumber of bits set in n base 2rr)divmod)nnbrems r-nbitszexpand_substates..nbitss:  Aq\\FAs #IB  r/ch|]}|zSr'r')r*xstates r- z#expand_substates..s444%!)444r/T)keyreverse)listsortrL)statesrn statelist substatesrqs @r-expand_substatesrz|s}I$$4444V44455 5$///#### r/c,eZdZdZdZdZdZdZdS)_ComplexBinderc,||||j|jfd}|S)Nc"dg|dd<||_||_i}d}|D]P}tt|dz ddD](} || } | |vrd|| <|| |}|rn)|rnQg|dd<|D] } |  g|dd<|r|SdS)NTrr@)rAmc_staterBrC) rDlistsrArishandlerrunningdoafterhandlerrFrIrErGrHfs r-rJz0_ComplexBinder.__create_handler..handlers$(& QQQ #EM%ENIA  s1vvaxR00""AQ4D9,,*. $ AaDKK"!EE"$ QQQ #   "N111    r/)rr)r<rrArrJs r-__create_handlerz_ComplexBinder.__create_handlers1#(%('+'<%)%8    4r/c |_t|d_|_|_ddt Di_g_g_g_ t D]}fdt|D} ||t|}dt|zjzdz}j|jj||fdS)Nrcg|]}gSr'r'rfs r-rgz+_ComplexBinder.__init__..s"7"7"7!2"7"7"7r/c6g|]}jd|SrO)r:)r*rGr<s r-rgz+_ComplexBinder.__init__..s&JJJ1T%d+A.JJJr/r3r4)r5r6typenamer8r9_statesr: handleridsrr_state_subsets_ComplexBinder__create_handler _state_codes _state_namesrLrK)r<r5r8r9rbrrJseqs` r-r=z_ComplexBinder.__init__s t Q  $ "7"7w"7"7"78!#  J JAJJJJq8IJJJE++E4aIIGl1o%dm3C7C O " "C)9)9$/:=w*H*H$I J J J J  J Jr/c djvrdtDjd<tD]fdddfD}|jt}dt jddd}j|j j ||ffd}j s |dSj |dS)Nrcg|]}gSr'r'rfs r-rgz'_ComplexBinder.bind..s+@+@+@1B+@+@+@r/cVg|]%}tD]}j||&Sr')rr:)r*detailrGrbr<s r-rgz'_ComplexBinder.bind..sP===$#1!#4==*6215====r/r3r`r4chjddSNrr)r:rLrHr<rMsr-z%_ComplexBinder.bind..*t' 3GAJ?FFtLLr/)r:rrr5rrrrrLr8rKr9rr)r<rMrHrrJrdoitrbs``` @r-rKz_ComplexBinder.binds[ 1:T- - -+@+@+@+@+@D WQZ ( N N=====)0T(:===//ty0A7.L.L(MNNNNLLLLLL$ - DFFFFF   & &t , , , , ,r/ctfd}js |dSj|dS)NchjddSr)r:rPrsr-rz'_ComplexBinder.unbind..rr/)rrrL)r<rMrHrs``` r-rQz_ComplexBinder.unbindsPLLLLLL$ - DFFFFF   & &t , , , , ,r/c|jD]X\}} |j|j||(#tj$r}t |jdvrYd}~Qd}~wwxYwdSrS)rr8rQr9rTrUrVrW)r<ridrXs r-rYz_ComplexBinder.__del__s  GC  ""4?C<<<<#   '16!94454444   s!0AAAN)rZr[r\rr=rKrQrYr'r/r-r|r|sb:JJJ.---$---r/r|))KeyPressKey) KeyRelease) ButtonPressButton) ButtonRelease)Activate) Circulate)Colormap) Configure) Deactivate)Destroy)Enter)Expose)FocusIn)FocusOut)Gravity)Leave)Map)Motion) MouseWheel)Property)Reparent)Unmap) Visibilityc4i|]}t|D]}||Sr')r6r)s r-r.r.sC111!'11V1111r/z^\w+$z^[1-5]$cB|r|ddks |ddkrdS|ddd}d}|r<|dtvr-|dt|dzz}|d=|r|dtv-|r&|dtvrt|d}|d=ndSt|tur |s|rdSd}n[|dd Dvrt }nt }|sd}n9t|dkr$||dr |d}ndS|||fS) a-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. rr3r@r4Nrr`c(g|]}t|Sr') _type_namesrfs r-rgz#_parse_sequence..$sGGGqKNGGGr/)rr) split_modifier_namesr_binder_classesr1 _keysym_re _button_rerCmatch)r7words modifiersr5rtype_res r-_parse_sequencer sq x{c))Xb\S-@-@t QrTN  % %EI E!H//Q/%(333 !H E!H// q[((58$ !HHtt --   4FF GG,FGGG G G GG G FF ZZ1__uQx!8!8_1XFF4 dF ""r/c|dr?dt|dzt|ddzdz|dzdzSdt|dzt|ddzdzS)Nrr3rrr`r4)rr6)rMs r-_triplet_to_sequencer2sqzF< ++F71:,>q,AA#Eqz < ++F71:,>q,AA#EEr/chtvr tSGfdd}|t<|S)zReturn a MultiCall class which inherits its methods from the given widget class (for example, Tkinter.Text). This is used instead of a templating mechanism. c~eZdZeejsJfdZd fd Zd fd ZfdZ fdZ d fd Z dZ dS) #MultiCallCreator..MultiCallcjg|Ri|i_fdtttD_dS)Nc>g|]}t||Sr')r)r*rGr<r8s r-rgz@MultiCallCreator..MultiCall.__init__..Ks:;;;"#.a0FDAA;;;r/)r=_MultiCall__eventinforBrCr6_MultiCall__binders)r<rWkwargsr8s` r-r=z,MultiCallCreator..MultiCall.__init__Esq FOD 24 2 2 26 2 2 2 "D ;;;;;',S[['9'9;;;DNNNr/Nct|turt|dkr|dddkr|dddkr||jvr|j|}|d8|dD]/}|j|d||d0||d<|d2|dD])}|j|d||*n |gg|j|<||||S)Nr<<>>rr)r5strrCrrrQrK)r<r7rHaddeirMr8s r-rKz(MultiCallCreator..MultiCall.bindNs#H~~$$X):):|t## (=(=t///)(3B!u(')!uNNG N71:6==gr!uMMMM BqE!u(')!uKKG N71:6;;GTJJJJ26D$X.;;tXtS99 9r/cjt|turt|dkrs|dddkre|dddkrW||jvrN|j|\}}|<|D])}|j|d||*d|j|d<|||S)Nrrrrrr)r5rrCrrrQ)r<r7funcidrHtripletsrMr8s r-rQz*MultiCallCreator..MultiCall.unbind`sH~~$$X):):|t## (=(=4+++!%!1(!;h##+IIwqz299'4HHHH48D$X.q1==x88 8r/c*||jvr dgg|j|<|j|\}}|D]i}t|}||||+|'|j|d||||jdSNr)rr event_addrrKrLr<virtual sequencesrHrrrMr8s r-rz-MultiCallCreator..MultiCall.event_addksd...-12J )!-g6ND(  - -)#..?$$T7C8888'wqz277FFFOOG,,,, - -r/c||jvrdS|j|\}}|D]i}t|}||||+|'|j|d||||jdSr)rr event_deleterrQrPrs r-rz0MultiCallCreator..MultiCall.event_delete|sd...!-g6ND(  - -)#..?''gs;;;;'wqz299'4HHHOOG,,,, - -r/c| ||jvr||Sttt|j|d||zSr)r event_infotuplemapr)r<rr8s r-rz.MultiCallCreator..MultiCall.event_infosv'1A"A"A((w777S!5!%!1'!:1!=??@@((w7788r/c|jD]r}|j|\}}|r^|D][} |j|d||+#tj$r}t |jdvrYd}~Td}~wwxYwsdS)Nrr)rrrQrTrUrVrW)r<rrHrrMrXs r-rYz+MultiCallCreator..MultiCall.__del__s+ & &!%!1'!:h&#+&&& N71:6==gtLLLL&/&&qvay#@#@ %$A#@#@#@#@&  & &s'A  A7A22A7)NNNrO) rZr[r\ issubclassrTMiscr=rKrQrrrrY)r8sr- MultiCallrBsz&',///// ; ; ; ; ; : : : : : :$ 9 9 9 9 9 9 - - - - -" - - - - - 8 8 8 8 8 8 & & & & &r/r)_multicall_dict)r8rs` r-MultiCallCreatorr:sl   v&&Y&Y&Y&Y&Y&Y&Y&VY&Y&Y&v(OF r/ctj|}|dtt|ddd\}}|d||dzfzttj| dgffd }|d|d |d |d |d |d |d|d|d|d|d|ddS)NzTest MultiCall+rz+%d+%drcfd}d|dz|d|dz|dxxdz cc<dS)Nc&tdSrO)print)rDrs r-rJz-_multi_call..bindseq..handlers #JJJJJr/z <>rr)rKr)rrkrJtexts` r-bindseqz_multi_call..bindseqsp      /!A$&000 qt+S111 ! r/zz z zzzzz zz zz) rTTopleveltitlerintgeometryrrTextpack)parenttoprpyrrs @r- _multi_callrs  6 " "CII sFOO%%++C004 5 5DAqLLQCL())) ) GL ) )# . .DIIKKKs  GG GO GM G  G !""" GI G !!! GL G  GL GI GIr/__main__)mainzidlelib.idle_test.test_mainmenuF) verbosityexit)run)C__doc__resysrT MC_KEYPRESS MC_KEYRELEASEMC_BUTTONPRESSMC_BUTTONRELEASE MC_ACTIVATE MC_CIRCULATE MC_COLORMAP MC_CONFIGURE MC_DEACTIVATE MC_DESTROYMC_ENTER MC_EXPOSE MC_FOCUSIN MC_FOCUSOUT MC_GRAVITYMC_LEAVEMC_MAP MC_MOTION MC_MOUSEWHEEL MC_PROPERTY MC_REPARENTMC_UNMAP MC_VISIBILITYMC_SHIFT MC_CONTROLMC_ALTMC_META MC_OPTION MC_COMMANDplatformr(_modifier_masksrBrCrrVr1rrrzrrrbrIrGrLr|r6rrcompilerrrrrrrrZunittestridlelib.idle_test.htestrr'r/r-r'sz<   Q}q12B A|1{1l AxbIR*  2 x2Fy b+b+2(R} dTFT7  t*<8FJY COODJ!68W=O99',uSS__'='=9994&&&&&&&&Z %SS__$ % %""!""" $"!'** A A U33z?? # #$$ Fa< $ # #A[[[[[[[[~ "#a'=*:cc&kk!m*LL11#(5V#5#5111 RZ ! ! RZ # # %#%#%#NFFFdddN4 zD *aeDDDD++++++C  r/