o
     JAfiR  ã                   @   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rNddlmZ edddd dS 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ÚtagsÚ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	   © r   ú-/usr/lib/python3.10/idlelib/autocomplete_w.pyÚ__init__   s$   ÿÿ
zAutoCompleteWindow.__init__c                 C   sÄ   t t| jƒt|ƒƒ}d}||k r*| j| || kr*|d7 }||k r*| j| || ks|t| jƒk rE| j d| j|f d| jt| jƒf ¡ |t|ƒk r]| j d| j|f ||d … | j¡ || _d S )Nr   é   ú%s+%dc)ÚminÚlenr   r   Údeleter   Úinsertr	   )r   ÚnewstartÚmin_lenÚir   r   r   Ú_change_start@   s   ÿÿ
þ
z AutoCompleteWindow._change_startc                 C   sZ   d}t | jƒ}||kr#|| d }| j| |kr|}n|d }||ks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_searchN   s   ûz!AutoCompleteWindow._binary_searchc           
      C   s
  |   |¡}| j| dt|ƒ… |kr|S |d }t| jƒ}||kr?|| d }| j| dt|ƒ… |kr7|}n|d }||ks!|d }||krL| j| S | j| }| j| }tt|ƒt|ƒƒ}	t|ƒ}||	k r|| || kr|d7 }||	k r|| || kso|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_string[   s,   

û


ÿz#AutoCompleteWindow._complete_stringc                 C   s\  t | j ¡ d ƒ}| j |¡ | j}| j| }|  |¡|kr!|}n-tt|ƒt|ƒƒ}d}||k rH|| || krH|d7 }||k rH|| || ks8|d|… }|  	|¡ | j| dt| j
ƒ… | j
krn| jj| j| jd dS | jj| j d¡| j d¡d | jr¬| j| _d| _| j dt¡ | jD ]	}| j t|¡ q’| j |  | j
¡¡ |  ¡  dS dS )zzCall when the selection of the Listbox has changed.

        Updates the Listbox display and calls _change_start.
        r   r!   N)ÚselectbackgroundÚselectforegroundÚ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   r;   {   s:   
ÿ


ÿ
ÿ
ùz%AutoCompleteWindow._selection_changedc                 C   sv  |\| _ | _|| _| j |¡| _| j | jd¡| _|rQ|  | j¡}| j}|  	|¡ |  
|¡}| j | |krQ|t| j ƒd ksM| j |d  dt|ƒ… |krQ||kS || _| j| _t| jƒ | _}	|	 d¡ |	 d¡ z|	j dd|	jdd¡ W n	 ty€   Y nw t|	td	 | _}
t|	|
jd
d | _}| j D ]}| t|¡ q˜| d¡| _| d¡| _ |
j!|j"d |
j#t$t%d |j#t&t'dd |	 (¡  | j )|  
| j¡¡ |  *¡  |	 +t,| j-¡| _.| j +t,| j-¡| _/|	 0t,t1¡ t2D ]	}| j 0t,|¡ qî| j +t3| j4¡| _5t6D ]
}| j 0t3|¡ q| j +t7| j8¡| _9| j 0t7t:¡ | +t;| j<¡| _=d
| _>|	 +t?| j@¡| _A| +tB| jC¡| _Dd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::MacWindowStyleÚstyleÚhelpZnoActivates)ZorientF)ZyscrollcommandZexportselectionr3   r2   )Zcommand)ÚsideÚfillT)r@   rA   Úexpand)Er   r   r   r   Úindexr   Úgetr   r1   r*   r/   r$   r   r   ZToplevelr
   Úwm_geometryZwm_overrideredirectZtkÚcallZ_wÚTclErrorr   ZVERTICALr   ZListboxÚsetr   r&   r9   r8   r   r   ZconfigZyviewÚpackZRIGHTÚYZLEFTZBOTHZliftr:   r;   Ú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_listsrC   Úcompleter   ZuserWantsWinZ	completedr   r)   Úacwr   r   r=   Úseqr   r   r   Úshow_window¡   s|   



ÿÿÿ
ÿÿÿÿzAutoCompleteWindow.show_windowc                 C   sJ  | j rd S d| _ |  ¡ sd S zk| j}| | j¡ | | j¡\}}}}| j}t ¡  	d¡r0| 
¡  | ¡ | ¡ }}	| ¡ | ¡ }
}| ¡ t|td|
| ƒƒ }| ¡ | }|||  |	ksb||	k rg||7 }n||	8 }| d||f ¡ | ¡  W n	 ty‚   Y nw t ¡  	d¡r z	| t| j¡ W n	 tyœ   Y nw d | _d| _ d S )NTZWindowsr   z+%d+%dF)r   Ú	is_activer   r7   r   Zbboxr
   ÚplatformÚsystemÚ
startswithÚupdateZwinfo_widthÚwinfo_heightZwinfo_rootxr#   ÚmaxZwinfo_rootyrE   Zupdate_idletasksrG   ÚunbindrZ   r   )r   ÚeventÚtextÚxÚyZcxÚcyr_   Z	acw_widthZ
acw_heightÚ
text_widthZtext_heightZnew_xZnew_yr   r   r   r[   î   sB   
ÿÿ
z"AutoCompleteWindow.winconfig_eventc                 C   sF   | j sd S z| j  ¡ s|  ¡  W d S W d S  ty"   |  ¡  Y d S w ©N)r
   Z	focus_getÚhide_windowÚKeyError©r   r   r   r   Ú_hide_event_check"  s   
