
\[\JI                 @   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 dQ Z dR Z dS Z dT Z dU Z dV Z  e j! d k rd[ 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( Gd$ d%   d%  Z) e% d e& e"  > Z* d& d"   e* D Z+ d' d(   Z, e, e*  Z- g  Z. x] e* D]U Z/ d Z0 x9 e% e& e"   D]% Z1 d e1 >e/ @re0 e# e1 OZ0 qqWe. j2 e0  qWGd) d*   d*  Z3 dx Z4 e3 f d e) f e& e4  d Z5 e$ dD d"   e% e& e4   D  Z6 e j7 dE  Z8 e j7 dF  Z9 dG dH   Z: dI dJ   Z; i  Z< dK dL   Z= dM dN   Z> e? dO k rd dP l@ mA ZA eA e>  n  d S)ya  
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OptionCommandAltMetaMc             C   s-   g  |  ]# } t  | D] } | | f  q q S )
_modifiers).0numbernamer    r    '/usr/lib/python3.4/idlelib/MultiCall.py
<listcomp>7   s   	r&   z<can't invoke "bind" command:  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   sJ   | |  _  d t | d d |  _ | |  _ | |  _ g  |  _ d  |  _ d  S)N<r   >)type_typessequencewidget
widgetinstbindedfuncs	handlerid)selfr*   r-   r.   r    r    r%   __init__K   s    				z_SimpleBinder.__init__c             C   sY   |  j  sE |  j |  j d d  } |  j j |  j |  j |  |  _  n  |  j j |  d  S)Nc             S   ss   | |  _  i  } x] t t |  d d d  D]? } | | } | | k r, d | | <| |   } | rk | Sq, q, Wd  S)Nr   Tr3   )mc_typerangelen)eventlr4   	wascalledifuncrr    r    r%   handlerU   s    	#

z#_SimpleBinder.bind.<locals>.handler)r0   r/   r*   r-   bindr.   r,   append)r1   tripletr;   r=   r    r    r%   r>   S   s
    	
z_SimpleBinder.bindc             C   sH   |  j  j |  |  j  sD |  j j |  j |  j |  j  d  |  _ n  d  S)N)r/   remover-   unbindr.   r,   r0   )r1   r@   r;   r    r    r%   rB   c   s    	z_SimpleBinder.unbindc             C   sw   |  j  rs y# |  j j |  j |  j |  j   Wqs t j k
 ro } z | j d t k rZ n   WYd  d  } ~ Xqs Xn  d  S)Nr   )	r0   r-   rB   r.   r,   tkinterTclErrorargsAPPLICATION_GONE)r1   er    r    r%   __del__i   s    	z_SimpleBinder.__del__N)__name__
__module____qualname__r2   r>   rB   rH   r    r    r    r%   r'   J   s   r'   c                s8   g  |  ].   d  j    f d d   t t  D   q S) c             3   s1   |  ]' \ } } d  | >  @r | d d Vq d S)r   r   -Nr    )r"   r:   m)sr    r%   	<genexpr>z   s   	z<listcomp>.<genexpr>)join	enumerater!   )r"   r    )rO   r%   r&   z   s   	c                so   d d   } g  } xV |  D]N   t  t   f d d   |  D   } | j d | d d  | j |  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   s6   d } x) |  r1 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%   rP      s    z#expand_substates.<locals>.<genexpr>keyreverseT)listsetsortr?   )ZstatesrU   Z	statelistZ	substatesr    )rW   r%   expand_substates   s    %r]   c               @   sL   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 d d  } | S)Nc             S   s   d g | d  d   <| |  _  | |  _ i  } d  } x| | D]t } xa t t |  d d d  D]C }	 | |	 }
 |
 | k r[ d | |
 <| |	 |   } | r Pq q[ q[ W| r8 Pq8 q8 Wg  | d  d   <x | D] } |   q Wg  | d  d   <| r | Sd  S)NTr   r3   r3   )r4   mc_stater5   r6   )r7   listsr4   r_   ishandlerrunningdoafterhandlerr9   r<   r8   r:   r;   fr    r    r%   r=      s*    		#

