o
    ^hH                     @   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rVd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 ]Z/dZ0e%e&e"D ]Z1de1> e/@ re0e#e1 O Z0qe.2e0 qG 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 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   "   g | ]}t | D ]}||fqqS  )
_modifiers.0numbernamer    r    #  /home/conda/feedstock_root/build_artifacts/python-split_1761171407825/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehol/lib/python3.10/idlelib/multicall.py
<listcomp>7       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/   r0   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 ]}|| }||vr'd||< || }|r'|  S qd S )Nr   T)mc_typerangelen)eventlr6   	wascalledifuncrr    r    r&   handlerT   s   z#_SimpleBinder.bind.<locals>.handler)r2   r1   r,   r/   bindr0   r.   append)r3   tripletr=   r?   r    r    r&   r@   R   s   

z_SimpleBinder.bindc                 C   s6   | j | | j s| j| j| j| j d | _d S d S N)r1   remover/   unbindr0   r.   r2   )r3   rB   r=   r    r    r&   rE   b   s
   
z_SimpleBinder.unbindc              
   C   s`   | j r.z| j| j| j| j  W d S  tjy- } zt|jd vr" W Y d }~d S d }~ww d S Nr   )	r2   r/   rE   r0   r.   tkinterTclErrorAPPLICATION_GONEargs)r3   er    r    r&   __del__h   s   
z_SimpleBinder.__del__N)__name__
__module____qualname__r4   r@   rE   rL   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#   r<   msr    r&   	<genexpr>w   s
    
z<listcomp>.<genexpr>)join	enumerater!   )r#   r    rS   r&   r'   w   s
    c                    sL   dd }g }| D ] 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 }| s|S )znumber of bits set in n base 2r   r   )divmod)nnbremr    r    r&   nbits   s   zexpand_substates.<locals>.nbitsc                 3   s    | ]} |@ V  qd S rC   r    )r#   xstater    r&   rU      s    z#expand_substates.<locals>.<genexpr>T)keyreverse)listsetsortrA   )Zstatesr\   Z	statelistZ	substatesr    r^   r&   expand_substates|   s   re   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 ])}tt|d ddD ]}	||	 }
|
|vr7d||
< ||	 | }|r7 nq|r< nqg |d d < |D ]}|  qEg |d d < |rU|S d S )NTr   r5   )r6   mc_stater7   r8   )r9   listsr6   rg   ishandlerrunningdoafterhandlerr;   r>   r:   r<   r=   fr    r    r&   r?      s0   z0_ComplexBinder.__create_handler.<locals>.handler)ri   rj   )r3   rh   r6   rg   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 ]0} fddt
| D } ||t| }dt|   j d } j| j j||f q%d S )Nr   c                 S      g | ]}g qS r    r    r#   rT   r    r    r&   r'          z+_ComplexBinder.__init__.<locals>.<listcomp>c                    s   g | ]	} j d  | qS rC   )r1   r#   r<   r3   r    r&   r'      s    r*   r+   )r,   r-   typenamer/   r0   _statesr1   
handleridsri   rj   _state_subsets_ComplexBinder__create_handler_state_codes_state_namesrA   r@   )r3   r,   r/   r0   rT   rh   r?   seqr    rp   r&   r4      s    
z_ComplexBinder.__init__c              	      s   d j vrKdd tD j d < tD ]5fddd d fD }|jt }dt jd f }j|j	
j||f q fdd}js[|  d S j| d S )Nr   c                 S   rl   r    r    rm   r    r    r&   r'      rn   z'_ComplexBinder.bind.<locals>.<listcomp>c                    s(   g | ]}t   D ]	}j| | qqS r    )rt   r1   )r#   detailr<   )rT   r3   r    r&   r'      s    z	<%s%s-%s>c                         j d  d   S Nr   r   )r1   rA   r    r=   r3   rB   r    r&   <lambda>       z%_ComplexBinder.bind.<locals>.<lambda>)r1   rr   ru   r,   rv   rw   rq   rs   rA   r/   r@   r0   ri   rj   )r3   rB   r=   rh   r?   rx   doitr    )r=   rT   r3   rB   r&   r@      s"   



z_ComplexBinder.bindc                    s0    fdd}j s|  d S j| d S )Nc                      rz   r{   )r1   rD   r    r|   r    r&   r}      r~   z'_ComplexBinder.unbind.<locals>.<lambda>)ri   rj   rA   )r3   rB   r=   r   r    r|   r&   rE      s   
z_ComplexBinder.unbindc                 C   s`   | j D ]*\}}z| j| j|| W q tjy- } zt|jd vr# W Y d }~qd }~ww d S rF   )rs   r/   rE   r0   rG   rH   rI   rJ   )r3   rx   idrK   r    r    r&   rL      s   z_ComplexBinder.__del__N)rM   rN   rO   ru   r4   r@   rE   rL   r    r    r    r&   rf      s    rf   ))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   r   r    )r-   r"   r    r    r&   r'     r(   z^\w+$z^[1-5]$c                 C   s  | r| d dks| d dkrdS | dd  d}d}|r8|d tv r8|dt|d  > O }|d= |r8|d tv s#|rJ|d tv rJt|d  }|d= ndS t| tu r[|sV|rXdS d}n'|dd	 d
D v rgt}nt}|snd}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*   r5   r+   Nr   rQ   c                 S   s   g | ]}t | qS r    )_type_namesrm   r    r    r&   r'   $  s    z#_parse_sequence.<locals>.<listcomp>)r   r   )	split_modifier_namesr   _binder_classesr)   
_keysym_re
_button_rer8   match)r.   words	modifiersr,   ry   Ztype_rer    r    r&   _parse_sequence  s2   

