U Å:âeNã@sœdZddlZddlTddlmZddlmZmZddlm Z dZ dZ e d fZ d Z d Zd Zd ZdZdZdZGdd„dƒZedkr˜ddlmZedddddS)zH An auto-completion window for IDLE, used by the autocomplete extension éN)Ú*)Ú Scrollbar)ÚFILESÚATTRS)ÚMC_SHIFTz<>z z z<>) zzz z zz z z z z z z!<>z zz zc@sŒeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!S)"ÚAutoCompleteWindowcCs‚||_d|_|_|_d|_|_d|_d|_d|_d|_ d|_ d|_ d|_ d|_ |_|_|_|_|_d|_d|_dS)NF)ÚwidgetÚautocompletewindowÚlistboxÚ scrollbarÚorigselforegroundÚorigselbackgroundÚ completionsÚmorecompletionsÚmodeÚstartÚ startindexÚlasttypedstartÚuserwantswindowZhideidÚ keypressidÚ listupdateidÚ winconfigidÚ keyreleaseidÚ doubleclickidÚlastkey_was_tabÚis_configuring)Úselfr©rú;/usr/local/python38/lib/python3.8/idlelib/autocomplete_w.pyÚ__init__s$ ÿÿzAutoCompleteWindow.__init__cCs¨tt|jƒt|ƒƒ}d}||kr<|j|||kr<|d7}q|t|jƒkrr|j d|j|fd|jt|jƒf¡|t|ƒkrž|j d|j|f||d…¡||_dS)Nréú%s+%dc)ÚminÚlenrrÚdeleterÚinsert)rÚnewstartÚmin_lenÚirrrÚ _change_start>s ÿ  ÿz AutoCompleteWindow._change_startcCsTd}t|jƒ}||kr@||d}|j||kr6|}q|d}qt|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#rr")rÚsr(ÚjÚmrrrÚ_binary_searchKs   z!AutoCompleteWindow._binary_searchc Csî| |¡}|j|dt|ƒ…|kr(|S|d}t|jƒ}||krx||d}|j|dt|ƒ…|krn|}q:|d}q:|d}||kr’|j|S|j|}|j|}tt|ƒt|ƒƒ} t|ƒ}|| krâ||||krâ|d7}qÀ|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.rr#r") rr+Úfirstr(r,r-ZlastZ first_compZ last_compr'rrrÚ_complete_stringXs(        z#AutoCompleteWindow._complete_stringcCsDt|j ¡dƒ}|j |¡|j}|j|}| |¡|krB|}nDtt|ƒt|ƒƒ}d}||krz||||krz|d7}qX|d|…}|  |¡|j|dt|j ƒ…|j krÄ|jj |j |j dn||jj |j d¡|j d¡d|jr@|j|_d|_|j dt¡|jD]}|j t|¡q|j | |j ¡¡| ¡dS)zzCall when the selection of the Listbox has changed. Updates the Listbox display and calls _change_start. rr N)ÚselectbackgroundÚselectforegroundÚbgZfg)Úintr Ú curselectionÚseerrr.r"r#r)rZ configurer r Úcgetrr$ÚENDr%Ú select_setÚ_selection_changed)rÚcurselZltsZselstartr&r'r(Úitemrrrr:xs6      ÿ ÿ z%AutoCompleteWindow._selection_changedcCs~|\|_|_||_|j |¡|_|j |jd¡|_|r¢| |j¡}|j}|  |¡|  |¡}|j||kr¢|t |jƒdksš|j|ddt |ƒ…|kr¢||kS||_ |j|_ t|jƒ|_} |  d¡|  d¡z| j dd| jdd¡Wntk rYnXt| td |_} t| | jd d |_} |jD]} |  t| ¡q4|  d ¡|_|  d ¡|_ | j!| j"d| j#t$t%d| j#t&t'dd|  (¡|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¡|_DdS)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)ZorientF)ZyscrollcommandZexportselectionr2r1)Zcommand)ÚsideÚfillT)r?r@Úexpand)ErrrrÚindexrÚgetrr0r)r.r#rrZToplevelr Ú wm_geometryZwm_overrideredirectZtkÚcallZ_wZTclErrorrZVERTICALr ZListboxÚsetr r%r8r7r r ZconfigZyviewÚpackZRIGHTÚYZLEFTZBOTHZliftr9r:Ú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_eventrrÚWINCONFIG_SEQUENCEÚwinconfig_eventrÚDOUBLECLICK_SEQUENCEÚdoubleclick_eventr)rZ comp_listsrBÚcompleterZ userWantsWinZ completedrr(Úacwr r r<ÚseqrrrÚ show_windowžs€    ÿþ  ÿÿ     ÿÿÿÿzAutoCompleteWindow.show_windowcCs|jr dSd|_| ¡sdS|j}| |j¡| |j¡\}}}}|j}| ¡| ¡|  ¡}} | ¡|  ¡} } |  ¡t |t d| |ƒƒ} |  ¡|} | ||| ks´|| kr¾| |7} n| | 8} | d| | f¡| ¡t ¡ d¡r| t|j¡d|_d|_dS)NTrz+%d+%dZWindowsF)rÚ is_activerr6rZbboxr ÚupdateZ winfo_widthÚ winfo_heightZ winfo_rootxr"ÚmaxZ winfo_rootyrDZupdate_idletasksÚplatformÚsystemÚ startswithÚunbindrXr)rÚeventÚtextÚxÚyZcxÚcyr]Z acw_widthZ acw_heightÚ text_widthZ text_heightZnew_xZnew_yrrrrYês2  ÿ z"AutoCompleteWindow.winconfig_eventcCsB|js dSz|j ¡s| ¡Wntk r<| ¡YnXdS©N)r Z focus_getÚ hide_windowÚKeyError©rrrrÚ_hide_event_checks  z$AutoCompleteWindow._hide_event_checkcCs>| ¡r:|jtjkr&|j d|j¡n|jtjkr:| ¡dS)Nr ) r`ÚtypeZ EventTypeZFocusOutrZafterrrZ ButtonPressro©rrhrrrrKs   zAutoCompleteWindow.hide_eventcCs4| ¡r0d|_t|j ¡dƒ}| |j|¡dS)NTr)r`rr4r r5r)r©rrhr;rrrrW(sz#AutoCompleteWindow.listselect_eventcCs.t|j ¡dƒ}| |j|¡| ¡dS)Nr)r4r r5r)rrorurrrr[.sz$AutoCompleteWindow.doubleclick_eventcs | ¡s dS|j‰t|dƒr$|j}nd}ˆdkr6d|_tˆƒdks`ˆdks`|jtkrJˆdkrJ|t@sJtˆƒdkrŠ|  |j ˆ¡n|ˆdkr¤|  |j d ¡nbˆd kr¾|  |j d ¡nHˆd krØ|  |j d ¡n.t|j ƒdkrò|  ¡dS|  |j dd…¡|j |_ |j  dt|j  ¡dƒ¡|j  | |j ¡¡| ¡dSˆdkrh| ¡|  ¡dS|jtkr~ˆdks |jtkrˆdkr|t@st|j  ¡dƒ}|j|dt|j ƒ…|j krö|jtksæ|j rö|  |j|¡|  ¡dSˆdkr2|s2d|_t|j  ¡dƒ}ˆdkr:d}nĈdkrTt|jƒd}nªˆdkr¾|j  |j  ¡¡|j  d¡}ˆdkr–td||ƒ}n&ˆdks¤t‚tt|jƒd||ƒ}n@ˆdkrØtd|dƒ}n&ˆdksæt‚tt|jƒd|dƒ}|j  |¡|j  |¡| ¡|  |j|¡dSˆdkrŠ|sŠ|jrxt|j  ¡dƒ}|  |j|¡|  ¡dSd|_d|_dSn’t‡fdd„dDƒƒr¦dS|jr|jdkr|  |j |j¡|j |_ |j  dt|j  ¡dƒ¡|j  | |j ¡¡| ¡dS|  ¡dSdS) NÚmc_staterZTabFr )Ú underscoreZ BackSpace)ÚperiodÚminusrwÚ_rxÚ.ryú-éÿÿÿÿÚbreakZReturn)rxZspaceZ parenleftZ parenrightZ bracketleftZ bracketright)ZslashZ backslashZquotedblZ apostrophe)ÚHomeÚEndÚPriorÚNextÚUpÚDownTrr€)rr‚rr‚rƒr„c3s|]}|ˆkVqdSrnr)Ú.0r+©ÚkeysymrrÚ •sz4AutoCompleteWindow.keypress_event..)ZShiftZControlZAltZMetaZCommandZOptionú )r`r‡Úhasattrrvrr#rrrr)rrorr Z select_clearr4r5r9r.r:r\rrrZnearestrbrcÚAssertionErrorr"ÚanyÚchar)rrhÚstater;ZnewselZjumprr†rrQ4sÐ ÿÿÿý  ÿýÿýû  ÿÿ ÿ    ÿ    z!AutoCompleteWindow.keypress_eventcCs@| ¡s dS|j d¡|j d|jt|jƒf¡kr<| ¡dS)Nr%r!)r`rrBrr#rrortrrrrT¨s  ÿz#AutoCompleteWindow.keyrelease_eventcCs |jdk Srn)r rqrrrr`°szAutoCompleteWindow.is_activecCs| | |j¡¡dSrn)r)r0rrqrrrr\³szAutoCompleteWindow.completecCs | ¡s dS|j tt¡tD]}|j t|¡q|j t|j¡|j t|j ¡d|_d|_ t D]}|j t |¡qb|j t |j ¡d|_ |j t t¡|j t |j¡d|_|j t|j¡d|_|jrâ|j t|j¡d|_|j ¡|j ¡d|_|j ¡d|_|j ¡d|_dSrn)r`r Z event_deleterJrNrOrrgrLrMrRrPrrSrUrr rVrrrXZ focus_setr Zdestroy)rr^rrrro·s@ÿÿ    zAutoCompleteWindow.hide_windowN)Ú__name__Ú __module__Ú __qualname__rr)r.r0r:r_rYrrrKrWr[rQrTr`r\rorrrrrs !   &L%  trÚ__main__)Úmainz%idlelib.idle_test.test_autocomplete_wr*F)Ú verbosityÚexit)Ú__doc__rdÚtkinterZ tkinter.ttkrZidlelib.autocompleterrZidlelib.multicallrrJrNrOrPrRrSrUrVrXrZrrZunittestr“rrrrÚs,  G