a
    IfH                     @   s  d Z ddlZddlZddlZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd
ZdZdZdZ ej!dkrdZ"eeee fZ#ndZ"eeeefZ#e$dd  e%e&e"D Z'd!Z(G d"d# d#Z)e%de&e"> Z*d$d  e*D Z+d%d& Z,e,e*Z-g Z.e*D ]BZ/dZ0e%e&e"D ] Z1de1> e/@ r2e0e#e1 O Z0q2e.2e0 qG d'd( d(Z3d)Z4e3fd e)fe&e4d   Z5e$d*d  e%e&e4D Z6e7d+Z8e7d,Z9d-d. Z:d/d0 Z;i Z<d1d2 Z=d3d4 Z>e?d5krdd6l@mAZA eAd7dd8d9 dd:lBmCZC eCe> dS );a  
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)ZShiftZControl)ZOption)ZCommand)r   )ZAltr   )ZMetaMc                 C   s"   g | ]}t | D ]}||fqqS  )
_modifiers.0Znumbernamer   r   "lib/python3.9/idlelib/multicall.py
<listcomp>7   s   r%   zapplication has been destroyedc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_SimpleBinderc                 C   s8   || _ dt| d  d | _|| _|| _g | _d | _d S )N<r   >)type_typessequencewidget
widgetinstbindedfuncs	handlerid)selfr)   r,   r-   r   r   r$   __init__J   s    z_SimpleBinder.__init__c                 C   s>   | j s.| j| jfdd}| j| j| j|| _ | j| d S )Nc                 S   sT   || _ i }tt|d ddD ]0}|| }||vrd||< || }|r|  S qd S )Nr   T)mc_typerangelen)eventlr3   	wascalledifuncrr   r   r$   handlerT   s    z#_SimpleBinder.bind.<locals>.handler)r/   r.   r)   r,   bindr-   r+   append)r0   tripletr:   r<   r   r   r$   r=   R   s    

z_SimpleBinder.bindc                 C   s2   | j | | j s.| j| j| j| j d | _d S N)r.   remover,   unbindr-   r+   r/   )r0   r?   r:   r   r   r$   rB   b   s    z_SimpleBinder.unbindc              
   C   s\   | j rXz| j| j| j| j  W n6 tjyV } zt|jd vrB W Y d }~n
d }~0 0 d S Nr   )	r/   r,   rB   r-   r+   tkinterTclErrorAPPLICATION_GONEargs)r0   er   r   r$   __del__h   s    z_SimpleBinder.__del__N)__name__
__module____qualname__r1   r=   rB   rI   r   r   r   r$   r&   I   s   r&   c                    s(   g | ]  d   fddttD qS ) c                 3   s*   | ]"\}}d |>  @ r|d d V  qdS )r   r   -Nr   )r"   r9   msr   r$   	<genexpr>w   s   z<listcomp>.<genexpr>)join	enumerater    )r"   r   rP   r$   r%   w   s   c                    sL   dd }g }| D ]6 t t fdd| D }|j|dd || q|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.
    c                 S   s$   d}| r t | d\} }||7 }q|S )znumber of bits set in n base 2r   r   )divmod)nZnbZremr   r   r$   nbits   s
    
