B
    ^ cH                 @   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.xNe*D ]FZ/dZ0x0e%e&e"D ] Z1de1> e/@ r6e0e#e1 O Z0q6W e.2e0 q W 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))Shift)Control)ZOption)ZCommand))r   )ZAlt)r   )ZMetaMc             C   s"   g | ]}t | D ]}||fqqS  )
_modifiers).0numbernamer   r   "lib/python3.7/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 }xDtt|d ddD ],}|| }||kr d||< || }|r |S q W 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$   rA   b   s    z_SimpleBinder.unbindc          
   C   sZ   | j rVy| j| j| j| j  W n4 tjk
rT } zt|jd krD W d d }~X Y nX d S )Nr   )	r/   r,   rA   r-   r+   tkinterTclErrorAPPLICATION_GONEargs)r0   er   r   r$   __del__h   s    z_SimpleBinder.__del__N)__name__
__module____qualname__r1   r=   rA   rG   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   )rN   r$   r%   w   s   c                sP   dd }g }x>| D ]6 t t fdd| D }|j|dd || qW |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}x| r"t | d\} }||7 }qW |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 )Nr   )r!   x)stater   r$   rO      s    z#expand_substates.<locals>.<genexpr>T)keyreverse)listsetsortr>   )ZstatesrT   Z	statelistZ	substatesr   )rV   r$   expand_substates|   s    
r\   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 }xZ|D ]R}xFtt|d ddD ].}	||	 }
|
|krBd||
< ||	 | }|rBP qBW |r(P q(W g |d d < x|D ]
}|  qW g |d d < |r|S d S )NTr   r2   )r3   mc_stater4   r5   )r6   listsr3   r^   ishandlerrunningdoafterhandlerr8   r;   r7   r9   r:   fr   r   r$   r<      s*    


z0_ComplexBinder.__create_handler.<locals>.handler)r`   ra   )r0   r_   r3   r^   r<   r   r   r$   Z__create_handler   s
    z_ComplexBinder.__create_handlerc          	      s   | _ t| d  _| _| _d dd tD i _g  _g  _g  _	xhtD ]`} fddt
| D } ||t| }dt|   j d } j| j j||f qLW d S )Nr   c             S   s   g | ]}g qS r   r   )r!   rN   r   r   r$   r%      s    z+_ComplexBinder.__init__.<locals>.<listcomp>c                s   g | ]} j d  | qS )N)r.   )r!   r9   )r0   r   r$   r%      s    r'   r(   )r)   r*   typenamer,   r-   _statesr.   
handleridsr`   ra   _state_subsets_ComplexBinder__create_handler_state_codes_state_namesr>   r=   )r0   r)   r,   r-   rN   r_   r<   seqr   )r0   r$   r1      s    
z_ComplexBinder.__init__c          	      s   d j krdd tD j d < xrtD ]jfddd d fD }|jt }dt jd f }j|j	
j||f q,W  fdd}js|  nj| d S )Nr   c             S   s   g | ]}g qS r   r   )r!   rN   r   r   r$   r%      s    z'_ComplexBinder.bind.<locals>.<listcomp>c                s(   g | ] }t   D ]}j| | qqS r   )rf   r.   )r!   detailr9   )rN   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>       z%_ComplexBinder.bind.<locals>.<lambda>)r.   rd   rg   r)   rh   ri   rc   re   r>   r,   r=   r-   r`   ra   )r0   r?   r:   r_   r<   rj   doitr   )r:   rN   r0   r?   r$   r=      s    


z_ComplexBinder.bindc                s.    fdd}j s|  nj| d S )Nc                  s   j d  d   S )Nr   r   )r.   r@   r   )r:   r0   r?   r   r$   rl      rm   z'_ComplexBinder.unbind.<locals>.<lambda>)r`   ra   r>   )r0   r?   r:   rn   r   )r:   r0   r?   r$   rA      s    z_ComplexBinder.unbindc             C   sd   x^| j D ]T\}}y| j| j|| W q tjk
rZ } zt|jd krJ W d d }~X Y qX qW d S )Nr   )re   r,   rA   r-   rB   rC   rD   rE   )r0   rj   idrF   r   r   r$   rG      s    z_ComplexBinder.__del__N)rH   rI   rJ   rg   r1   r=   rA   rG   r   r   r   r$   r]      s
   r]   ))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   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}x.|rd|d tkrd|dt|d  > O }|d= q8W |r|d tkrt|d  }|d= ndS t| tkr|s|rdS d}nN|dd	 d
