a
    If8                     @   s   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edZd	Zd
ZdZee e e e e Zdd ZG dd deZedkrddlm Z  e dddd ddl!m"Z" e"e dS )z6
Dialog for building Tkinter accelerator key bindings
    )ToplevelListbox	StringVarTclError)FrameButtonCheckbuttonEntryLabel	Scrollbar)
messagebox)_setup_dialogN)ZF1ZF2ZF3ZF4ZF5ZF6ZF7ZF8ZF9ZF10ZF11ZF12z~!@#%^&*()_-+={}[]|;:,.<>/?)TabSpaceZReturn)Z	BackSpaceZDeleteZInsert)ZHomeZEndPage Up	Page Down
Left ArrowRight ArrowUp Arrow
Down Arrowc              $   C   s|   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"d#d$#}| | | } d%|v rr| tjv rr|  } d&|  S )'z3Translate from keycap symbol to the Tkinter keysym.ZspaceZ
asciitildeZexclamZatZ
numbersignZpercentZasciicircumZ	ampersandZasteriskZ	parenleftZ
parenrightZ
underscoreZminusZplusZequalZ	braceleftZ
bracerightZbracketleftZbracketrightZbarZ	semicolonZcolonZcommaZperiodZlessZgreaterZslashZquestionZPriorZNextZLeftZRightZUpZDownr   )#r   ~!@#%^&*()_-+={}[]|;:,.<>/?r   r   r   r   r   r   r   ShiftzKey-)getstringascii_lowercaseupper)key	modifiersmapping r9   #lib/python3.9/idlelib/config_key.pytranslate_key   s"    r;   c                   @   s   e Zd ZdZdddddZdd Zdd	 Zd
d Zdd ZdddZ	dd Z
dd Zdd Zd ddZd!ddZdd Zdd ZdS )"GetKeysDialogzKey Sequence ErrorF)_htest_utestc          	      C   sJ  t | | |   | jdd | jddd | | | | t|  |   | 	d| j
 || _|| _|| _d| _t| | _| jd |   g | _| jD ]"}t| }|d | j| qd| _|   |   | d| | d |  d   | |s$| d |  d  nd	 f  |sF|    | !  d
S )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
           )borderwidthF)heightwidthZWM_DELETE_WINDOW z+%d+%d      N)"r   __init__ZwithdrawZ	configureZ	resizabletitleZ	transientr   Zgrab_setZprotocolcancelparentactioncurrent_key_sequencesresultr   
key_stringsetset_modifiers_for_platformmodifier_varsr7   appendadvancedcreate_widgetsZupdate_idletasksZgeometryZwinfo_rootxZwinfo_widthZwinfo_reqwidthZwinfo_rootyZwinfo_heightZwinfo_reqheightZ	deiconifyZwait_window)	selfrI   rG   rJ   rK   r=   r>   modifiervariabler9   r9   r:   rF   1   sN    




zGetKeysDialog.__init__c                 O   s   t j|i | d S N)r   	showerror)rT   argskwargsr9   r9   r:   rX   b   s    zGetKeysDialog.showerrorc              	   C   s0  t | ddd | _}|jdddd t | }|jdd	d
 t|dd| jd| _| jjddddd t|dd| jd| _| jjddddd t |dd| _	| j	jdddddd t
| j	d| j dd}|jdd t
| j	d| jddd}|jddd	d t || _| jjddddd  i | _d}t| j| jD ]T\}}| j||}t| j| j|||d!d"}	|	jd|ddd# |	| j|< |d7 }q.t
| jdd$d%}
|
jddd&ddd' t| jd(d)d*d+| _| jjd,gtR   | jd-| j | jjdd&d&d.d/ t| jd0| jjd1}| jj|jd2 |jddd&d.d/ t| jd3| j d4| _!| j!jddd&d5 t |d6d| _"| j"jdddddd t
| j"dd7| j d8d9 d%}|jdd t#| j"| jd:| _$| j$jd	d; t || _%| j%jddddd  t
| j%dd<d%}|jdddd= t|| j&d>d?| _'| j'jddd@dddA | &  d S )BNrD   Zsunken)r@   relieftopTZboth)sideexpandfillZbottomx)r]   r_   ZOK   )textrB   commandr   r?   )rowcolumnpadxpadyZCancel   Zkeyseq_basic)nameZnsew)rd   re   stickyrf   rg   zNew keys for 'z' :rb   w)anchorleftZgroove)justifytextvariabler[   r@   )ZipadxZipadyr_   )rd   re   rj   rf   rC   )rc   rb   rV   ZonvalueZoffvalue)rd   re   rf   rj   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.))ro   rb      )rd   re   
columnspanrf   rj      
   Zsingle)rB   rA   Z
selectmodeendz<ButtonRelease-1>ns)rd   re   Zrowspanrj   Zvertical)Zorientrc   )Zyscrollcommandz
Clear Keys)rb   rc   )rd   re   rr   Zkeyseq_advancedzEnter new binding(s) for 'z' :
z2(These bindings will not be checked for validity!))rp   )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>.)rd   re   rj   << Basic Key Binding Entry)rc   rb   Zew)rd   re   Zstickrf   rg   )(r   frameZpackr   okZ	button_okZgridrH   Zbutton_cancelframe_keyseq_basicr
   rJ   rM   frame_controls_basicZmodifier_checkbuttonszipr7   rP   modifier_labelr2   r   build_key_stringr   list_keys_finalinsertAVAILABLE_KEYSbindfinal_key_selectedr   yviewconfigrN   clear_key_seqZbutton_clearframe_keyseq_advancedr	   advanced_keysframe_help_advancedtoggle_levelbutton_level)rT   rx   Zframe_buttonsZbasic_titleZ
