U
    ”¼pdé  ã                   @   sV   d Z ddlZddlZdd„ ZG dd„ dƒZedkrRdd	„ Ze e¡Ze	d
e
eƒƒ 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)
ZvlineÚcursesZ	ACS_VLINEZhlineZ	ACS_HLINEÚaddchZACS_ULCORNERZACS_URCORNERZACS_LRCORNERZACS_LLCORNER)ÚwinÚulyÚulxZlryZlrx© r   ú$/usr/lib/python3.8/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ÚlastcmdZkeypad)Úselfr   r   r   r   r	   Ú__init__+   s    zTextbox.__init__c                 C   s&   | j  ¡ \}}|d | _|d | _d S r   )r   ZgetmaxyxÚmaxyÚmaxx)r   r   r   r   r   r	   r   3   s    
zTextbox._update_max_yxc                 C   sX   |   ¡  | j}tj | j ||¡¡tjjkr@t| j|d ƒ}qTn
|dkrJqT|d }q|S )zuGo to the location of the first blank on the given line,
        returning the index of the last non-blank character.r   r   )r   r   r   Úasciir   ÚinchZSPÚmin)r   ÚyZlastr   r   r	   Ú_end_of_line8   s    
zTextbox._end_of_linec                 C   s¶   |   ¡  | j ¡ \}}d }|| jk s.|| jk rž| jr>| j ¡ }z| j |¡ W n tj	k
rd   Y nX | jržtj
 |¡szqž|}| j ¡ \}}|d kr||f}q|d k	r²| jj|Ž  d S )N)r   r   Úgetyxr   r   r   r   r   r   Úerrorr   ÚisprintÚmove)r   Úchr   ÚxZbackyxZoldchr   r   r	   Ú_insert_printable_charF   s$    

zTextbox._insert_printable_charc                 C   sV  |   ¡  | j ¡ \}}|| _tj |¡rJ|| jk s<|| jk rF|  	|¡ n|tjj
krh| j |d¡ nê|tjjtjtjjtjfkr|dkr¢| j ||d ¡ nB|dkr¬n8| jrÐ| j |d |  |d ¡¡ n| j |d | j¡ |tjjtjfkrR| j ¡  nL|tjjkr"| j ¡  n0|tjjkrb| jrN| j ||  |¡¡ n| j || j¡ nð|tjjtjfkrº|| jk r–| j ||d ¡ n || jkr¤n| j |d d¡ n˜|tjjkrÌdS |tjjkr| jdkrêdS || jk rR| j |d d¡ nF|tjjkrZ|dkr@|  |¡dkr@| j ¡  n| j ||¡ | j ¡  nø|tjjkrt| j ¡  nÞ|tjjtjfkrØ|| jk rR| j |d |¡ ||  |d ¡krR| j |d |  |d ¡¡ nz|tjj krò| j !¡  n`|tjj"tj#fkrR|dkrR| j |d |¡ ||  |d ¡krR| j |d |  |d ¡¡ dS )z!Process a single editing command.r   r   )$r   r   r   r   r   r   r   r   r   r    ZSOHr   ZSTXZKEY_LEFTZBSZKEY_BACKSPACEr   r   ZdelchZEOTZENQZACKZ	KEY_RIGHTZBELÚNLZVTZdeletelnZclrtoeolZFFÚrefreshZSOZKEY_DOWNZSIZinsertlnZDLEZKEY_UP)r   r   r   r   r   r   r	   Ú
do_command_   sr    
zTextbox.do_commandc              
   C   s¢   d}|   ¡  t| jd ƒD ]‚}| j |d¡ |  |¡}|dkrF| jrFqt| jd ƒD ]4}| jrj||krj qŠ|tt	j
 
| j ||¡¡ƒ }qT| jdkr|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(q4| j  ¡  q |  ¡ S )z2Edit in the widget window and collect the results.)r   Zgetchr#   r"   r*   )r   Zvalidater   r   r   r	   Úedit±   s    

zTextbox.edit)F)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r    r#   r*   r+   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   )Zaddstrr   Znewwinr
   r"   r   r+   )ZstdscrZncolsZnlinesr   r   r   r   r   r	   Útest_editbox¿   s     r6   zContents of text box:)r/   r   Zcurses.asciir
   r   r,   r6   ÚwrapperÚstrÚprintÚreprr   r   r   r	   Ú<module>   s    ,	
