
    "erO                     P   d Z ddlZddlZddlZddlZddlmZ ddlm	Z	 ddl
mZ ddlmZ d Zd Zd	 Zd
 Zej$                  d        Z G d d      Z G d de      Z G d de      Z G d de      Z G d de      Zd Zedk(  r ddlmZ  eddd       ddlmZ  ee       yy)zLine numbering implementation for IDLE as an extension.
Includes BaseSideBar which can be extended for other sidebar based extensions
    N)Font)idleConf)	Delegator)macosxc                 T    | j                  |      }|rt        t        |            S dS )z7Return the line number of an index in a Tk text widget.N)indexintfloat)textr   
text_indexs      !lib/python3.12/idlelib/sidebar.py
get_linenor      s'    E"J%/3uZ !9T9    c                     t        | d      S )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                 F    | j                  | d| dd      }|r|d   S dS )z@Display height, in lines, of a logical line in a Tk text widget.z
 linestartz lineenddisplaylinesr   )count)r   r   ress      r   get_displaylinesr      s9    
**wj)wh'#%C 3q6ar   c           
         | j                         }|dk(  r| j                         }n$|dk(  r| j                         }nt        d|       t	        t        | j                  j                  |d   | j                  d      | j                  d      g            }t	        t        | j                  j                  |d   | j                  d      | j                  d      g            }||fS )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              #      K   | j                  t        j                         	 d  | j                  t        j                         y # | j                  t        j                         w xY ww)Nstate)	configurer$   NORMALDISABLEDr   s    r   temp_enable_text_widgetr1   ;   sD     NNN#*R[[)R[[)s   !A.A	 !A.	"A++A.c                   ^    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zy)BaseSideBarz%A base class for sidebars using Text.c                     || _         |j                  | _        |j                  | _        d| _        | j                         | _        | j                          | j                          | j                          y NF)
editwin
text_frameparentr   is_showninit_widgetsmain_widgetbind_eventsupdate_fontupdate_colors)selfr6   s     r   __init__zBaseSideBar.__init__F   s]    ((LL	,,.r   c                     t         )z<Initialize the sidebar's widgets, returning the main widget.NotImplementedErrorr?   s    r   r:   zBaseSideBar.init_widgetsT       !!r   c                     t         );Update the sidebar text font, usually after config changes.rB   rD   s    r   r=   zBaseSideBar.update_fontX   rE   r   c                     t         )=Update the sidebar text colors, usually after config changes.rB   rD   s    r   r>   zBaseSideBar.update_colors\   rE   r   c                     t         )z,Layout the widget, always using grid layout.rB   rD   s    r   r   zBaseSideBar.grid`   rE   r   c                 L    | j                   s| j                          d| _         y y )NT)r9   r   rD   s    r   show_sidebarzBaseSideBar.show_sidebard   s    }}IIK DM r   c                 `    | j                   r"| j                  j                          d| _         y y r5   )r9   r;   grid_forgetrD   s    r   hide_sidebarzBaseSideBar.hide_sidebari   s'    ==((*!DM r   c                     t         )z8Hook for vertical scrolling for sub-classes to override.rB   r?   argskwargss      r   yscroll_eventzBaseSideBar.yscroll_eventn   rE   r   c                 l     | j                   j                  j                  |   | j                  |i |S )mRedirect vertical scrolling to the main editor text widget.

        The scroll bar is also updated.
        )r6   vbarsetrT   rQ   s      r   redirect_yscroll_eventz"BaseSideBar.redirect_yscroll_eventr   s6    
 	t$!t!!42622r   c                 8    | j                   j                          y)z8Redirect focus-in events to the main editor text widget.break)r   	focus_setr?   events     r   redirect_focusin_eventz"BaseSideBar.redirect_focusin_eventz   s    		r   c                     | j                   j                          | j                   j                  |d|j                         y)z<Redirect mouse button events to the main editor text widget.r   xyr[   )r   r\   event_generaterc   )r?   r^   
