
    dO                     |   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           dS dS )zLine numbering implementation for IDLE as an extension.
Includes BaseSideBar which can be extended for other sidebar based extensions
    N)Font)idleConf)	Delegator)macosxc                 l    |                      |          }|rt          t          |                    ndS )z7Return the line number of an index in a Tk text widget.N)indexintfloat)textr   
text_indexs      !  /croot/python-split_1694437901252/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib/python3.11/idlelib/sidebar.py
get_linenor      s3    E""J%/93uZ  !!!T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                 T    |                      | d| dd          }|r|d         n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      sD    
**)))'''#% %C 3q66ar   c           
         |                                  }|dk    r|                                 }n-|dk    r|                                 }nt          d|           t	          t          | j        j        |d         |                     d          |                     d          g                    }t	          t          | j        j        |d         |                     d          |                     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		!!C'CCDDD s69#VFH&    D
 s69#VFH&    D
 :r   c              #      K   |                      t          j                   	 d V  |                      t          j                   d S # |                      t          j                   w xY w)Nstate)	configurer$   NORMALDISABLEDr   s    r   temp_enable_text_widgetr1   ;   sb      NNN###*R[)))))R[))))s   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dS )BaseSideBarz%A base class for sidebars using Text.c                     || _         |j        | _        |j        | _        d| _        |                                 | _        |                                  |                                  | 	                                 d S 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   ss    (L	,,..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                 N    | j         s|                                  d| _         d S d S )NT)r9   r   rD   s    r   show_sidebarzBaseSideBar.show_sidebard   s.    } 	!IIKKK DMMM	! 	!r   c                 X    | j         r"| j                                         d| _         d S d S r5   )r9   r;   grid_forgetrD   s    r   hide_sidebarzBaseSideBar.hide_sidebari   s6    = 	"((***!DMMM	" 	"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                 D     | 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   s1    
 	t$$!t!426222r   c                 8    | j                                          dS )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    	wr   c                 |    | j                                          | j                             |d|j                   dS )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   s:    		  qEG <<<wr   c                 V    | j                             dd|j        |j                   dS )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   s6    	  #$u{ 	! 	D 	D 	Dwr   c                    	
  j          j        d<    j                            d j                    j                            d j                    fd}dD ]C}d| dd| dd	| d
fD ]} |||           d| dd| dfD ]} ||d| d           Dd d d 	 fd

 fd} j                            d|            fd} j                            d|           
fd} j                            d|           	
 fd	 fd} j                            d|           	 fd} j                            d|           d S )Nyscrollcommandz	<FocusIn>rh   c                 t    t          j        j        |          }j                            | |           d S )N)re   )	functoolspartialrf   r;   bind)re   target_event_namehandlerr?   s      r   bind_mouse_eventz1BaseSideBar.bind_events.<locals>.bind_mouse_event   sD    '(G3DF F FG!!*g66666r   )            z<Button->z<ButtonRelease-z<Bz-Motion>)rq   z<Double-Button-z<Triple-Button-c                 4   t          j        d|            }t          |g          \  }}j                            ddd           j                            d| d|dz    d           j                            d||k    r|n|dz    d           dS )	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    	???;;F:v.//DAqI  u555IeXXX!A#zzz:::Ix,2aKK&&VaZKKKM M M M Mr   c                     t          t          j                            d| j                                       | j         | j                   d S )Nrz   )r	   r
   r   r   rc   )r^   r   last_yr?   r   s    r   b1_mousedown_handlerz5BaseSideBar.bind_events.<locals>.b1_mousedown_handler   sP     U49?????#C#CDDEEJWF11%':::::r   z
<Button-1>c                 T    d d j                             dd| j                   d S )N<ButtonRelease-1>r   ra   )r   rd   rc   )r^   r   r?   r   s    r   b1_mouseup_handlerz3BaseSideBar.bind_events.<locals>.b1_mouseup_handler   s5    
 JFI$$%8A$IIIIIr   r   c                 >    d S | j          | j                    d S N)rc   )r^   r   r   s    r   b1_drag_handlerz0BaseSideBar.bind_events.<locals>.b1_drag_handler   s-    ~WF11%':::::r   z<B1-Motion>c                     } | j                                        ddS | dk     r*j                            d| z   d            |            n`| j                                         k    rCj                            d| z   j                                         z
  d            |            j                             d          dS )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FF*.'Q	&&rAvx88855a8888T%224444	&&q1ut/?/L/L/N/N'N'/1 1 155a888 &&r+;<< $##r   c                 T    $| j         j                            d          d S d S )Nr   )rc   r;   r   )r^   r   r   r?   r   s    r   b1_leave_handlerz1BaseSideBar.bind_events.<locals>.b1_leave_handler   s<     '.$**1.>?? ('' /.r   z
<B1-Leave>c                 H    j                                        d d S d S r   )r;   r   )r^   r   r?   s    r   b1_enter_handlerz1BaseSideBar.bind_events.<locals>.b1_enter_handler  s7     '2 --.EFFF*.''' 32r   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	"# 	k4+FGGG 	nd.LMMM	7 	7 	7 	7 	7
 # 	I 	IF3&333::::4F444! K K
 ! zJJJJJ  ;:::::::! I I
 ! 3Gf3G3G3GI I I I II 
  #'	M 	M 	M 	M 	M 	M	; 	; 	; 	; 	; 	; 	; 	; 	l,@AAA	J 	J 	J 	J 	J 	J 	J 	13EFF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   s        //  " " "" " "" " "" " "! ! !
