fJdZddlZddlZdZGddZedk(r%dZejeZe de eyy) z:Simple textbox editing widget with Emacs-like keybindings.Ncd|j|dz|tj||z dz |j||dztj||z dz |j||dztj||z dz |j|dz|tj||z dz |j ||tj |j ||tj|j ||tj|j ||tjy)z^Draw a rectangle with corners at the provided upper-left and lower-right coordinates. N) vlinecurses ACS_VLINEhline ACS_HLINEaddch ACS_ULCORNER ACS_URCORNER ACS_LRCORNER ACS_LLCORNER)winulyulxlrylrxs %/usr/lib/python3.12/curses/textpad.py rectanglersIIc!eS&**C#IM:IIc3q5&**C#IM:IIc3q5&**C#IM:IIc!eS&**C#IM:IIc3++,IIc3++,IIc3++,IIc3++,c>eZdZdZd dZdZdZdZdZdZ d d Z y) TextboxadEditing widget using the interior of a window object. Supports the following Emacs-like key bindings: Ctrl-A Go to left edge of window. Ctrl-B Cursor left, wrapping to previous line if appropriate. Ctrl-D Delete character under cursor. Ctrl-E Go to right edge (stripspaces off) or end of line (stripspaces on). Ctrl-F Cursor right, wrapping to next line when appropriate. Ctrl-G Terminate, returning the window contents. Ctrl-H Delete character backward. Ctrl-J Terminate if the window is 1 line, otherwise insert newline. Ctrl-K If line is blank, delete it, otherwise clear to end of line. Ctrl-L Refresh screen. Ctrl-N Cursor down; move down one line. Ctrl-O Insert a blank line at cursor location. Ctrl-P Cursor up; move up one line. Move operations do nothing if the cursor is at an edge where the movement is not possible. The following synonyms are supported where possible: KEY_LEFT = Ctrl-B, KEY_RIGHT = Ctrl-F, KEY_UP = Ctrl-P, KEY_DOWN = Ctrl-N KEY_BACKSPACE = Ctrl-h c~||_||_|jd|_d|_|j dyNr)r insert_mode_update_max_yx stripspaceslastcmdkeypad)selfrrs r__init__zTextbox.__init__+s7&   1 rcf|jj\}}|dz |_|dz |_yr)rgetmaxyxmaxymaxx)r r$r%s rrzTextbox._update_max_yx3s.XX&&( d1H 1H rc8|j|j} tjj|jj ||tjj k7rt|j|dz} |S|dk(r |S|dz }~)zuGo to the location of the first blank on the given line, returning the index of the last non-blank character.rr)rr%rasciirinchSPmin)r ylasts r _end_of_linezTextbox._end_of_line8s yy||!!$((--4"89V\\__L499d1f-  !8D rcn|j|jj\}}d}||jks||jkr|j r|jj } |jj||j rtjjsnE|}|jj\}}|||f}||jkr||jkr||jj|yy#tj$rYwxYwN) rrgetyxr$r%rr(r rerrorr'isprintmove)r chr+xbackyxoldchs r_insert_printable_charzTextbox._insert_printable_charFs !A$))mq499}  r"##6<<+?+?+FBXX^^%FQ~A!$))mq499}$   DHHMM6 " <<  s5DD43D4c |j|jj\}}||_tj j |r0||jks||jkr|j|y|tj jk(r|jj|dy|tj jtjtj jtjtj j fvr|dkDr |jj||dz nm|dk(rng|j"r2|jj|dz |j%|dz n)|jj|dz |j|tj jtjtj j fvr|jj'y|tj j(k(r|jj'y|tj j*k(r_|j"r,|jj||j%|y|jj||jy|tj j,tj.fvr`||jkr |jj||dzy||jk(r y|jj|dzdy|tj j0k(ry|tj j2k(r?|jdk(ry||jkr|jj|dzdy|tj j4k(rk|dk(r/|j%|dk(r|jj7y|jj|||jj9y|tj j:k(r|jj=y|tj j>tj@fvrw||jkrg|jj|dz|||j%|dzkDr1|jj|dz|j%|dzy|tj jBk(r|jjEy|tj jFtjHfvrl|dkDrg|jj|dz |||j%|dz kDr1|jj|dz |j%|dz y)z!Process a single editing command.rr)%rrr0rrr'r2r$r%r8SOHr3STXKEY_LEFTBS KEY_BACKSPACEDELrr-delchEOTENQACK KEY_RIGHTBELNLVTdeletelnclrtoeolFFrefreshSOKEY_DOWNSIinsertlnDLEKEY_UP)r r4r+r5s r do_commandzTextbox.do_command_s !A <<   #499}DII ++B/vu6<<## # HHMM!Q rqFLL$$V__LLOO((LL$$&&1u a1%a!! ac4#4#4QqS#9: ac499-flloov';';V\\=M=MNN VU6<<## # HHNN RQ6<<## # a!2!21!56LI a+HGFLL$$f&6&67 7499} a1%BAdii>; ac1%:96<<## # 6<6<rc d}|jt|jdzD]}|jj |d|j |}|dk(r |j rBt|jdzD]Z}|j r||kDrnG|ttjj|jj||z}\|jdkDs|dz}|S)z.Collect and return the contents of the window.rr ) rranger$rr3r-rr%chrrr'r()r resultr+stopr5s rgatherzTextbox.gathers tyy{# 'A HHMM!Q $$Q'DqyT--499Q;' O##D#fll&8&8q!9L&M"NN Oyy1}$ ' rNc |jj}|r||}|s(|j|s |j S|jjd)z2Edit in the widget window and collect the results.)rgetchrRrKrZ)r validater4s reditz Textbox.editsY!Bb\??2&{{} HH   r)Fr/) __name__ __module__ __qualname____doc__r!rr-r8rRrZr^rrrrs,. #2BH" rr__main__cd\}}d\}}|j|dz |dtj||||}t||dz |dz ||z||z|j t |j S)N) )zUse Ctrl-G to end editing.r)addstrrnewwinrrKrr^)stdscrncolsnlinesrrrs r test_editboxrpsz vS c!eS">?mmFE34&#a%Qf cEkBs|  ""rzContents of text box:) rbr curses.asciirrr_rpwrapperstrprintreprrcrrrvsU@  -ll\ z# &.. &C !49-r