B
    Ç S]pM  ã               @   s    d Z ddlZddlT ddlmZ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)Ú*)ÚFrameÚ	Scrollbar)ÚCOMPLETE_FILESÚCOMPLETE_ATTRIBUTES)Ú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!<<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 S )NF)ÚwidgetÚautocompletewindowÚlistboxÚ	scrollbarÚorigselforegroundÚorigselbackgroundÚcompletionsÚmorecompletionsÚmodeÚstartÚ
startindexÚlasttypedstartÚuserwantswindowZhideidÚ
keypressidÚlistupdateidÚwinconfigidÚkeyreleaseidÚdoubleclickidÚlastkey_was_tab)Ú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 )z’Find the first index in self.completions where completions[i] is
        greater or equal to s, or the last index if there is no such
        one.r   é   r    )r"   r   r!   )r   Úsr'   ÚjÚmr   r   r   Ú_binary_searchJ   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_stringW   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 )z|Should be called 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   v   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<¡| _=|	 +t>| j?¡| _@| +tA| jB¡| _Cd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)Dr   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   Ú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š   sl    









zAutoCompleteWindow.show_windowc             C   sæ   |   ¡ 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 S )Nr   z+%d+%dZWindows)Ú	is_activer	   r4   r   Zbboxr
   Zwinfo_widthÚwinfo_heightZwinfo_rootxr!   ÚmaxZwinfo_rootyrA   Ú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   ã   s$    
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afterrg   ZButtonPressre   )r   ra   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   ra   r9   r   r   r   rQ     s    z#AutoCompleteWindow.listselect_eventc             C   s.   t | j ¡ d ƒ}|  | j| ¡ |  ¡  d S )Nr   )r2   r   r3   r(   r   re   )r   ra   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Úminusrj   Ú_rk   Ú.rl   ú-éÿÿÿÿÚbreakZReturn)rk   ZspaceZ	parenleftZ
parenrightZbracketleftZbracketright)ZslashZ	backslashZquotedblZ
apostrophe)ÚHomeÚEndÚPriorÚNextÚUpÚDownTrr   rs   )rt   ru   rt   ru   rv   rw   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   ry   Úhasattrri   r   r"   r   r   r   r(   r   re   r   r   Zselect_clearr2   r3   r7   r-   r8   rV   r   r   r   Znearestr[   r\   ÚAssertionErrorr!   ÚanyÚchar)r   ra   Ústater9   ZnewselZjumpr   )ry   r   rK   $  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   re   )r   ra   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	   r`   rF   rG   rL   rJ   r   rM   rO   r   r   rP   r   r   rR   Z	focus_setr   Zdestroy)r   rX   r   r   r   re   §  s<    





zAutoCompleteWindow.hide_windowN)Ú__name__Ú
__module__Ú__qualname__r   r(   r-   r/   r8   rY   rS   rg   rE   rQ   rU   rK   rN   rZ   rV   re   r   r   r   r   r      s     $Itr   Ú__main__)Úmainz%idlelib.idle_test.test_autocomplete_wr)   F)Ú	verbosityÚexit)Ú__doc__r]   ZtkinterZtkinter.ttkr   r   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,      7