
   Iᅚ                   L   S r SSKrSSKrSSKrSSKrSSKJr  SSKJ	r	  SSK
Jr  SSKJr  S rS rS	 rS
 r\R$                  S 5       r " S S5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rS r\S:X  a  SSKJr  \" SSSS9  SSKJr  \" \5        gg)zLine numbering implementation for IDLE as an extension.
Includes BaseSideBar which can be extended for other sidebar based extensions
    N)Font)idleConf)	Delegator)macosxc                 ^    U R                  U5      nU(       a  [        [        U5      5      $ S$ )z7Return the line number of an index in a Tk text widget.N)indexintfloat)textr   
text_indexs      &/usr/lib/python3.13/idlelib/sidebar.py
get_linenor      s'    E"J%/3uZ !9T9    c                     [        U S5      $ )z7Return the number of the last line in a Tk text widget.zend-1c)r   r   s    r   get_end_linenumberr      s    dH%%r   c                 2    U R                  U S3U S3SSS9$ )z@Display height, in lines, of a logical line in a Tk text widget.z
 linestartz lineenddisplaylinesT)return_ints)count)r   r   s     r   get_displaylinesr      s0    ::z*x($$  8 8r   c           
         U R                  5       nUS:X  a  U R                  5       nO%US:X  a  U R                  5       nO[        SU 35      e[	        [        U R                  R                  US   U R                  S5      U R                  S5      /5      5      n[	        [        U R                  R                  US   U R                  S5      U R                  S5      /5      5      nX44$ )z;Get the total padding of a Tk widget, including its border.packgridzUnsupported geometry manager: padxborderpady)	winfo_manager	pack_info	grid_info
ValueErrorsummaptkgetintcget)widgetmanagerinfor   r   s        r   get_widget_paddingr*       s     ""$G&!	F	!9'CDD s699##VFH&  D
 s699##VFH&  D
 :r   c              #      #    U R                  [        R                  S9   S v   U R                  [        R                  S9  g ! U R                  [        R                  S9  f = f7f)Nstate)	configurer$   NORMALDISABLEDr   s    r   temp_enable_text_widgetr1   :   sC     NNN#*R[[)R[[)s   A%A A%A""A%c                   f    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rSrg)BaseSideBarC   z%A base class for sidebars using Text.c                     Xl         UR                  U l        UR                  U l        SU l        U R                  5       U l        U R                  5         U R                  5         U R                  5         g NF)
editwin
text_frameparentr   is_showninit_widgetsmain_widgetbind_eventsupdate_fontupdate_colors)selfr7   s     r   __init__BaseSideBar.__init__E   s[    ((LL	,,.r   c                     [         e)z<Initialize the sidebar's widgets, returning the main widget.NotImplementedErrorr@   s    r   r;   BaseSideBar.init_widgetsS       !!r   c                     [         e);Update the sidebar text font, usually after config changes.rD   rF   s    r   r>   BaseSideBar.update_fontW   rH   r   c                     [         e)=Update the sidebar text colors, usually after config changes.rD   rF   s    r   r?   BaseSideBar.update_colors[   rH   r   c                     [         e)z,Layout the widget, always using grid layout.rD   rF   s    r   r   BaseSideBar.grid_   rH   r   c                 V    U R                   (       d  U R                  5         SU l         g g )NT)r:   r   rF   s    r   show_sidebarBaseSideBar.show_sidebarc   s    }}IIK DM r   c                 j    U R                   (       a"  U R                  R                  5         SU l         g g r6   )r:   r<   grid_forgetrF   s    r   hide_sidebarBaseSideBar.hide_sidebarh   s'    ==((*!DM r   c                     [         e)z8Hook for vertical scrolling for sub-classes to override.rD   r@   argskwargss      r   yscroll_eventBaseSideBar.yscroll_eventm   rH   r   c                 l    U R                   R                  R                  " U6   U R                  " U0 UD6$ )]Redirect vertical scrolling to the main editor text widget.

The scroll bar is also updated.
)r7   vbarsetr\   rY   s      r   redirect_yscroll_event"BaseSideBar.redirect_yscroll_eventq   s2    
 	t$!!42622r   c                 8    U R                   R                  5         g)z8Redirect focus-in events to the main editor text widget.break)r   	focus_setr@   events     r   redirect_focusin_event"BaseSideBar.redirect_focusin_eventy   s    		r   c                     U R                   R                  5         U R                   R                  USUR                  S9  g)z<Redirect mouse button events to the main editor text widget.r   xyre   )r   rf   event_generatern   )r@   rh   
event_names      r   redirect_mousebutton_event&BaseSideBar.redirect_mousebutton_event~   s2    				  qEGG <r   c                 d    U R                   R                  SSUR                  UR                  S9  g)z7Redirect mouse wheel events to the editwin text widget.<MouseWheel>r   )rm   rn   deltare   )r   ro   rn   ru   rg   s     r   redirect_mousewheel_event%BaseSideBar.redirect_mousewheel_event   s.    		  #$u{{ 	! 	Dr   c                   ^ ^	^
^^^ T R                   T R                  S'   T R                  R                  ST R                  5        T R                  R                  ST R
                  5        U 4S jnS H?  nSU S3SU S3S	U S