event_names      r   redirect_mousebutton_eventz&BaseSideBar.redirect_mousebutton_event   s2    				  qEGG <r   c                 j    | j                   j                  dd|j                  |j                         y)z7Redirect mouse wheel events to the editwin text widget.<MouseWheel>r   )rb   rc   deltar[   )r   rd   rc   ri   r]   s     r   redirect_mousewheel_eventz%BaseSideBar.redirect_mousewheel_event   s.    		  #$u{{ 	! 	Dr   c                    	
  j                    j                  d<    j                  j                  d j                          j                  j                  d j
                          fd}dD ]A  }d| dd| dd	| d
fD ]  } |||        d| dd| dfD ]  } ||d| d        C d d d 	 fd

 fd} j                  j                  d|        fd} j                  j                  d|       
fd} j                  j                  d|       	
 fd	 fd} j                  j                  d|       	 fd} j                  j                  d|       y )Nyscrollcommandz	<FocusIn>rh   c                     t        j                  j                  |      }j                  j	                  | |       y )N)re   )	functoolspartialrf   r;   bind)re   target_event_namehandlerr?   s      r   bind_mouse_eventz1BaseSideBar.bind_events.<locals>.bind_mouse_event   s5    ''(G(G3DFG!!*g6r   )            z<Button->z<ButtonRelease-z<Bz-Motion>)rq   z<Double-Button-z<Triple-Button-c                 0   t        j                  d|        }t        |g      \  }}j                  j                  ddd       j                  j	                  d| d|dz    d       j                  j                  d||k(  r|n|dz    d       y)	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_markzFBaseSideBar.bind_events.<locals>.drag_update_selection_and_insert_mark   s    		S	?;F:v./DAqII  u5IIes"X!A#bz:IIx,2aK&VaZ!HKMr   c                     t        t        j                  j                  d| j                                     | j                   | j                         y )Nrz   )r	   r
   r   r   rc   )r^   r   last_yr?   r   s    r   b1_mousedown_handlerz5BaseSideBar.bind_events.<locals>.b1_mousedown_handler   s@     U499??S	?#CDEJWWF1%'':r   z
<Button-1>c                 ^    d d j                   j                  dd| j                         y )N<ButtonRelease-1>r   ra   )r   rd   rc   )r^   r   r?   r   s    r   b1_mouseup_handlerz3BaseSideBar.bind_events.<locals>.b1_mouseup_handler   s-    
 JFII$$%8A$Ir   r   c                 H    y | j                    | j                          y N)rc   )r^   r   r   s    r   b1_drag_handlerz0BaseSideBar.bind_events.<locals>.b1_drag_handler   s     ~WWF1%'':r   z<B1-Motion>c                     } | j                   j                         dy| dk  r(j                  j                  d| z   d        |        n_| j                   j	                         kD  rBj                  j                  d| z   j                   j	                         z
  d        |        j                   j                  d      y)z6Mimic Text auto-scrolling when dragging outside of it.Nr   pixelsr~   2   )r;   after_cancelr   yview_scrollwinfo_heightafter)rc   auto_scrolling_after_idr   r   r?   text_auto_scrolls    r   r   z1BaseSideBar.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                 \    )| j                   j                  j                  d      y y )Nr   )rc   r;   r   )r^   r   r   r?   r   s    r   b1_leave_handlerz1BaseSideBar.bind_events.<locals>.b1_leave_handler   s5     '.$$**1.>? ( /r   z
