
\[\E              
   @   s   d  Z  d d l Td d l m Z d d l m Z m Z d Z d Z d Z	 d Z
 d Z d Z d Z d Z d Z Gd d   d  Z d S)zH
An auto-completion window for IDLE, used by the AutoComplete extension
    )*)MC_SHIFT)COMPLETE_FILESCOMPLETE_ATTRIBUTESz<<autocompletewindow-hide>>
<FocusOut><ButtonPress>z<<autocompletewindow-keypress>><Key><Key-BackSpace><Key-Return>	<Key-Tab><Key-Up>
<Key-Down>
<Key-Home>	<Key-End><Key-Prior>
<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 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userwantswindowhideid
keypressidlistupdateidwinconfigidkeyreleaseiddoubleclickidlastkey_was_tab)selfr    r(   0/usr/lib/python3.4/idlelib/AutoCompleteWindow.py__init__   s    								,zAutoCompleteWindow.__init__c             C   s   t  t |  j  t |   } d } x1 | | k  rW |  j | | | k rW | d 7} q' W| t |  j  k  r |  j j d |  j | f d |  j t |  j  f  n  | t |  k  r |  j j d |  j | f | | d    n  | |  _ d  S)Nr      z%s+%dc)minlenr   r   deleter   insert)r'   newstartmin_lenir(   r(   r)   _change_start8   s    & z AutoCompleteWindow._change_startc             C   sv   d } t  |  j  } xD | | k r[ | | d } |  j | | k rN | } q | d } q Wt | 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
        one.r      r+   )r-   r   r,   )r'   sr2   jmr(   r(   r)   _binary_searchE   s     	z!AutoCompleteWindow._binary_searchc       
      C   sG  |  j  |  } |  j | d t |   | k r6 | S| d } t |  j  } xT | | k r | | d } |  j | d t |   | k r | } qR | d } qR W| d } | | k r |  j | S|  j | } |  j | } t t |  t |   }	 t |  } x. | |	 k  r8| | | | k r8| d 7} qW| 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+   r4   )r8   r   r-   r,   )
r'   r5   firstr2   r6   r7   lastZ
first_compZ	last_compr1   r(   r(   r)   _complete_stringR   s(    #
#	
#z#AutoCompleteWindow._complete_stringc             C   s  t  |  j j   d  } |  j j |  |  j } |  j | } |  j |  | k r] | } nb t t |  t |   } d } x. | | k  r | | | | k r | d 7} q W| d |  } |  j	 |  |  j | d t |  j
   |  j
 k r|  j j d |  j d |  j  n |  j j d |  j j d  d |  j j d   |  j r|  j |  _ d |  _ |  j j d t  x$ |  j D] } |  j j t |  qW|  j j |  j |  j
   |  j   n  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selectforegroundbgZfg)intr   curselectionseer   r   r8   r,   r-   r3   r   Z	configurer   r   cgetr   r.   ENDr/   
select_set_selection_changed)r'   curselZltsZselstartr0   r1   r2   itemr(   r(   r)   rE   q   s2    		#)		z%AutoCompleteWindow._selection_changedc             C   sQ  | \ |  _  |  _ | |  _ |  j j |  |  _ |  j j |  j d  |  _ | r |  j |  j  } |  j } |  j	 |  |  j
 |  } |  j  | | k r | t |  j   d k s |  j  | d d t |   | k r | | k Sn  | |  _ |  j |  _ t |  j  |  _ }	 |	 j d  |	 j d  y# |	 j j d d |	 j d d  Wn t k
 rdYn Xt |	 d	 t |  _ }
 t |	 d
 |
 j d d d d |  _ } x! |  j  D] } | j t |  qW| j d  |  _ | j d  |  _  |
 j! d | j"  |
 j# d t$ d t%  | j# d t& d t' d d  |  j j( |  j
 |  j   |  j)   |  j j* t+ |  j,  |  _- x! t. D] } |  j j/ t+ |  q{W|  j j* t0 |  j1  |  _2 x! t3 D] } |  j j/ t0 |  qW|  j j* t4 |  j5  |  _6 |  j j/ t4 t7  | j* t8 |  j9  |  _: |	 j* t; |  j<  |  _= | j* t> |  j?  |  _@ d 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::MacWindowStyleZstylehelpZnoActivatesZorientZyscrollcommandZexportselectionFr>   Zwhiter=   r<   ZcommandZsideZfillexpandT)Ar   r   r   r   indexr   getr   r;   r3   r8   r-   r   r   ZToplevelr   wm_geometryZwm_overrideredirectZtkcallZ_wZTclErrorZ	ScrollbarZVERTICALr   ZListboxsetr   r/   rC   rB   r   r   ZconfigZyviewZpackZRIGHTYZLEFTZBOTHrD   rE   ZbindHIDE_VIRTUAL_EVENT_NAME
hide_eventr    HIDE_SEQUENCESZ	event_add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_listsrJ   completer   ZuserWantsWinZ	completedr   r2   acwr   r   rG   seqr(   r(   r)   show_window   sf    		'	
		zAutoCompleteWindow.show_windowc             C   s
  |  j    s d  S|  j } | j |  j  | j |  j  \ } } } } |  j } | j   | j   } }	 | j   | j   }
 } | j   t	 | t
 d |
 |   } | j   | } | | | |	 k s | |	 k  r | | 7} n
 | |	 8} | j d | | f  d  S)Nr   z+%d+%d)	is_activer   rA   r   Zbboxr   Zwinfo_widthwinfo_heightZwinfo_rootxr,   maxZwinfo_rootyrL   )r'   eventtextxyZcxZcyr`   Z	acw_widthZ
