o
    p̦i                     @   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rdS |tjjkr| jdkrd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     ,
	