basic_keysre   rU   rV   ZlabelZcheckZ
help_basicZscroll_keys_finalZadvanced_titleZhelp_advancedr9   r9   r:   rS   f   s    



zGetKeysDialog.create_widgetsc                 C   s.   t jdkrg d| _n
g d| _ddi| _dS )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)r1   ControlZOptionZCommand)r   ZAltr1   r   ZCtrlN)sysplatformr7   r}   rT   r9   r9   r:   rO      s    

z(GetKeysDialog.set_modifiers_for_platformc                 C   s   | j ddrN|   | j jdd | j  | j  | j	  d| _
n0|   | j jdd | j  | j  d| _
dS )	z'Toggle between basic and advanced keys.rb   ZAdvancedrw   rk   TzAdvanced Key Binding Entry >>FN)r   Zcget
startswithr   r   r   Zliftr   r   Z	focus_setrR   rz   r{   r   r9   r9   r:   r      s    




zGetKeysDialog.toggle_levelNc                 C   s   |    dS )z3Handler for clicking on key in basic settings list.N)r~   rT   eventr9   r9   r:   r      s    z GetKeysDialog.final_key_selectedc                 C   sN   |    }}| jd}|r0t||}|| | jdd| d dS )z2Create formatted string of modifiers plus the key.rm   r-   r!   r.   N)get_modifiersr   r2   r;   rQ   rM   rN   join)rT   keylistr7   	final_keyr9   r9   r:   r~      s    

zGetKeysDialog.build_key_stringc                 C   s   dd | j D }dd |D S )z9Return ordered list of modifiers that have been selected.c                 S   s   g | ]}|  qS r9   )r2   ).0rV   r9   r9   r:   
<listcomp>       z/GetKeysDialog.get_modifiers.<locals>.<listcomp>c                 S   s   g | ]}|r|qS r9   r9   )r   modr9   r9   r:   r      r   )rP   )rT   Zmod_listr9   r9   r:   r      s    zGetKeysDialog.get_modifiersc                 C   sB   | j dd | j dd | jD ]}|d q"| jd dS )z#Clear modifiers and keys selection.r   ru   Zmovetoz0.0rC   N)r   Zselect_clearr   rP   rN   rM   )rT   rV   r9   r9   r:   r      s
    
zGetKeysDialog.clear_key_seqc                 C   s\   | j   }|s(| j| j| dd d S | js8| |rH| |rH|| _| 	  | 
  d S )NzNo key specified.rG   rI   message)rM   r2   striprX   keyerror_titlerR   keys_okbind_okrL   grab_releasedestroy)rT   r   keysr9   r9   r:   ry     s    
zGetKeysDialog.okc                 C   s   d| _ |   |   d S )NrC   )rL   r   r   r   r9   r9   r:   rH     s    zGetKeysDialog.cancelc                 C   s   | j d}|  }| j}dd | jD }|dsF| j|| dd nt|sh|tt vrh| j|| dd nR|d	gkr|tt d
 vrd}| j|| |d n"||v rd}| j|| |d ndS dS )zValidity check on user's 'basic' keybinding selection.

        Doesn't check the string produced by the advanced dialog because
        'modifiers' isn't set.
        rm   c                 S   s   g | ]}|D ]}|qqS r9   r9   )r   r   r6   r9   r9   r:   r     s   z)GetKeysDialog.keys_ok.<locals>.<listcomp>r.   zMissing the final Key)rI   r   zNo modifier key(s) specified.r   r1   )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   r2   r   r   rK   endswithrX   FUNCTION_KEYS	MOVE_KEYS)rT   r   r   r7   rG   Zkey_sequencesmsgr9   r9   r:   r     s4    



zGetKeysDialog.keys_okc              
   C   sh   z|  |dd }W n> tyR } z&| j| j| d| d W Y d}~dS d}~0 0 | || dS dS )z:Return True if Tcl accepts the new keys else show message.c                   S   s   d S rW   r9   r9   r9   r9   r:   <lambda>6  r   z'GetKeysDialog.bind_ok.<locals>.<lambda>z2The entered key sequence is not accepted.

Error: r   NFT)r   r   rX   r   Zunbind)rT   r   Zbindingerrr9   r9   r:   r   3  s    zGetKeysDialog.bind_ok)N)N)N)__name__
__module____qualname__r   rF   rX   rS   rO   r   r   r~   r   r   ry   rH   r   r   r9   r9   r9   r:   r<   ,   s   1f
	

r<   __main__)mainz!idlelib.idle_test.test_config_keyrD   F)	verbosityexit)run)#__doc__Ztkinterr   r   r   r   Ztkinter.ttkr   r   r   r	   r
   r   r   Ztkinter.simpledialogr   r3   r   r   tupler4   ZdigitsZALPHANUM_KEYSZPUNCTUATION_KEYSZWHITESPACE_KEYSZ	EDIT_KEYSr   r   r;   r<   r   Zunittestr   Zidlelib.idle_test.htestr   r9   r9   r9   r:   <module>   s8    
  