
    e~;                     d   d Z ddlmZmZmZmZ ddlmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlZddlZdZ eej(                  ej*                  z         Z ed      Zd	Zd
ZdZeez   ez   ez   ez   ez   Zd Z G d de      Z G d de      Zedk(  r ddl m!Z!  e!ddd       ddl"m#Z#  e#e$       yy)z6
Dialog for building Tkinter accelerator key bindings
    )ToplevelListbox	StringVarTclError)FrameButtonCheckbuttonEntryLabel	Scrollbar)
messagebox)_setup_dialogN)F1F2F3F4F5F6F7F8F9F10F11F12z~!@#%^&*()_-+={}[]|;:,.<>/?)TabSpaceReturn)	BackSpaceDeleteInsert)HomeEndPage Up	Page Down
Left ArrowRight ArrowUp Arrow
Down Arrowc                 X   i ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdEi}|j                  | |       } dF|v r"| t        j                  v r| j                         } dG|  S )Hz3Translate from keycap symbol to the Tkinter keysym.r   space~
asciitilde!exclam@at#
numbersign%percent^asciicircum&	ampersand*asterisk(	parenleft)
parenright_
underscore-minus+plus=equal{	braceleft}
braceright[bracketleft]bracketright|bar;	semicolon:colon,comma.period<less>greater/slash?questionr#   Priorr$   Nextr%   Leftr&   Rightr'   Upr(   Downr   ShiftzKey-)getstringascii_lowercaseupper)key	modifiersmappings      $lib/python3.12/idlelib/config_key.pytranslate_keyrp      s   @ww @@!(@,/@69,@	@}@.1+@ 
@  @ .1@ 	@ "'	@ ,/v	@ 8;7	@
 @
 !@ @  #>@ 47u@ @ !@ +.g@ 8;8@ @ I@ (+7@ 58
@ g@  +6@ @ "/w@ t@ *6@ 49@G ++c3
C)v'='= =iik#<    c                   f     e Zd ZdZ fdZd Zd Zd Zd ZddZ	d Z
d	 Zd
 Zd Zd Zd Z xZS )GetKeysFramezKey Sequence Errorc                    t         |   |       d| d<   d| d<   || _        || _        || _        d| _        t        |       | _        | j                  j                  d       | j                          g | _
        | j                  D ]9  }t        |       }|j                  d       | j                  j                  |       ; d| _        | j                          y)a  
        parent - parent of this dialog
        action - the name of the virtual event these keys will be
                 mapped to
        current_key_sequences - a list of all key sequence lists
                 currently mapped to virtual events, for overlap checking
           borderwidthsunkenrelief FN)super__init__parentactioncurrent_key_sequencesresultr   
key_stringsetset_modifiers_for_platformmodifier_varsrm   appendadvancedcreate_widgets)selfr|   r}   r~   modifiervariable	__class__s         ro   r{   zGetKeysFrame.__init__1   s     	 ]!X%:"#D/B'') 	0H HLL%%h/	0 rq   c                 .    t        j                  |i | y N)r   	showerror)r   argskwargss      ro   r   zGetKeysFrame.showerrorL   s    d-f-rq   c           	      D   t        | d      | _        | j                  j                  ddddd       t        | j                  d| j                   d	      }|j                  d
       t        | j                  d| j                  dd      }|j                  ddd       t        |       | _        | j                  j                  dddd       i | _        d}t        | j                  | j                        D ]o  \  }}| j                  j                  ||      }t        | j                  | j                  |||d      }|j                  d|dd
       || j                  |<   |dz  }q t        | j                  dd      }|j                  ddddd
       t!        | j                  ddd      | _         | j"                  j$                  dgt&          | j"                  j)                  d | j*                         | j"                  j                  dddd!"       t-        | j                  d#| j"                  j.                  $      }	| j"                  j1                  |	j2                  %       |	j                  dddd!"       t5        | j                  d&| j6                  '      | _        | j8                  j                  ddd(       t        | d)      | _        | j:                  j                  ddddd       t        | j:                  dd*| j                   d+d,z         }
|
j                  d
       t=        | j:                  | j                  -      | _        | j>                  j                  d.       t        |       | _         | j@                  j                  dddd       t        | j@                  dd/      }|j                  ddd0       t5        | | jB                  d12      | _"        | jD                  j                  ddd3dd4       | jC                          y )5Nkeyseq_basic)namer   nsew   )rowcolumnstickypadxpadyzNew keys for 'z' :textw)anchorleftgrooveru   )justifytextvariablerx   rv   x)ipadxipadyfill   )r   r   r   r   ry   )commandr   r   onvalueoffvalue)r   r   r   r   zSelect the desired modifier keys
above, and the final key from the
list on the right.

Use upper case Symbols when using
the Shift modifier.  (Letters will be
converted automatically.))r   r      )r   r   
columnspanr   r      
   single)widthheight
