\dQdZddlZddlTddlmZddlmZmZddlm Z dZ dZ e d fZ d Z d Zd Zd ZdZdZdZGddZedkrddlmZeddddSdS)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 zcneZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdS)AutoCompleteWindowc:||_||_dx|_x|_|_dx|_|_d|_d|_d|_ d|_ d|_ d|_ d|_ dx|_x|_x|_x|_x|_|_d|_d|_dS)NF)widgettagsautocompletewindowlistbox scrollbarorigselforegroundorigselbackground completionsmorecompletionsmodestart startindexlasttypedstartuserwantswindowhideid keypressid listupdateid winconfigid keyreleaseid doubleclickidlastkey_was_tabis_configuring)selfr r s '..\python\lib\idlelib\autocomplete_w.py__init__zAutoCompleteWindow.__init__s  BFFF$,;?>!7#  # $IM M  Mdo M(9 M   M#043E$#c2tt|jt|}d}||kr9|j|||kr"|dz }||kr|j|||k"|t|jkrA|jd|j|fzd|jt|jfz|t|kr3|jd|j|fz||d|j||_dS)Nr%s+%dc)minlenrr deleterinsertr )r!newstartmin_lenis r" _change_startz AutoCompleteWindow._change_start@sc$*oos8}}55 'kkdjmx{:: FA'kkdjmx{:: s4:   K  x4?A*>>'4?C OO*LL N N N s8}}   K  x4?A*>>'|#y * * * r$cd}t|j}||kr'||zdz}|j||kr|}n|dz}||k't|t|jdz 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. rr&)r)rr()r!sr.jms r"_binary_searchz!AutoCompleteWindow._binary_searchNs~ 3t'((q!eeQ1 A"a''E !ee 1c$*++A-...r$c||}|j|dt||kr|S|dz}t|j}||kr<||zdz}|j|dt||kr|}n|dz}||k<|dz }||kr |j|S|j|}|j|}tt|t|} t|}|| kr/||||kr|dz }|| kr||||k|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&r1)r5rr)r() r!r2firstr.r3r4last first_comp last_compr-s r"_complete_stringz#AutoCompleteWindow._complete_string[s] ##A&&  E "7CFF7 +q 0 0H AI  ! !!eeQ1 A"7CFF7+q00E !ee s D==#E* *%e, $T* c*oos9~~66 FF'kkjmy|;; FA'kkjmy|;;"1"~r$ct|jd}|j||j}|j|}|||kr|}nktt|t|}d}||kr/||||kr|dz }||kr||||k|d|}| ||j|dt|j |j kr(|j |j |j dS|j |jd|jd|jr|j|_d|_|jdt"|jD]"}|jt"|#|j||j |dSdS)zzCall when the selection of the Listbox has changed. Updates the Listbox display and calls _change_start. rr&N)selectbackgroundselectforegroundbgfg)intr curselectionseerrr5r(r)r/r configurerrcgetrr*ENDr+ select_set_selection_changed)r!curselltsselstartr,r-r.items r"rHz%AutoCompleteWindow._selection_changed{sH T\..00344    !#F+   s # #v - -HH#c((CMM22GAg++#a&HQK"7"7Qg++#a&HQK"7"7|H 8$$$  F #$4S__$4 5 C C L " "D4J484J # L L L L L L " "DL4E4Ed4K4K48L4E4Ed4K4K # M M M# *#'#7 '+$ ##As+++ ,33DL''T2222 ''(;(;DJ(G(GHHH''))))) * *r$c |\|_|_||_|j||_|j|jd|_|r||j}|j}| || |}|j||krJ|t|jdz ks)|j|dzdt||kr||kS||_ |j|_ t|jx|_} | | d | jdd| jddn#t*$rYnwxYwt-| t.x|_} t3| | jd x|_} |jD]} | t:| | d |_| d |_ | !| j" | #tHtJ| #tLtNd| (|j)| |j|*| +tX|j-|_.|j+tX|j-|_/| 0tXtbtdD]"} |j0tX| #|j+tf|j4|_5tlD]"} |j0tf| #|j+tn|j8|_9|j0tntt| +tv|j<|_=d |_>| +t~|j@|_A| +t|jC|_DdS)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!::tk::unsupported::MacWindowStylestylehelp noActivates)orientF)yscrollcommandexportselectionr>r=)command)sidefillT)rUrVexpand)Errrr indexrgetrr;r/r5r)rrToplevelr withdrawwm_overrideredirecttkcall_wTclErrorrVERTICALrListboxsetrr+rFrErrconfigyviewpackRIGHTYLEFTBOTHliftrGrHbindHIDE_VIRTUAL_EVENT_NAME hide_eventhideaidhidewid event_addHIDE_FOCUS_OUT_SEQUENCEHIDE_SEQUENCESKEYPRESS_VIRTUAL_EVENT_NAMEkeypress_eventrKEYPRESS_SEQUENCESKEYRELEASE_VIRTUAL_EVENT_NAMEkeyrelease_eventrKEYRELEASE_SEQUENCELISTUPDATE_SEQUENCElistselect_eventrr WINCONFIG_SEQUENCEwinconfig_eventrDOUBLECLICK_SEQUENCEdoubleclick_eventr)r! comp_listsrXcompleter userWantsWin completedrr.acwrrrLseqs r" show_windowzAutoCompleteWindow.show_windows%2<.$. +++E22[__T_h??  *--dj99IJE   y ) ) )##I..A"i//S)**1,,, 1%os9~~o6)CC E))+"j(0(=(==#  """  FKK;Wcf  / / / /    D %.s8%D%D%DD!(Y]9>"@"@"@ @ w$ & &D NN3 % % % %!(.@!A!A!(.@!A!A///E*** $T$ 777    3 3DJ ? ?@@@ !!!xx 7II {''(?QQ  -/FGGG! @ @C K ! !"93 ? ? ? ?+**+F+/+>@@% D DC K ! !"=s C C C C K,,-J-1-BDD ;@@#88$68LMM$\\*>*.*@BBts#E?? F  F c <|jrdSd|_|sdS |j}||j||j\}}}}|j}tj dr| | | } }| | } } | t|td| |z z} ||z} | ||zz | ks|| kr| |z } n| | z} |d| | fz||n#t($rYnwxYwtj dr9 |t,|jn#t($rYnwxYwd|_d|_dS)NTWindowsrz+%d+%dF)r is_activer rCrbboxr platformsystem startswithupdate winfo_width winfo_height winfo_rootxr(max winfo_rooty wm_geometry deiconifyupdate_idletasksr`unbindr|r)r!eventtextxycxcyr acw_width acw_height text_width text_heightnew_xnew_ys r"r}z"AutoCompleteWindow.winconfig_events-    F"~~  F ;D HHT_ % % %99T_55LAq"b)C  ++I66   $'OO$5$5s7G7G7I7IzI&*&6&6&8&8$:K:K:M:M J$$&&QAzI7M0N0N)O)OOE$$&&*Eq2v&*44z>> # OOHu~5 6 6 6 MMOOO  " " " "    D  ?   ' ' 2 2 $  -t/?@@@@    #D #s$E=F&& F32F3 G>> H  H c|jsdS |js|dSdS#t$r|YdSwxYwN)r focus_get hide_windowKeyErrorr!s r"_hide_event_checkz$AutoCompleteWindow._hide_event_checks&  F *4466 #  """"" # #             s-<AAc|rb|jtjkr"|jd|jdS|jtjkr|dSdSdS)Nr&) rtype EventTypeFocusOutr afterr ButtonPressrr!rs r"rnzAutoCompleteWindow.hide_event*s >>   #zY/// !!!T%;<<<<<y444  """"" # # 54r$c|rUd|_t|jd}||j|dSdS)NTr)rrrArrBr/rr!rrIs r"r{z#AutoCompleteWindow.listselect_event7sh >>   9#'D 2244Q788F   t/7 8 8 8 8 8 9 9r$ct|jd}||j||dS)Nr)rArrBr/rrrs r"rz$AutoCompleteWindow.doubleclick_event=sVT\..00344 4+F3444 r$c |sdS|jt|dr|j}nd}dkrd|_t dksdvs|jtkrdvr|tzst dkr| |j zndkr| |j d znd kr| |j d zntd kr| |j d znPt |j dkr| dS| |j dd|j |_ |j dt|j d|j ||j |dSdkr*|| dS|jt*krdvs|jtkrdvr|tzst|j d}|j|dt |j |j kr7|jt*ks|j r | |j|| dSdvr|sd|_t|j d}dkrd}ndkrt |jdz }ndvr|j |j |j dz }dkrt5d||z }n{dksJt7t |jdz ||z}nJdkrt5d|dz }n0dksJt7t |jdz |dz}|j ||j ||| |j|dSdkr{|sy|jrbt|j d}| |j|| dSd|_d|_dSt9fddDrdS|jr|jdkr| |j |jz|j |_ |j dt|j d|j ||j |dS| dS)Nmc_staterTabFr&) underscore BackSpace)periodminusr_r.r-breakReturn)rspace parenleft parenright bracketleft bracketright)slash backslashquotedbl apostrophe)HomeEndPriorNextUpDownTrr)rrrrrrc3 K|]}|vV dSr).0r2keysyms r" z4AutoCompleteWindow.keypress_event..s?EEfEEEEEEr$)ShiftControlAltMetaCommandOption )rrhasattrrrr)rrrr/rrrr select_clearrArBrGr5rHrrrrnearestrrr(anychar)r!rstaterInewseljumprs @r"ruz!AutoCompleteWindow.keypress_eventCsf~~ 4 5* % % NEEE U??#(D KK1  *E E E U""v#($($XI%($6{{a""4:#67777<''""4:#344448##""4:#344447""""4:#34444tz??a''$$&&&4""4:crc?333"&*D  L % %aT\-F-F-H-H-K)L)L M M M L # #D$7$7 $C$C D D D  # # % % %7 x   MMOOO      7i5  V&&i5  V>&?&?xi'&? 2244Q788F'(8TZ(89TZGGI&&$*&""4#3F#;<<<      4 E E EF$(D 2244Q788F5T-..q0,,,|++DL,E,E,G,GHH|++A../W$$ F4K00FF!V++++ T%5!6!6q!8&+FFFF4Qq))''''S!12214fQh?? L % %f - - - L # #F + + +  # # % % %   t/7 8 8 87ooeo# T\6688;<<""4#3F#;<<<  """w(,$'+$t EEEE'DEEEEE 4 Z EJ#--   tzEJ6 7 7 7"&*D  L % %aT\-F-F-H-H-K)L)L M M M L # #D$7$7 $C$C D D D  # # % % %7      4r$c|sdS|jd|jd|jt |jfzkr|dSdS)Nr+r')rr rXrr)rrrs r"rxz#AutoCompleteWindow.keyrelease_events~~  F ;  X & & ;  X#dj//(JJ K K L L         L Lr$c|jduSr)r rs r"rzAutoCompleteWindow.is_actives&d22r$c`|||jdSr)r/r;rrs r"rzAutoCompleteWindow.completes, 400<<=====r$c~|sdS|jttt D]"}|jt|#|jt|j|jt|j d|_d|_ tD]"}|jt|#|jt|j d|_ |jtt|jt|jd|_|jt"|jd|_|jr,|jt(|jd|_|j|jd|_|jd|_|jd|_dSr)rr event_deletermrrrsr rrorprvrtrrwryrrrzrrr| focus_setrdestroy)r!rs r"rzAutoCompleteWindow.hide_windows ~~  F ,,-D-D F F F! C CC K $ $% MMM 2DLAAA  % G GC K $ $%@# F F F F 6HHH   !>!4 6 6 6 8$:KLLL  /1BCCC    $  # * *+=t?O P P P#D         '')))"&r$N)__name__ __module__ __qualname__r#r/r5r;rHrr}rrnr{rrurxrrrrr$r"r r s!$!$!$F    / / /@$*$*$*LFFFP3$3$3$j    # # #999  rrrh333>>>%'%'%'%'%'r$r __main__)mainz%idlelib.idle_test.test_autocomplete_wr1F) verbosityexit)__doc__rtkinter tkinter.ttkridlelib.autocompleterridlelib.multicallrrmrrrsrtrvrwryrzr|r~r runittestrrr$r"rs!!!!!!--------&&&&&&7&)?;?C!D$*"2P'P'P'P'P'P'P'P'f zD 0AEJJJJJJr$