U .c5@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/python38/lib64/python3.8/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 borderwidthZhighlightthicknessstateZyscrollcommandF)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_fontr(fontrrr r%?szBaseSideBar.update_fontcCs||jd<dS)Nr/)r!r.rrr r-DszBaseSideBar._update_fontcCs*ttd}|j|d|dddS)=Update the sidebar text colors, usually after config changes.Znormal foreground backgroundr1r2NrZ GetHighlightZ CurrentTheme_update_colorsr(Zcolorsrrr r&Gs zBaseSideBar.update_colorscCs|jj|||||ddS)N)ZfgZbgZselectforegroundZselectbackgroundZinactiveselectbackground)r!r")r(r1r2rrr r5MszBaseSideBar._update_colorscCs$|js |jjddtjdd|_dS)NrrrowcolumnZstickyT)r'r!r rNSEWr(rrr show_sidebarTszBaseSideBar.show_sidebarcCs|jr|jd|_dS)NF)r'r!Z grid_forgetr;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_setr(eventrrr redirect_focusin_eventgs z"BaseSideBar.redirect_focusin_eventcCs"|j|jj|d|jddS)z)rrDevent_generaterI)r(rF event_namerrr redirect_mousebutton_eventls z&BaseSideBar.redirect_mousebutton_eventcCs|jjdd|j|jddS)z7Redirect mouse wheel events to the editwin text widget. r)rHrIdeltar>)rrJrIrNrErrr redirect_mousewheel_eventrs z%BaseSideBar.redirect_mousewheel_eventN)__name__ __module__ __qualname____doc__r)r%r-r&r5r<r=r$rGrLrOrrrr 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(rUrrr r)|s zEndLineDelegator.__init__NcCs$|j||||t|jdSN)delegateinsertrUr )r(rcharsZtagsrrr rXszEndLineDelegator.insertcCs"|j|||t|jdSrV)rWdeleterUr )r(Zindex1Zindex2rrr rZszEndLineDelegator.delete)N)N)rPrQrRrSr)rXrZrrrr rTys rTc@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}||k r||j}qd|_dS) NrrrrX1 linenumberF)Z takefocusZexportselection)Zjustify)rr)prev_endtyper!_sidebar_width_typer"rNORMALrXr#Z tag_configZRIGHT bind_eventsr rupdate_sidebar_textrTZ setdelegaterZundorWZpertopZ resetcacher')r(rendZend_line_delegatorZ delegatorrrr r)s&     zLineNumbers.__init__cs4jdjjdjfdd}dD]j}d|dd|dd |d fD]}|||d qVd |dd |dfD]}||d|dd qq0ddfdd}jd|fdd}jd|fddfdd}jd|fdd}jd|dS)Nz rMcs"tjj|d}j||dS)N)rK) functoolspartialrLr!bind)rKtarget_event_nameZhandlerr;rr bind_mouse_eventsz1LineNumbers.bind_events..bind_mouse_event)rzz)riz.b1_mousedown_handlerz csddddSrVr)rF)last_y last_yviewrxrr b1_mouseup_handlersz3LineNumbers.bind_events..b1_mouseup_handlerzcsttjd|}t|g\}}jdddjd|d|ddjd||krn|n|dddS) z6Helper function for drag and selection event handlers.rorprqrerrrrXN) rrr!rsortedrrsrtru)Zy_coordrvabrwrr %drag_update_selection_and_insert_marks zFLineNumbers.bind_events..drag_update_selection_and_insert_markcsJ|jjdkr*jks.b1_drag_handlerz cs:dkr dSj}|kr6j|ddSr)r!rrrA)rFrrrr selection_handler s  z2LineNumbers.bind_events..selection_handlerz <>)r!rhrGrO)r(rjZbuttonrKryr|rrr)rrzr{r(rxr rbs4         zLineNumbers.bind_eventscCs*ttd}|j|d|dddS)r0r]r1r2r3Nr4r6rrr 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 linesNrr rzend -1cr]z.0 -1c)r^lenstrrrr!r`r"rrajoin itertoolschainrrangerXrZr#)r(reZwidth_differenceZ cur_widthZ new_widthZnew_textrrr rcs"  zLineNumbers.update_sidebar_textN)rPrQrRrSr)rbr&rcrrrr r[s jr[c 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/r7rqrcss|]}d|VqdS)r~Nr).0irrr Msz._linenumbers_drag_scrolling..e)Zidlelib.idle_test.test_sidebarrrZToplevelZFramer ZLEFTZBOTHZ rowconfigureZcolumnconfigurerr,rr r r:Z Scrollbarr?r[r<rXrr)rrZtoplevelrr/rrZ linenumbersrrr _linenumbers_drag_scrolling:s    r__main__)r*zidlelib.idle_test.test_sidebarrF) verbosityexit)run)rSrfrZtkinterrZidlelib.configrZidlelib.delegatorrr rrrTr[rrPZunittestr*Zidlelib.idle_test.htestrrrrr s"  N-