a
    äIþfõQ  ã                   @   sœ   d Z ddlZddlT ddlmZ ddlmZmZ ddlm	Z	 dZ
dZed	fZd
ZdZdZdZdZdZdZG dd„ dƒZedkr˜ddlmZ edddd dS )zH
An auto-completion window for IDLE, used by the autocomplete extension
é    N)Ú*)Ú	Scrollbar)ÚFILESÚATTRS)ÚMC_SHIFTz<<autocompletewindow-hide>>z
<FocusOut>z<ButtonPress>z<<autocompletewindow-keypress>>)z<Key>z<Key-BackSpace>z<Key-Return>z	<Key-Tab>z<Key-Up>z
<Key-Down>z
<Key-Home>z	<Key-End>z<Key-Prior>z
<Key-Next>z<Key-Escape>z!<<autocompletewindow-keyrelease>>z<KeyRelease>z<B1-ButtonRelease>z<Configure>z<B1-Double-ButtonRelease>c                   @   sŒ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!S )"ÚAutoCompleteWindowc                 C   s‚   || _ d  | _ | _| _d  | _| _d | _d | _d | _d | _	d | _
d | _d | _d  | _ | _ | _ | _ | _| _d| _d| _d S )NF)ÚwidgetÚautocompletewindowÚlistboxÚ	scrollbarÚorigselforegroundÚorigselbackgroundÚcompletionsÚmorecompletionsÚmodeÚstartÚ
startindexÚlasttypedstartÚuserwantswindowZhideidÚ
keypressidÚlistupdateidÚwinconfigidÚkeyreleaseidÚdoubleclickidÚlastkey_was_tabÚis_configuring)Úselfr   © r   ú'lib/python3.9/idlelib/autocomplete_w.pyÚ__init__   s"    ÿÿzAutoCompleteWindow.__init__c                 C   s¨   t t| jƒt|ƒƒ}d}||k r<| j| || kr<|d7 }q|t| jƒk rr| j d| j|f d| jt| jƒf ¡ |t|ƒk rž| j d| j|f ||d … ¡ || _d S )Nr   é   ú%s+%dc)ÚminÚlenr   r   Údeleter   Úinsert)r   ÚnewstartÚmin_lenÚir   r   r   Ú_change_start>   s    
ÿ
ÿz AutoCompleteWindow._change_startc                 C   sT   d}t | jƒ}||kr@|| d }| j| |kr6|}q|d }qt|t | jƒd ƒS )zFind the first index in self.completions where completions[i] is
        greater or equal to s, or the last index if there is no such.
        r   é   r    )r#   r   r"   )r   Úsr(   ÚjÚmr   r   r   Ú_binary_searchK   s    
z!AutoCompleteWindow._binary_searchc           
      C   sî   |   |¡}| j| dt|ƒ… |kr(|S |d }t| jƒ}||krx|| d }| j| dt|ƒ… |krn|}q:|d }q:|d }||kr’| j| S | j| }| j| }tt|ƒt|ƒƒ}	t|ƒ}||	k râ|| || krâ|d7 }qÀ|d|… S )zßAssuming that s is the prefix of a string in self.completions,
        return the longest string which is a prefix of all the strings which
        s is a prefix of them. If s is not a prefix of a string, return s.
        Nr    r*   )r.   r   r#   r"   )
r   r+   Úfirstr(   r,   r-   ZlastZ
first_compZ	last_compr'   r   r   r   Ú_complete_stringX   s(    






z#AutoCompleteWindow._complete_stringc                 C   sD  t | j ¡ d ƒ}| j |¡ | j}| j| }|  |¡|krB|}nDtt|ƒt|ƒƒ}d}||k rz|| || krz|d7 }qX|d|… }|  	|¡ | j| dt| j
ƒ… | j
krÄ| jj| j| jd n|| jj| j d¡| j d¡d | jr@| j| _d| _| j dt¡ | jD ]}| j t|¡ q| j |  | j
¡¡ |  ¡  dS )zzCall when the selection of the Listbox has changed.

        Updates the Listbox display and calls _change_start.
        r   r    N)ÚselectbackgroundÚselectforegroundZbgZfg)Úintr
   ÚcurselectionÚseer   r   r.   r"   r#   r)   r   Z	configurer   r   Úcgetr   r$   ÚENDr%   Ú
select_setÚ_selection_changed)r   ÚcurselZltsZselstartr&   r'   r(   Úitemr   r   r   r9   x   s6    



