NfdZddlZddlZdZGddZedkr*dZejeZe de edSdS) z:Simple textbox editing widget with Emacs-like keybindings.Ncf||dz|tj||z dz |||dztj||z dz |||dztj||z dz ||dz|tj||z dz |||tj|||tj|||tj|||tj dS)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.11/curses/textpad.py rectanglers IIc!eS&*C#IM:::IIc3q5&*C#IM:::IIc3q5&*C#IM:::IIc!eS&*C#IM:::IIc3+,,,IIc3+,,,IIc3+,,,IIc3+,,,,,c@eZdZdZd dZdZdZdZdZdZ d d Z d S) 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 Fc||_||_|d|_d|_|ddSNr)r insert_mode_update_max_yx stripspaceslastcmdkeypad)selfrrs r__init__zTextbox.__init__+sE&   1 rcf|j\}}|dz |_|dz |_dSr)rgetmaxyxmaxymaxx)r r$r%s rrzTextbox._update_max_yx3s3X&&(( d1H 1H rc ||j} tj|j||tjjkrt|j|dz}n |dkrn|dz }q|S)zuGo to the location of the first blank on the given line, returning the index of the last non-blank character.Trr)rr%rasciirinchSPmin)r ylasts r _end_of_linezTextbox._end_of_line8s y |!!$(--4"8"899V\_LL49d1f--!8D   rc ||j\}}d}||jks ||jkr|jr|j} |j|n#tj $rYnwxYw|jrtj |sn:|}|j\}}|||f}||jk||jk||jj |dSdSN) rrgetyxr$r%rr(r rerrorr'isprintmove)r chr+xbackyxoldchs r_insert_printable_charzTextbox._insert_printable_charFs& !!A$)mmq49}} (  r""""<    # 6<+?+?+F+F BX^^%%FQ~A!$)mmq49}}$   DHM6 " " " "  s*BBBc ||j\}}||_tj|r-||jks ||jkr| |n|tjj kr|j |dn|tjj tj tjjtjfvr|dkr|j ||dz nf|dkrn_|jr5|j |dz ||dz n#|j |dz |j|tjjtjfvr|jn|tjjkr|jnY|tjjkrY|jr0|j |||n |j ||jn|tjjtjfvrX||jkr |j ||dzn||jkrn|j |dzdnt|tjjkrdS|tjjkr8|jdkrdS||jkr|j |dzdn|tjjkrp|dkr4||dkr|jn|j |||jn|tjjkr|jn[|tjjtjfvrz||jkrn|j |dz||||dzkr4|j |dz||dzn|tjj kr|j!n|tjj"tj#fvrt|dkrn|j |dz ||||dz kr4|j |dz ||dz dS)z!Process a single editing command.rr)$rrr0rrr'r2r$r%r8SOHr3STXKEY_LEFTBS KEY_BACKSPACErr-delchEOTENQACK KEY_RIGHTBELNLVTdeletelnclrtoeolFFrefreshSOKEY_DOWNSIinsertlnDLEKEY_UP)r r4r+r5s r do_commandzTextbox.do_command_s !!A <   # #9 ?49}}DI ++B/// 6<# # # HMM!Q     FL$V_flofFZ[ [ [1uu a1%%%%a! . ac4#4#4QqS#9#9:::: ac49---flov';<<<   6<# # # HNN     6<# # # , a!2!21!5!56666 a++++ FL$f&67 7 749}} a1%%%%di ac1%%%% 6<# # #1 6>> 6>>qrc d}|t|jdzD]}|j|d||}|dkr|jr@t|jdzD]Y}|jr||krnI|ttj |j ||z}Z|jdkr|dz}|S)z.Collect and return the contents of the window.rr ) rranger$rr3r-rr%chrrr'r()r resultr+stopr5s rgatherzTextbox.gathers ty{## ' 'A HMM!Q   $$Q''DqyyT-y49Q;'' O O#DE#fl&8&8q!9L9L&M&M"N"NNy1}}$ rNc |j}|r ||}|s*||sn|jY|S)z2Edit in the widget window and collect the results.)rgetchrQrJrY)r validater4s reditz Textbox.editsx !!B "Xb\\ ??2&&  H      {{}}r)Fr/) __name__ __module__ __qualname____doc__r!rr-r8rQrYr]rrrrs.   ###2???B"      rr__main__c d\}}d\}}||dz |dtj||||}t||dz |dz ||z||z|t |S)N) )zUse Ctrl-G to end editing.r)addstrrnewwinrrJrr])stdscrncolsnlinesrrrs r test_editboxros vS c!eS">???mFE344&#a%Qf cEkBBBs||  """rzContents of text box:) rar curses.asciirrr^rowrapperstrprintreprrbrrrus@@  - - -iiiiiiiiV z### &. & &C E !4499-----r