a  ze5@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)textrC/opt/bitninja-python-dojo/embedded/lib/python3.9/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)Zwidgetmanagerinfor 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)Nr0)r"r/rrr r.DszBaseSideBar._update_fontcCs*ttd}|j|d|dddS)=Update the sidebar text colors, usually after config changes.Znormal foreground backgroundr2r3NrZ GetHighlightZ CurrentTheme_update_colorsr)Zcolorsrrr r'Gs zBaseSideBar.update_colorscCs|jj|||||ddS)N)ZfgbgZselectforegroundZselectbackgroundZinactiveselectbackground)r"r#)r)r2r3rrr r6Ms zBaseSideBar._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)zr)rJrKdeltar@)rrLrKrPrGrrr redirect_mousewheel_eventrs z%BaseSideBar.redirect_mousewheel_eventN)__name__ __module__ __qualname____doc__r*r&r.r'r6r>r?r%rIrNrQrrrr 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)rWrrr r*|s zEndLineDelegator.__init__NcCs$|j||||t|jdSN)delegateinsertrWr )r)rcharstagsrrr rZszEndLineDelegator.insertcCs"|j|||t|jdSrX)rYdeleterWr )r)Zindex1index2rrr r]szEndLineDelegator.delete)N)N)rRrSrTrUr*rZr]rrrr rVys rVc@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}||ur||j}qd|_dS) NrrrrZ1 linenumberF)Z takefocusZexportselection)Zjustify)rr*prev_endtyper"_sidebar_width_typer#rNORMALrZr$Z tag_configZRIGHT bind_eventsr rupdate_sidebar_textrVZ setdelegaterZundorYZpertopZ 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 rOcs"tjj|d}j||dS)N)rM) functoolspartialrNr"bind)rMtarget_event_namehandlerr=rr bind_mouse_eventsz1LineNumbers.bind_events..bind_mouse_event)rzz)rmz.b1_mousedown_handlerz csddddSrXr)rH)last_y last_yviewr}rr b1_mouseup_handlersz3LineNumbers.bind_events..b1_mouseup_handlerzcsttjd|}t|g\}}jdddjd|d|ddjd||krn|n|dddS) z6Helper function for drag and selection event handlers.rtrurvrirwrrZN) rrr"rsortedrrxryrz)Zy_coordr{abr|rr %drag_update_selection_and_insert_marks zFLineNumbers.bind_events..drag_update_selection_and_insert_markcsJ|jjdkr*jks.b1_drag_handlerz cs:dur dSj}|kr6j|ddSr)r"rrrC)rHrrrr selection_handler s  z2LineNumbers.bind_events..selection_handlerz <>)r"rlrIrQ)r)roZbuttonrMr~rrrr)rrrr)r}r rfs4         zLineNumbers.bind_eventscCs*ttd}|j|d|dddS)r1rar2r3r4Nr5r7rrr 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 -1craz.0 -1c)rblenstrrrr"rdr#rrejoin itertoolschainrrangerZr]r$)r)riZwidth_differenceZ cur_widthZ new_widthZnew_textrrr rgs"  zLineNumbers.update_sidebar_textN)rRrSrTrUr*rfr'rgrrrr 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)Zsidefillexpandr)Zweightr+r,P)rZheightrr0r9rvrcss|]}d|VqdS)rNr).0irrr Mz._linenumbers_drag_scrolling..e)Zidlelib.idle_test.test_sidebarrrZToplevelZFramer ZLEFTZBOTHZ rowconfigureZcolumnconfigurerr-r r!r r<Z ScrollbarrAr_r>rZrr)rrZtoplevelrr0rrZ linenumbersrrr _linenumbers_drag_scrolling:s    r__main__)r+zidlelib.idle_test.test_sidebarrF) verbosityexit)run)rUrjrtkinterrZidlelib.configrZidlelib.delegatorrr rrrVr_rrRZunittestr+Zidlelib.idle_test.htestrrrrr s"  N-