34 H	  nU" X3S9  M     SU S3SU S34 H  nU" USU S3S9  M     MA     S mS mS m	U U4S jm
U
UU U4S jnT R                  R                  SU5        UU U4S jnT R                  R                  SU5        U
U4S jnT R                  R                  SU5        U	U
UU U4S jmU	UU U4S jnT R                  R                  SU5        U	U 4S jnT R                  R                  SU5        g )Nyscrollcommandz	<FocusIn>rt   c                 z   > [         R                  " TR                  US9nTR                  R	                  X5        g )N)rp   )	functoolspartialrq   r<   bind)rp   target_event_namehandlerr@   s      r   bind_mouse_event1BaseSideBar.bind_events.<locals>.bind_mouse_event   s3    ''(G(G3DFG!!*6r   )            z<Button->z<ButtonRelease-z<Bz-Motion>)r~   z<Double-Button-z<Triple-Button-c                 .  > [        TR                  SU  35      n[        TU/5      u  p#TR                  R                  SSS5        TR                  R	                  SU S3US-    S35        TR                  R                  SX:X  a  UOUS-    S35        g)	z6Helper function for drag and selection event handlers.@0,sel1.0endz.0   insertN)r   r   sorted
tag_removetag_addmark_set)y_coordlinenoabr@   
start_lines       r   %drag_update_selection_and_insert_markFBaseSideBar.bind_events.<locals>.drag_update_selection_and_insert_mark   s    		S	?;F:v./DAII  u5IIes"X!A#bz:IIx,2K&VaZ!HKMr   c                    > [        [        TR                  R                  SU R                   35      5      5      mU R                  mT" U R                  5        g )Nr   )r	   r
   r   r   rn   )rh   r   last_yr@   r   s    r   b1_mousedown_handler5BaseSideBar.bind_events.<locals>.b1_mousedown_handler   s@     U499??S	?#CDEJWWF1%'':r   z
<Button-1>c                 X   > S mS mTR                   R                  SSU R                  S9  g )N<ButtonRelease-1>r   rl   )r   ro   rn   )rh   r   r@   r   s    r   b1_mouseup_handler3BaseSideBar.bind_events.<locals>.b1_mouseup_handler   s-    
 JFII$$%8A$Ir   r   c                 J   > Tc  g U R                   mT" U R                   5        g N)rn   )rh   r   r   s    r   b1_drag_handler0BaseSideBar.bind_events.<locals>.b1_drag_handler   s     ~WWF1%'':r   z<B1-Motion>c                    > Tn U c  TR                   R                  T5        SmgU S:  a(  TR                  R                  SU -   S5        T" U 5        O`U TR                   R	                  5       :  aB  TR                  R                  SU -   TR                   R	                  5       -
  S5        T" U 5        TR                   R                  ST5      mg)z6Mimic Text auto-scrolling when dragging outside of it.Nr   pixelsr   2   )r<   after_cancelr   yview_scrollwinfo_heightafter)rn   auto_scrolling_after_idr   r   r@   text_auto_scrolls    r   r   1BaseSideBar.bind_events.<locals>.text_auto_scroll   s     Ay  --.EF*.'Q		&&rAvx85a8T%%2244		&&q1ut/?/?/L/L/N'N'/15a8  &&r+;< $r   c                 ^   > Tc)  U R                   mTR                  R                  ST5      mg g )Nr   )rn   r<   r   )rh   r   r   r@   r   s    r   b1_leave_handler1BaseSideBar.bind_events.<locals>.b1_leave_handler   s5     '.$$**1.>? ( /r   z
<B1-Leave>c                 H   > Tb  TR                   R                  T5        S mg g r   )r<   r   )rh   r   r@   s    r   b1_enter_handler1BaseSideBar.bind_events.<locals>.b1_enter_handler   s+     '2  --.EF*.' 3r   z
<B1-Enter>)rb   r   r<   r}   ri   rv   )r@   r   buttonrp   r   r   r   r   r   r   r   r   r   r   s   `        @@@@@r   r=   BaseSideBar.bind_events   s   &*&A&A		"# 	k4+F+FG 	nd.L.LM	7
 #F!)&3!0:!#F884!
 !J	! "1:!0:!
 !5=fXQ3GI! #" 
  #'	M	; 	; 	l,@A	J 	13EF	; 	m_=	= 	=&	@ 	@ 	l,<=	/ 	l,<=r   )r7   r:   r<   r9   r   N)__name__
