o
    ˜»áfé  ã                   @   sZ   d Z ddlZddlZdd„ ZG dd„ dƒZedkr+dd	„ Ze e¡Ze	d
e
eƒƒ dS dS )z:Simple textbox editing widget with Emacs-like keybindings.é    Nc                 C   s¼   |   |d |tj|| d ¡ |  ||d tj|| d ¡ |  ||d tj|| d ¡ |   |d |tj|| d ¡ |  ||tj¡ |  ||tj¡ |  ||tj¡ |  ||tj	¡ dS )z^Draw a rectangle with corners at the provided upper-left
    and lower-right coordinates.
    é   N)
ÚvlineÚcursesÚ	ACS_VLINEÚhlineÚ	ACS_HLINEÚaddchÚACS_ULCORNERÚACS_URCORNERÚACS_LRCORNERÚACS_LLCORNER)ÚwinÚulyÚulxÚlryÚlrx© r   ú%/usr/lib/python3.10/curses/textpad.pyÚ	rectangle   s   r   c                   @   sL   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	ddd„Z
dS )ÚTextboxad  Editing 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                 C   s.   || _ || _|  ¡  d| _d | _| d¡ d S ©Nr   )r   Úinsert_modeÚ_update_max_yxÚstripspacesÚlastcmdÚkeypad)Úselfr   r   r   r   r   Ú__init__+   s   zTextbox.__init__c                 C   s&   | j  ¡ \}}|d | _|d | _d S r   )r   ÚgetmaxyxÚmaxyÚmaxx)r   r   r    r   r   r   r   3   s   
zTextbox._update_max_yxc                 C   s\   |   ¡  | j}	 tj | j ||¡¡tjjkr"t| j|d ƒ}	 |S |dkr)	 |S |d }q)zuGo to the location of the first blank on the given line,
        returning the index of the last non-blank character.Tr   r   )r   r    r   Úasciir   ÚinchÚSPÚmin)r   ÚyÚlastr   r   r   Ú_end_of_line8   s   ýÿúzTextbox._end_of_linec                 C   sÊ   |   ¡  | j ¡ \}}d }|| jk s|| jk rW| jr| j ¡ }z| j |¡ W n
 tj	y1   Y nw | jr;tj
 |¡s<n|}| j ¡ \}}|d u rM||f}|| jk s|| jk s|d urc| jj|Ž  d S d S ©N)r   r   Úgetyxr   r    r   r"   r   r   Úerrorr!   ÚisprintÚmove)r   Úchr%   ÚxÚbackyxÚoldchr   r   r   Ú_insert_printable_charF   s*   
ÿðÿzTextbox._insert_printable_charc                 C   sP  |   ¡  | j ¡ \}}|| _tj |¡r%|| jk s|| jk r#|  	|¡ dS |tjj
kr4| j |d¡ dS |tjjtjtjjtjfv r|dkrP| j ||d ¡ n!|dkrUn| jrg| j |d |  |d ¡¡ n
| j |d | j¡ |tjjtjfv r| j ¡  dS |tjjkrŽ| j ¡  dS |tjjkr­| jr£| j ||  |¡¡ dS | j || j¡ dS |tjjtjfv rÙ|| jk rÆ| j ||d ¡ dS || jkrÎ	 dS | j |d d¡ dS |tjjkrádS |tjjkrþ| jdkrîdS || jk rü| j |d d¡ dS |tjjkr'|dkr|  |¡dkr| j ¡  dS | j ||¡ | j ¡  dS |tjjkr5| j ¡  dS |tjjtjfv rh|| jk rf| j |d |¡ ||  |d ¡krf| j |d |  |d ¡¡ dS |tjj krv| j !¡  dS |tjj"tj#fv r¦|dkr¦| j |d |¡ ||  |d ¡kr¦| j |d |  |d ¡¡ dS )z!Process a single editing command.r   r   )$r   r   r)   r   r   r!   r+   r   r    r1   ÚSOHr,   ÚSTXÚKEY_LEFTÚBSÚKEY_BACKSPACEr   r'   ÚdelchÚEOTÚENQÚACKÚ	KEY_RIGHTÚBELÚNLÚVTÚdeletelnÚclrtoeolÚFFÚrefreshÚSOÚKEY_DOWNÚSIÚinsertlnÚDLEÚKEY_UP)r   r-   r%   r.   r   r   r   Ú
do_command_   s   
8É6Ë
+Ö
)Ø&Ü$Ý
!
àãä

ë
ð
ò
ôù
û
zTextbox.do_commandc              
   C   s¢   d}|   ¡  t| jd ƒD ]A}| j |d¡ |  |¡}|dkr#| jr#qt| jd ƒD ]}| jr5||kr5 n|tt	j
 
| j ||¡¡ƒ }q*| jdkrN|d }q|S )z.Collect and return the contents of the window.Ú r   r   Ú
)r   Úranger   r   r,   r'   r   r    Úchrr   r!   r"   )r   Úresultr%   Ústopr.   r   r   r   Úgather    s   
 
€zTextbox.gatherNc                 C   s>   	 | j  ¡ }|r||ƒ}|sq |  |¡s	 |  ¡ S | j  ¡  q)z2Edit in the widget window and collect the results.)r   ÚgetchrI   rB   rP   )r   Úvalidater-   r   r   r   Úedit±   s   


ÿøzTextbox.edit)Fr(   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r'   r1   rI   rP   rS   r   r   r   r   r      s    
Ar   Ú__main__c                 C   sf   d\}}d\}}|   |d |d¡ t ||||¡}t| |d |d || || ƒ |  ¡  t|ƒ ¡ S )N)é	   é   )é   é   é   zUse Ctrl-G to end editing.r   )Úaddstrr   Únewwinr   rB   r   rS   )ÚstdscrÚncolsÚnlinesr   r   r   r   r   r   Útest_editbox¿   s    rc   zContents of text box:)rW   r   Úcurses.asciir   r   rT   rc   ÚwrapperÚstrÚprintÚreprr   r   r   r   Ú<module>   s     ,
	õ