egOLSrSSKrSSKrSSKrSSKrSSKJr SSKJ r SSK J r SSK J r SrSrS rS r\R$S 5r"S S 5r"SS\ 5r"SS\5r"SS\ 5r"SS\5rSr\S:XaSSKJr \"SSSS9 SSKJr \"\5 gg)zLine numbering implementation for IDLE as an extension. Includes BaseSideBar which can be extended for other sidebar based extensions N)Font)idleConf) Delegator)macosxc^URU5nU(a[[U55$S$)z7Return the line number of an index in a Tk text widget.N)indexintfloat)textr text_indexs 5/opt/imh/python3.13/lib/python3.13/idlelib/sidebar.py get_linenors'E"J%/3uZ !9T9c[US5$)z7Return the number of the last line in a Tk text widget.zend-1c)rr s r get_end_linenumberrs dH %%rc2URUS3US3SSS9$)z@Display height, in lines, of a logical line in a Tk text widget.z linestartz lineend displaylinesT) return_ints)count)r rs r get_displaylinesrs0 ::z*x($$  88rc UR5nUS:XaUR5nO%US:XaUR5nO[SU35e[ [ UR RUSURS5URS5/55n[ [ UR RUSURS5URS5/55nX44$)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## UR[RS9 Sv UR[RS9 g!UR[RS9 f=f7f)Nstate) configurer$NORMALDISABLEDrs r temp_enable_text_widgetr1:sCNNN#*  R[[)R[[)sA%AA%A""A%cf\rSrSrSrSrSrSrSrSr Sr S r S r S r S rS rSrSrSrg) BaseSideBarCz%A base class for sidebars using Text.cXlURUlURUlSUlUR 5UlUR5 UR5 UR5 gNF) editwin text_frameparentr is_shown init_widgets main_widget bind_events update_font update_colors)selfr7s r __init__BaseSideBar.__init__Es[ (( LL  ,,.   rc[e)zBaseSideBar.update_fontWrHrc[e)=Update the sidebar text colors, usually after config changes.rDrFs r r?BaseSideBar.update_colors[rHrc[e)z,Layout the widget, always using grid layout.rDrFs r rBaseSideBar.grid_rHrcVUR(dUR5 SUlgg)NT)r:rrFs r show_sidebarBaseSideBar.show_sidebarcs}} IIK DMrcjUR(a"URR5 SUlggr6)r:r< grid_forgetrFs r hide_sidebarBaseSideBar.hide_sidebarhs' ==    ( ( *!DM rc[e)z8Hook for vertical scrolling for sub-classes to override.rDr@argskwargss r yscroll_eventBaseSideBar.yscroll_eventmrHrclURRR"U6 UR"U0UD6$)]Redirect vertical scrolling to the main editor text widget. The scroll bar is also updated. )r7vbarsetr\rYs r redirect_yscroll_event"BaseSideBar.redirect_yscroll_eventqs2 t$!!42622rc8URR5 g)z8Redirect focus-in events to the main editor text widget.break)r focus_setr@events r redirect_focusin_event"BaseSideBar.redirect_focusin_eventys rcURR5 URRUSURS9 g)zr)rmrndeltare)r rornrurgs r redirect_mousewheel_event%BaseSideBar.redirect_mousewheel_events.   #$u{{ ! Drc^^ ^ ^ ^ ^ TRTRS'TRRSTR5 TRRSTR 5 U4SjnSH?nSUS3SUS3S US 34H nU"X3S 9 M S US3S US34HnU"USUS3S 9 M MA Sm Sm Sm UU 4Sjm U U UU 4SjnTRRSU5 U UU 4SjnTRRSU5 U U 4SjnTRRSU5 U U U UU 4Sjm U U UU 4SjnTRRSU5 U U4SjnTRRSU5 g)Nyscrollcommandz rtcz>[R"TRUS9nTRR X5 g)N)rp) functoolspartialrqr<bind)rptarget_event_namehandlerr@s r bind_mouse_event1BaseSideBar.bind_events..bind_mouse_events3''(G(G3DFG    ! !* 6r)zz)r~z[TRSU35n[TU/5up#TRRSSS5 TRR SUS3US-S35 TRR SX:XaUOUS-S35 g) z6Helper function for drag and selection event handlers.@0,sel1.0endz.0insertN)rr sorted tag_removetag_addmark_set)y_coordlinenoabr@ start_lines r %drag_update_selection_and_insert_markFBaseSideBar.bind_events..drag_update_selection_and_insert_marks S ?;F:v./DA II u 5 II  es"X!A#bz : II  x,2K&VaZ!HK Mrc>[[TRRSUR3555mURmT"UR5 g)Nr)r r r rrn)rhrlast_yr@rs r b1_mousedown_handler5BaseSideBar.bind_events..b1_mousedown_handlers@U499??S ?#CDEJWWF 1%'' :rz cX>SmSmTRRSSURS9 g)Nrrl)r rorn)rhrr@rs r b1_mouseup_handler3BaseSideBar.bind_events..b1_mouseup_handlers- JF II $ $%8A $ IrrcJ>TcgURmT"UR5 gN)rn)rhrrs r b1_drag_handler0BaseSideBar.bind_events..b1_drag_handlers ~WWF 1%'' :rz c>TnUcTRRT5 SmgUS:a(TRRSU-S5 T"U5 O`UTRR 5:aBTRRSU-TRR 5- S5 T"U5 TRR ST5mg)z6Mimic Text auto-scrolling when dragging outside of it.Nrpixelsr2)r< after_cancelr yview_scroll winfo_heightafter)rnauto_scrolling_after_idrrr@text_auto_scrolls r r1BaseSideBar.bind_events..text_auto_scrollsAy  --.EF*.'Q &&rAvx85a8T%%2244 &&q1ut/?/?/L/L/N'N'/15a8  &&r+;< $rc^>Tc)URmTRRST5mgg)Nr)rnr<r)rhrrr@rs r b1_leave_handler1BaseSideBar.bind_events..b1_leave_handlers5'.$$**1.>?(/rz cH>TbTRRT5 Smggr)r<r)rhrr@s r b1_enter_handler1BaseSideBar.bind_events..b1_enter_handlers+'2  --.EF*.'3rz )rbr r<r}rirv)r@rbuttonrprrrrrrrrrrs` @@@@@r r=BaseSideBar.bind_eventss&*&A&A "# k4+F+FG nd.L.LM  7 #F!)&3!0:!#F884! !J !"1:!0:! !5=fXQ3GI!#"  #' M ; ; l,@A J 13EF ; m_= = =& @ @ l,<= / l,<=r)r7r:r<r9r N)__name__ __module__ __qualname____firstlineno____doc__rAr;r>r?rrRrVr\rbrirqrvr=__static_attributes__rr r3r3CsG/ """"! " "3   |>rr3c2\rSrSrSrSrSSjrSSjrSrg) EndLineDelegatori zuGenerate callbacks with the current end line number. The provided callback is called after every insert and delete. c<[R"U5 Xlgr)rrAchanged_callback)r@rs r rAEndLineDelegator.__init__s4 0rNcURRXU5 UR[UR55 gr)delegaterrr)r@rcharstagss r rEndLineDelegator.inserts. U40 0?@rcURRX5 UR[UR55 gr)rdeleterr)r@index1index2s r rEndLineDelegator.deletes, V, 0?@r)rr) rrrrrrArrrrrr rr s1AArrcP^\rSrSrSrU4SjrSrSrSrSr Sr S r S r U=r $) LineNumbersiz(Line numbers support for editor windows.c>[TU]U5 [UR5nURR R UURRS9 g)Nr)superrArupdate_sidebar_textr7perinsertfilterafterundo)r@r7end_line_delegator __class__s r rALineNumbers.__init__sQ !-d.F.FG **+=151B1B + Drc [UR5up[R"URS[R SUSSS9UlUR R[RS9 SUl [UR S5Ul [UR 5 UR RSSS 5 SSS5 UR RS S S 9 UR RS [RS 9 [!UR5nUR#U5 UR $!,(df  N=f) Nrrr)widthwraprr borderwidthhighlightthicknessr,rr1 linenumberF) takefocusexportselection)justify)r*r r$Textr9NONE sidebar_textconfigr0prev_endtype_sidebar_width_typer1r tag_configRIGHTrr)r@_padxrrs r r;LineNumbers.init_widgets&s (3 GGDKKqrww)*01aI   r{{ 3 #'(9(9'(B#C $T%6%6 7    $ $XsL A8   5% H $$\288$D +   %   8 7s /E  EcVURRSS[RS9 g)Nrrrowcolumnsticky)rrr$NSEWrFs r rLineNumbers.grid9s! 1Qrww?rcd[R"URSS5nXRS'g)Nmain EditorWindowfont)rGetFontr r)r@rs r r>LineNumbers.update_font<s( 6>B$(&!rc[R"[R"5S5nUSnUSnURR X#X#US9 g)rMr foreground background)fgbgselectforegroundselectbackgroundinactiveselectbackgroundN)r GetHighlight CurrentThemerr)r@colorsrrs r r?LineNumbers.update_colors@sS&&x'<'<'> ML) L)    '%/ ! rcXR:Xag[[U55[[UR55- nU(aC[[ UR S55nX2-nUR U5UR S'[UR 5 XR:amSR[R"S/[[[URS-US-5555nUR RSUS5 O"UR RUS-S3S5 SSS5 Xlg!,(df  N=f) 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 rzend -1crz.0 -1c)rlenstrr r rrr1join itertoolschainr#rangerr)r@rwidth_difference cur_width new_widthnew_texts r rLineNumbers.update_sidebar_textKs --  s3x=3s4==/A+BB E$"3"3G"<=>I!4I)-)A)A))LD  g & $T%6%6 7]]"99Y__DU4==1#4cAg>?&!!((7X|L!!((CE7&)99E8 8 7s #BE Ec@URRUS5 g)Nrre)r yview_movetorYs r r\LineNumbers.yscroll_eventfs &&tAw/r)rrr)rrrrrrAr;rr>r?rr\r __classcell__rs@r rrs02D!&@)  6rrc.\rSrSrSrSSjrSSjrSrg) WrappedLineHeightChangeDelegatorikc<[R"U5 Xlg)z callback - Callable, will be called when an insert, delete or replace action on the text widget may require updating the shell sidebar. N)rrAcallback)r@rs r rA)WrappedLineHeightChangeDelegator.__init__ls 4  rNcSU;nU(a [X5nURRXU5 U(a[X5nUW:XagUR5 g)Nr )rrrr)r@rrris_single_linebefore_displaylinesafter_displayliness r r'WrappedLineHeightChangeDelegator.insertusQU* "24"?  U40 !1$!> !%88 rcUcUS-n[X5[X5:HnU(a [X5nURRX5 U(a[X5nUW:XagUR 5 g)Nz+1c)rrrrr)r@rrr!r"r#s r r'WrappedLineHeightChangeDelegator.deletesg >e^F#D1Z5MM "24"@  V, !1$!? !%88 r)rr)rrrrrArrrrrr rrks! rrch^\rSrSrSrU4SjrSrU4SjrSrSr Sr S r S r S r S rS rU=r$) ShellSidebariz0Sidebar for the PyShell window, for prompts etc.c>SUl0Ul[TU] U5 [ UR 5nUR RRnURURLahURUR RRLa;URnURUR RRLaM;UR RRX#S9 SUl g)NrT)canvas line_promptsrrArchange_callbackr7rtoprr bottomrr:)r@r7change_delegatordrs r rAShellSidebar.__init__s  ! -T-A-A B  LL    ::TYY &**DLL$4$4$;$;;JJ**DLL$4$4$;$;; **+;*E rc[R"URSSSSS9UlUR 5 UR 5 UR$)NrF)rrrr)r$Canvasr9r*update_sidebarrrFs r r;ShellSidebar.init_widgetssCii 2,-!*/1   {{rc>[TU]5 URR[R "5(aSOSUR 5 g)Nz z )rr=r<r}risAquaTkcontext_menu_event)r@rs r r=ShellSidebar.bind_eventss<  "OO--L<  # # rcf^[R"TRSS9n[TRR SS55nU4SjnUR SU"S5U(aSOS S 9 UR S U"S 5U(aSOS S 9 URURUR5 g )Nr)tearoffrrc>^UU4Sj$)Nc:>TRRT5$r)r ro eventnamer@sr @ShellSidebar.context_menu_event..mkcmd..s49933I>rrr?s`r mkcmd.ShellSidebar.context_menu_event..mkcmds > >rCopyz<>normaldisabled)labelcommandr-zCopy with promptsz<>re) r$Menur<boolr tag_nextrange add_commandtk_popupx_rooty_root)r@rhrmenu has_selectionrCs` r r9ShellSidebar.context_menu_events((!4TYY44UEBC  ? "' "3,9z  K  3"'(?"@,9z  K u||U\\2rcZURRSS[RSSS9 g)Nrrr)rrrrr)r*rr$rrFs r rShellSidebar.grids# QqqqIrcHUR(aUR5 ggr)r:r5rFs r r,ShellSidebar.change_callbacks ==    ! rc vURnURnURn0=o@lUR [ R 5 URS5nURSS5SS:waURUS35nURU5=nbUSnU"US35nSU;aSO S U;aS OSn U (aHURS U[ RU URURS S 9 [X5n XU 'URUS35nURU5=nbMgg)Nz@0,0.r0z+1line linestartz linestart -1cconsolez>>>stdinz...rr)anchorr rfillz+1line)r tag_namesr*r+rr$ALLrsplit dlineinfo create_textNWrrr) r@r text_tagnamesr*r+rlineinfornprev_newline_tagnamespromptrs r r5ShellSidebar.update_sidebars4yy +-- ( bff 6" ;;sA q !S (JJ%(89:E>>%00x= A$1UG>2J$K !"&;; $99  ""1aF(,  A#H#D0'-V$JJ%/0E >>%00x=rc$UR5 g)r_re)r,rYs r r\ShellSidebar.yscroll_events rc^[R"URSS5n[URUS9m[ U4SjS55nUR R US-S-S9 XlUR5 g ) rJrr)rc3F># UHnTRU5v M g7fr)measure).0chartk_fonts r +ShellSidebar.update_font..sF:4..:s!)rrYrr)rN) rrr rmaxr*r.rr,)r@r char_widthrqs @r r>ShellSidebar.update_fontsj 6>Btyyt,F:FF  JNQ$67  rc"[R"[R"5S5n[R"[R"5S5nUSnUSnX44UlURR US9 UR 5 g)rMrr[rr)rN)rrrrr*r.r,)r@linenumbers_colors prompt_colorsrrs r r?ShellSidebar.update_colorssx%2283H3H3JLY --h.C.C.EyQ "<0 ' 5 !.  4 r)r*rrr:r+)rrrrrrAr;r=r9rr,r5r\r>r?rrrs@r r(r(s>:$  J"14rr(c SSKJn [R"U5n[R"U5nUR [R [RSS9 URSSS9 URSSS9 [R"USS5n[R"US S [RUS 9nURSS[RS 9 U"U5n[R "U5Ul[%U5nUR'5 UR)S SR+S[-SS5555 g)Nr) Dummy_editwinT)sider^expandr)weightrrP)rheightrrrrr c3,# UH nSU-v M g7f)rNr)rois r rr,_sidebar_number_scrolling..s > 1Q se)idlelib.idle_test.test_sidebarr|r$ToplevelFramerLEFTBOTH rowconfigurecolumnconfigurerrrrrr Scrollbarr`rrRrr r)r9r|r-r8rr r7 linenumberss r _sidebar_number_scrollingrs< ++f C#JOOrwwtO<Aa(q+   C 8D 77:Rt LDII!AbggI.D!G<< +GLg&KKKtyy >a >>?r__main__)rzidlelib.idle_test.test_sidebarrF) verbosityexit)run)r contextlibr{rtkinterr$ tkinter.fontridlelib.configridlelib.delegatorridlelibrrrrr*contextmanagerr1r3rrrr(rrunittestridlelib.idle_test.htestrrrr rs#': & 8 4 **C>C>LAyA$M+M`&y&Rm;m`@, z )QUC+!" r