o =?hO@sdZddlZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z ddZd d Zd d Zd dZejddZGdddZGddde ZGdddeZGddde ZGdddeZddZedkrddlmZedd d!d"dd#lmZeedSdS)$zLine numbering implementation for IDLE as an extension. Includes BaseSideBar which can be extended for other sidebar based extensions N)Font)idleConf) Delegator)macosxcCs||}|r tt|SdS)z7Return the line number of an index in a Tk text widget.N)indexintfloat)textrZ text_indexr 6/opt/alt/python310/lib64/python3.10/idlelib/sidebar.py get_linenos r cCs t|dS)z7Return the number of the last line in a Tk text widget.zend-1c)r r r r r get_end_linenumbers rcCs*||d|dd}|r|dSdS)z@Display height, in lines, of a logical line in a Tk text widget.z linestartz lineendZ displaylinesr)count)r rresr r r get_displayliness rcCs|}|dkr |}n|dkr|}ntd|tt|jj|d|d|dg}tt|jj|d|d|dg}||fS)z;Get the total padding of a Tk widget, including its border.packgridzUnsupported geometry manager: padxZborderpady) Z winfo_managerZ pack_infoZ grid_info ValueErrorsummaptkZgetintZcget)ZwidgetZmanagerinforrr r r get_widget_padding!s"    rc cs<|jtjdz dVW|jtjddS|jtjdw)Nstate) configurerZNORMALDISABLEDr r r r temp_enable_text_widget;s "r c@sxeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZdS) BaseSideBarz%A base class for sidebars using Text.cCsB||_|j|_|j|_d|_||_||| dSNF) editwin text_frameparentr is_shown init_widgets main_widget bind_events update_font update_colors)selfr#r r r __init__Fs  zBaseSideBar.__init__cCt)zr)rErFdeltar?)r rGrFrKrAr r r redirect_mousewheel_events z%BaseSideBar.redirect_mousewheel_eventc spjjd<jdjjdjfdd}dD]5}d|dd |dd |d fD]}|||d q1d |dd|dfD] }||d|dd qFqdddfddfdd}jd|fdd}jd|fdd}jd|fddfdd}jd|fdd }jd!|dS)"NZyscrollcommandz rJcs"tjj|d}j||dS)N)rH) functoolspartialrIr(bind)rHtarget_event_nameZhandlerr1r r bind_mouse_eventsz1BaseSideBar.bind_events..bind_mouse_event)zz)rPz.drag_update_selection_and_insert_markcs0ttjd|j|j|jdS)NrW)rrr rrFrB)rblast_yr,rar r b1_mousedown_handlersz5BaseSideBar.bind_events..b1_mousedown_handlerz cs ddjjdd|jddS)NrrD)r rGrFrc)rdr,rar r b1_mouseup_handlersz3BaseSideBar.bind_events..b1_mouseup_handlerrfcs durdS|j|jdSNrFrc)rbrdr r b1_drag_handlersz0BaseSideBar.bind_events..b1_drag_handlerz cs}|durjddS|dkr"jd|d|n|jkr;jd|jd|jddS)z6Mimic Text auto-scrolling when dragging outside of it.NrZpixelsr[2)r( after_cancelr Z yview_scrollZ winfo_heightafterri)auto_scrolling_after_idrbrdr,text_auto_scrollr r rps   z1BaseSideBar.bind_events..text_auto_scrollcs$dur|jjddSdS)Nr)rFr(rnrc)rordr,rpr r b1_leave_handlers  z1BaseSideBar.bind_events..b1_leave_handlerz cs durjddSdSrh)r(rmrc)ror,r r b1_enter_handlers z1BaseSideBar.bind_events..b1_enter_handlerz )r>r r(rOrCrL) r,rQZbuttonrHrergrjrqrrr )rorbrdr,rarpr r)s@          zBaseSideBar.bind_eventsN)__name__ __module__ __qualname____doc__r-r'r*r+rr5r6r:r>rCrIrLr)r r r r r!Ds r!c@s,eZdZdZddZd ddZd ddZdS) EndLineDelegatorz}Generate callbacks with the current end line number. The provided callback is called after every insert and delete. cCst|||_dSrh)rr-changed_callback)r,rxr r r r-s  zEndLineDelegator.__init__NcCs$|j||||t|jdSrh)delegater\rxr)r,rcharstagsr r r r\szEndLineDelegator.insertcCs"|j|||t|jdSrh)rydeleterxr)r,index1index2r r r r|szEndLineDelegator.deleterh)rsrtrurvr-r\r|r r r r rw s  rwcsPeZdZdZfddZddZddZdd Zd d Zd d Z ddZ Z S) LineNumbersz(Line numbers support for editor windows.cs0t|t|j}|jjj||jjddS)Nrn)superr-rwupdate_sidebar_textr#perinsertfilterafterZundo)r,r#Zend_line_delegator __class__r r r-s    zLineNumbers.__init__c Cst|j\}}tj|jdtjd|ddd|_|jjtjdd|_ t |jd|_ t |j|j ddd Wdn1sAwY|jjd d d |jjd tjd t|j}|||jS) Nr[rRr)widthwraprr borderwidthhighlightthicknessrrr\1 linenumberF) takefocusZexportselection)Zjustify)rr rTextr%NONE sidebar_textconfigrprev_endtype_sidebar_width_typer r\Z tag_configZRIGHTrr)r,Z_padxrrZr r r r''s    zLineNumbers.init_widgetscCs|jjddtjddS)Nr[rrowcolumnsticky)rrrNSEWr1r r r r:szLineNumbers.gridcCst|jdd}||jd<dS)Nmain EditorWindowfont)rGetFontr r)r,rr r r r*=szLineNumbers.update_fontcCs:ttd}|d}|d}|jj|||||ddS)r4r foreground background)ZfgZbgZselectforegroundZselectbackgroundZinactiveselectbackgroundN)r GetHighlight CurrentThemerr)r,colorsrrr r r r+As zLineNumbers.update_colorsc Cs||jkrdStt|tt|j}|r+tt|jd}||}|||jd<t|j7||jkrTdt dgt tt |jd|d}|j d|dn |j|dddWdn1sjwY||_dS) 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)rlenstrrrrrr join itertoolschainrranger\r|)r,rZZwidth_differenceZ cur_widthZ new_widthZnew_textr r r rLs$    zLineNumbers.update_sidebar_textcOs|j|ddS)Nrr?)rZ yview_movetor7r r r r:gszLineNumbers.yscroll_event) rsrtrurvr-r'rr*r+rr: __classcell__r r rr rs   rc@s(eZdZddZdddZdddZdS) WrappedLineHeightChangeDelegatorcCst|||_dS)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,rr r r r-ms  z)WrappedLineHeightChangeDelegator.__init__NcCsLd|v}|r t||}|j||||r t||}||kr dS|dS)Nr)rryr\r)r,rrzr{is_single_linebefore_displaylinesafter_displaylinesr r r r\vs   z'WrappedLineHeightChangeDelegator.insertcCsf|dur|d}t||t||k}|rt||}|j|||r-t||}||kr-dS|dS)Nz+1c)r rryr|r)r,r}r~rrrr r r r|s   z'WrappedLineHeightChangeDelegator.deleterh)rsrtrur-r\r|r r r r rls rcsleZdZdZfddZddZfddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ZS) ShellSidebarz0Sidebar for the PyShell window, for prompts etc.cszd|_i|_t|t|j}|jjj}|j |j ur/|j |jjj ur/|j }|j |jjj us$|jjj ||dd|_ dS)NrT)canvas line_promptsrr-rchange_callbackr#rtopryr Zbottomrr&)r,r#Zchange_delegatordrr r r-s    zShellSidebar.__init__cCs.tj|jddddd|_|||jS)NrF)rrrr)rZCanvasr%rupdate_sidebarrr1r r r r's zShellSidebar.init_widgetscs*t|jtrdnd|jdS)Nz z )rr)r(rOrZisAquaTkcontext_menu_eventr1rr r r)s zShellSidebar.bind_eventscsztjjdd}tjdd}fdd}|jd|d|r!d nd d |jd |d |r/d nd d ||j|j dS)Nr)ZtearoffrXrYcsfddS)Ncs jSrh)r rGr ) eventnamer,r r s z@ShellSidebar.context_menu_event..mkcmd..r rr1rr mkcmdsz.ShellSidebar.context_menu_event..mkcmdZCopyz<>ZnormalZdisabled)ZlabelZcommandrzCopy with promptsz<>r?) rZMenur(boolr Z tag_nextrangeZ add_commandZtk_popupZx_rootZy_root)r,rBZrmenuZ has_selectionrr r1r rs   zShellSidebar.context_menu_eventcCs|jjddtjddddS)Nr[rrR)rrrrr)rrrrr1r r r rszShellSidebar.gridcCs|jr |dSdSrh)r&rr1r r r rs zShellSidebar.change_callbackc Cs|j}|j}|j}i}|_|tj|d}|ddddkr+||d}| |}dur{|d}||d}d|vrEdnd |vrKd nd} | rh|j d |tj | |j |j d d t||} | || <||d}| |}dus4dSdS)Nz@0,0.r[0z+1line linestartz linestart -1cconsolez>>>stdinz...rRr)Zanchorr rfillz+1line)r Z tag_namesrrr|rZALLrsplitZ dlineinfoZ create_textZNWrrr ) r,r Z text_tagnamesrrrZlineinforFZprev_newline_tagnamespromptr^r r r rs.       zShellSidebar.update_sidebarcOs |dS)r;r?)rr7r r r r:szShellSidebar.yscroll_eventcs\t|jdd}t|j|dtfdddD}|jj|ddd ||_|d S) r3rr)rc3s|]}|VqdSrh)Zmeasure).0charZtk_fontr r sz+ShellSidebar.update_font..)rVrrSrT)rN) rrr rmaxrrrr)r,rZ char_widthr rr r*s  zShellSidebar.update_fontcCsTttd}ttd}|d}|d}||f|_|jj|d|dS)r4rrrr)rN)rrrrrrr)r,Zlinenumbers_colorsZ prompt_colorsrrr r r r+s  zShellSidebar.update_colors)rsrtrurvr-r'r)rrrrr:r*r+rr r rr rs    rc Csddlm}t|}t|}|jtjtjdd|jddd|j dddt |dd}tj |d d tj |d }|jddtjd ||}t||_t|}||d dddtddDdS)Nr) Dummy_editwinT)Zsiderexpandr[)ZweightrrP)rZheightrrrrYrcss|]}d|VqdS)r_Nr )rir r r rsz._linenumbers_drag_scrolling..e)Zidlelib.idle_test.test_sidebarrrZToplevelZFramerZLEFTZBOTHZ rowconfigureZcolumnconfigurerrrrrrZ Scrollbarr<rr5r\rr)r%rZtoplevelr$rr r#Z linenumbersr r r _linenumbers_drag_scrollings    &r__main__)rzidlelib.idle_test.test_sidebarrRF) verbosityexit)run)rv contextlibrMrZtkinterrZ tkinter.fontrZidlelib.configrZidlelib.delegatorrZidlelibrr rrrcontextmanagerr r!rwrrrrrsZunittestrZidlelib.idle_test.htestrr r r r s8     GP)p