o
    *j~;                     @   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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 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  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}| | | } dF|v r| tjv r|  } dG|  S )Hz3Translate from keycap symbol to the Tkinter keysym.r   Zspace~Z
asciitilde!Zexclam@Zat#Z
numbersign%percent^Zasciicircum&Z	ampersand*Zasterisk(Z	parenleft)Z
parenright_Z
underscore-Zminus+Zplus=Zequal{Z	braceleft}Z
braceright[Zbracketleft]Zbracketright|Zbar;Z	semicolon:Zcolon,Zcomma.Zperiod<Zless>Zgreater/Zslash?Zquestionr   ZPriorr   ZNextr   ZLeftr   ZRightr   ZUpr   ZDownr   ShiftzKey-)getstringascii_lowercaseupper)key	modifiersmapping r:   $lib/python3.10/idlelib/config_key.pytranslate_key   s   		


r<   c                       sz   e Zd ZdZ f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 Zdd Zdd Z  ZS )GetKeysFramezKey Sequence Errorc                    s   t  | d| d< d| d< || _|| _|| _d| _t| | _| jd | 	  g | _
| jD ]}t| }|d | j
| q/d| _|   dS )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
           borderwidthZsunkenrelief FN)super__init__parentactioncurrent_key_sequencesresultr   
key_stringsetset_modifiers_for_platformmodifier_varsr8   appendadvancedcreate_widgets)selfrD   rE   rF   modifiervariable	__class__r:   r;   rC   1   s"   


zGetKeysFrame.__init__c                 O   s   t j|i | d S N)r   	showerror)rO   argskwargsr:   r:   r;   rU   L   s   zGetKeysFrame.showerrorc              	   C   s  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 ])\}}| j||}t| j| j|||dd}|jd|dd
d || j|< |d7 }qRt| 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d#| jjd$}	| jj|	jd% |	jdddd!d" t| jd&| jd'| _| jjdddd( t | d)d| _| jjdddddd t| jdd*| j d+d, 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d0 t| | j!d1d2| _"| j"jddd3ddd4 | !  d S )5NZkeyseq_basic)namer   Znsew   )rowcolumnstickypadxpadyzNew keys for 'z' :textw)anchorleftZgroover>   )justifytextvariabler@   r?   x)ZipadxZipadyfill   )rZ   r[   r\   r]   rA   )commandr`   rQ   ZonvalueZoffvalue)rZ   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.))rd   r`      )rZ   r[   
columnspanr]   r\      
   Zsingle)widthheightZ
selectmodeendz<ButtonRelease-1>ns)rZ   r[   Zrowspanr\   Zvertical)Zorientri   )Zyscrollcommandz
Clear Keys)r`   ri   )rZ   r[   rk   Zkeyseq_advancedzEnter new binding(s) for 'z' :
z2(These bindings will not be checked for validity!))re   )rg   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>.)rZ   r[   r\   << Basic Key Binding Entry)ri   r`   Zew)rZ   r[   Zstickr]   r^   )#r   frame_keyseq_basicgridr
   rE   packrH   frame_controls_basicZmodifier_checkbuttonszipr8   rK   modifier_labelr3   r   build_key_stringr   list_keys_finalinsertAVAILABLE_KEYSbindfinal_key_selectedr   yviewconfigrI   r   clear_key_seqZbutton_clearframe_keyseq_advancedr	   advanced_keysframe_help_advancedtoggle_levelbutton_level)rO   Zbasic_titleZ
basic_keysr[   rP   rQ   ZlabelcheckZ
help_basicZscroll_keys_finalZadvanced_titleZhelp_advancedr:   r:   r;   rN   P   s   




zGetKeysFrame.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)r2   ControlZOptionZCommand)r   ZAltr2   r   ZCtrlN)sysplatformr8   rx   rO   r:   r:   r;   rJ      s   

z'GetKeysFrame.set_modifiers_for_platformc                 C   s   | j ddr(|   | j jdd | j  | j  | j	  d| _
dS |   | j jdd | j  | j  d| _
dS )	z'Toggle between basic and advanced keys.r`   ZAdvancedrr   r_   TzAdvanced Key Binding Entry >>FN)r   Zcget
startswithr   r   r   Zliftr   r   Z	focus_setrM   rs   rv   r   r:   r:   r;   r      s   






zGetKeysFrame.toggle_levelNc                 C   s   |    dS )z3Handler for clicking on key in basic settings list.N)ry   rO   Zeventr:   r:   r;   r~         zGetKeysFrame.final_key_selectedc                 C   sN   |    }}| jd}|rt||}|| | jdd| d dS )z2Create formatted string of modifiers plus the key.rb   r.   r"   r/   N)get_modifiersrz   r3   r<   rL   rH   rI   join)rO   keylistr8   	final_keyr:   r:   r;   ry      s   