<B1-Leave>c                 F    j                   j                         d y y r   )r;   r   )r^   r   r?   s    r   b1_enter_handlerz1BaseSideBar.bind_events.<locals>.b1_enter_handler  s+     '2  --.EF*.' 3r   z
<B1-Enter>)rY   r   r;   rp   r_   rj   )r?   rs   buttonre   r   r   r   r   r   r   r   r   r   r   s   `        @@@@@r   r<   zBaseSideBar.bind_events   s   &*&A&A		"# 	k4+F+FG 	nd.L.LM	7
 # 	IF!)&3!0:!#F884! K
 !zJ	K "1:!0:! I
 !5=fXQ3GII	I" 
  #'	M	; 	l,@A	J 	13EF	; 	m_=	= 	=&	@ 	l,<=	/ 	l,<=r   N)__name__
__module____qualname____doc__r@   r:   r=   r>   r   rL   rO   rT   rY   r_   rf   rj   r<    r   r   r3   r3   D   sG    /""""!
"
"3
|>r   r3   c                   &    e Zd ZdZd ZddZddZy)EndLineDelegatorz}Generate callbacks with the current end line number.

    The provided callback is called after every insert and delete.
    c                 <    t        j                  |        || _        y r   )r   r@   changed_callback)r?   r   s     r   r@   zEndLineDelegator.__init__  s    4  0r   Nc                     | j                   j                  |||       | j                  t        | j                                y r   )delegater   r   r   )r?   r   charstagss       r   r   zEndLineDelegator.insert  s0    UE400?@r   c                     | j                   j                  ||       | j                  t        | j                                y r   )r   deleter   r   )r?   index1index2s      r   r   zEndLineDelegator.delete  s.    VV,0?@r   r   )r   r   r   r   r@   r   r   r   r   r   r   r   
  s    1AAr   r   c                   F     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
 xZS )	LineNumbersz(Line numbers support for editor windows.c                     t         |   |       t        | j                        }| j                  j
                  j                  || j                  j                         y )Nr   )superr@   r   update_sidebar_textr6   perinsertfilterafterundo)r?   r6   end_line_delegator	__class__s      r   r@   zLineNumbers.__init__  sQ    !-d.F.FG 	**+=151B1B 	+ 	Dr   c           	         t        | j                        \  }}t        j                  | j                  dt        j
                  d|dd      | _        | j                  j                  t        j                         d| _	        t        | j                  d         | _        t        | j                        5  | j                  j                  ddd	       d d d        | j                  j                  d
d
       | j                  j                  d	t        j                         t!        | j                        }| j#                  |       | j                  S # 1 sw Y   xY w)Nr~   rt   r   )widthwrapr   r   borderwidthhighlightthicknessr,   r   r   1
linenumberF)	takefocusexportselection)justify)r*   r   r$   Textr8   NONEsidebar_textconfigr0   prev_endtype_sidebar_width_typer1   r   
tag_configRIGHTr   r   )r?   _padxr   r}   s       r   r:   zLineNumbers.init_widgets'  s   (3tGGDKKqrww)*01aI 	  r{{ 3#'(9(9'(B#C $T%6%67 	B$$XsLA	B  5% H$$\288$D +  %   	B 	Bs   5EEc                 \    | j                   j                  ddt        j                         y )Nr~   r   rowcolumnsticky)r   r   r$   NSEWrD   s    r   r   zLineNumbers.grid:  s!    1Qrww?r   c                 d    t        j                  | j                  dd      }|| j                  d<   y )NmainEditorWindowfont)r   GetFontr   r   )r?   r   s     r   r=   zLineNumbers.update_font=  s*    		6>B$(&!r   c                     t        j                  t        j                         d      }|d   }|d   }| j                  j	                  |||||       y)rI   r   
foreground
background)fgbgselectforegroundselectbackgroundinactiveselectbackgroundN)r   GetHighlightCurrentThemer   r   )r?   colorsr   r   s       r   r>   zLineNumbers.update_colorsA  sW    &&x'<'<'>ML)
L)
  j'*%/ 	! 	
r   c                    || j                   k(  ryt        t        |            t        t        | j                               z
  }|rDt        t	        | j
                  d               }||z   }| j                  |      | j
                  d<   t        | j
                        5  || j                   kD  rldj                  t        j                  dgt        t        t        | j                   dz   |dz                           }| j
                  j                  d|d       n"| j
                  j                  |dz    dd       ddd       || _         y# 1 sw Y   || _         yxY w)	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   zLineNumbers.update_sidebar_textL  s-    $--s3x=3s4==/A+BBE$"3"3G"<=>I!$44I)-)A)A))LDg&$T%6%67 	FT]]"99Y__DU4==1#4cAg>?&  !!((7X|L!!((CE7&)99E	F 	F s   BEEc                 @    | j                   j                  |d          y)Nr   r[   )r   yview_movetorQ   s      r   rT   zLineNumbers.yscroll_eventg  s    &&tAw/r   )r   r   r   r   r@   r:   r   r=   r>   r   rT   __classcell__r   s   @r   r   r     s+    2D!&@)	
6r   r   c                   "    e Zd Zd ZddZddZy) WrappedLineHeightChangeDelegatorc                 <    t        j                  |        || _        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)r   r@   callback)r?   r   s     r   r@   z)WrappedLineHeightChangeDelegator.__init__m  s     	4  r   Nc                     d|v}|rt        | |      }| j                  j                  |||       |rt        | |      }|k(  ry | j                          y )Nr   )r   r   r   r   )r?   r   r   r   is_single_linebefore_displaylinesafter_displayliness          r   r   z'WrappedLineHeightChangeDelegator.insertv  sW    U*"24"?UE40!1$!>!%88r   c                     ||dz   }t        | |      t        | |      k(  }|rt        | |      }| j                  j                  ||       |rt        | |      }|k(  ry | j	                          y )Nz+1c)r   r   r   r   r   )r?   r   r   r   r   r   s         r   r   z'WrappedLineHeightChangeDelegator.delete  sq    >e^F#D&1Zf5MM"24"@VV,!1$!?!%88r   r   )r   r   r   r@   r   r   r   r   r   r   r   l  s    !r   r   c                   \     e Zd ZdZ fdZd Z fdZd Zd Zd Z	d Z
d	 Zd
 Zd Z xZS )ShellSidebarz0Sidebar for the PyShell window, for prompts etc.c                     d | _         i | _        t        |   |       t	        | j
                        }| j                  j                  j                  }|j                  | j                  ure|j                  | j                  j                  j                  ur9|j                  }|j                  | j                  j                  j                  ur9| j                  j                  j                  ||       d| _        y )Nr   T)canvasline_promptsr   r@   r   change_callbackr6   r   topr   r   bottomr   r9   )r?   r6   change_delegatordr   s       r   r@   zShellSidebar.__init__  s    ! -T-A-AB 	 LL  ::TYY&**DLL$4$4$;$;;JJ **DLL$4$4$;$;;**+;1*Er   c                     t        j                  | j                  dddd      | _        | j	                          | j                          | j                  S )N   r   F)r   r   r   r   )r$   Canvasr8   r  update_sidebarr   rD   s    r   r:   zShellSidebar.init_widgets  sC    ii2,-!*/1 			{{r   c                     t         |           | j                  j                  t	        j
                         rdnd| j                         y )Nz
<Button-2>z
<Button-3>)r   r<   r;   rp   r   isAquaTkcontext_menu_event)r?   r   s    r   r<   zShellSidebar.bind_events  s9    "OO-L<##	
r   c                 `    t        j                   j                  d      }t         j                  j                  dd            } fd}|j                  d |d      |rdnd	
       |j                  d |d      |rdnd	
       |j                  |j                  |j                         y)Nr   )tearoffr{   r|   c                       fdS )Nc                  :    j                   j                         S r   )r   rd   	eventnamer?   s   r   <lambda>z@ShellSidebar.context_menu_event.<locals>.mkcmd.<locals>.<lambda>  s    49933I> r   r   r  s   `r   mkcmdz.ShellSidebar.context_menu_event.<locals>.mkcmd  s	    >>r   Copyz<<copy>>normaldisabled)labelcommandr-   zCopy with promptsz<<copy-with-prompts>>r[   )
r$   Menur;   boolr   tag_nextrangeadd_commandtk_popupx_rooty_root)r?   r^   rmenuhas_selectionr  s   `    r   r  zShellSidebar.context_menu_event  s    ((!4TYY44UEBC	?"'
"3,9z 	 	K 	 3"'(?"@,9z 	 	K 	u||U\\2r   c                 `    | j                   j                  ddt        j                  dd       y )Nr~   r   rt   )r   r   r   r   r   )r  r   r$   r   rD   s    r   r   zShellSidebar.grid  s#    QqqqIr   c                 >    | j                   r| j                          y y r   )r9   r  rD   s    r   r  zShellSidebar.change_callback  s    ==! r   c           	      h   | j                   }|j                  }| j                  }i x}| _        |j	                  t
        j                         |j                  d      }|j                  dd      d   dk7  r|j                  | d      }|j                  |      x}|d   } || d      }d|v rdnd	|v rd