__module____qualname____firstlineno____doc__rA   r;   r>   r?   r   rR   rV   r\   rb   ri   rq   rv   r=   __static_attributes__ r   r   r3   r3   C   sG    /""""!
"
"3
|>r   r3   c                   2    \ rS rSrSrS rSS jrSS jrSrg)	EndLineDelegatori	  zuGenerate callbacks with the current end line number.

The provided callback is called after every insert and delete.
c                 <    [         R                  " U 5        Xl        g r   )r   rA   changed_callback)r@   r   s     r   rA   EndLineDelegator.__init__  s    4  0r   Nc                     U R                   R                  XU5        U R                  [        U R                   5      5        g r   )delegater   r   r   )r@   r   charstagss       r   r   EndLineDelegator.insert  s.    U400?@r   c                     U R                   R                  X5        U R                  [        U R                   5      5        g r   )r   deleter   r   )r@   index1index2s      r   r   EndLineDelegator.delete  s,    V,0?@r   )r   r   )	r   r   r   r   r   rA   r   r   r   r   r   r   r   r   	  s    1AAr   r   c                   P   ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	 rS
rU =r$ )LineNumbersi  z(Line numbers support for editor windows.c                    > [         TU ]  U5        [        U R                  5      nU R                  R
                  R                  UU R                  R                  S9  g )Nr   )superrA   r   update_sidebar_textr7   perinsertfilterafterundo)r@   r7   end_line_delegator	__class__s      r   rA   LineNumbers.__init__  sQ    !-d.F.FG 	**+=151B1B 	+ 	Dr   c           
         [        U R                  5      u  p[        R                  " U R                  S[        R
                  SUSSS9U l        U R                  R                  [        R                  S9  SU l	        [        U R                  S   5      U l        [        U R                  5         U R                  R                  SSS	5        S S S 5        U R                  R                  S
S
S9  U R                  R                  S	[        R                  S9  [!        U R                  5      nU R#                  U5        U R                  $ ! , (       d  f       N= f)Nr   r   r   )widthwrapr   r   borderwidthhighlightthicknessr,   r   r   1
linenumberF)	takefocusexportselection)justify)r*   r   r$   Textr9   NONEsidebar_textconfigr0   prev_endtype_sidebar_width_typer1   r   
tag_configRIGHTr   r   )r@   _padxr   r   s       r   r;   LineNumbers.init_widgets&  s
   (3GGDKKqrww)*01aI 	  r{{ 3#'(9(9'(B#C $T%6%67$$XsLA 8  5% H$$\288$D +  %    87s   /E		
Ec                 V    U R                   R                  SS[        R                  S9  g )Nr   r   rowcolumnsticky)r   r   r$   NSEWrF   s    r   r   LineNumbers.grid9  s!    1Qrww?r   c                 d    [         R                  " U R                  SS5      nXR                  S'   g )NmainEditorWindowfont)r   GetFontr   r   )r@   r   s     r   r>   LineNumbers.update_font<  s(    		6>B$(&!r   c                     [         R                  " [         R                  " 5       S5      nUS   nUS   nU R                  R	                  X#X#US9  g)rM   r   
foreground
background)fgbgselectforegroundselectbackgroundinactiveselectbackgroundN)r   GetHighlightCurrentThemer   r   )r@   colorsr   r   s       r   r?   LineNumbers.update_colors@  sS    &&x'<'<'>ML)
L)
  '%/ 	! 	
r   c                    XR                   :X  a  g[        [        U5      5      [        [        U R                   5      5      -
  nU(       aC  [        [	        U R
                  S   5      5      nX2-   nU R                  U5      U R
                  S'   [        U R
                  5         XR                   :  am  SR                  [        R                  " S/[        [        [        U R                   S-   US-   5      5      5      5      nU R
                  R                  SUS5        O"U R
                  R                  US-    S3S5        SSS5        Xl         g! , (       d  f       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   
 r   zend -1cr   z.0 -1c)r   lenstrr	   r
   r   r   r1   join	itertoolschainr#   ranger   r   )r@   r   width_difference	cur_width	new_widthnew_texts         r   r   LineNumbers.update_sidebar_textK  s    --s3x=3s4==/A+BBE$"3"3G"<=>I!4I)-)A)A))LDg&$T%6%67]]"99Y__DU4==1#4cAg>?&  !!((7X|L!!((CE7&)99E 8  87s   #BE
Ec                 @    U R                   R                  US   5        g)Nr   re   )r   yview_movetorY   s      r   r\   LineNumbers.yscroll_eventf  s    &&tAw/r   )r   r   r   )r   r   r   r   r   rA   r;   r   r>   r?   r   r\   r   __classcell__r   s   @r   r   r     s0    2D!&@)	
6 r   r   c                   .    \ rS rSrS rSS jrSS jrSrg) WrappedLineHeightChangeDelegatorik  c                 <    [         R                  " U 5        Xl        g)z
callback - Callable, will be called when an insert, delete or replace
           action on the text widget may require updating the shell
           sidebar.
N)r   rA   callback)r@   r  s     r   rA   )WrappedLineHeightChangeDelegator.__init__l  s     	4  r   Nc                     SU;  nU(       a  [        X5      nU R                  R                  XU5        U(       a  [        X5      nUW:X  a  g U R                  5         g )Nr	  )r   r   r   r  )r@   r   r   r   is_single_linebefore_displaylinesafter_displayliness          r   r   'WrappedLineHeightChangeDelegator.insertu  sQ    U*"24"?U40!1$!>!%88r   c                     Uc  US-   n[        X5      [        X5      :H  nU(       a  [        X5      nU R                  R                  X5        U(       a  [        X5      nUW:X  a  g U R	                  5         g )Nz+1c)r   r   r   r   r  )r@   r   r   r!  r"  r#  s         r   r   'WrappedLineHeightChangeDelegator.delete  sg    >e^F#D1Z5MM"24"@V,!1$!?!%88r   )r  r   )r   r   r   r   rA   r   r   r   r   r   r   r  r  k  s    !r   r  c                   h   ^  \ rS rSrSrU 4S jrS rU 4S jrS rS r	S r
S	 rS
 rS rS rSrU =r$ )ShellSidebari  z0Sidebar for the PyShell window, for prompts etc.c                    > S U l         0 U l        [        TU ]  U5        [	        U R
                  5      nU R                  R                  R                  nUR                  U R                  Lah  UR                  U R                  R                  R                  La;  UR                  nUR                  U R                  R                  R                  La  M;  U R                  R                  R                  X#S9  SU l        g )Nr   T)canvasline_promptsr   rA   r  change_callbackr7   r   topr   r   bottomr   r:   )r@   r7   change_delegatordr   s       r   rA   ShellSidebar.__init__  s    ! -T-A-AB 	 LL  ::TYY&**DLL$4$4$;$;;JJ **DLL$4$4$;$;;**+;*Er   c                     [         R                  " U R                  SSSSS9U l        U R	                  5         U R                  5         U R                  $ )N   r   F)r   r   r   r   )r$   Canvasr9   r*  update_sidebarr   rF   s    r   r;   ShellSidebar.init_widgets  sC    ii2,-!*/1 			{{r   c                    > [         TU ]  5         U R                  R                  [        R
                  " 5       (       a  SOSU R                  5        g )Nz
<Button-2>z
<Button-3>)r   r=   r<   r}   r   isAquaTkcontext_menu_event)r@   r   s    r   r=   ShellSidebar.bind_events  s<    "OO--L<##	
r   c                 f  ^  [         R                  " T R                  SS9n[        T R                  R                  SS5      5      nU 4S jnUR                  SU" S5      U(       a  SOS	S
9  UR                  SU" S5      U(       a  SOS	S
9  UR                  UR                  UR                  5        g)Nr   )tearoffr   r   c                    >^  U U4S j$ )Nc                  :   > TR                   R                  T 5      $ r   )r   ro   	eventnamer@   s   r   <lambda>@ShellSidebar.context_menu_event.<locals>.mkcmd.<locals>.<lambda>  s    49933I>r   r   r?  s   `r   mkcmd.ShellSidebar.context_menu_event.<locals>.mkcmd  s	    >>r   Copyz<<copy>>normaldisabled)labelcommandr-   zCopy with promptsz<<copy-with-prompts>>re   )
r$   Menur<   boolr   tag_nextrangeadd_commandtk_popupx_rooty_root)r@   rh   rmenuhas_selectionrC  s   `    r   r9  ShellSidebar.context_menu_event  s    ((!4TYY44UEBC	?"'
"3,9z 	 	K 	 3"'(?"@,9z 	 	K 	u||U\\2r   c                 Z    U R                   R                  SS[        R                  SSS9  g )Nr   r   r   )r   r   r   r   r   )r*  r   r$   r   rF   s    r   r   ShellSidebar.grid  s#    QqqqIr   c                 H    U R                   (       a  U R                  5         g g r   )r:   r5  rF   s    r   r,  ShellSidebar.change_callback  s    ==! r   c           	      v   U R                   nUR                  nU R                  n0 =o@l        UR	                  [
        R                  5        UR                  S5      nUR                  SS5      S   S:w  a  UR                  U S35      nUR                  U5      =nb  US   nU" U S35      nSU;   a  SO	S	U;   a  S
OS n	U	(       aH  UR                  SU[
        R                  U	U R                  U R                  S   S9  [        X5      n
XU
'   UR                  U S35      nUR                  U5      =nb  M  g g )Nz@0,0.r   0z+1line linestartz linestart -1cconsolez>>>stdinz...r   r   )anchorr   r   fillz+1line)r   	tag_namesr*  r+  r   r$   ALLr   split	dlineinfocreate_textNWr   r  r   )r@   r   text_tagnamesr*  r+  r   lineinforn   prev_newline_tagnamespromptr   s              r   r5  ShellSidebar.update_sidebar  s4   yy+--(bff

6";;sAq!S(JJ%(89:E>>%00x=A$1UG>2J$K!"&;; $99 
 ""1aF(,		A # H#D0'-V$JJ%/0E  >>%00x=r   c                 $    U R                  5         g)r_   re   )r,  rY   s      r   r\   ShellSidebar.yscroll_event  s    
 	r   c                   ^ [         R                  " U R                  SS5      n[        U R                  US9m[	        U4S jS 5       5      nU R
                  R                  US-  S-   S9  Xl        U R                  5         g	)
rJ   r   r   )r   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   )measure).0chartk_fonts     r   	<genexpr>+ShellSidebar.update_font.<locals>.<genexpr>  s     F:4..:s   !)r   rY  r   r   )r   N)	r   r   r   r   maxr*  r.   r   r,  )r@   r   
char_widthrq  s      @r   r>   ShellSidebar.update_font  sj    		6>Btyyt,F:FF
JNQ$67	r   c                 "   [         R                  " [         R                  " 5       S5      n[         R                  " [         R                  " 5       S5      nUS   nUS   nX44U l        U R                  R                  US9  U R                  5         g)rM   r   r[  r   r   )r   N)r   r  r  r  r*  r.   r,  )r@   linenumbers_colorsprompt_colorsr   r   s        r   r?   ShellSidebar.update_colors  sx    %2283H3H3JLY --h.C.C.EyQ"<0
'5
!.4r   )r*  r  r   r:   r+  )r   r   r   r   r   rA   r;   r=   r9  r   r,  r5  r\   r>   r?   r   r  r  s   @r   r(  r(    s>    :$
J"14 r   r(  c           
         SSK Jn  [        R                  " U 5      n[        R                  " U5      nUR                  [        R                  [        R                  SS9  UR                  SSS9  UR                  SSS9  [        R                  " USS5      n[        R                  " US	S
[        R                  US9nUR                  SS[        R                  S9  U" U5      n[        R                   " U5      Ul        [%        U5      nUR'                  5         UR)                  SSR+                  S [-        SS5       5       5      5        g )Nr   )Dummy_editwinT)sider^  expandr   )weightr   r   P      )r   heightr   r   r   r   r	  c              3   ,   #    U  H
  nS U-  v   M     g7f)r   Nr   )ro  is     r   rr  ,_sidebar_number_scrolling.<locals>.<genexpr>  s      >1Qs   e   )idlelib.idle_test.test_sidebarr|  r$   ToplevelFramer   LEFTBOTHrowconfigurecolumnconfigurer   r   r   r   r   r   	Scrollbarr`   r   rR   r   r  r  )r9   r|  r-  r8   r   r   r7   linenumberss           r   _sidebar_number_scrollingr    s    <
++f
C#JOOrwwtO<Aa(q+C8D77:RtLDII!AbggI.D!G<<
+GLg&KKKtyy >a >>?r   __main__)r   zidlelib.idle_test.test_sidebarr   F)	verbosityexit)run)r   
contextlibr{   r  tkinterr$   tkinter.fontr   idlelib.configr   idlelib.delegatorr   idlelibr   r   r   r   r*   contextmanagerr1   r3   r   r   r  r(  r  r   unittestr   idlelib.idle_test.htestr  r   r   r   <module>r     s         # ' :&
84 * *C> C>LAy A$M+ M`&y &Rm; m`@, z	)QUC+!" r   