" " "
" " "3 3 3  
    |> |> |> |> |>r   r3   c                   (    e Zd ZdZd ZddZddZdS )EndLineDelegatorz}Generate callbacks with the current end line number.

    The provided callback is called after every insert and delete.
    c                 <    t          j        |            || _        d S r   )r   r@   changed_callback)r?   r   s     r   r@   zEndLineDelegator.__init__  s!    4    0r   Nc                     | j                             |||           |                     t          | j                              d S r   )delegater   r   r   )r?   r   charstagss       r   r   zEndLineDelegator.insert  sA    UE40000??@@@@@r   c                     | j                             ||           |                     t          | j                              d S 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 1 1A A A AA A A A 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                   d S )Nr   )superr@   r   update_sidebar_textr6   perinsertfilterafterundo)r?   r6   end_line_delegator	__class__s      r   r@   zLineNumbers.__init__  sj    !!!-d.FGG 	**+=151B 	+ 	D 	D 	D 	D 	Dr   c           	         t          | j                  \  }}t          j        | j        dt          j        d|dd          | _        | j                            t          j                   d| _	        t          | j        d                   | _        t          | j                  5  | j                            ddd	           d d d            n# 1 swxY w Y   | j                            d
d
           | j                            d	t          j                   t!          | j                  }|                     |           | j        S )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'  sz   (33tGDKqrw)*01aI I I 	  r{ 333#'(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% HHH$$\28$DDD ++  %%%  s   &CCCc                 T    | j                             ddt          j                   d S )Nr~   r   rowcolumnsticky)r   r   r$   NSEWrD   s    r   r   zLineNumbers.grid:  s(    1Qrw?????r   c                 P    t          j        | j        dd          }|| j        d<   d S )NmainEditorWindowfont)r   GetFontr   r   )r?   r   s     r   r=   zLineNumbers.update_font=  s+    	6>BB$(&!!!r   c                     t          j        t          j                    d          }|d         }|d         }| j                            |||||           dS )rI   r   
foreground
background)fgbgselectforegroundselectbackgroundinactiveselectbackgroundN)r   GetHighlightCurrentThemer   r   )r?   colorsr   r   s       r   r>   zLineNumbers.update_colorsA  sh    &x'<'>'>MML)
L)
  j'*%/ 	! 	
 	
 	
 	
 	
r   c                    || j         k    rdS t          t          |                    t          t          | j                             z
  }|rIt          t	          | j        d                             }||z   }|                     |          | j        d<   t          | j                  5  || j         k    rrd                    t          j
        dgt          t          t          | j         dz   |dz                                           }| j                            d|d           n!| j                            |dz    dd           ddd           n# 1 swxY w Y   || _         dS )	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    $-Fs3xx==3s4=/A/A+B+BB 	ME$"3G"<==>>I!$44I)-)A)A))L)LDg&$T%677 	F 	FT]""99Y_DU4=1#4cAg>>??& &   !((X|LLLL!((CE)9)9)99EEE	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F s   +BEEEc                 F    | j                             |d                    dS )Nr   r[   )r   yview_movetorQ   s      r   rT   zLineNumbers.yscroll_eventg  s"    &&tAw///wr   )r   r   r   r   r@   r:   r   r=   r>   r   rT   __classcell__r   s   @r   r   r     s        22D D D D D! ! !&@ @ @) ) )	
 	
 	
  6      r   r   c                   $    e Zd Zd ZddZddZdS ) WrappedLineHeightChangeDelegatorc                 <    t          j        |            || _        dS )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                            |||           |rt          | |          }||k    rd S |                                  d S )Nr   )r   r   r   r   )r?   r   r   r   is_single_linebefore_displaylinesafter_displayliness          r   r   z'WrappedLineHeightChangeDelegator.insertv  sy    U* 	@"24"?"?UE4000 	!1$!>!>!%888r   c                    ||dz   }t          | |          t          | |          k    }|rt          | |          }| j                            ||           |rt          | |          }||k    rd S |                                  d S )Nz+1c)r   r   r   r   r   )r?   r   r   r   r   r   s         r   r   z'WrappedLineHeightChangeDelegator.delete  s    >e^F#D&11Zf5M5MM 	A"24"@"@VV,,, 	!1$!?!?!%888r   r   )r   r   r   r@   r   r   r   r   r   r   r   l  sK        ! ! !        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r7|j	        | j        j        j        ur|j	        }|j	        | j        j        j        u| j        j                            ||           d| _        d S )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BB 	 L :TY&&*DL$4$;;;J *DL$4$;;;**+;1*EEEr   c                     t          j        | j        dddd          | _        |                                  |                                  | j        S )N   r   F)r   r   r   r   )r$   Canvasr8   r  update_sidebarr   rD   s    r   r:   zShellSidebar.init_widgets  sQ    i2,-!*/1 1 1 			{r   c                     t                                                       | j                            t	          j                    rdnd| j                   d S )Nz
