o
    giR                     @   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   L/Users/admin/.pyenv/versions/3.10.0/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!   N)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 )zAssuming 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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   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 )zShow 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?   r@   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&   r8   r7   r   r   ZconfigZyviewpackZRIGHTYZLEFTZBOTHZliftr9   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_listsrB   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rz	|t| j W n	 ty   Y nw d | _d| _ d S )NTZWindowsr   z+%d+%dF)r   	is_activer   r6   r   Zbboxr
   platformsystem
startswithupdateZwinfo_widthwinfo_heightZwinfo_rootxr#   maxZwinfo_rootyrD   Zupdate_idletasksrF   unbindrY   r   )r   eventtextxyZcxZcyr^   Z	acw_widthZ
acw_heightZ
text_widthZtext_heightZnew_xZnew_yr   r   r   rZ      sD   

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!   )	ra   typeZ	EventTypeZFocusOutr   Zafterrq   ZButtonPressrn   r   ri   r   r   r   rL   .  s   zAutoCompleteWindow.hide_eventc                 C   s8   |   rd| _t| j d }| | j|  d S d S )NTr   )ra   r   r4   r   r5   r*   r   r   ri   r;   r   r   r   rX   ;  s
   z#AutoCompleteWindow.listselect_eventc                 C   s.   t | j d }| | j|  |   d S )Nr   )r4   r   r5   r*   r   rn   rt   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 @ st 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 @ st| 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rt| j d }| 	| j|  |   dS d| _d| _d S t fdddD rd 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minusrv   _rw   .rx   -breakZReturn)rw   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 rm   r   ).0r,   keysymr   r   	<genexpr>  s    z4AutoCompleteWindow.keypress_event.<locals>.<genexpr>)ZShiftZControlZAltZMetaZCommandZOption )ra   r   hasattrru   r   r$   r   r   r   r*   r   rn   r   r   Zselect_clearr4   r5   r9   r/   r:   r]   r   r   r   Znearestrf   rg   r#   anychar)r   ri   stater;   ZnewselZjumpr   r   r   rR   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"   )ra   r   rB   r   r$   r   rn   rs   r   r   r   rU     s   
z#AutoCompleteWindow.keyrelease_eventc                 C   s
   | j d uS rm   )r
   rp   r   r   r   ra     s   
zAutoCompleteWindow.is_activec                 C   s   |  | | j d S rm   )r*   r1   r   rp   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 rm   )ra   r
   Zevent_deleterK   rO   rP   r   rh   rM   rN   rS   rQ   r   rT   rV   r   r   rW   r   r   rY   Z	focus_setr   Zdestroy)r   r_   r   r   r   rn     s@   




zAutoCompleteWindow.hide_windowN)__name__
__module____qualname__r    r*   r/   r1   r:   r`   rZ   rq   rL   rX   r\   rR   rU   ra   r]   rn   r   r   r   r   r      s"    # &M4tr   __main__)mainz%idlelib.idle_test.test_autocomplete_wr+   F)	verbosityexit)__doc__rb   tkinterZtkinter.ttkr   Zidlelib.autocompleter   r   Zidlelib.multicallr   rK   rO   rP   rQ   rS   rT   rV   rW   rY   r[   r   r   Zunittestr   r   r   r   r   <module>   s0       Z