o
    ^ùhiR  ã                   @   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   á(  /home/conda/feedstock_root/build_artifacts/python-split_1761171407825/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehol/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.   Ú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exportselectionr4   r3   )Zcommand)ÚsideÚfillT)rA   rB   Úexpand)Er   r   r   r   Úindexr   Úgetr   r2   r*   r/   r$   r   r   ZToplevelr
   Úwm_geometryZwm_overrideredirectZtkÚcallZ_wÚTclErrorr   ZVERTICALr   ZListboxÚsetr   r&   r:   r9   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_listsrD   Ú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   r8   r   Zbboxr
   ÚplatformÚsystemÚ
startswithÚupdateZwinfo_widthÚwinfo_heightZwinfo_rootxr#   ÚmaxZwinfo_rootyrF   Zupdate_idletasksrH   Úunbindr[   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!   )	rc   ÚtypeZ	EventTypeZFocusOutr   Zafterru   ZButtonPressrr   ©r   rk   r   r   r   rN   .  s   øzAutoCompleteWindow.hide_eventc                 C   s8   |   ¡ rd| _t| j ¡ d ƒ}|  | j| ¡ d S d S )NTr   )rc   r   r6   r   r7   r*   r   ©r   rk   r=   r   r   r   rZ   ;  s
   ýz#AutoCompleteWindow.listselect_eventc                 C   s.   t | j ¡ d ƒ}|  | j| ¡ |  ¡  d S )Nr   )r6   r   r7   r*   r   rr   rx   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|sd| _t| j ¡ d ƒ}ˆ dkrd}nbˆ dkrt| jƒd }nUˆ dv rS| j | j ¡ ¡| j d¡ }ˆ dkr?td|| ƒ}n4ˆ dksFJ ‚tt| jƒd || ƒ}n ˆ dkr`td|d ƒ}nˆ dksgJ ‚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Úminusrz   Ú_r{   Ú.r|   ú-éÿÿÿÿÚbreakZReturn)r{   ÚspaceZ	parenleftZ
parenrightZbracketleftZbracketright)ZslashZ	backslashZquotedblZ
apostrophe)ÚHomeÚEndÚPriorÚNextÚUpÚDownTrƒ   r„   )r…   r†   r…   r†   r‡   rˆ   c                 3   s    | ]}|ˆ v V  qd S rq   r   )Ú.0r,   ©Úkeysymr   r   Ú	<genexpr>¨  s   € z4AutoCompleteWindow.keypress_event.<locals>.<genexpr>)ZShiftZControlZAltZMetaZCommandZOptionú )rc   r‹   Úhasattrry   r   r$   r   r   r   r*   r   rr   r   r   Zselect_clearr6   r7   r;   r/   r<   r_   r   r   r   Znearestrh   ri   r#   ÚanyÚchar)r   rk   Ústater=   ZnewselZjumpr   rŠ   r   rT   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"   )rc   r   rD   r   r$   r   rr   rw   r   r   r   rW   »  s   
ÿýz#AutoCompleteWindow.keyrelease_eventc                 C   s
   | j d uS rq   )r
   rt   r   r   r   rc   Ã  s   
zAutoCompleteWindow.is_activec                 C   s   |   |  | j¡¡ d S rq   )r*   r2   r   rt   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 rq   )rc   r
   Zevent_deleterM   rQ   rR   r   rj   rO   rP   rU   rS   r   rV   rX   r   r   rY   r   r   r[   Z	focus_setr   Zdestroy)r   ra   r   r   r   rr   Ê  s@   ÿÿ




zAutoCompleteWindow.hide_windowN)Ú__name__Ú
__module__Ú__qualname__r    r*   r/   r2   r<   rb   r\   ru   rN   rZ   r^   rT   rW   rc   r_   rr   r   r   r   r   r      s"    # &M4tr   Ú__main__)Úmainz%idlelib.idle_test.test_autocomplete_wr+   F)Ú	verbosityÚexit)Ú__doc__rd   ÚtkinterZtkinter.ttkr   Zidlelib.autocompleter   r   Zidlelib.multicallr   rM   rQ   rR   rS   rU   rV   rX   rY   r[   r]   r   r’   Zunittestr–   r   r   r   r   Ú<module>   s0       Zþ