<Button-2>z
<Button-3>)r   r<   r;   rp   r   isAquaTkcontext_menu_event)r?   r   s    r   r<   zShellSidebar.bind_events  sX    "O--?LL<#	
 	
 	
 	
 	
r   c                 l    t          j         j        d          }t           j                            dd                    } fd}|                    d |d          |rdnd	
           |                    d |d          |rdnd	
           |                    |j        |j	                   dS )Nr   )tearoffr{   r|   c                       fdS )Nc                  8    j                                        S r   )r   rd   	eventnamer?   s   r   <lambda>z@ShellSidebar.context_menu_event.<locals>.mkcmd.<locals>.<lambda>  s    49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44TY44UEBBCC	? 	? 	? 	? 	?"'%
"3"3,9 Iz 	 	K 	K 	K 	 3"'%(?"@"@,9 Iz 	 	K 	K 	K 	u|U\222wr   c                 X    | j                             ddt          j        dd           d S )Nr~   r   rt   )r   r   r   r   r   )r  r   r$   r   rD   s    r   r   zShellSidebar.grid  s+    QqqqIIIIIr   c                 @    | j         r|                                  d S d S r   )r9   r  rD   s    r   r  zShellSidebar.change_callback  s.    = 	"!!!!!	" 	"r   c           	         | j         }|j        }| j        }i x}| _        |                    t
          j                   |                    d          }|                    dd          d         dk    r|                    | d          }|	                    |          x}|d         } || d          }d|v rdnd	|v rd
nd }	|	rJ|
                    d|t
          j        |	| j        | j        d                    t          ||          }
|	||
<   |                    | d          }|	                    |          x}d S d S )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{   y+--t(bf

6"";;sAq!S((JJ%999::E>>%000x=A$1MU2J2J2J$K$K!"&;;; $999 
  .""1aF(,	A # H H H#D%00'-V$JJ%///00E  >>%000x=====r   c                 .    |                                   dS )rV   r[   )r  rQ   s      r   rT   zShellSidebar.yscroll_event  s    
 	wr   c                    t          j        | j        dd          }t          | j        |          t	          fddD                       }| j                            |dz  dz              || _        |                                  d	S )
rG   r   r   )r   c              3   B   K   | ]}                     |          V  d S r   )measure).0chartk_fonts     r   	<genexpr>z+ShellSidebar.update_font.<locals>.<genexpr>  s/      FF4..FFFFFFr   )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  s    	6>BBtyt,,,FFFF:FFFFF
JNQ$6777	r   c                 .   t          j        t          j                    d          }t          j        t          j                    d          }|d         }|d         }||f| _        | j                            |           |                                  dS )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  s    %283H3J3JLYY -h.C.E.EyQQ"<0
'5
!:.444r   )r   r   r   r   r@   r:   r<   r  r   r  r  rT   r=   r>   r   r   s   @r   r  r    s        ::    $  
 
 
 
 
  J J J" " "1 1 14          r   r  c           
         ddl m} t          j        |           }t          j        |          }|                    t          j        t          j        d           |                    dd           |	                    dd           t          j        |dd          }t          j        |d	d
t          j        |          }|                    ddt          j                    ||          }t          j        |          |_        t%          |          }|                                 |                    dd                    d t-          dd          D                                  d S )Nr   )Dummy_editwinT)sider1  expandr~   )weightr   r   P      )r   heightr   r   r   r|   r   c              3       K   | ]	}d |z  V  
dS )r   Nr   )r@  is     r   rC  z._linenumbers_drag_scrolling.<locals>.<genexpr>  s&       > >1Q > > > > > >r   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  toplevelr7   r   r   r6   linenumberss           r   _linenumbers_drag_scrollingr^    sF   <<<<<<{6""H(##JOOrwtO<<<Aa(((q+++Hfn==D7:RtLLLDII!AbgI...mD!!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.htestrb  r   r   r   <module>rl     sR                          # # # # # # ' ' ' ' ' '      : : :& & &
       4 * * *C> C> C> C> C> C> C> C>LA A A A Ay A A A$M M M M M+ M M M`& & & & &y & & &Rm m m m m; m m m`@ @ @, zD	)QUCCCC++++++C#$$$$$ r   