ÿ
ÿ
z%AutoCompleteWindow._selection_changedc                 C   s„  |\| _ | _|| _| j |¡| _| j | jd¡| _|r¢|  | j¡}| j}|  	|¡ |  
|¡}| j | |kr¢|t| j ƒd ksš| j |d  dt|ƒ… |kr¢||kS || _| j| _t| jƒ | _}	|	 d¡ |	 d¡ z|	j dd|	jdd¡ W n ty   Y n0 t|	td	 | _}
t|	|
jd
d | _}| j D ]}| t|¡ q2| d¡| _| d¡| _ |
j!|j"d |
j#t$t%d |j#t&t'dd |	 (¡  |	 )¡  | j *|  
| j¡¡ |  +¡  |	 ,t-| j.¡| _/| j ,t-| j.¡| _0|	 1t-t2¡ t3D ]}| j 1t-|¡ qè| j ,t4| j5¡| _6t7D ]}| j 1t4|¡ q| j ,t8| j9¡| _:| j 1t8t;¡ | ,t<| j=¡| _>d
| _?|	 ,t@| jA¡| _B| ,tC| jD¡| _EdS )z®Show the autocomplete list, bind events.

        If complete is True, complete the text, and if there is exactly
        one matching completion, don't open a list.
        r%   r    Nz+10000+10000z!::tk::unsupported::MacWindowStyleZstyleÚhelpZnoActivates)ZorientF)ZyscrollcommandZexportselectionr2   r1   )Zcommand)ÚsideÚfillT)r=   r>   Úexpand)Fr   r   r   r   Úindexr   Úgetr   r0   r)   r.   r#   r   r   ZToplevelr	   Úwm_geometryZwm_overrideredirectZtkZcallZ_wÚTclErrorr   ZVERTICALr   ZListboxÚsetr
   r%   r7   r6   r   r   ZconfigZyviewZpackZRIGHTÚYZLEFTZBOTHÚupdate_idletasksZliftr8   r9   ZbindÚHIDE_VIRTUAL_EVENT_NAMEÚ