D k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   rL   c             S   s   g | ]}t | qS r   )_type_names)r!   rN   r   r   r$   r%   $  s    z#_parse_sequence.<locals>.<listcomp>)rp   rq   )	split_modifier_namesrr   _binder_classesr&   
_keysym_re
_button_rer5   match)r+   ZwordsZ	modifiersr)   rk   Ztype_rer   r   r$   _parse_sequence  s0    

ry   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   rL   r(   )ri   r*   )r?   r   r   r$   _triplet_to_sequence2  s    0rz   c                s0    t k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t 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  f|| i  _ fddtttD  _d S )Nc                s   g | ]}t | | qS r   )ru   )r!   r9   )r0   r,   r   r$   r%   K  s   z@MultiCallCreator.<locals>.MultiCall.__init__.<locals>.<listcomp>)r1   _MultiCall__eventinfor4   r5   r*   _MultiCall__binders)r0   rE   kwargs)r,   )r0   r$   r1   E  s    z,MultiCallCreator.<locals>.MultiCall.__init__Nc                s   t |tkrt|dkr|d d dkr|dd  dkr|| jkr| j| }|d d k	rx*|d D ]}| j|d  ||d  qbW ||d< |d d k	rx6|d D ]}| j|d  || qW n|g g| j|<  | |||S )Nr   z<<z>>r   r   )r)   strr5   r{   r|   rA   r=   )r0   r+   r:   addZeir?   )r,   r   r$   r=   N  s     

z(MultiCallCreator.<locals>.MultiCall.bindc                s   t |tkrt|dkr|d d dkr|dd  dkr|| jkr| j| \}}|d k	rx"|D ]}| j|d  || q^W d | j| d<  | ||S )Nr   z<<r~   z>>r   r   )r)   r   r5   r{   r|   rA   )r0   r+   Zfuncidr:   tripletsr?   )r,   r   r$   rA   `  s     

z*MultiCallCreator.<locals>.MultiCall.unbindc                s   || j krd g g| j |< | j | \}}xT|D ]L}t|}|d krP | || q,|d k	rn| j|d  || || q,W d S )Nr   )r{   ry   	event_addr|   r=   r>   )r0   virtual	sequencesr:   r   rj   r?   )r,   r   r$   r   k  s    

z-MultiCallCreator.<locals>.MultiCall.event_addc                sv   || j krd S | j | \}}xT|D ]L}t|}|d krF | || q"|d k	rd| j|d  || || q"W d S )Nr   )r{   ry   event_deleter|   rA   r@   )r0   r   r   r:   r   rj   r?   )r,   r   r$   r   |  s    

z0MultiCallCreator.<locals>.MultiCall.event_deletec                sF   |d ks|| j kr | |S ttt| j | d  | | S d S )Nr   )r{   
event_infotuplemaprz   )r0   r   )r,   r   r$   r     s
    z.MultiCallCreator.<locals>.MultiCall.event_infoc             S   s   x~| j D ]t}| j | \}}|rx\|D ]T}y| j|d  || W q$ tjk
rv } zt|jd krf W d d }~X Y q$X q$W qW d S )Nr   r   )r{   r|   rA   rB   rC   rD   rE   )r0   r   r:   r   r?   rF   r   r   r$   rG     s    
z+MultiCallCreator.<locals>.MultiCall.__del__)NNN)N)N)rH   rI   rJ   
issubclassrB   ZMiscAssertionErrorr1   r=   rA   r   r   r   rG   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 )N)print)r6   )rj   r   r$   r<     s    z-_multi_call.<locals>.bindseq.<locals>.handlerz<<handler%d>>r   r   )r=   r   )rj   rS   r<   )text)rj   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>)
rB   ZTopleveltitler   intZgeometryrs   r   ZTextZpack)parenttoprU   yr   r   )r   r$   _multi_call  s&    

 r   __main__)mainzidlelib.idle_test.test_mainmenuF)	verbosityexit)run)D__doc__resysrB   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   rt   rD   r&   rd   ri   r\   rf   rh   rN   r;   r9   r>   r]   r*   ru   rr   compilerv   rw   ry   rz   r   r   r   rH   Zunittestr   Zidlelib.idle_test.htestr   r   r   r   r$   <module>   s                         

-
`	

'g