r   c                 C   s\   | d rdt | d   t| d  d  d | d  d S dt | d   t| d  d  d S )Nr   r*   r   r   rQ   r+   )rw   r-   )rB   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   ro   )r3   r/   r    r&   r'   K  s    z@MultiCallCreator.<locals>.MultiCall.__init__.<locals>.<listcomp>)r4   _MultiCall__eventinfor7   r8   r-   _MultiCall__binders)r3   rJ   kwargsr/   rp   r&   r4   E  s
   
z,MultiCallCreator.<locals>.MultiCall.__init__Nc                    s   t |tu rdt|dkrd|d d dkrd|dd  dkrd|| jv r]| j| }|d d ur@|d D ]}| j|d  ||d  q0||d< |d d ur\|d D ]}| j|d  || qNn|g g| j|<  | |||S )Nr   <<>>r   r   )r,   strr8   r   r   rE   r@   )r3   r.   r=   addeirB   r   r    r&   r@   N  s    

z(MultiCallCreator.<locals>.MultiCall.bindc                    s   t |tu rCt|dkrC|d d dkrC|dd  dkrC|| jv rC| j| \}}|d urC|D ]}| j|d  || q.d | j| d<  | ||S )Nr   r   r   r   r   r   )r,   r   r8   r   r   rE   )r3   r.   Zfuncidr=   tripletsrB   r   r    r&   rE   `  s    
z*MultiCallCreator.<locals>.MultiCall.unbindc                    s|   || j vrd g g| j |< | j | \}}|D ]&}t|}|d u r' | || q|d ur6| j|d  || || qd S Nr   )r   r   	event_addr   r@   rA   r3   virtual	sequencesr=   r   rx   rB   r   r    r&   r   k  s   
z-MultiCallCreator.<locals>.MultiCall.event_addc                    sr   || j vrd S | j | \}}|D ]&}t|}|d u r" | || q|d ur1| j|d  || || qd S r   )r   r   event_deleter   rE   rD   r   r   r    r&   r   |  s   
z0MultiCallCreator.<locals>.MultiCall.event_deletec                    sB   |d u s	|| j vr | |S ttt| j | d  | | S r   )r   
event_infotuplemapr   )r3   r   r   r    r&   r     s   
z.MultiCallCreator.<locals>.MultiCall.event_infoc                 S   s|   | j D ]8}| j | \}}|r;|D ]*}z| j|d  || W q tjy: } zt|jd vr0 W Y d }~qd }~ww qd S )Nr   r   )r   r   rE   rG   rH   rI   rJ   )r3   r   r=   r   rB   rK   r    r    r&   rL     s   
z+MultiCallCreator.<locals>.MultiCall.__del__)NNNrC   )rM   rN   rO   
issubclassrG   ZMiscr4   r@   rE   r   r   r   rL   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 rC   )print)r9   rx   r    r&   r?     s   z-_multi_call.<locals>.bindseq.<locals>.handlerz<<handler%d>>r   r   )r@   r   )rx   rY   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>)
rG   ZTopleveltitler   intZgeometryr   r   ZTextpack)parenttopr]   yr   r    r   r&   _multi_call  s&   

 r   __main__)mainzidlelib.idle_test.test_mainmenuF)	verbosityexit)run)D__doc__resysrG   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dictr7   r8   r   rI   r)   rr   rw   re   rt   rv   rT   r>   r<   rA   rf   r-   r   r   compiler   r   r   r   r   r   r   rM   Zunittestr   Zidlelib.idle_test.htestr   r    r    r    r&   <module>   sl    


-_



'g
