[ڪPdZddlZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z dZdZd Zd Zej$d ZGd d ZGdde ZGddeZGdde ZGddeZdZedk(r ddlmZedddddlmZeeyy)zLine numbering implementation for IDLE as an extension. Includes BaseSideBar which can be extended for other sidebar based extensions N)Font)idleConf) Delegator)macosxcT|j|}|rtt|SdS)z7Return the line number of an index in a Tk text widget.N)indexintfloat)textr text_indexs 6/opt/alt/python312/lib64/python3.12/idlelib/sidebar.py get_linenors'E"J%/3uZ !9T9ct|dS)z7Return the number of the last line in a Tk text widget.zend-1c)rr s r get_end_linenumberrs dH %%rcF|j|d|dd}|r|dSdS)z@Display height, in lines, of a logical line in a Tk text widget.z linestartz lineend displaylinesr)count)r rress r get_displaylinesrs9 **wj)wh'# %C3q6arc |j}|dk(r|j}n$|dk(r|j}ntd|t t |j j|d|jd|jdg}t t |j j|d|jd|jdg}||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 !9'CDD s699## V  F H& D s699## V  F H& D :rc#K|jtj d|jtjy#|jtjwxYww)Nstate) configurer$NORMALDISABLEDrs r temp_enable_text_widgetr1;sDNNN#*  R[[)R[[)s!A.A !A. "A++A.c^eZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZy) BaseSideBarz%A base class for sidebars using Text.c||_|j|_|j|_d|_|j |_|j|j|jyNF) editwin text_frameparentr is_shown init_widgets main_widget bind_events update_font update_colors)selfr6s r __init__zBaseSideBar.__init__Fs] (( LL  ,,.   rct)zzBaseSideBar.update_colors\rErct)z,Layout the widget, always using grid layout.rBrDs r rzBaseSideBar.grid`rErcL|js|jd|_yy)NT)r9rrDs r show_sidebarzBaseSideBar.show_sidebards}} IIK DMrc`|jr"|jjd|_yyr5)r9r; grid_forgetrDs r hide_sidebarzBaseSideBar.hide_sidebaris' ==    ( ( *!DM rct)z8Hook for vertical scrolling for sub-classes to override.rBr?argskwargss r yscroll_eventzBaseSideBar.yscroll_eventnrErcl|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_eventrs6  t$!t!!42622rc8|jjy)z8Redirect focus-in events to the main editor text widget.break)r focus_setr?events r redirect_focusin_eventz"BaseSideBar.redirect_focusin_eventzs rc|jj|jj|d|jy)zr)rbrcdeltar[)r rdrcrir]s r redirect_mousewheel_eventz%BaseSideBar.redirect_mousewheel_events.   #$u{{ ! Drc jjd<jjdjjjdj fd}dD]A}d|dd|dd |d fD] }||| d |dd |dfD]}||d|d Cd d d fd fd}jjd| fd}jjd| fd}jjd| fd fd}jjd| fd}jjd|y)Nyscrollcommandz rhctjj|}jj ||y)N)re) functoolspartialrfr;bind)retarget_event_namehandlerr?s r bind_mouse_eventz1BaseSideBar.bind_events..bind_mouse_events5''(G(G3DFG    ! !*g 6r)zz)rqz.drag_update_selection_and_insert_marks S ?;F:v./DAq II u 5 II  es"X!A#bz : II  x,2aK&VaZ!HK Mrcttjjd|j|j|jy)Nrz)r r r rrc)r^rlast_yr?rs r b1_mousedown_handlerz5BaseSideBar.bind_events..b1_mousedown_handlers@U499??S ?#CDEJWWF 1%'' :rz c^ddjjdd|jy)Nrra)r rdrc)r^rr?rs r b1_mouseup_handlerz3BaseSideBar.bind_events..b1_mouseup_handlers- JF II $ $%8A $ IrrcHy|j|jyN)rc)r^rrs r b1_drag_handlerz0BaseSideBar.bind_events..b1_drag_handlers ~WWF 1%'' :rz c}|jjdy|dkr(jjd|zd|n_|jj kDrBjjd|zjj z d|jj dy)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  --.EF*.'Q &&rAvx85a8T%%2244 &&q1ut/?/?/L/L/N'N'/15a8  &&r+;< $rc\)|jjjdyy)Nr)rcr;r)r^rrr?rs r b1_leave_handlerz1BaseSideBar.bind_events..b1_leave_handlers5'.$$**1.>?(/rz cFjjdyyr)r;r)r^rr?s r b1_enter_handlerz1BaseSideBar.bind_events..b1_enter_handlers+'2  --.EF*.'3rz )rYr r;rpr_rj)r?rsbuttonrerrrrrrrrrrs` @@@@@r r<zBaseSideBar.bind_eventss&*&A&A "# k4+F+FG nd.L.LM  7 #F!)&3!0:!#F884! !zJ !"1:!0:! !5=fXQ3GI!#"  #' M ; l,@A J 13EF ; m_= = =& @ l,<= / l,<=rN)__name__ __module__ __qualname____doc__r@r:r=r>rrLrOrTrYr_rfrjr<rr r3r3DsG/ """"! " "3   |>rr3c&eZdZdZdZddZddZy)EndLineDelegatorz}Generate callbacks with the current end line number. The provided callback is called after every insert and delete. c<tj|||_yr)rr@changed_callback)r?rs r r@zEndLineDelegator.__init__s4 0rNc|jj||||jt|jyr)delegaterrr)r?rcharstagss r rzEndLineDelegator.inserts0 UE40 0?@rc|jj|||jt|jyr)rdeleterr)r?index1index2s r rzEndLineDelegator.deletes. VV, 0?@rr)rrrrr@rrrrr rr s1AArrcFeZdZdZfdZdZdZdZdZdZ dZ xZ S) LineNumbersz(Line numbers support for editor windows.ct||t|j}|jj j ||jjy)Nr)superr@rupdate_sidebar_textr6perinsertfilterafterundo)r?r6end_line_delegator __class__s r r@zLineNumbers.__init__sQ !-d.F.FG **+=151B1B + Drc t|j\}}tj|jdtj d|dd|_|j jtjd|_ t|j d|_ t|j 5|j jddd ddd|j jd d |j jd tj t!|j}|j#||j S#1swYxYw) 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's (3 tGGDKKqrww)*01aI   r{{ 3 #'(9(9'(B#C $T%6%6 7    $ $XsL A8   5% H $$\288$D +   %   8 7s 5EEc\|jjddtjy)Nr~rrowcolumnsticky)rrr$NSEWrDs r rzLineNumbers.grid:s! 1Qrww?rcdtj|jdd}||jd<y)Nmain EditorWindowfont)rGetFontr r)r?rs r r=zLineNumbers.update_font=s* 6>B$(&!rctjtjd}|d}|d}|jj |||||y)rIr foreground background)fgbgselectforegroundselectbackgroundinactiveselectbackgroundN)r GetHighlight CurrentThemerr)r?colorsrrs r r>zLineNumbers.update_colorsAsW&&x'<'<'> ML) L)    j'*%/ ! rc||jk(rytt|tt|jz }|rDtt |j d}||z}|j ||j d<t|j 5||jkDrldjtjdgttt|jdz|dz}|j jd|dn"|j j|dzddddd||_y#1swY||_yxYw) 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% $--  s3x=3s4==/A+BB E$"3"3G"<=>I!$44I)-)A)A))LD  g & $T%6%6 7T]]"99Y__DU4==1#4cAg>?&!!((7X|L!!((CE7&)99E8 8 s BE  Ec@|jj|dy)Nrr[)r yview_movetorQs r rTzLineNumbers.yscroll_eventgs &&tAw/r) rrrrr@r:rr=r>rrT __classcell__rs@r rrs+2D!&@)  6rrc"eZdZdZddZddZy) WrappedLineHeightChangeDelegatorc<tj|||_y)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}|r t||}|jj||||rt||}|k(ry|jy)Nr)rrrr)r?rrris_single_linebefore_displaylinesafter_displayliness r rz'WrappedLineHeightChangeDelegator.insertvsWU* "24"?  UE40 !1$!> !%88 rc||dz}t||t||k(}|r t||}|jj|||rt||}|k(ry|j y)Nz+1c)rrrrr)r?rrrrrs r rz'WrappedLineHeightChangeDelegator.deletesq >e^F#D&1Zf5MM "24"@  VV, !1$!? !%88 rr)rrrr@rrrrr rrls! rrc\eZdZdZfdZdZfdZdZdZdZ dZ d Z d Z d Z xZS) ShellSidebarz0Sidebar for the PyShell window, for prompts etc.cd|_i|_t| |t |j }|j jj}|j|jure|j|j jjur9|j}|j|j jjur9|j jj||d|_ y)NrT)canvas line_promptsrr@rchange_callbackr6rtoprr bottomrr9)r?r6change_delegatordrs r r@zShellSidebar.__init__s  ! -T-A-A B  LL    ::TYY &**DLL$4$4$;$;;JJ**DLL$4$4$;$;; **+;1*E rctj|jdddd|_|j |j |jS)NrF)rrrr)r$Canvasr8rupdate_sidebarrrDs r r:zShellSidebar.init_widgetssCii 2,-!*/1   {{rct||jjt j rdnd|j y)Nz z )rr<r;rprisAquaTkcontext_menu_event)r?rs r r<zShellSidebar.bind_eventss9  "OO-L<  # # rc`tjjd}tjj dd}fd}|j d|d|rdnd |j d |d |rdnd |j|j|jy )Nr)tearoffr{r|cfdS)Nc:jjSr)r rd eventnamer?sr z@ShellSidebar.context_menu_event..mkcmd..s49933I>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((!4TYY44UEBC  ? "' "3,9z  K  3"'(?"@,9z  K u||U\\2rc`|jjddtjddy)Nr~rrt)rrrrr)rrr$rrDs r rzShellSidebar.grids# QqqqIrc>|jr|jyyr)r9rrDs r rzShellSidebar.change_callbacks ==    ! rc h|j}|j}|j}ix}|_|j t j |jd}|jddddk7r|j|d}|j|x}|d}||d}d|vrdnd |vrd nd} | rM|jd |t j| |j|jd  t||} | || <|j|d}|j|x}yy)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:yy +-- t( bff 6" ;;sA q !S (JJ%(89:E>>%00x= A$1UG>2J$K !"&;; $99  ""1aF(,  A#H#D%0'- V$JJ%/0E >>%00x=rc$|jy)rVr[)rrQs r rTzShellSidebar.yscroll_events rctj|jdd}t|j|t fddD}|j j |dzdz||_|jy ) rGrr)rc3@K|]}j|ywr)measure).0chartk_fonts r z+ShellSidebar.update_font..sF:4.:s)rxr,rurv)rN) rrr rmaxrr.rr)r?r char_widthrBs @r r=zShellSidebar.update_fontsl 6>Btyyt,F:FF  JNQ$67  rc"tjtjd}tjtjd}|d}|d}||f|_|jj ||j y)rIrr.rr)rN)rrrrrr.r)r?linenumbers_colors prompt_colorsrrs r r>zShellSidebar.update_colorssz%2283H3H3JLY --h.C.C.EyQ "<0 ' 5 !:.  4 r)rrrrr@r:r<rrrrrTr=r>rrs@r rrs9:$  J"14rrc ddlm}tj|}tj|}|j tj tjd|jdd|jddtj|dd}tj|d d tj| }|jddtj ||}tj ||_t%|}|j'|j)d dj+dt-ddDy)Nr) Dummy_editwinT)sider1expandr~)weightrrP)rheightrrrr|rc3&K|] }d|z yw)rNr)r@is r rCz,_sidebar_number_scrolling..s > 1Q se)idlelib.idle_test.test_sidebarrJr$ToplevelFramerLEFTBOTH rowconfigurecolumnconfigurerrrrrr ScrollbarrWrrLrrr)r8rJrr7rr r6 linenumberss r _sidebar_number_scrollingr]s< ++f C#JOOrwwtO<Aa(q+   C 8D 77:Rt LDII!AbggI.D!G<< +GLg&KKKtyy >a >>?r__main__)rzidlelib.idle_test.test_sidebarrtF) verbosityexit)run)r contextlibrnrtkinterr$ tkinter.fontridlelib.configridlelib.delegatorridlelibrrrrr*contextmanagerr1r3rrrrr]runittestridlelib.idle_test.htestrarrr rks#': &  4 **C>C>LAyA$M+M`&y&Rm;m`@, z )QUC+!" r