B B&Lj@sdZddlZddlZddlZddlmZddlmZddZ ddZ Gd d d Z Gd d d eZ Gd dde Z ddZedkrddlmZeddddddlmZeedS)zLine numbering implementation for IDLE as an extension. Includes BaseSideBar which can be extended for other sidebar based extensions N)idleConf) DelegatorcCstt|dS)z:Utility to get the last line's number in a Tk text widget.zend-1c)intfloatindex)textr4/opt/alt/python37/lib64/python3.7/idlelib/sidebar.pyget_end_linenumber sr cCs|}|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)ZwidgetZmanagerinfor rrrr get_widget_paddings    rc@sheZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZdS) BaseSideBarz@ The base class for extensions which require a sidebar. c Csx||_|j|_|j|_t|j\}}tj|jdtjd|ddd|_|jj tj d|j |jd<| | d|_dS)Nr)widthwrapr rZ borderwidthZhighlightthickness)stateZyscrollcommandF)editwin text_frameparentrrrTextNONE sidebar_textconfigDISABLEDredirect_yscroll_event update_font update_colorsis_shown)selfrZ_padxrrrr __init__/s  zBaseSideBar.__init__cCst|jdd}||dS)z;Update the sidebar text font, usually after config changes.main EditorWindowN)rGetFontr _update_font)r'fontrrr r$?szBaseSideBar.update_fontcCs||jd<dS)Nr-)r )r'r-rrr r,DszBaseSideBar._update_fontcCs*ttd}|j|d|dddS)z=Update the sidebar text colors, usually after config changes.Znormal foreground background)r.r/N)r GetHighlight CurrentTheme_update_colors)r'colorsrrr r%Gs zBaseSideBar.update_colorscCs|jj|||||ddS)N)ZfgZbgZselectforegroundZselectbackgroundZinactiveselectbackground)r r!)r'r.r/rrr r2MszBaseSideBar._update_colorscCs$|js |jjddtjdd|_dS)Nrr)rowcolumnstickyT)r&r r rNSEW)r'rrr show_sidebarTszBaseSideBar.show_sidebarcCs|jr|jd|_dS)NF)r&r Z grid_forget)r'rrr hide_sidebarYs zBaseSideBar.hide_sidebarcOs"|jjj||j|ddS)zmRedirect vertical scrolling to the main editor text widget. The scroll bar is also updated. rbreak)rvbarsetr yview_moveto)r'argskwargsrrr r#^sz"BaseSideBar.redirect_yscroll_eventcCs|jdS)z8Redirect focus-in events to the main editor text widget.r:)r focus_set)r'eventrrr redirect_focusin_eventgs z"BaseSideBar.redirect_focusin_eventcCs"|j|jj|d|jddS)zr)rCrDdeltar:)rrErDrH)r'rArrr redirect_mousewheel_eventrsz%BaseSideBar.redirect_mousewheel_eventN)__name__ __module__ __qualname____doc__r(r$r,r%r2r8r9r#rBrGrIrrrr r+s rc@s,eZdZdZddZd ddZd ddZdS) EndLineDelegatorz\Generate callbacks with the current end line number after insert or delete operationscCst|||_dS)z changed_callback - Callable, will be called after insert or delete operations with the current end line number. N)rr(changed_callback)r'rOrrr r(|s zEndLineDelegator.__init__NcCs$|j||||t|jdS)N)delegateinsertrOr )r'rcharsZtagsrrr rQszEndLineDelegator.insertcCs"|j|||t|jdS)N)rPdeleterOr )r'Zindex1Zindex2rrr rSszEndLineDelegator.delete)N)N)rJrKrLrMr(rQrSrrrr rNys rNc@s0eZdZdZddZddZddZdd Zd S) LineNumbersz(Line numbers support for editor windows.cCst||d|_t|jd|_|jjtjd|j ddd|jjtj d|jjddd|jj dtj d | t|j}||t|j}||jjj|jj||jjj}x||k r||j}qWd|_dS) Nrr)rrQ1 linenumberF)Z takefocusZexportselection)Zjustify)rr(prev_endtyper _sidebar_width_typer!rNORMALrQr"Z tag_configZRIGHT bind_eventsr rupdate_sidebar_textrNZ setdelegaterZundorPZpertopZ resetcacher&)r'rendZend_line_delegatorZ delegatorrrr r(s&       zLineNumbers.__init__cs@jdjjdjfdd}xzdD]r}x6d|dd|dd |d fD]}|||d qZWx4d |dd |dfD]}||d|dd qWq2Wddfdd}jd|fdd}jd|fddfdd}jd|fdd}jd|dS)Nz z cs"tjj|d}j||dS)N)rF) functoolspartialrGr bind)rFtarget_event_nameZhandler)r'rr bind_mouse_eventsz1LineNumbers.bind_events..bind_mouse_event)rzz)rbz.b1_mousedown_handlerz csddddS)Nr)rA)last_y last_yviewrmrr b1_mouseup_handlersz3LineNumbers.bind_events..b1_mouseup_handlerzcsttjd|}t|g\}}jdddjd|d|ddjd||krn|n|dddS) z6Helper function for drag and selection event handlers.z@0,rhz1.0r^z.0rrQN) rrr rsortedrrirjrk)Zy_coordrlab)r'rmrr %drag_update_selection_and_insert_marks  zFLineNumbers.bind_events..drag_update_selection_and_insert_markcsJ|jjdkr*jks)rurorpr'rr b1_drag_handlers  z0LineNumbers.bind_events..b1_drag_handlerz cs:dkr dSj}|kr6j|ddS)Nr)r rvrr=)rArv)rurorpr'rr selection_handler s  z2LineNumbers.bind_events..selection_handlerz <>)r rarBrI)r'rcZbuttonrFrnrqrwrxr)rurorpr'rmr r[s.       zLineNumbers.bind_eventscCs*ttd}|j|d|dddS)z=Update the sidebar text colors, usually after config changes.rVr.r/)r.r/N)rr0r1r2)r'r3rrr r%s zLineNumbers.update_colorsc Cs||jkrdStt|tt|j}|rVtt|jd}||}|||jd<|jjtj d||jkrd t dgt tt|jd|d}|jd|dn|j|dd d|jjtjd||_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 rzend -1crVz.0 -1c)rWlenstrrrr rYr!rrZjoin itertoolschainrrangerQrSr")r'r^Zwidth_differenceZ cur_widthZ new_widthZnew_textrrr r\s   zLineNumbers.update_sidebar_textN)rJrKrLrMr(r[r%r\rrrr rTs jrTc Csddlm}t|}t|}|jtjtjdd|jddd|j dddt |dd}tj |d d tj |d }|jddtjd ||}t||_t|}||d dddtddDdS)Nr) Dummy_editwinT)ZsideZfillexpandr)Zweightr)r*P)rZheightrr-)r4r5r6z1.0rycss|]}d|VqdS)rsNr).0irrr Msz._linenumbers_drag_scrolling..e)Zidlelib.idle_test.test_sidebarrrZToplevelZFramer ZLEFTZBOTHZ rowconfigureZcolumnconfigurerr+rrr r7Z Scrollbarr;rTr8rQr}r)rrZtoplevelrr-rrZ linenumbersrrr _linenumbers_drag_scrolling:s    r__main__)r)zidlelib.idle_test.test_sidebarrF) verbosityexit)run)rMr_r~ZtkinterrZidlelib.configrZidlelib.delegatorrr rrrNrTrrJZunittestr)Zidlelib.idle_test.htestrrrrr s"  N-