acw_heightZ
text_widthZtext_heightZnew_xZnew_yr(   r(   r)   r\      s    		&
z"AutoCompleteWindow.winconfig_eventc             C   s   |  j    s d  S|  j   d  S)N)rc   hide_window)r'   rf   r(   r(   r)   rQ      s    zAutoCompleteWindow.hide_eventc             C   sJ   |  j    s d  Sd |  _ t |  j j   d  } |  j |  j |  d  S)NTr   )rc   r   r?   r   r@   r3   r   )r'   rf   rF   r(   r(   r)   rZ      s
    	z#AutoCompleteWindow.listselect_eventc             C   s;   t  |  j j   d  } |  j |  j |  |  j   d  S)Nr   )r?   r   r@   r3   r   rj   )r'   rf   rF   r(   r(   r)   r^      s    z$AutoCompleteWindow.doubleclick_eventc                s]  |  j    s d  S| j   t | d  r4 | j } n d }   d k rR d |  _ n  t    d k s   d( k s |  j t k r  d) k r| t @rt    d k r |  j	 |  j
    n   d k r |  j	 |  j
 d
  n   d k r|  j	 |  j
 d  n`   d	 k r)|  j	 |  j
 d  n= t |  j
  d k rL|  j   d  S|  j	 |  j
 d  d*   |  j
 |  _ |  j j d t |  j j   d   |  j j |  j |  j
   |  j   d S  d k r|  j   d  S|  j t k r  d+ k s|  j t k r  d, k r| t @rt |  j j   d  } |  j | d  t |  j
   |  j
 k r|  j t k sx|  j
 r|  j	 |  j |  n  |  j   d  S  d- k r-| r-d |  _ t |  j j   d  }   d k rd } n  d k r	t |  j  d } n   d. k r|  j j |  j j    |  j j d  }   d k rbt d | |  } q  d k stt  t t |  j  d | |  } nT   d k rt d | d  } n2   d k st  t t |  j  d | d  } |  j j |  |  j j |  |  j   |  j	 |  j |  d S  d k r| r|  j rt |  j j   d  } |  j	 |  j |  |  j   d Sd |  _ d |  _ d  Sn t   f d d    d/ D  rd  S| j rK| j d' k rK|  j	 |  j
 | j  |  j
 |  _ |  j j d t |  j j   d   |  j j |  j |  j
   |  j   d S|  j   d  Sd  S)0Nmc_stater   ZTabFr+   
underscore	BackSpaceperiodminus_.-breakZReturnspace	parenleft
parenrightbracketleftbracketrightslash	backslashquotedbl
apostropheHomeEndPriorNextUpDownTc             3   s   |  ] } |   k Vq d  S)Nr(   ).0r5   )keysymr(   r)   	<genexpr>a  s    z4AutoCompleteWindow.keypress_event.<locals>.<genexpr>ShiftControlAltMetaCommandOption )rl   rm   )rn   ro   )rn   rt   ru   rv   rw   rx   )ry   rz   r{   r|   )r}   r~   r   r   r   r   )r   r   )r   r   r   r   r   r   )rc   r   hasattrrk   r&   r-   r   r   r   r3   r   rj   r   r   Zselect_clearr?   r@   rD   r8   rE   r   r   r   Znearestrd   re   AssertionErrorr,   anychar)r'   rf   staterF   Znewseljumpr(   )r   r)   rT     s    		
&

 		)
		# 
	
		&

z!AutoCompleteWindow.keypress_eventc             C   s[   |  j    s d  S|  j j d  |  j j d |  j t |  j  f  k rW |  j   n  d  S)Nr/   z%s+%dc)rc   r   rJ   r   r-   r   rj   )r'   rf   r(   r(   r)   rW   t  s
    +z#AutoCompleteWindow.keyrelease_eventc             C   s   |  j  d  k	 S)N)r   )r'   r(   r(   r)   rc   |  s    zAutoCompleteWindow.is_activec             C   s   |  j  |  j |  j   d  S)N)r3   r;   r   )r'   r(   r(   r)   r_     s    zAutoCompleteWindow.completec             C   sL  |  j    s d  Sx! t D] } |  j j t |  q W|  j j t |  j  d  |  _ x! t D] } |  j j t |  qZ W|  j j t |  j	  d  |  _	 |  j j t
 t  |  j j t
 |  j  d  |  _ |  j j t |  j  d  |  _ |  j j t |  j  d  |  _ |  j j   d  |  _ |  j j   d  |  _ |  j j   d  |  _ d  S)N)rc   rR   r   Zevent_deleterP   Zunbindr    rU   rS   r!   rV   rX   r$   r   rY   r"   r   r[   r#   r   Zdestroy)r'   ra   r(   r(   r)   rj     s0    							zAutoCompleteWindow.hide_windowN)__name__
__module____qualname__r*   r3   r8   r;   rE   rb   r\   rQ   rZ   r^   rT   rW   rc   r_   rj   r(   r(   r(   r)   r      s    $Esr   N)r   r   )
r   r	   r
   r   r   r   r   r   r   r   )__doc__ZtkinterZidlelib.MultiCallr   Zidlelib.AutoCompleter   r   rP   rR   rS   rU   rV   rX   rY   r[   r]   r   r(   r(   r(   r)   <module>   s   
  