zGetKeysFrame.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 r:   )r3   ).0rQ   r:   r:   r;   
<listcomp>       z.GetKeysFrame.get_modifiers.<locals>.<listcomp>c                 S   s   g | ]}|r|qS r:   r:   )r   modr:   r:   r;   r      r   )rK   )rO   Zmod_listr:   r:   r;   r      s   zGetKeysFrame.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   rp   Zmovetoz0.0rA   N)rz   Zselect_clearr   rK   rI   rH   )rO   rQ   r:   r:   r;   r      s
   
zGetKeysFrame.clear_key_seqc                 C   sR   d| _ | j  }|s| j| j| dd d S | js| |r'| |r'|| _ d S )NrA   zNo key specified.titlerD   message)	rG   rH   r3   striprU   keyerror_titlerM   keys_okbind_ok)rO   keysr:   r:   r;   ok   s   
zGetKeysFrame.okc                 C   s   | j d}|  }| j}dd | jD }|ds$| j|| dd dS |s6|tt vr6| j|| dd dS |d	gkrO|tt d
 vrOd}| j|| |d dS ||v r_d}| j|| |d 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.
        rb   c                 S   s   g | ]	}|D ]}|qqS r:   r:   )r   r   r7   r:   r:   r;   r      s
    
z(GetKeysFrame.keys_ok.<locals>.<listcomp>r/   zMissing the final Key)rD   r   zNo modifier key(s) specified.r   r2   )r   r   zBThe shift modifier by itself may not be used with this key symbol.z'This key combination is already in use.TF)	rz   r3   r   r   rF   endswithrU   FUNCTION_KEYS	MOVE_KEYS)rO   r   r   r8   r   Zkey_sequencesmsgr:   r:   r;   r      s6   


zGetKeysFrame.keys_okc              
   C   sd   z
|  |dd }W n ty) } z| j| j| d| d W Y d}~dS d}~ww | || dS )z:Return True if Tcl accepts the new keys else show message.c                   S   s   d S rT   r:   r:   r:   r:   r;   <lambda>  s    z&GetKeysFrame.bind_ok.<locals>.<lambda>z2The entered key sequence is not accepted.

Error: r   NFT)r}   r   rU   r   Zunbind)rO   r   Zbindingerrr:   r:   r;   r     s   zGetKeysFrame.bind_okrT   )__name__
__module____qualname__r   rC   rU   rN   rJ   r   r~   ry   r   r   r   r   r   __classcell__r:   r:   rR   r;   r=   ,   s    Y
	r=   c                       sR   e Zd Zddd fdd
Zedd Zejdd Zdd	d
ZdddZ  Z	S )GetKeysWindowF)_htest_utestc                   sf  t  | |   d| d< | jddd |   | | d |  d   }| |s:|	 d | 
 d  nd }| d| d|  | | t| || | _}	| d| j t| }
t|
d	d
| jd| _t|
dd
| jd| _| jjddddd | jjddddd |	jdddd |
jddd | | t|  |   |s|   |   dS 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
        rY   r?   F)ro   rn   r>      r#   ZWM_DELETE_WINDOWZOK   )r`   rn   ri   ZCancelr   )rZ   r[   r]   r^   rh   topTZboth)sideexpandrg   Zbottomrf   )r   rg   N)rB   rC   ZwithdrawZ	resizableZupdate_idletasksZwinfo_rootxZwinfo_widthZwinfo_reqwidthZwinfo_rootyZwinfo_heightZwinfo_reqheightZgeometryr   r=   frameZprotocolcancelr   r   r   Z	button_okZbutton_cancelrt   ru   Z	transientr   Zgrab_setZ	deiconifyZwait_window)rO   rD   r   rE   rF   r   r   rf   yr   Zframe_buttonsrR   r:   r;   rC     sF   

zGetKeysWindow.__init__c                 C   s   | j jS rT   r   rG   r   r:   r:   r;   rG   J  s   zGetKeysWindow.resultc                 C   s   || j _d S rT   r   )rO   valuer:   r:   r;   rG   N  r   Nc                 C   s   | j   |   |   d S rT   )r   r   grab_releasedestroyr   r:   r:   r;   r   R  s   
zGetKeysWindow.okc                 C   s   d| _ |   |   d S )NrA   )rG   r   r   r   r:   r:   r;   r   W  s   zGetKeysWindow.cancelrT   )
r   r   r   rC   propertyrG   setterr   r   r   r:   r:   rR   r;   r     s    .


r   __main__)mainz!idlelib.idle_test.test_config_keyr>   F)	verbosityexit)run)%__doc__Ztkinterr   r   r   r   Ztkinter.ttkr   r   r   r	   r
   r   r   Ztkinter.simpledialogr   r4   r   r   tupler5   digitsZALPHANUM_KEYSZPUNCTUATION_KEYSZWHITESPACE_KEYSZ	EDIT_KEYSr   r|   r<   r=   r   r   Zunittestr   Zidlelib.idle_test.htestr   ZGetKeysDialogr:   r:   r:   r;   <module>   s<     
 oC