selectmodeendz<ButtonRelease-1>ns)r   r   rowspanr   vertical)orientr   )yscrollcommandz
Clear Keys)r   r   )r   r   r   keyseq_advancedzEnter new binding(s) for 'z' :
z2(These bindings will not be checked for validity!))r   )r   a  Key bindings are specified using Tkinter keysyms as
in these samples: <Control-f>, <Shift-F2>, <F12>,
<Control-space>, <Meta-less>, <Control-Alt-Shift-X>.
Upper case is used when the Shift modifier is present!

'Emacs style' multi-keystroke bindings are specified as
follows: <Control-x><Control-y>, where the first key
is the 'do-nothing' keybinding.

Multiple separate bindings for one action should be
separated by a space, eg., <Alt-v> <Meta-v>.)r   r   r   << Basic Key Binding Entry)r   r   ew)r   r   stickr   r   )#r   frame_keyseq_basicgridr   r}   packr   frame_controls_basicmodifier_checkbuttonsziprm   r   modifier_labelrh   r	   build_key_stringr   list_keys_finalinsertAVAILABLE_KEYSbindfinal_key_selectedr   yviewconfigr   r   clear_key_seqbutton_clearframe_keyseq_advancedr
   advanced_keysframe_help_advancedtoggle_levelbutton_level)r   basic_title
basic_keysr   r   r   labelcheck
help_basicscroll_keys_finaladvanced_titlehelp_advanceds               ro   r   zGetKeysFrame.create_widgetsP   s   "'>"B$$1V+,1 	% 	6D33#1$++c!BD$422F(,'(*
 	aqs3 %*$K!!!&&1QvA&N &(""%dnnd6H6H"I 	Hh''++Hh?E 9 9(,(=(=E)18bRE JJ1V!CJ@38D&&x0aKF	 444f!<=
 	AaAAcJ  't'@'@.0X G###E;N;!!"5t7N7NO!!a1T!J%d&?&?-7.2.B.B.H.HJ 	##3D3H3H#I1Q$G"4#<#<(4+/+=+=? 	1Q1= &+46G%H"""''Aa./a 	( 	9t996&@U$S%Y%Z[ 	3'"4#=#=04AS) $);   %%!Af1%Md66@	B 	q6: #41B1B'CE1QdKrq   c                 b    t         j                  dk(  r
g d| _        n	g d| _        ddi| _        y)aV  Determine list of names of key modifiers for this platform.

        The names are used to build Tk bindings -- it doesn't matter if the
        keyboard has these keys; it matters if Tk understands them.  The
        order is also important: key binding equality depends on it, so
        config-keys.def must use the same ordering.
        darwin)rg   ControlOptionCommand)r   Altrg   r   CtrlN)sysplatformrm   r   r   s    ro   r   z'GetKeysFrame.set_modifiers_for_platform   s+     <<8#FDN8DN(&1rq   c                 *   | j                   j                  d      j                  d      r| j                          | j                   j	                  d       | j
                  j                          | j                  j                          | j                  j                          d| _
        y| j                          | j                   j	                  d       | j                  j                          | j                  j                          d| _
        y)	z'Toggle between basic and advanced keys.r   Advancedr   r   TzAdvanced Key Binding Entry >>FN)r   cget
startswithr   r   r   liftr   r   	focus_setr   r   r   r   s    ro   r   zGetKeysFrame.toggle_level   s    ""6*55jA $$*F$G&&++-$$))+((* DM $$*I$J##((*%%**,!DMrq   c                 $    | j                          y)z3Handler for clicking on key in basic settings list.N)r   r   events     ro   r   zGetKeysFrame.final_key_selected   s    rq   c                     | j                         x}}| j                  j                  d      }|rt        ||      }|j	                  |       | j
                  j                  ddj                  |       d       y)z2Create formatted string of modifiers plus the key.r   rY   rA   r[   N)get_modifiersr   rh   rp   r   r   r   join)r   keylistrm   	final_keys       ro   r   zGetKeysFrame.build_key_string   sk    "0022)((,,X6	%i;INN9%a 12!45rq   c                     | j                   D cg c]  }|j                          }}|D cg c]  }|s|	 c}S c c}w c c}w )z9Return ordered list of modifiers that have been selected.)r   rh   )r   r   mod_listmods       ro   r   zGetKeysFrame.get_modifiers   s=    373E3EFxHLLNFF'/3// G/s   ;A A c                     | j                   j                  dd       | j                   j                  dd       | j                  D ]  }|j	                  d        | j
                  j	                  d       y)z#Clear modifiers and keys selection.r   r   movetoz0.0ry   N)r   select_clearr   r   r   r   )r   r   s     ro   r   zGetKeysFrame.clear_key_seq   sa    ))!U3""8U3** 	HLL	Brq   c                    d| _         | j                  j                         j                         }|s| j	                  | j
                  | d       y | j                  s| j                  |      r| j                  |      r|| _         y )Nry   zNo key specified.titler|   message)	r   r   rh   stripr   keyerror_titler   keys_okbind_ok)r   keyss     ro   okzGetKeysFrame.ok   so    ""$**,NN!4!4T#6  8MMT\\$/T\\$5GDKrq   c                    | j                   j                  d      }| j                         }| j                  }| j                  D cg c]  }|D ]  }|  }}}|j                  d      s| j                  || d       y|s$|t        t        z   vr| j                  || d       y|dgk(  r)|t        t        z   dz   vrd	}| j                  || |       y||v rd
}| j                  || |       yyc c}}w )zValidity check on user's 'basic' keybinding selection.

        Doesn't check the string produced by the advanced dialog because
        'modifiers' isn't set.
        r   r[   zMissing the final Key)r|   r   zNo modifier key(s) specified.r   rg   )r   r   zBThe shift modifier by itself may not be used with this key symbol.z'This key combination is already in use.TF)	r   rh   r   r   r~   endswithr   FUNCTION_KEYS	MOVE_KEYS)	r   r   r   rm   r   r   rl   key_sequencesmsgs	            ro   r   zGetKeysFrame.keys_ok   s1    ((,,X6	&&(	##,0,F,F 1(/1!$  1 1 1}}S!NN5#:  <"  =9#<<NNt#B  D  G9$#i/2BBC&CNNtSNA  ]";CNNtSNA  '1s   C1c                     	 | j                  |d       }| j                  ||       y# t        $ r+}| j                  | j                  | d|        Y d}~yd}~ww xY w)z:Return True if Tcl accepts the new keys else show message.c                       y r    r
  rq   ro   <lambda>z&GetKeysFrame.bind_ok.<locals>.<lambda>  s    rq   Tz2The entered key sequence is not accepted.