zexpand_substates.<locals>.nbitsc                 3   s   | ]} |@ V  qd S r@   r   )r"   xstater   r$   rR          z#expand_substates.<locals>.<genexpr>T)keyreverse)listsetsortr>   )ZstatesrW   Z	statelistZ	substatesr   rY   r$   expand_substates|   s    ra   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )_ComplexBinderc                 C   s   |||| j | jfdd}|S )Nc                 S   s   dg|d d < || _ || _i }d }|D ]R}tt|d ddD ]0}	||	 }
|
|vr>d||
< ||	 | }|r> qpq>|r& qzq&g |d d < |D ]
}|  qg |d d < |r|S d S )NTr   r2   )r3   mc_stater4   r5   )r6   listsr3   rc   ishandlerrunningdoafterhandlerr8   r;   r7   r9   r:   fr   r   r$   r<      s*    z0_ComplexBinder.__create_handler.<locals>.handler)re   rf   )r0   rd   r3   rc   r<   r   r   r$   Z__create_handler   s    
z_ComplexBinder.__create_handlerc              	      s   | _ t| d  _| _| _d dd tD i _g  _g  _g  _	tD ]`} fddt
| D } ||t| }dt|   j d } j| j j||f qJd S )Nr   c                 S   s   g | ]}g qS r   r   r"   rQ   r   r   r$   r%      r[   z+_ComplexBinder.__init__.<locals>.<listcomp>c                    s   g | ]} j d  | qS r@   )r.   r"   r9   r0   r   r$   r%      r[   r'   r(   )r)   r*   typenamer,   r-   _statesr.   
handleridsre   rf   _state_subsets_ComplexBinder__create_handler_state_codes_state_namesr>   r=   )r0   r)   r,   r-   rQ   rd   r<   seqr   rj   r$   r1      s    z_ComplexBinder.__init__c              	      s   d j vrdd tD j d < tD ]jfddd d fD }|jt }dt jd f }j|j	
j||f q* fdd}js|  nj| d S )Nr   c                 S   s   g | ]}g qS r   r   rh   r   r   r$   r%      r[   z'_ComplexBinder.bind.<locals>.<listcomp>c                    s(   g | ] }t   D ]}j| | qqS r   )rn   r.   )r"   detailr9   )rQ   r0   r   r$   r%      s   z	<%s%s-%s>c                      s   j d  d   S Nr   r   )r.   r>   r   r:   r0   r?   r   r$   <lambda>   r[   z%_ComplexBinder.bind.<locals>.<lambda>)r.   rl   ro   r)   rp   rq   rk   rm   r>   r,   r=   r-   re   rf   )r0   r?   r:   rd   r<   rr   doitr   )r:   rQ   r0   r?   r$   r=      s"    


z_ComplexBinder.bindc                    s.    fdd}j s|  nj| d S )Nc                      s   j d  d   S rt   )r.   rA   r   ru   r   r$   rv      r[   z'_ComplexBinder.unbind.<locals>.<lambda>)re   rf   r>   )r0   r?   r:   rw   r   ru   r$   rB      s    z_ComplexBinder.unbindc                 C   sb   | j D ]V\}}z| j| j|| W q tjyZ } zt|jd vrF W Y d }~qd }~0 0 qd S rC   )rm   r,   rB   r-   rD   rE   rF   rG   )r0   rr   idrH   r   r   r$   rI      s    z_ComplexBinder.__del__N)rJ   rK   rL   ro   r1   r=   rB   rI   r   r   r   r$   rb      s
   rb   ))KeyPressZKey)
KeyRelease)ZButtonPressZButton)ZButtonRelease)ZActivate)Z	Circulate)ZColormap)Z	Configure)Z
Deactivate)ZDestroy)ZEnter)ZExpose)ZFocusIn)ZFocusOut)ZGravity)ZLeave)ZMap)ZMotion)Z
MouseWheel)ZProperty)ZReparent)ZUnmap)Z
Visibilityc                 C   s"   g | ]}t | D ]}||fqqS r   )r*   r!   r   r   r$   r%     s   z^\w+$z^[1-5]$c                 C   s   | r| d dks| d dkr dS | dd  d}d}|rb|d tv rb|dt|d  > O }|d= q6|r|d tv rt|d  }|d= ndS t| tu r|s|rdS d}nN|dd	 d
D v rt}nt}|sd}n(t|dkr||d r|d }ndS |||fS )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.
    r   r'   r2   r(   Nr   rN   c                 S   s   g | ]}t | qS r   )_type_namesrh   r   r   r$   r%   $  r[   z#_parse_sequence.<locals>.<listcomp>)ry   rz   )	split_modifier_namesr{   _binder_classesr&   
_keysym_re
_button_rer5   match)r+   ZwordsZ	modifiersr)   rs   Ztype_rer   r   r$   _parse_sequence  s0    
r   c                 C   s`   | d r8dt | d   t| d  d  d | d  d S dt | d   t| d  d  d S d S )Nr   r'   r   r   rN   r(   )rq   r*   )r?   r   r   r$   _triplet_to_sequence2  s    "r   c                    s0    t v rt   S G  fddd }|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                       sr   e Zd Ze ejsJ  fddZd fdd	Zd fdd	Z fdd	Z	 fd
dZ
d fdd	Zdd ZdS )z#MultiCallCreator.<locals>.MultiCallc                    s@   j  g|R i | i  _ fddtttD  _d S )Nc                    s   g | ]}t | | qS r   )r~   ri   )r0   r,   r   r$   r%   K  s   z@MultiCallCreator.<locals>.MultiCall.__init__.<locals>.<listcomp>)r1   _MultiCall__eventinfor4   r5   r*   _MultiCall__binders)r0   rG   kwargsr,   rj   r$   r1   E  s
    
