B
    ?™cN  ã               @   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.7/idlelib/autocomplete_w.pyÚ__init__   s    $zAutoCompleteWindow.__init__c             C   s¬   t t| jƒt|ƒƒ}d}x&||k r>| j| || kr>|d7 }qW |t| jƒk rv| j d| j|f d| jt| jƒf ¡ |t|ƒk r¢| j d| j|f ||d … ¡ || _d S )Nr   é   z%s+%dc)ÚminÚlenr   r   Údeleter   Úinsert)r   ÚnewstartÚmin_lenÚir   r   r   Ú_change_start>   s    z AutoCompleteWindow._change_startc             C   sX   d}t | jƒ}x4||krB|| d }| j| |kr8|}q|d }qW 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ƒ}x@||krz|| d }| j| dt|ƒ… |krp|}q<|d }q<W |d }||kr–| j| S | j| }| j| }tt|ƒt|ƒƒ}	t|ƒ}x$||	k rè|| || krè|d7 }qÆW |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   sL  t | j ¡ d ƒ}| j |¡ | j}| j| }|  |¡|krB|}nHtt|ƒt|ƒƒ}d}x$||k r||| || kr||d7 }qZW |d|… }|  	|¡ | j| dt| j
ƒ… | j
krÈ| jj| j| jd n€| jj| j d¡| j d¡d | jrH| j| _d| _| j dt¡ x| jD ]}| j t|¡ qW | 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   r8   x   s2    


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¡ y|	j dd|	jdd¡ W n tk
r   Y nX t|	td	 | _}
t|	|
jd
d | _}x| j D ]}| t|¡ q6W | d¡| _| d¡| _ |
j!|j"d |
j#t$t%d |j#t&t'dd |	 (¡  | j )|  
| j¡¡ |  *¡  |	 +t,| j-¡| _.| j +t,| j-¡| _/|	 0t,t1¡ xt2D ]}| j 0t,|¡ qèW | j +t3| j4¡| _5xt6D ]}| j 0t3|¡ qW | 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::MacWindowStyleZstyleÚhelpZnoActivates)ZorientF)ZyscrollcommandZexportselectionr1   r0   )Zcommand)ÚsideÚfillT)r<   r=   Úexpand)Er   r   r   r   Úindexr   Úgetr   r/   r(   r-   r"   r   r   ZToplevelr	   Úwm_geometryZwm_overrideredirectZtkZcallZ_wZTclErrorr   ZVERTICALr   ZListboxÚsetr
   r$   r6   r5   r   r   ZconfigZyviewZpackZRIGHTÚYZLEFTZBOTHZliftr7   r8   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ž   sn    









zAutoCompleteWindow.show_windowc             C   s  | j r
d S d| _ |  ¡ sd S | j}| | j¡ | | j¡\}}}}| j}| ¡  | ¡ | 	¡  }}	| ¡ | 	¡  }
}| 
¡ t|td|
| ƒƒ }| ¡ | }|||  |	ks´||	k r¾||7 }n||	8 }| d||f ¡ | ¡  t ¡  d¡r| t| j¡ d | _d| _ d S )NTr   z+%d+%dZWindowsF)r   Ú	is_activer   r4   r   Zbboxr	   ÚupdateZwinfo_widthÚwinfo_heightZwinfo_rootxr!   ÚmaxZwinfo_rootyrA   Zupdate_idletasksÚplatformÚsystemÚ
startswithÚunbindrR   r   )r   ÚeventÚtextÚxÚyZcxZcyrW   Z	acw_widthZ
acw_heightZ
text_widthZtext_heightZnew_xZnew_yr   r   r   rS   ê   s0    
z"AutoCompleteWindow.winconfig_eventc             C   sB   | j s
d S y| j  ¡ s|  ¡  W n tk
r<   |  ¡  Y nX 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    )	rZ   ÚtypeZ	EventTypeZFocusOutr   Zafterrh   ZButtonPressrf   )r   rb   r   r   r   rE     s
    zAutoCompleteWindow.hide_eventc             C   s4   |   ¡ r0d| _t| j ¡ d ƒ}|  | j| ¡ d S )NTr   )rZ   r   r2   r
   r3   r(   r   )r   rb   r9   r   r   r   rQ   (  s    z#AutoCompleteWindow.listselect_eventc             C   s.   t | j ¡ d ƒ}|  | j| ¡ |  ¡  d S )Nr   )r2   r
   r3   r(   r   rf   )r   rb   r9   r   r   r   rU   .  s    z$AutoCompleteWindow.doubleclick_eventc                s   |   ¡ sd S |j‰ t|dƒr$|j}nd}ˆ dkr6d| _tˆ ƒdks`ˆ dks`| jtkrJˆ dk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ks | jtkrˆ dkr|t @ st| j ¡ d ƒ}| j| d t| j