z0_ComplexBinder.__create_handler.<locals>.handler)ra   rb   )r1   r`   r4   r_   r=   r    r    r%   Z__create_handler   s
    z_ComplexBinder.__create_handlerc                s   |   _  t | d   _ |   _ |   _ i d d   t D d  6  _ g    _ g    _ g    _	 x t D] }   f d d   t
 | D }   j | | t |  } d t |   j d }   j j |   j j   j | |  f  qk Wd  S)Nr   c             S   s   g  |  ] } g   q Sr    r    )r"   rO   r    r    r%   r&      s   	 z+_ComplexBinder.__init__.<locals>.<listcomp>c                s!   g  |  ] }   j  d  |  q S)N)r/   )r"   r:   )r1   r    r%   r&      s   	 r(   r)   )r*   r+   typenamer-   r.   _statesr/   
handleridsra   rb   _state_subsets_ComplexBinder__create_handler_state_codes_state_namesr?   r>   )r1   r*   r-   r.   rO   r`   r=   seqr    )r1   r%   r2      s    						z_ComplexBinder.__init__c                s   d  j  k r d d   t D  j   d <x t D]    f d d    d d  f D }  j |  j t   } d t   j  d f }  j j |  j	 j
  j | |  f  q8 Wn      f d d   }  j s |   n  j j |  d  S)Nr   c             S   s   g  |  ] } g   q Sr    r    )r"   rO   r    r    r%   r&      s   	 z'_ComplexBinder.bind.<locals>.<listcomp>c                s2   g  |  ]( } t    D] }  j | |  q q Sr    )rg   r/   )r"   detailr:   )rO   r1   r    r%   r&      s   	z	<%s%s-%s>c                  s     j   d  d j    S)Nr   r   )r/   r?   r    )r;   r1   r@   r    r%   <lambda>   s    z%_ComplexBinder.bind.<locals>.<lambda>)r/   re   rh   r*   ri   rj   rd   rf   r?   r-   r>   r.   ra   rb   )r1   r@   r;   r`   r=   rk   doitr    )r;   rO   r1   r@   r%   r>      s    	
z_ComplexBinder.bindc                s?       f d d   }  j  s+ |   n  j j |  d  S)Nc                  s     j   d  d j    S)Nr   r   )r/   rA   r    )r;   r1   r@   r    r%   rm      s    z'_ComplexBinder.unbind.<locals>.<lambda>)ra   rb   r?   )r1   r@   r;   rn   r    )r;   r1   r@   r%   rB      s    	
z_ComplexBinder.unbindc             C   s   xy |  j  D]n \ } } y |  j j |  j | |  Wq
 t j k
 rw } z | j d t k rb Pn   WYd  d  } ~ Xq
 Xq
 Wd  S)Nr   )rf   r-   rB   r.   rC   rD   rE   rF   )r1   rk   idrG   r    r    r%   rH      s    z_ComplexBinder.__del__N)rI   rJ   rK   rh   r2   r>   rB   rH   r    r    r    r%   r^      s
   r^   KeyPressKey
KeyReleaseButtonPressButtonButtonReleaseActivate	CirculateColormap	Configure
DeactivateDestroyEnterExposeFocusInFocusOutGravityLeaveMapMotion
MouseWheelPropertyReparentUnmap
Visibilityc             C   s-   g  |  ]# } t  | D] } | | f  q q Sr    )r+   )r"   r#   r$   r    r    r%   r&   
  s   	z^\w+$z^[1-5]$c             C   sY  |  s' |  d d k s' |  d d k r+ d S|  d d  j  d  } d } x7 | r | d t k r | d t | d >O} | d =qM W| r | d t k r t | d } | d =n d St | t k r | s | r d Sd } nm | d d   d D k rt } n t } | sd } n6 t |  d k rH| j | d  rH| 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(   r   r)   NrM   c             S   s   g  |  ] } t  |  q Sr    )_type_names)r"   rO   r    r    r%   r&   )  s   	 z#_parse_sequence.<locals>.<listcomp>rp   rr   r3   r3   )rp   rr   )	split_modifier_namesr   _binder_classesr'   
_keysym_re
_button_rer6   match)r,   ZwordsZ	modifiersr*   rl   Ztype_rer    r    r%   _parse_sequence  s0    '
			%r   c             C   sb   |  d r: d t  |  d t |  d d d |  d d Sd t  |  d t |  d d d Sd  S)Nr   r(   r   r   rM   r)   )rj   r+   )r@   r    r    r%   _triplet_to_sequence7  s    
0r   c                s>     t  k r t    SG  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                   s   e  Z d  Z e   e j  s$ t    f d d   Z d d 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                sK    j    | |  i    _    f d d   t t t   D   _ d  S)Nc                s&   g  |  ] } t  | |      q Sr    )r   )r"   r:   )r1   r-   r    r%   r&   P  s   	z@MultiCallCreator.<locals>.MultiCall.__init__.<locals>.<listcomp>)r2   _MultiCall__eventinfor5   r6   r+   _MultiCall__binders)r1   rE   kwargs)r-   )r1   r%   r2   J  s    	z,MultiCallCreator.<locals>.MultiCall.__init__Nc                s/  t  |  t k rt |  d k r| d  d  d k r| d d   d k r| |  j k r|  j | } | d d  k	 r x4 | d D]% } |  j | d j | | d  q Wn  | | d <| d d  k	 rx0 | d D]! } |  j | d j | |  q Wqq| g  g |  j | <n    j |  | | |  S)Nr   z<<z>>r   r   )r*   strr6   r   r   rB   r>   )r1   r,   r;   addZeir@   )r-   r    r%   r>   S  s    $,&
%z(MultiCallCreator.<locals>.MultiCall.bindc                s   t  |  t k r t |  d k r | d  d  d k r | d d   d k r | |  j k r |  j | \ } } | d  k	 r x) | D]! } |  j | d j | |  q Wd  |  j | d <q n    j |  | |  S)Nr   z<<z>>r   r   r   )r*   r   r6   r   r   rB   )r1   r,   Zfuncidr;   tripletsr@   )r-   r    r%   rB   e  s    $,z*MultiCallCreator.<locals>.MultiCall.unbindc                s   | |  j  k r% d  g  g |  j  | <n  |  j  | \ } } xs | D]k } t |  } | d  k rs   j |  | |  q? | d  k	 r |  j | d j | |  n  | j |  q? Wd  S)Nr   )r   r   	event_addr   r>   r?   )r1   virtual	sequencesr;   r   rk   r@   )r-   r    r%   r   p  s    z-MultiCallCreator.<locals>.MultiCall.event_addc                s   | |  j  k r d  S|  j  | \ } } xs | D]k } t |  } | d  k ra   j |  | |  q- | d  k	 r |  j | d j | |  n  | j |  q- Wd  S)Nr   )r   r   event_deleter   rB   rA   )r1   r   r   r;   r   rk   r@   )r-   r    r%   r     s    z0MultiCallCreator.<locals>.MultiCall.event_deletec                s]   | d  k s | |  j  k r+   j |  |  St t t |  j  | d     j |  |  Sd  S)Nr   )r   
event_infotuplemapr   )r1   r   )r-   r    r%   r     s
    	z.MultiCallCreator.<locals>.MultiCall.event_infoc             S   s   x |  j  D] } |  j  | \ } } | r
 xu | D]j } y |  j | d j | |  Wq0 t j k
 r } z | j d t k r Pn   WYd  d  } ~ Xq0 Xq0 Wq
 q
 Wd  S)Nr   r   )r   r   rB   rC   rD   rE   rF   )r1   r   r;   r   r@   rG   r    r    r%   rH     s    z+MultiCallCreator.<locals>.MultiCall.__del__)rI   rJ   rK   
issubclassrC   ZMiscAssertionErrorr2   r>   rB   r   r   r   rH   r    )r-   r    r%   	MultiCallG  s   	r   )_multicall_dict)r-   r   r    )r-   r%   MultiCallCreator?  s
    ]
r   c                s$  t  j   } | j d  t t t t j d |  j      \ } } } } | j d | | d f  t	 t  j
  |      j   d g   f d d  } | d  | d	  | d
  | d  | d  | d  | d  | d  | d  | d  | d  | d  | j   d  S)NzTest MultiCallz[x+]z+%d+%d   r   c                sT     f d d   }  j  d | d |   j d | d    | d d 7<d  S)Nc                s   t     d  S)N)print)r7   )rk   r    r%   r=     s    z-_multi_call.<locals>.bindseq.<locals>.handlerz<<handler%d>>r   r   )r>   r   )rk   rT   r=   )text)rk   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>)rC   ZTktitlerZ   r   intrer   Zgeometryr   ZTextZpackZmainloop)parentrootwidthZheightrV   yr   r    )r   r%   _multi_call  s(    3












r   __main__)runr   r   r	       @      r   r   r   r   )r   r   r   r   r   r   r   r   r   )r   r   r   r   zKeyPressrq   z
KeyReleasers   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )B__doc__sysr   rC   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dictr5   r6   r   rF   r'   re   rj   r]   rg   ri   rO   r<   r:   r?   r^   r+   r   r   compiler   r   r   r   r   r   r   rI   Zidlelib.idle_test.htestr   r    r    r    r%   <module>   s                         
/	
b     "'i