a  zeQ@sdZddlZddlTddlmZddlmZmZddlm Z dZ dZ e d fZ d Z d Zd Zd ZdZdZdZGdddZedkrddlmZedddddS)zH An auto-completion window for IDLE, used by the autocomplete extension N)*) Scrollbar)FILESATTRS)MC_SHIFTz<>z z z<>) zzz z zz z z z z z z!<>z zz zc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!S)"AutoCompleteWindowcCs||_d|_|_|_d|_|_d|_d|_d|_d|_ d|_ d|_ d|_ d|_ |_|_|_|_|_d|_d|_dS)NF)widgetautocompletewindowlistbox scrollbarorigselforegroundorigselbackground completionsmorecompletionsmodestart startindexlasttypedstartuserwantswindowZhideid keypressid listupdateid winconfigid keyreleaseid doubleclickidlastkey_was_tabis_configuring)selfrrJ/opt/bitninja-python-dojo/embedded/lib/python3.9/idlelib/autocomplete_w.py__init__s" zAutoCompleteWindow.__init__cCstt|jt|}d}||kr<|j|||kr<|d7}q|t|jkrr|jd|j|fd|jt|jf|t|kr|jd|j|f||d||_dS)Nr%s+%dc)minlenrrdeleterinsert)rnewstartmin_lenirrr _change_start>s   z AutoCompleteWindow._change_startcCsTd}t|j}||kr@||d}|j||kr6|}q|d}qt|t|jdS)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. rr )r#rr")rsr(jmrrr_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)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.rr#r") rr+firstr(r,r-ZlastZ first_compZ last_compr'rrr_complete_stringXs(        z#AutoCompleteWindow._complete_stringcCsDt|jd}|j||j}|j|}|||krB|}nDtt|t|}d}||krz||||krz|d7}qX|d|}| ||j|dt|j |j kr|jj |j |j dn||jj |jd|jdd|jr@|j|_d|_|jdt|jD]}|jt|q|j||j |dS)zzCall when the selection of the Listbox has changed. Updates the Listbox display and calls _change_start. rr N)selectbackgroundselectforegroundbgZfg)intr curselectionseerrr.r"r#r)rZ configurer r cgetrr$ENDr% select_set_selection_changed)rcurselZltsZselstartr&r'r(itemrrrr:xs6        z%AutoCompleteWindow._selection_changedcCs|\|_|_||_|j||_|j|jd|_|r||j}|j}| || |}|j||kr|t |jdks|j|ddt ||kr||kS||_ |j|_ t|j|_} | d| dz| jdd| jddWntyYn0t| td |_} t| | jd d |_} |jD]} | t| q2| d |_| d |_ | j!| j"d| j#t$t%d| j#t&t'dd| (| )|j*| |j|+| ,t-|j.|_/|j,t-|j.|_0| 1t-t2t3D]} |j1t-| q|j,t4|j5|_6t7D]} |j1t4| q|j,t8|j9|_:|j1t8t;| ,t<|j=|_>d |_?| ,t@|jA|_B| ,tC|jD|_EdS)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::MacWindowStylestylehelpZ noActivates)ZorientF)ZyscrollcommandZexportselectionr2r1)Zcommand)sidefillT)r?r@expand)Frrrrindexrgetrr0r)r.r#rrZToplevelr wm_geometryZwm_overrideredirectZtkcallZ_wTclErrorrZVERTICALr ZListboxsetr r%r8r7r r ZconfigZyviewpackZRIGHTYZLEFTZBOTHupdate_idletasksZliftr9r:bindHIDE_VIRTUAL_EVENT_NAME hide_eventhideaidhidewidZ event_addHIDE_FOCUS_OUT_SEQUENCEHIDE_SEQUENCESKEYPRESS_VIRTUAL_EVENT_NAMEkeypress_eventrKEYPRESS_SEQUENCESKEYRELEASE_VIRTUAL_EVENT_NAMEkeyrelease_eventrKEYRELEASE_SEQUENCELISTUPDATE_SEQUENCElistselect_eventrrWINCONFIG_SEQUENCEwinconfig_eventrDOUBLECLICK_SEQUENCEdoubleclick_eventr)rZ comp_listsrBcompleterZ userWantsWinZ completedrr(acwr r r<seqrrr show_windows           zAutoCompleteWindow.show_windowcCsP|jr dSd|_|sdSz|j}||j||j\}}}}|j}t dr`| | | }} | | } } | t|td| |} ||} | ||| ks|| kr| |7} n| | 8} |d| | f|WntyYn0t drFz|t|jWnty>Yn0d|_d|_dS)NTZWindowsrz+%d+%dF)r is_activerr6rZbboxr platformsystem startswithupdateZ winfo_width winfo_heightZ winfo_rootxr"maxZ winfo_rootyrDrJrFunbindrZr)reventtextxyZcxcyr_Z acw_widthZ acw_height text_widthZ text_heightZnew_xZnew_yrrrr[s@    z"AutoCompleteWindow.winconfig_eventcCs@|js dSz|js|Wnty:|Yn0dSN)r Z focus_get hide_windowKeyErrorrrrr_hide_event_checks   z$AutoCompleteWindow._hide_event_checkcCs>|r:|jtjkr&|jd|jn|jtjkr:|dS)Nr ) rbtypeZ EventTypeZFocusOutrZafterrtZ ButtonPressrqrrjrrrrM+s   zAutoCompleteWindow.hide_eventcCs4|r0d|_t|jd}||j|dS)NTr)rbrr4r r5r)rrrjr;rrrrY8sz#AutoCompleteWindow.listselect_eventcCs.t|jd}||j||dS)Nr)r4r r5r)rrqrwrrrr]>sz$AutoCompleteWindow.doubleclick_eventcs|s dS|jt|dr$|j}nd}dkr6d|_tdks`dvs`|jtkrJdvrJ|t@sJtdkr| |j n|dkr| |j d nbd kr| |j d nHd kr| |j d n.t|j dkr| dS| |j dd|j |_ |j dt|j d|j ||j |dSdkrh|| dS|jtkr~dvs|jtkrdvr|t@st|j d}|j|dt|j |j kr|jtks|j r| |j|| dSdvr|sd|_t|j d}dkr:d}ndkrTt|jd}ndvr|j |j |j d}dkrtd||}ntt|jd||}n2dkrtd|d}ntt|jd|d}|j ||j ||| |j|dSdkrn|sn|jr\t|j d}| |j|| dSd|_d|_dSntfdddDrdS|jr|jdkr| |j |j|j |_ |j dt|j d|j ||j |dS| dSdS)Nmc_staterZTabFr ) underscoreZ BackSpace)periodminusry_rz.r{-breakZReturn)rzspaceZ parenleftZ parenrightZ bracketleftZ bracketright)ZslashZ backslashZquotedblZ apostrophe)HomeEndPriorNextUpZDownTrr)rrrrc3s|]}|vVqdSrpr).0r+keysymrr z4AutoCompleteWindow.keypress_event..)ZShiftZControlZAltZMetaZCommandZOption )rbrhasattrrxrr#rrrr)rrqrr Z select_clearr4r5r9r.r:r^rrrZnearestrgrhr"anychar)rrjstater;ZnewselZjumprrrrSDs              z!AutoCompleteWindow.keypress_eventcCs@|s dS|jd|jd|jt|jfkr<|dS)Nr%r!)rbrrBrr#rrqrvrrrrVs  z#AutoCompleteWindow.keyrelease_eventcCs |jduSrp)r rsrrrrbszAutoCompleteWindow.is_activecCs|||jdSrp)r)r0rrsrrrr^szAutoCompleteWindow.completecCs |s dS|jtttD]}|jt|q|jt|j|jt|j d|_d|_ t D]}|jt |qb|jt |j d|_ |jt t|jt |jd|_|jt|jd|_|jr|jt|jd|_|j|jd|_|jd|_|jd|_dSrp)rbr Z event_deleterLrPrQrrirNrOrTrRrrUrWrr rXrrrZZ focus_setr Zdestroy)rr`rrrrqs@    zAutoCompleteWindow.hide_windowN)__name__ __module__ __qualname__rr)r.r0r:rar[rtrMrYr]rSrVrbr^rqrrrrrs !   &M4  tr__main__)mainz%idlelib.idle_test.test_autocomplete_wr*F) verbosityexit)__doc__rctkinterZ tkinter.ttkrZidlelib.autocompleterrZidlelib.multicallrrLrPrQrRrTrUrWrXrZr\rrZunittestrrrrrs,  W