
    "eH              	          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jB                  dk(  r	dZ"eeee fZ#ndZ"eeeefZ# e$ e%e"            D  ci c]  } e"|    D ]  }||   c}} Z&dZ' G d  d!      Z( e$d e%e"      z        Z)e)D cg c]"  d"jU                  fd# e+e"      D              $ c}Z,d$ Z- e-e)      Z.g Z/e)D ]9  Z0dZ1 e$ e%e"            D ]  Z2de2z  e0z  se1e#e2   z  Z1 e/jg                  e1       ;  G d% d&      Z4d'Z5e4fdz  e(f e%e5      dz
  z  z   Z6 e$ e%e5            D  ci c]  } e5|    D ]  }||   c}} Z7 ejp                  d(      Z9 ejp                  d)      Z:d* Z;d+ Z<i Z=d, Z>d- Z?e@d.k(  r dd/lAmBZB  eBd0dd12       dd3lCmDZD  eDe?       yyc c}} w c c}w c c}} w )4a  
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)r   )Altr   )MetaMzapplication has been destroyedc                   $    e Zd Zd Zd Zd Zd Zy)_SimpleBinderc                 x    || _         dt        |   d   z   dz   | _        || _        || _        g | _        d | _        y )N<r   >)type_typessequencewidget
widgetinstbindedfuncs	handlerid)selfr+   r.   r/   s       #lib/python3.12/idlelib/multicall.py__init__z_SimpleBinder.__init__J   s?    	F4LO+C/$    c                     | j                   sP| j                  | j                  fd}| j                  j	                  | j
                  | j                  |      | _         | j                  j                  |       y )Nc                     || _         i }t        t        |      dz
  dd      D ]  }||   }||vsd||<    ||       }|s|c S  y )Nr   T)mc_typerangelen)eventlr9   	wascalledifuncrs          r3   handlerz#_SimpleBinder.bind.<locals>.handlerT   sY     '	s1vaxR0 %AQ4D9,*.	$ K#$H%r5   )r1   r0   r+   r.   bindr/   r-   append)r2   tripletr@   rB   s       r3   rC   z_SimpleBinder.bindR   sY    ~~#'#3#3tyy 	% "[[--doo.2mmWFDN%r5   c                     | j                   j                  |       | j                   sC| j                  j                  | j                  | j
                  | j                         d | _        y y N)r0   remover.   unbindr/   r-   r1   )r2   rE   r@   s      r3   rI   z_SimpleBinder.unbindb   sM    %KKtt~~N!DN  r5   c                    | j                   r=	 | j                  j                  | j                  | j                  | j                          y y # t
        j                  $ r }t        |j                  d   vr Y d }~y d }~ww xY wNr   )	r1   r.   rI   r/   r-   tkinterTclErrorAPPLICATION_GONEargs)r2   es     r3   __del__z_SimpleBinder.__del__h   sh    >>""4??DMM(  ## '166!94 5s   ;A A>A99A>N)__name__
__module____qualname__r4   rC   rI   rQ    r5   r3   r'   r'   I   s    & "r5   r'    c              3   D   K   | ]  \  }}d |z  z  r
|d   dz     yw)r   r   -NrU   ).0r?   mss      r3   	<genexpr>r\   w   s0      ) AqFa< !S )s    c                     d }g }| D ]B  }t        | D ch c]  }||z  	 c}      }|j                  |d       |j                  |       D |S c c}w )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                 <    d}| rt        | d      \  } }||z  }| r|S )znumber of bits set in n base 2r   r   )divmod)nnbrems      r3   nbitszexpand_substates.<locals>.nbits   s.    Aq\FAs#IB  	r5   T)keyreverse)listsortrD   )statesrc   	stateliststatex	substatess         r3   expand_substatesrm   |   sa     I $V4%!)45	5$/#$  5s   A
c                   *    e Zd Zd Zd Zd Zd Zd Zy)_ComplexBinderc                 @    |||| j                   | j                  fd}|S )Nc                     dg|d d  || _         || _        i }d }|D ]B  }t        t        |      dz
  dd      D ]   }	||	   }