hide_eventÚhideaidÚhidewidZ	event_addÚHIDE_FOCUS_OUT_SEQUENCEÚHIDE_SEQUENCESÚKEYPRESS_VIRTUAL_EVENT_NAMEÚkeypress_eventr   ÚKEYPRESS_SEQUENCESÚKEYRELEASE_VIRTUAL_EVENT_NAMEÚkeyrelease_eventr   ÚKEYRELEASE_SEQUENCEÚLISTUPDATE_SEQUENCEÚlistselect_eventr   r   ÚWINCONFIG_SEQUENCEÚwinconfig_eventr   ÚDOUBLECLICK_SEQUENCEÚdoubleclick_eventr   )r   Z
comp_listsr@   Úcompleter   ZuserWantsWinZ	completedr   r(   Úacwr   r
   r;   Úseqr   r   r   Úshow_windowž   s€    

ÿþ

ÿÿ
ÿÿÿÿzAutoCompleteWindow.show_windowc                 C   sP  | j r
d S d| _ |  ¡ sd S zÖ| j}| | j¡ | | j¡\}}}}| j}t ¡  	d¡r`| 
¡  | ¡ | ¡  }}	| ¡ | ¡  }
}| ¡ t|td|
| ƒƒ }| ¡ | }|||  |	ksÄ||	k rÎ||7 }n||	8 }| d||f ¡ | ¡  W n ty   Y n0 t ¡  	d¡rFz| t| j¡ W n ty>   Y n0 d | _d| _ d S )NTZWindowsr   z+%d+%dF)r   Ú	is_activer   r5   r   Zbboxr	   ÚplatformÚsystemÚ
startswithÚupdateZwinfo_widthÚwinfo_heightZwinfo_rootxr"   ÚmaxZwinfo_rootyrB   rF   rC   ÚunbindrU   r   )r   ÚeventÚtextÚxÚyZcxZcyrZ   Z	acw_widthZ
acw_heightZ
text_widthZtext_heightZnew_xZnew_yr   r   r   rV   ë   s@    ÿ
z"AutoCompleteWindow.winconfig_eventc                 C   s@   | j s
d S z| j  ¡ s|  ¡  W n ty:   |  ¡  Y n0 d S ©N)r	   Z	focus_getÚhide_windowÚKeyError©r   r   r   r   Ú_hide_event_check  s    
z$AutoCompleteWindow._hide_event_checkc                 C   s>   |   ¡ r:|jtjkr&| j d| j¡ n|jtjkr:|  ¡  d S )Nr    )	r]   ÚtypeZ	EventTypeZFocusOutr   Zafterrm   ZButtonPressrj   ©r   re   r   r   r   rH   +  s
    zAutoCompleteWindow.hide_eventc                 C   s4   |   ¡ r0d| _t| j ¡ d ƒ}|  | j| ¡ d S )NTr   )r]   r   r3   r
   r4   r)   r   ©r   re   r:   r   r   r   rT   8  s    z#AutoCompleteWindow.listselect_eventc                 C   s.   t | j ¡ d ƒ}|  | j| ¡ |  ¡  d S )Nr   )r3   r
   r4   r)   r   rj   rp   r   r   r   rX   >  s    z$AutoCompleteWindow.doubleclick_eventc                    s   |   ¡ sd S |j‰ t|dƒr$|j}nd}ˆ dkr6d| _tˆ ƒdks`ˆ dv s`| jtkrJˆ dv rJ|t @ sJtˆ ƒdkrŠ|  	| j
ˆ  ¡ n|ˆ dkr¤|  	| j
d	 ¡ nbˆ d
kr¾|  	| j
d ¡ nHˆ dkrØ|  	| j
d ¡ n.t| j
ƒdkrò|  ¡  d S |  	| j
d d… ¡ | j
| _| j dt| j ¡ d ƒ¡ | j |  | j
¡¡ |  ¡  dS ˆ dkrh|  ¡  |  ¡  dS | jtkr~ˆ dv s | jtkrˆ dv r|t @ st| j ¡ d ƒ}| j| d t| j
ƒ… | j
krö| jtksæ| j
rö|  	| j| ¡ |  ¡  d S ˆ dv r2|s2d| _t| j ¡ d ƒ}ˆ dkr:d}nÄˆ dkrTt| jƒd }nªˆ dv r¾| j | j ¡ ¡| j d¡ }ˆ dkr–td|| ƒ}n&ˆ dks¤J ‚tt| jƒd || ƒ}n@ˆ dkrØtd|d ƒ}n&ˆ dksæJ ‚tt| jƒd |d ƒ}| j |¡ | j |¡ |  ¡  |  	| j| ¡ dS ˆ dkrŠ|sŠ| jrxt| j ¡ d ƒ}|  	| j| ¡ |  ¡  dS d| _d| _d S n’t‡ fdd„dD ƒƒr¦d S |jr|jdkr|  	| j
|j ¡ | j
| _| j dt| j ¡ d ƒ¡ | j |  | j
¡¡ |  ¡  dS |  ¡  d S d S ) NÚmc_stater   ZTabFr    )Ú
underscoreZ	BackSpace)ÚperiodÚminusrr   Ú_rs   Ú.rt   ú-éÿÿÿÿÚbreakZReturn)rs   ZspaceZ	parenleftZ
parenrightZbracketleftZbracketright)ZslashZ	backslashZquotedblZ
apostrophe)ÚHomeÚEndÚPriorÚNextÚUpÚDownTrz   r{   )r|   r}   r|   r}   r~   r   c                 3   s   | ]}|ˆ v V  qd S ri   r   )Ú.0r+   ©Úkeysymr   r   Ú	<genexpr>¥  ó    z4AutoCompleteWindow.keypress_event.<locals>.<genexpr>)ZShiftZControlZAltZMetaZCommandZOptionú )r]   r‚   Úhasattrrq   r   r#   r   r   r   r)   r   rj   r   r
   Zselect_clearr3   r4   r8   r.   r9   rY   r   r   r   Znearestrb   rc   r"   ÚanyÚchar)r   re   Ústater:   ZnewselZjumpr   r   r   rN   D  sÐ    
ÿÿÿý
ÿýÿýû	 ÿÿ
ÿ



ÿ

z!AutoCompleteWindow.keypress_eventc                 C   s@   |   ¡ sd S | j d¡| j d| jt| jƒf ¡kr<|  ¡  d S )Nr%   r!   )r]   r   r@   r   r#   r   rj   ro   r   r   r   rQ   ¸  s    
ÿz#AutoCompleteWindow.keyrelease_eventc                 C   s
   | j d uS ri   )r	   rl   r   r   r   r]   À  s    zAutoCompleteWindow.is_activec                 C   s   |   |  | j¡¡ d S ri   )r)   r0   r   rl   r   r   r   rY   Ã  s    zAutoCompleteWindow.completec                 C   s   |   ¡ sd S | j tt¡ tD ]}| j t|¡ q| j t| j¡ | j t| j	¡ d | _d | _	t
D ]}| j t|¡ qb| j t| j¡ d | _| j tt¡ | j t| j¡ d | _| j t| j¡ d | _| jrâ| j t| j¡ d | _| j ¡  | j ¡  d | _| j ¡  d | _| j ¡  d | _d S ri   )r]   r	   Zevent_deleterG   rK   rL   r   rd   rI   rJ   rO   rM   r   rP   rR   r   r
   rS   r   r   rU   Z	focus_setr   Zdestroy)r   r[   r   r   r   rj   Ç  s@    ÿÿ



zAutoCompleteWindow.hide_windowN)Ú__name__Ú
__module__Ú__qualname__r   r)   r.   r0   r9   r\   rV   rm   rH   rT   rX   rN   rQ   r]   rY   rj   r   r   r   r   r      s    ! &M4tr   Ú__main__)Úmainz%idlelib.idle_test.test_autocomplete_wr*   F)Ú	verbosityÚexit)Ú__doc__r^   ZtkinterZtkinter.ttkr   Zidlelib.autocompleter   r   Zidlelib.multicallr   rG   rK   rL   rM   rO   rP   rR   rS   rU   rW   r   rŠ   ZunittestrŽ   r   r   r   r   Ú<module>   s,      W