nd }	|	rM|j                  d|t
        j                  |	| j                  | j                  d          t        ||      }
|	||
<   |j                  | d      }|j                  |      x}y y )Nz@0,0.r~   0z+1line linestartz linestart -1cconsolez>>>stdinz...rt   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   lineinforc   prev_newline_tagnamespromptr   s              r   r  zShellSidebar.update_sidebar  s:   yy+--t(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                 $    | j                          y)rV   r[   )r  rQ   s      r   rT   zShellSidebar.yscroll_event  s    
 	r   c                    t        j                  | j                  dd      }t        | j                  |      t	        fddD              }| j
                  j                  |dz  dz          || _        | j                          y	)
rG   r   r   )r   c              3   @   K   | ]  }j                  |        y wr   )measure).0chartk_fonts     r   	<genexpr>z+ShellSidebar.update_font.<locals>.<genexpr>  s     F4.Fs   )rx   r,  ru   rv   )r   N)	r   r   r   r   maxr  r.   r   r  )r?   r   
char_widthrB  s      @r   r=   zShellSidebar.update_font  sl    		6>Btyyt,F:FF
JNQ$67	r   c                 "   t        j                  t        j                         d      }t        j                  t        j                         d      }|d   }|d   }||f| _        | j                  j                  |       | j                          y)rI   r   r.  r   r   )r   N)r   r   r   r   r  r.   r  )r?   linenumbers_colorsprompt_colorsr   r   s        r   r>   zShellSidebar.update_colors  sz    %2283H3H3JLY --h.C.C.EyQ"<0
'5
!:.4r   )r   r   r   r   r@   r:   r<   r  r   r  r  rT   r=   r>   r   r   s   @r   r  r    s9    :$
J"14r   r  c           
         ddl m} t        j                  |       }t        j                  |      }|j                  t        j                  t        j                  d       |j                  dd       |j                  dd       t        j                  |dd      }t        j                  |d	d
t        j                  |      }|j                  ddt        j                          ||      }t        j                   |      |_        t%        |      }|j'                          |j)                  ddj+                  d t-        dd      D                     y )Nr   )Dummy_editwinT)sider1  expandr~   )weightr   r   P      )r   heightr   r   r   r|   r   c              3   &   K   | ]	  }d |z    yw)r   Nr   )r@  is     r   rC  z,_sidebar_number_scrolling.<locals>.<genexpr>  s      >1Q >s   e   )idlelib.idle_test.test_sidebarrJ  r$   ToplevelFramer   LEFTBOTHrowconfigurecolumnconfigurer   r   r   r   r   r   	ScrollbarrW   r   rL   r   r   r   )r8   rJ  r  r7   r   r   r6   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_sidebarrt   F)	verbosityexit)run)r   
contextlibrn   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.htestra  r   r   r   <module>rk     s         # ' :&
 4 * *C> C>LAy A$M+ M`&y &Rm; m`@, z	)QUC+!" r   