|
|vsd||
<    ||	   |       }|s  n |sB n g |d d  |D ]	  } |         g |d d  |r|S y )NTr   r8   )r9   mc_stater:   r;   )r<   listsr9   rr   ishandlerrunningdoafterhandlerr>   rA   r=   r?   r@   fs               r3   rB   z0_ComplexBinder.__create_handler.<locals>.handler   s     $(&Q#EM%ENIA 	s1vaxR0 "AQ4D9,*.	$ AaDK!" 	 #%Q#  "N1 r5   )rt   ru   )r2   rs   r9   rr   rB   s        r3   __create_handlerz_ComplexBinder.__create_handler   s(    #(%('+'<'<%)%8%8	4 r5   c           	         || _         t        |   d   | _        || _        || _        d t
        D cg c]  }g  c}i| _        g | _        g | _        g | _	        t
        D ]  }t        |   D cg c]  }| j                  d    |    }}| j                  ||t        |         }dt        |   z   | j                  z   dz   }| j                  j                  || j                  j                  | j                  ||      f        y c c}w c c}w )Nr   r)   r*   )r+   r,   typenamer.   r/   _statesr0   
handleridsrt   ru   _state_subsets_ComplexBinder__create_handler_state_codes_state_namesrD   rC   )	r2   r+   r.   r/   r[   r?   rs   rB   seqs	            r3   r4   z_ComplexBinder.__init__   s   	tQ$ w"7!2"78 !#  	JA8Fq8IJ1T%%d+A.JEJ++E4aIGl1o%dmm3C7COO""C)9)9$//:=w*H $I J		J #8 Ks   	D+Dc           	      ~    d    j                   vrt        D cg c]  }g  c} j                   d   <   t        D ]  }d   d fD cg c]"  }t        |   D ]  } j                   |   |    $ }}} j                  | j                  t
        |         }dt        |    j                  dd   d} j                  j                  | j                  j                   j                  ||      f         fd}	 j                  s |	        y  j                  j                  |	       y c c}w c c}}w )Nr   r)   rX   r*   c                  R    j                   d      d      j                         S Nr   r   )r0   rD   r@   r2   rE   s   r3   <lambda>z%_ComplexBinder.bind.<locals>.<lambda>   *    t''
3GAJ?FFtL r5   )r0   rz   r|   r}   r+   r~   r   ry   r{   rD   r.   rC   r/   rt   ru   )
r2   rE   r@   r[   detailr?   rs   rB   r   doits
   ```       r3   rC   z_ComplexBinder.bind   s:   1:T---8?+@1B+@DWQZ( N)0T(:=$#1!#4= **6215 =5 = = //tyy0<QA$0OT]]GAJO&&T[[-=-=doo>A7.L (M NN M$$F&&t, ,A=s   	D4'D9c                 v      fd} j                   s |        y  j                  j                  |       y )Nc                  R    j                   d      d      j                         S r   )r0   rH   r   s   r3   r   z'_ComplexBinder.unbind.<locals>.<lambda>   r   r5   )rt   ru   rD   )r2   rE   r@   r   s   ``` r3   rI   z_ComplexBinder.unbind   s*    L$$F&&t,r5   c                     | j                   D ]-  \  }}	 | j                  j                  | j                  ||       / y # t        j
                  $ r }t        |j                  d   vr Y d }~_d }~ww xY wrK   )r{   r.   rI   r/   rL   rM   rN   rO   )r2   r   idrP   s       r3   rQ   z_ComplexBinder.__del__   sh     	GC""4??C<	 ## '166!94 5s   '>A1A,,A1N)rR   rS   rT   r}   r4   rC   rI   rQ   rU   r5   r3   ro   ro      s    :J.-$-r5   ro   ))KeyPressKey)