Error: r   NF)r   unbindr   r   r   )r   r   bindingerrs       ro   r   zGetKeysFrame.bind_ok  sl    
	iil3G KKg&  	NN--d ''*e-  / 	s   ( 	A!AAr   )__name__
__module____qualname__r   r{   r   r   r   r   r   r   r   r   r  r   r   __classcell__r   s   @ro   rs   rs   ,   sH     *N6.Wr2"  60
 	>rq   rs   c                   j     e Zd Zddd fd
Zed        Zej                  d        ZddZddZ xZ	S )	GetKeysWindowF)_htest_utestc                "   t         |   |       | j                          d| d<   | j                  dd       | j	                          |j                         |j                         dz  | j                         dz  z
  z   }|j                         |s'|j                         dz  | j                         dz  z
  ndz   }| j                  d| d|        | j                  |       t        | ||      x| _        }	| j                  d| j                          t#        |       }
t%        |
d	d
| j&                        | _        t%        |
dd
| j                         | _        | j(                  j-                  dddd       | j*                  j-                  dddd       |	j/                  ddd       |
j/                  dd       | j1                  |       t3        |        | j5                          |s!| j7                          | j9                          yy)a  
        parent - parent of this dialog
        title - string which is the title of the popup dialog
        action - string, the name of the virtual event these keys will be
                 mapped to
        current_key_sequences - list, a list of all key sequence lists
                 currently mapped to virtual events, for overlap checking
        _htest - bool, change box location when running htest
        _utest - bool, do not wait when running unittest
        r   rv   F)r   r   ru      rC   WM_DELETE_WINDOWOK   )r   r   r   Cancelr   )r   r   r   r   r   topTboth)sideexpandr   bottomr   )r   r   N)rz   r{   withdraw	resizableupdate_idletaskswinfo_rootxwinfo_widthwinfo_reqwidthwinfo_rootywinfo_heightwinfo_reqheightgeometryr   rs   frameprotocolcancelr   r   r  	button_okbutton_cancelr   r   	transientr   grab_set	deiconifywait_window)r   r|   r   r}   r~   r  r  r   yr-  frame_buttonsr   s              ro   r{   zGetKeysWindow.__init__  s    	 ]e51!  "A%(;(;(=q(@@B! ""$a'$*>*>*@!*CC!$& 	!AaSk"

5)$8MNN
U($++6dD&':#M)*DKKA!!!<Aaaa@

d
8s3vdNN rq   c                 .    | j                   j                  S r   r-  r   r   s    ro   r   zGetKeysWindow.resultJ  s    zz   rq   c                 &    || j                   _        y r   r9  )r   values     ro   r   zGetKeysWindow.resultN  s    !

rq   c                 x    | j                   j                          | j                          | j                          y r   )r-  r  grab_releasedestroyr   s     ro   r  zGetKeysWindow.okR  s$    

rq   c                 R    d| _         | j                          | j                          y )Nry   )r   r=  r>  r   s     ro   r/  zGetKeysWindow.cancelW  s    rq   r   )
r  r  r  r{   propertyr   setterr  r/  r  r  s   @ro   r  r    sF     !,\ ! ! ]]" "
rq   r  __main__)mainz!idlelib.idle_test.test_config_keyru   F)	verbosityexit)run)%__doc__tkinterr   r   r   r   tkinter.ttkr   r   r	   r
   r   r   r   tkinter.simpledialogr   ri   r   r  tuplerj   digitsALPHANUM_KEYSPUNCTUATION_KEYSWHITESPACE_KEYS	EDIT_KEYSr  r   rp   rs   r  r  unittestrC  idlelib.idle_test.htestrF  GetKeysDialogr
  rq   ro   <module>rT     s    ; : K K  .  
8f,,v}}<=67 ,-	6	"22]B!"$-.09:(k5 k\@H @F z	,F+ rq   