ÿýz$AutoCompleteWindow._hide_event_checkc                 C   sH   |   ¡ r |jtjkr| j d| j¡ d S |jtjkr"|  ¡  d S d S d S )Nr!   )	rb   ÚtypeZ	EventTypeZFocusOutr   Zafterrt   ZButtonPressrq   ©r   rj   r   r   r   rM   .  s   øzAutoCompleteWindow.hide_eventc                 C   s8   |   ¡ rd| _t| j ¡ d ƒ}|  | j| ¡ d S d S )NTr   )rb   r   r5   r   r6   r*   r   ©r   rj   r<   r   r   r   rY   ;  s
   ýz#AutoCompleteWindow.listselect_eventc                 C   s.   t | j ¡ d ƒ}|  | j| ¡ |  ¡  d S )Nr   )r5   r   r6   r*   r   rq   rw   r   r   r   r]   A  s   z$AutoCompleteWindow.doubleclick_eventc                    sæ  |   ¡ sd S |j‰ t|dƒr|j}nd}ˆ dkrd| _tˆ ƒdks.ˆ dv s.| jtkr¢ˆ dv r¢|t @ s¢tˆ ƒdkrB|  	| j
ˆ  ¡ n>ˆ dkrO|  	| j
d	 ¡ n1ˆ d
kr\|  	| j
d ¡ n$ˆ dkri|  	| j
d ¡ nt| j
ƒdkrv|  ¡  d S |  	| j
d d… ¡ | j
| _| j dt| j ¡ d ƒ¡ | j |  | j
¡¡ |  ¡  dS ˆ dkr°|  ¡  |  ¡  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 r|sd| _t| j ¡ d ƒ}ˆ dkrd}nTˆ dkrt| jƒd }nGˆ dv rL| j | j ¡ ¡| j d¡ }ˆ dkr?td|| ƒ}n&tt| jƒd || ƒ}nˆ dkrYtd|d ƒ}ntt| jƒd |d ƒ}| j |¡ | j |¡ |  ¡  |  	| j| ¡ dS ˆ dkrª|sª| jr¢t| j ¡ d ƒ}|  	| j| ¡ |  ¡  dS d| _d| _d S 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 )NÚmc_stater   ZTabFr!   )Ú
underscoreZ	BackSpace)ÚperiodÚminusry   Ú_rz   Ú.r{   ú-éÿÿÿÿÚbreakZReturn)rz   ÚspaceZ	parenleftZ
parenrightZbracketleftZbracketright)ZslashZ	backslashZquotedblZ
apostrophe)ÚHomeÚEndÚPriorÚNextÚUpZDownTr‚   rƒ   )r„   r…   r„   r†   c                 3   s    | ]}|ˆ v V  qd S rp   r   )Ú.0r,   ©Úkeysymr   r   Ú	<genexpr>¨  s   € z4AutoCompleteWindow.keypress_event.<locals>.<genexpr>)ZShiftZControlZAltZMetaZCommandZOptionú )rb   r‰   Úhasattrrx   r   r$   r   r   r   r*   r   rq   r   r   Zselect_clearr5   r6   r:   r/   r;   r^   r   r   r   Znearestrg   rh   r#   ÚanyÚchar)r   rj   Ústater<   ZnewselZjumpr   rˆ   r   rS   G  sº   
ÿþÿÿþ
ÿ



ÿ

z!AutoCompleteWindow.keypress_eventc                 C   sD   |   ¡ sd S | j d¡| j d| jt| jƒf ¡kr |  ¡  d S d S )Nr&   r"   )rb   r   rC   r   r$   r   rq   rv   r   r   r   rV   »  s   
ÿýz#AutoCompleteWindow.keyrelease_eventc                 C   s
   | j d uS rp   )r
   rs   r   r   r   rb   Ã  s   
zAutoCompleteWindow.is_activec                 C   s   |   |  | j¡¡ d S rp   )r*   r1   r   rs   r   r   r   r^   Æ  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|¡ q1| j t| j¡ d | _| j tt¡ | j t| j¡ d | _| j t| j¡ d | _| jrq| j t| j¡ d | _| j ¡  | j ¡  d | _| j ¡  d | _| j ¡  d | _d S rp   )rb   r
   Zevent_deleterL   rP   rQ   r   ri   rN   rO   rT   rR   r   rU   rW   r   r   rX   r   r   rZ   Z	focus_setr   Zdestroy)r   r`   r   r   r   rq   Ê  s@   ÿÿ




zAutoCompleteWindow.hide_windowN)Ú__name__Ú
__module__Ú__qualname__r    r*   r/   r1   r;   ra   r[   rt   rM   rY   r]   rS   rV   rb   r^   rq   r   r   r   r   r      s"    # &M4tr   Ú__main__)Úmainz%idlelib.idle_test.test_autocomplete_wr+   F)Ú	verbosityÚexit)Ú__doc__rc   ÚtkinterZtkinter.ttkr   Zidlelib.autocompleter   r   Zidlelib.multicallr   rL   rP   rQ   rR   rT   rU   rW   rX   rZ   r\   r   r   Zunittestr”   r   r   r   r   Ú<module>   s0       Zþ