KeyRelease)ButtonPressButton)ButtonRelease)Activate)	Circulate)Colormap)	Configure)
Deactivate)Destroy)Enter)Expose)FocusIn)FocusOut)Gravity)Leave)Map)Motion)
MouseWheel)Property)Reparent)Unmap)
Visibilityz^\w+$z^[1-5]$c                    | r| d   dk7  s| d   dk7  ry| dd j                  d      }d}|r.|d   t        v r#|dt        |d      z  z  }|d= |r|d   t        v r#|r|d   t        v rt        |d      }|d= nyt        |   t        u r|s|ryd}nT|dD cg c]  }t        |    c}v rt
        }nt        }|sd}n)t        |      dk(  r|j                  |d         r|d   }ny|||fS c c}w )	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)   r8   r*   Nr   rX   )r   r   )	split_modifier_names_type_names_binder_classesr'   
_keysym_re
_button_rer;   match)r-   words	modifiersr+   r   r[   type_res          r3   _parse_sequencer     s    x{c)Xb\S-@QrN  %EI
E!H/Q/%(333	!H E!H/ q[(58$!Ht-F ,FGqKNGG G GFZ1_uQx!81XFdF"" Hs   C(c                     | d   r+dt         | d      z   t        | d      d   z   dz   | d   z   dz   S dt         | d      z   t        | d      d   z   dz   S )Nr   r)   r   r   rX   r*   )r   r,   )rE   s    r3   _triplet_to_sequencer   2  sy    qz<
++F71:,>q,AA#Eqz 	 <
++F71:,>q,AA#EEr5   c                 V      t         v r	t             S  G  f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                       e Zd Z eW  ej
                        sJ  fdZd	 fd	Zd
 fd	Z fdZ	 fdZ
d
 fd	Zd Zy)#MultiCallCreator.<locals>.MultiCallc                      j                   | g|i | i | _        t        t        t                    D cg c]  }t        |   ||        c}| _        y c c}w rG   )r4   _MultiCall__eventinfor:   r;   r,   r   _MultiCall__binders)r2   rO   kwargsr?   r.   s       r3   r4   z,MultiCallCreator.<locals>.MultiCall.__init__E  s[    FOOD24262  "D',S['9;"# .a0FDA ;DN ;s   ANc                    t        |      t        u rt        |      dkD  r|d d dk(  r|dd  dk(  r|| j                  v rz| j                  |   }|d   /|d   D ]'  }| j                  |d      j                  ||d          ) ||d<   |d   >|d   D ]$  }| j                  |d      j                  ||       & n|g g| j                  |<   j                  | |||      S )Nr   <<>>r   r   )r+   strr;   r   r   rI   rC   )r2   r-   r@   addeirE   r.   s         r3   rC   z(MultiCallCreator.<locals>.MultiCall.bindN  s    H~$X):|t#(=t///))(3B!u(')!u NG NN71:6==gr!uMN BqE!u(')!u KG NN71:6;;GTJK 37D$$X.;;tXtS99r5   c                 B   t        |      t        u r{t        |      dkD  rm|d d dk(  re|dd  dk(  r]|| j                  v rO| j                  |   \  }}|;|D ]$  }| j                  |d      j                  ||       & d | j                  |   d<   j                  | ||      S )Nr   r   r   r   r   r   )r+   r   r;   r   r   rI   )r2   r-   funcidr@   tripletsrE   r.   s         r3   rI   z*MultiCallCreator.<locals>.MultiCall.unbind`  s    H~$X):|t#(=4+++!%!1!1(!;h##+ Iwqz299'4HI48D$$X.q1==x88r5   c                 "   || j                   vrd g g| j                   |<   | j                   |   \  }}|D ]X  }t        |      }|j                  | ||       $|"| j                  |d      j	                  ||       |j                  |       Z y Nr   )r   r   	event_addr   rC   rD   r2   virtual	sequencesr@   r   r   rE   r.   s          r3   r   z-MultiCallCreator.<locals>.MultiCall.event_addk  s     d...-12J  )!--g6ND(  -)#.?$$T7C8'wqz277FOOG,-r5   c                    || j                   vry | j                   |   \  }}|D ]X  }t        |      }|j                  | ||       $|"| j                  |d      j	                  ||       |j                  |       Z y r   )r   r   event_deleter   rI   rH   r   s          r3   r   z0MultiCallCreator.<locals>.MultiCall.event_delete|  s    d...!--g6ND(  -)#.?''gs;'wqz299'4HOOG,-r5   c                     ||| j                   vrj                  | |      S t        t        t        | j                   |   d               j                  | |      z   S r   )r   