z,MultiCallCreator.<locals>.MultiCall.__init__Nc                    s   t |tu rt|dkr|d d dkr|dd  dkr|| jv r| j| }|d d ur|d D ]}| j|d  ||d  q`||d< |d d ur|d D ]}| j|d  || qn|g g| j|<  | |||S )Nr   <<>>r   r   )r)   strr5   r   r   rB   r=   )r0   r+   r:   addZeir?   r   r   r$   r=   N  s     

z(MultiCallCreator.<locals>.MultiCall.bindc                    s   t |tu rt|dkr|d d dkr|dd  dkr|| jv r| j| \}}|d ur|D ]}| j|d  || q\d | j| d<  | ||S )Nr   r   r   r   r   r   )r)   r   r5   r   r   rB   )r0   r+   Zfuncidr:   tripletsr?   r   r   r$   rB   `  s    z*MultiCallCreator.<locals>.MultiCall.unbindc                    s|   || j vrd g g| j |< | j | \}}|D ]L}t|}|d u rN | || q*|d url| j|d  || || q*d S Nr   )r   r   	event_addr   r=   r>   r0   virtual	sequencesr:   r   rr   r?   r   r   r$   r   k  s    
z-MultiCallCreator.<locals>.MultiCall.event_addc                    sr   || j vrd S | j | \}}|D ]L}t|}|d u rD | || q |d urb| j|d  || || q d S r   )r   r   event_deleter   rB   rA   r   r   r   r$   r   |  s    
z0MultiCallCreator.<locals>.MultiCall.event_deletec                    sF   |d u s|| j vr | |S ttt| j | d  | | S d S r   )r   
event_infotuplemapr   )r0   r   r   r   r$   r     s    
z.MultiCallCreator.<locals>.MultiCall.event_infoc                 S   s~   | j D ]r}| j | \}}|r|D ]V}z| j|d  || W q  tjyt } zt|jd vr` W Y d }~q d }~0 0 q qd S )Nr   r   )r   r   rB   rD   rE   rF   rG   )r0   r   r:   r   r?   rH   r   r   r$   rI     s    
z+MultiCallCreator.<locals>.MultiCall.__del__)NNN)N)N)rJ   rK   rL   
issubclassrD   ZMiscr1   r=   rB   r   r   r   rI   r   r   r   r$   	MultiCallB  s   	r   )_multicall_dict)r,   r   r   r   r$   MultiCallCreator:  s
    [r   c                    s   t | }|d tt|  ddd  \}}|d||d f  tt j|  	  dgf fdd	}|d	 |d
 |d |d |d |d |d |d |d |d |d |d d S )NzTest MultiCall+r   z+%d+%d   r   c                    sH    fdd} d|d  | d|d    |d  d7  < d S )Nc                    s   t   d S r@   )print)r6   rr   r   r$   r<     s    z-_multi_call.<locals>.bindseq.<locals>.handlerz<<handler%d>>r   r   )r=   r   )rr   rV   r<   textr   r$   bindseq  s    z_multi_call.<locals>.bindseqz<Key>z<Control-Key>z<Alt-Key-a>z<Control-Key-a>z<Alt-Control-Key-a>z<Key-b>z<Control-Button-1>z
<Button-2>z<Alt-Button-1>z
<FocusOut>z<Enter>z<Leave>)
rD   ZTopleveltitler   intZgeometryr|   r   TextZpack)parenttoprX   yr   r   r   r$   _multi_call  s&    

 r   __main__)mainzidlelib.idle_test.test_mainmenuF)	verbosityexit)run)D__doc__resysrD   ZMC_KEYPRESSZMC_KEYRELEASEZMC_BUTTONPRESSZMC_BUTTONRELEASEZMC_ACTIVATEZMC_CIRCULATEZMC_COLORMAPZMC_CONFIGUREZMC_DEACTIVATEZ
MC_DESTROYZMC_ENTERZ	MC_EXPOSEZ
MC_FOCUSINZMC_FOCUSOUTZ
MC_GRAVITYZMC_LEAVEZMC_MAPZ	MC_MOTIONZMC_MOUSEWHEELZMC_PROPERTYZMC_REPARENTZMC_UNMAPZMC_VISIBILITYZMC_SHIFTZ
MC_CONTROLZMC_ALTZMC_METAZ	MC_OPTIONZ
MC_COMMANDplatformr    Z_modifier_masksdictr4   r5   r}   rF   r&   rl   rq   ra   rn   rp   rQ   r;   r9   r>   rb   r*   r~   r{   compiler   r   r   r   r   r   r   rJ   Zunittestr   Zidlelib.idle_test.htestr   r   r   r   r$   <module>   sf   


-_



'g