ƒ… | j
krö| jtksæ| j
rö|  	| j| ¡ |  ¡  d S ˆ dkr2|s2d| _t| j ¡ d ƒ}ˆ dkr:d}nÄˆ dkrTt| jƒd }nªˆ dkr¾| j | j ¡ ¡| j d¡ }ˆ dkr–td|| ƒ}n&ˆ dks¤t‚tt| jƒd || ƒ}n@ˆ dkrØtd|d ƒ}n&ˆ dksæt‚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Úminusrk   Ú_rl   Ú.rm   ú-éÿÿÿÿÚbreakZReturn)rl   ZspaceZ	parenleftZ
parenrightZbracketleftZbracketright)ZslashZ	backslashZquotedblZ
apostrophe)ÚHomeÚEndÚPriorÚNextÚUpÚDownTrs   rt   )ru   rv   ru   rv   rw   rx   c             3   s   | ]}|ˆ kV  qd S )Nr   )Ú.0r*   )Úkeysymr   r   ú	<genexpr>•  s    z4AutoCompleteWindow.keypress_event.<locals>.<genexpr>)ZShiftZControlZAltZMetaZCommandZOptionú )rZ   rz   Úhasattrrj   r   r"   r   r   r   r(   r   rf   r   r
   Zselect_clearr2   r3   r7   r-   r8   rV   r   r   r   Znearestr\   r]   ÚAssertionErrorr!   ÚanyÚchar)r   rb   Ústater9   ZnewselZjumpr   )rz   r   rK   4  s°    

 





z!AutoCompleteWindow.keypress_eventc             C   s@   |   ¡ sd S | j d¡| j d| jt| jƒf ¡kr<|  ¡  d S )Nr$   z%s+%dc)rZ   r   r?   r   r"   r   rf   )r   rb   r   r   r   rN   ¨  s
    
z#AutoCompleteWindow.keyrelease_eventc             C   s
   | j d k	S )N)r	   )r   r   r   r   rZ   °  s    zAutoCompleteWindow.is_activec             C   s   |   |  | j¡¡ d S )N)r(   r/   r   )r   r   r   r   rV   ³  s    zAutoCompleteWindow.completec             C   s(  |   ¡ sd S | j tt¡ xtD ]}| j t|¡ q W | j t| j¡ | j t| j	¡ d | _d | _	xt
D ]}| j t|¡ qhW | 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 )N)rZ   r	   Zevent_deleterD   rH   rI   r   ra   rF   rG   rL   rJ   r   rM   rO   r   r
   rP   r   r   rR   Z	focus_setr   Zdestroy)r   rX   r   r   r   rf   ·  s<    





zAutoCompleteWindow.hide_windowN)Ú__name__Ú
__module__Ú__qualname__r   r(   r-   r/   r8   rY   rS   rh   rE   rQ   rU   rK   rN   rZ   rV   rf   r   r   r   r   r      s    ! &L%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   rD   rH   rI   rJ   rL   rM   rO   rP   rR   rT   r   r‚   Zunittestr†   r   r   r   r   Ú<module>   s,      G