event_infotuplemapr   )r2   r   r.   s     r3   r   z.MultiCallCreator.<locals>.MultiCall.event_info  sh    '1A1A"A((w77S!5!%!1!1'!:1!=? @((w78 8r5   c                    | j                   D ]A  }| j                   |   \  }}|s|D ]%  }	 | j                  |d      j                  ||       ' C y # t        j                  $ r }t
        |j                  d   vr Y d }~Yd }~ww xY w)Nr   r   )r   r   rI   rL   rM   rN   rO   )r2   r   r@   r   rE   rP   s         r3   rQ   z+MultiCallCreator.<locals>.MultiCall.__del__  s    ++ &!%!1!1'!:h#+ && NN71:6==gtL&&  '// &#3qvvay#@ % $A&s   "AB%B  B)NNNrG   )rR   rS   rT   
issubclassrL   Miscr4   rC   rI   r   r   r   rQ   )r.   s   r3   	MultiCallr   B  s7    &',,//	;	:$		9	-"	-	8		&r5   r   )_multicall_dict)r.   r   s   ` r3   MultiCallCreatorr   :  s9    
  v&&Y&V Y&v (OFr5   c                 8   t        j                  |       }|j                  d       t        t        | j                         j                  d      dd        \  }}|j                  d||dz   fz          t        t         j                        |      j                          j                          dgffd	} |d        |d	        |d
        |d        |d        |d        |d        |d        |d        |d        |d        |d       y )NzTest MultiCall+r   z+%d+%d   r   c                       fd}j                  d|d   z  |       j                  d|d   z          |dxx   dz  cc<   y )Nc                     t               y rG   )print)r<   r   s    r3   rB   z-_multi_call.<locals>.bindseq.<locals>.handler  s
    #Jr5   z<<handler%d>>r   r   )rC   r   )r   r`   rB   texts   `  r3   bindseqz_multi_call.<locals>.bindseq  sC    			/!A$&0qt+S1	!	r5   z<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>)rL   Topleveltitler   intgeometryr   r   Textpack	focus_set)parenttoprk   yr   r   s        @r3   _multi_callr     s    


6
"CIIsFOO%++C045DAqLLQCL())GLL)#.DIIKNNs  GOM!"I !LLIIr5   __main__)mainzidlelib.idle_test.test_mainmenuF)	verbosityexit)run)E__doc__resysrL   MC_KEYPRESSMC_KEYRELEASEMC_BUTTONPRESSMC_BUTTONRELEASEMC_ACTIVATEMC_CIRCULATEMC_COLORMAPMC_CONFIGUREMC_DEACTIVATE
MC_DESTROYMC_ENTER	MC_EXPOSE
MC_FOCUSINMC_FOCUSOUT
MC_GRAVITYMC_LEAVEMC_MAP	MC_MOTIONMC_MOUSEWHEELMC_PROPERTYMC_REPARENTMC_UNMAPMC_VISIBILITYMC_SHIFT
MC_CONTROLMC_ALTMC_META	MC_OPTION
MC_COMMANDplatform
_modifiers_modifier_masksr:   r;   r   rN   r'   rz   join	enumerater   rm   r|   r~   r[   rA   r?   rD   ro   r,   r   r   compiler   r   r   r   r   r   r   rR   unittestr   idlelib.idle_test.htestr   )numbernamer[   s   00pr3   <module>r     s  < 
 
  Q}q12BA|1{1lAxbIR*2
x2Fyb+b+2(R}dTFT7	t* <<8FJY
CODJ!68W=O (-S_'=9#%/%79! < 94 9 4 & &Z S_$
% !"   )$-j$9) ) "
$ "'* 	 A	A3z?# $Fa<##A$ [ [~
 "#a'=*:c&k!m*LL $)V#51!'1 V| 1t 1 RZZ!
RZZ
#
%#NF dN: z	*aeD+ O9@"\1s   ;G5'GG