\dO|dZddlZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z dZdZd Zd Zejd ZGd d ZGdde ZGddeZGdde ZGddeZdZedkr'ddlmZedddddlmZeedSdS)zLine numbering implementation for IDLE as an extension. Includes BaseSideBar which can be extended for other sidebar based extensions N)Font)idleConf) Delegator)macosxcl||}|rtt|ndS)z7Return the line number of an index in a Tk text widget.N)indexintfloat)textr text_indexs ..\python\lib\idlelib\sidebar.py get_linenors3E""J%/ 93uZ  ! ! !T9c"t|dS)z7Return the number of the last line in a Tk text widget.zend-1c)rr s r get_end_linenumberrs dH % %%rcT||d|dd}|r|dndS)z@Display height, in lines, of a logical line in a Tk text widget.z linestartz lineend displaylinesr)count)r rress r get_displaylinesrsD **)))'''# % %C 3q66arc |}|dkr|}n-|dkr|}ntd|t t |jj|d|d|dg}t t |jj|d|d|dg}||fS)z;Get the total padding of a Tk widget, including its border.packgridzUnsupported geometry manager: padxborderpady) winfo_manager pack_info grid_info ValueErrorsummaptkgetintcget)widgetmanagerinforrs r get_widget_paddingr*!s""$$G&!! F  !!C'CCDDD s69# V  F H&  D s69# V  F H&  D :rc#K|tj dV|tjdS#|tjwxYw)Nstate) configurer$NORMALDISABLEDrs r temp_enable_text_widgetr1;sbNNN###*  R[)))))R[))))s A "A,c`eZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdS) BaseSideBarz%A base class for sidebars using Text.c||_|j|_|j|_d|_||_||| dSNF) editwin text_frameparentr is_shown init_widgets main_widget bind_events update_font update_colors)selfr6s r __init__zBaseSideBar.__init__Fss ( L  ,,..   rct)zzBaseSideBar.update_colors\rErct)z,Layout the widget, always using grid layout.rBrDs r rzBaseSideBar.grid`rErcN|js|d|_dSdS)NT)r9rrDs r show_sidebarzBaseSideBar.show_sidebards.} ! IIKKK DMMM ! !rcX|jr"|jd|_dSdSr5)r9r; grid_forgetrDs r hide_sidebarzBaseSideBar.hide_sidebaris6 = "   ( ( * * *!DMMM " "rct)z8Hook for vertical scrolling for sub-classes to override.rBr?argskwargss r yscroll_eventzBaseSideBar.yscroll_eventnrErcD|jjj||j|i|S)mRedirect vertical scrolling to the main editor text widget. The scroll bar is also updated. )r6vbarsetrTrQs r redirect_yscroll_eventz"BaseSideBar.redirect_yscroll_eventrs1  t$$!t!426222rc8|jdS)z8Redirect focus-in events to the main editor text widget.break)r focus_setr?events r redirect_focusin_eventz"BaseSideBar.redirect_focusin_eventzs wrc||j|j|d|jdS)zr)rbrcdeltar[)r rdrcrir]s r redirect_mousewheel_eventz%BaseSideBar.redirect_mousewheel_events6   #$u{ ! D D Dwrc jjd<jdjjdjfd}dD]C}d|dd|dd |d fD]}||| d |dd |dfD]}||d|d Dd d d fd fd}jd| fd}jd| fd}jd| fd fd}jd| fd}jd|dS)Nyscrollcommandz rhcttjj|}j||dS)N)re) functoolspartialrfr;bind)retarget_event_namehandlerr?s r bind_mouse_eventz1BaseSideBar.bind_events..bind_mouse_eventsD'(G3DFFFG   ! !*g 6 6 6 6 6r)zz)rqz.drag_update_selection_and_insert_marks ???;;F:v.//DAq I u 5 5 5 I  eXXX!A#zzz : : : I  x,2aKK&&VaZKKK M M M M Mrcttjd|j|j|jdS)Nrz)r r r rrc)r^rlast_yr?rs r b1_mousedown_handlerz5BaseSideBar.bind_events..b1_mousedown_handlersPU49?????#C#CDDEEJWF 1 1%' : : : : :rz cTddjdd|jdS)Nrra)r rdrc)r^rr?rs r b1_mouseup_handlerz3BaseSideBar.bind_events..b1_mouseup_handlers5 JF I $ $%8A $ I I I I Irrc>dS|j|jdSN)rc)r^rrs r b1_drag_handlerz0BaseSideBar.bind_events..b1_drag_handlers-~WF 1 1%' : : : : :rz c}|jddS|dkr*jd|zd|n`|jkrCjd|zjz d|jddS)z6Mimic Text auto-scrolling when dragging outside of it.Nrpixelsr~2)r; after_cancelr yview_scroll winfo_heightafter)rcauto_scrolling_after_idrrr?text_auto_scrolls r rz1BaseSideBar.bind_events..text_auto_scrollsAy --.EFFF*.'Q &&rAvx88855a8888T%224444 &&q1ut/?/L/L/N/N'N'/11155a888 &&r+;<< $ # #rcT$|jjddSdS)Nr)rcr;r)r^rrr?rs r b1_leave_handlerz1BaseSideBar.bind_events..b1_leave_handlers<'.$**1.>??(''/.rz cHjddSdSr)r;r)r^rr?s r b1_enter_handlerz1BaseSideBar.bind_events..b1_enter_handlers7'2 --.EFFF*.'''32rz )rYr r;rpr_rj)r?rsbuttonrerrrrrrrrrrs` @@@@@r r<zBaseSideBar.bind_eventss&*&A "# k4+FGGG nd.LMMM  7 7 7 7 7 # I IF3&333::::4F444! K K ! zJJJJJ ;:::::::! I I ! 3Gf3G3G3GIIIII I  #' M M M M M M ; ; ; ; ; ; ; ; l,@AAA J J J J J J J 13EFFF ; ; ; ; ; ; m_=== = = = = = = = = =& @ @ @ @ @ @ @ @ l,<=== / / / / / / l,<=====rN)__name__ __module__ __qualname____doc__r@r:r=r>rrLrOrTrYr_rfrjr<rr r3r3Ds//   """"""""""""!!! """ """333   |>|>|>|>|>rr3c(eZdZdZdZddZddZdS)EndLineDelegatorz}Generate callbacks with the current end line number. The provided callback is called after every insert and delete. c<tj|||_dSr)rr@changed_callback)r?rs r r@zEndLineDelegator.__init__s!4   0rNc|j||||t|jdSr)delegaterrr)r?rcharstagss r rzEndLineDelegator.insertsA UE4000 0??@@@@@rc|j|||t|jdSr)rdeleterr)r?index1index2s r rzEndLineDelegator.deletes? VV,,, 0??@@@@@rr)rrrrr@rrrrr rr s_111AAAAAAAAAArrcFeZdZdZfdZdZdZdZdZdZ dZ xZ S) LineNumbersz(Line numbers support for editor windows.ct|t|j}|jj||jjdS)Nr)superr@rupdate_sidebar_textr6perinsertfilterafterundo)r?r6end_line_delegator __class__s r r@zLineNumbers.__init__sj !!!-d.FGG **+=151B + D D D D Drc t|j\}}tj|jdtjd|dd|_|jtjd|_ t|jd|_ t|j5|j ddd dddn #1swxYwY|jd d |jd tj t!|j}|||jS) Nr~rtr)widthwraprr borderwidthhighlightthicknessr,rr1 linenumberF) takefocusexportselection)justify)r*r r$Textr8NONE sidebar_textconfigr0prev_endtype_sidebar_width_typer1r tag_configRIGHTrr)r?_padxrr}s r r:zLineNumbers.init_widgets'sz(33 tGDKqrw)*01aIII   r{ 333 #'(9'(B#C#C $T%6 7 7 B B   $ $XsL A A A B B B B B B B B B B B B B B B   5% HHH $$\28$DDD ++   %%%  s&CCCcT|jddtjdS)Nr~rrowcolumnsticky)rrr$NSEWrDs r rzLineNumbers.grid:s( 1Qrw?????rcPtj|jdd}||jd<dS)Nmain EditorWindowfont)rGetFontr r)r?rs r r=zLineNumbers.update_font=s+ 6>BB$(&!!!rctjtjd}|d}|d}|j|||||dS)rIr foreground background)fgbgselectforegroundselectbackgroundinactiveselectbackgroundN)r GetHighlight CurrentThemerr)r?colorsrrs r r>zLineNumbers.update_colorsAsh&x'<'>'> MML) L)    j'*%/ !     rc||jkrdStt|tt|jz }|rItt |jd}||z}|||jd<t|j5||jkrrdtj dgttt|jdz|dz}|j d|dn!|j|dzdddddn #1swxYwY||_dS) z Perform the following action: Each line sidebar_text contains the linenumber for that line Synchronize with editwin.text so that both sidebar_text and editwin.text contain the same number of linesNr r~zend -1crz.0 -1c)rlenstrr r rrr1join itertoolschainr#rangerr)r?r}width_difference cur_width new_widthnew_texts r rzLineNumbers.update_sidebar_textLs $-   Fs3xx==3s4=/A/A+B+BB  ME$"3G"<==>>I!$44I)-)A)A))L)LD g & $T%6 7 7 F FT]""99Y_DU4=1#4cAg>>??&&!((X|LLLL!((CE)9)9)99EEE F F F F F F F F F F F F F F F s+BEEEcF|j|ddS)Nrr[)r yview_movetorQs r rTzLineNumbers.yscroll_eventgs" &&tAw///wr) rrrrr@r:rr=r>rrT __classcell__rs@r rrs22DDDDD!!!&@@@)))    6rrc$eZdZdZddZddZdS) WrappedLineHeightChangeDelegatorc<tj|||_dS)z callback - Callable, will be called when an insert, delete or replace action on the text widget may require updating the shell sidebar. N)rr@callback)r?rs r r@z)WrappedLineHeightChangeDelegator.__init__ms 4     rNcd|v}|rt||}|j||||rt||}||krdS|dS)Nr)rrrr)r?rrris_single_linebefore_displaylinesafter_displayliness r rz'WrappedLineHeightChangeDelegator.insertvsyU*  @"24"?"?  UE4000  !1$!>!> !%888 rc||dz}t||t||k}|rt||}|j|||rt||}||krdS|dS)Nz+1c)rrrrr)r?rrrrrs r rz'WrappedLineHeightChangeDelegator.deletes >e^F#D&11Zf5M5MM  A"24"@"@  VV,,,  !1$!?!? !%888 rr)rrrr@rrrrr rrlsK!!!    rrc\eZdZdZfdZdZfdZdZdZdZ dZ d Z d Z d Z xZS) ShellSidebarz0Sidebar for the PyShell window, for prompts etc.cd|_i|_t|t |j}|jjj}|j |j ur7|j |jjj ur|j }|j |jjj u|jj ||d|_ dS)NrT)canvas line_promptsrr@rchange_callbackr6rtoprr bottomrr9)r?r6change_delegatordrs r r@zShellSidebar.__init__s  !!! -T-A B B  L   :TY & &*DL$4$;;;J*DL$4$;;; **+;1*EEE rctj|jdddd|_|||jS)NrF)rrrr)r$Canvasr8rupdate_sidebarrrDs r r:zShellSidebar.init_widgetssQi 2,-!*/111   {rct|jt jrdnd|jdS)Nz z )rr<r;rprisAquaTkcontext_menu_event)r?rs r r<zShellSidebar.bind_eventssX  "O-- ?LL<  #     rcltjjd}tjdd}fd}|d|d|rdnd |d |d |rdnd ||j|j d S)Nr)tearoffr{r|cfdS)Nc8jSr)r rd eventnamer?sr z@ShellSidebar.context_menu_event..mkcmd..s4933I>>rrrs`r mkcmdz.ShellSidebar.context_menu_event..mkcmds>>>>> >rCopyz<>normaldisabled)labelcommandr-zCopy with promptsz<>r[) r$Menur;boolr tag_nextrange add_commandtk_popupx_rooty_root)r?r^rmenu has_selectionrs` r rzShellSidebar.context_menu_events(!444TY44UEBBCC  ? ? ? ? ? "'% "3"3,9 Iz  K K K  3"'%(?"@"@,9 Iz  K K K u|U\222wrcX|jddtjdddS)Nr~rrt)rrrrr)rrr$rrDs r rzShellSidebar.grids+ QqqqIIIIIrc@|jr|dSdSr)r9rrDs r rzShellSidebar.change_callbacks. = "    ! ! ! ! ! " "rc |j}|j}|j}ix}|_|t j|d}|ddddkr||d}| |x}|d}||d}d|vrdnd |vrd nd} | rJ| d |t j | |j |j d  t||} | || <||d}| |x}dSdS)Nz@0,0.r~0z+1line linestartz linestart -1cconsolez>>>stdinz...rtr)anchorr rfillz+1line)r tag_namesrrrr$ALLrsplit dlineinfo create_textNWrrr) r?r text_tagnamesrrrlineinforcprev_newline_tagnamespromptrs r rzShellSidebar.update_sidebars{y +-- t( bf 6"" ;;sA  q !S ( (JJ%999::E>>%000x= A$1MU2J2J2J$K$K !"&;;; $999   .""1aF(,  A#HHH#D%00'- V$JJ%///00E >>%000x=====rc.|dS)rVr[)rrQs r rTzShellSidebar.yscroll_events wrctj|jdd}t|j|t fddD}|j|dzdz||_|d S) rGrr)rc3BK|]}|VdSr)measure).0chartk_fonts r z+ShellSidebar.update_font..s/FF4..FFFFFFr)rxr,rurv)rN) rrr rmaxrr.rr)r?r char_widthrBs @r r=zShellSidebar.update_fonts 6>BBtyt,,,FFFF:FFFFF  JNQ$6777  rc.tjtjd}tjtjd}|d}|d}||f|_|j||dS)rIrr.rr)rN)rrrrrr.r)r?linenumbers_colors prompt_colorsrrs r r>zShellSidebar.update_colorss%283H3J3JLYY -h.C.E.EyQQ "<0 ' 5 !:.  444 r)rrrrr@r:r<rrrrrTr=r>rrs@r rrs::$        JJJ"""1114rrc ddlm}tj|}tj|}|tjtjd|dd| ddtj |dd}tj |d d tj | }|ddtj ||}tj||_t%|}||d ddt-ddDdS)Nr) Dummy_editwinT)sider1expandr~)weightrrP)rheightrrrr|rc3 K|] }d|zV dS)rNr)r@is r rCz._linenumbers_drag_scrolling..s& > >1Q > > > > > >re)idlelib.idle_test.test_sidebarrJr$ToplevelFramerLEFTBOTH rowconfigurecolumnconfigurerrrrrr ScrollbarrWrrLrrr)r8rJtoplevelr7rr r6 linenumberss r _linenumbers_drag_scrollingr^sF<<<<<<{6""H(##JOOrwtO<<<Aa(((q+++  Hfn = =D 7:Rt L L LDII!AbgI...mD!!G< ++GLg&&KKKtyy > >a > > >>>?????r__main__)rzidlelib.idle_test.test_sidebarrtF) verbosityexit)run)r contextlibrnrtkinterr$ tkinter.fontridlelib.configridlelib.delegatorridlelibrrrrr*contextmanagerr1r3rrrrr^runittestridlelib.idle_test.htestrbrrr rlsR######''''''::: &&&    4 ***C>C>C>C>C>C>C>C>LAAAAAyAAA$MMMMM+MMM`&&&&&y&&&Rmmmmm;mmm`@@@, zD )QUCCCC++++++C#$$$$$ r