
][\                 @   s~   d  Z  d d l Z d d l Z d d   Z Gd d   d  Z e d k rz d d	   Z e j e  Z e	 d
 e
 e   n  d S)z:Simple textbox editing widget with Emacs-like keybindings.    Nc             C   s   |  j  | d | t j | | d  |  j | | d t j | | d  |  j | | d t j | | d  |  j  | d | t j | | d  |  j | | t j  |  j | | t j  |  j | | t j  |  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.4/curses/textpad.py	rectangle   s    %%%%r
   c               @   sd   e  Z d  Z d Z d 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   sm   | |  _  | |  _ | j   \ |  _ |  _ |  j d |  _ |  j d |  _ d |  _ d  |  _ | j d  d  S)Nr   )r   insert_modeZgetmaxyxmaxymaxxstripspaceslastcmdZkeypad)selfr   r   r   r   r	   __init__+   s    				zTextbox.__init__c             C   st   |  j  } xd t j j |  j j | |   t j j k rS t |  j  | d  } Pn | d k rc Pn  | 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   asciir   inchZSPmin)r   ylastr   r   r	   _end_of_line5   s    	-zTextbox._end_of_linec             C   s   |  j  j   \ } } | |  j k  s3 | |  j k  r |  j rN |  j  j   } n  y |  j  j |  Wn t j k
 ry Yn X|  j r |  j  j   \ } } t j	 j
 |  r |  j |  |  j  j | |  q q n  d  S)N)r   getyxr   r   r   r   r   r   errorr   isprint_insert_printable_charmove)r   chr   xZoldchZbackyZbackxr   r   r	   r   B   s    		zTextbox._insert_printable_charc             C   se  |  j  j   \ } } | |  _ t j j |  ra | |  j k  sN | |  j k  ra|  j |  qan | t j j	 k r |  j  j
 | d  n| t j j t j t j j t j f k r`| d k r |  j  j
 | | d  nY | d k r nJ |  j r|  j  j
 | d |  j | d   n |  j  j
 | d |  j  | t j j t j f k ra|  j  j   qan| t j j k r|  j  j   n| t j j k r|  j r|  j  j
 | |  j |   qa|  j  j
 | |  j  n| t j j t j f k rE| |  j k  r|  j  j
 | | d  qa| |  j k r+qa|  j  j
 | d d  n| t j j k r[d S| t j j k r|  j d k rd S| |  j k  ra|  j  j
 | d d  qan| t j j k r| d k r|  j |  d k r|  j  j   qa|  j  j
 | |  |  j  j   nO| t j j k r4|  j  j   n-| t j j t j f k r| |  j k  ra|  j  j
 | d |  | |  j | d  k r|  j  j
 | d |  j | d   qqan | t j j k r|  j  j    n | t j j! t j" f k ra| d k ra|  j  j
 | d |  | |  j | d  k r^|  j  j
 | d |  j | d   q^qan  d S)z!Process a single editing command.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_commandT   sp    	*	'	!--zTextbox.do_commandc             C   s   d } x t  |  j d  D] } |  j j | d  |  j |  } | d k r] |  j r] q n  x_ t  |  j d  D]J } |  j r | | k r Pn  | t t j	 j	 |  j j
 | |    } qq W|  j d k r | d } q q W| S)z.Collect and return the contents of the window. r   r   
)ranger   r   r   r   r   r   chrr   r   r   )r   resultr   stopr   r   r   r	   gather   s    /zTextbox.gatherNc             C   s`   xS |  j  j   } | r' | |  } n  | s3 q n  |  j |  sF Pn  |  j  j   q |  j   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)
__name__
__module____qualname____doc__r   r   r   r"   r)   r*   r   r   r   r	   r      s   
@r   __main__c             C   s   d \ } } d	 \ } } |  j  | d | d  t j | | | |  } t |  | d | d | | | |  |  j   t |  j   S)
N	               zUse Ctrl-G to end editing.r   )r0   r1   )r2   r3   )Zaddstrr   Znewwinr
   r!   r   r*   )ZstdscrZncolsZnlinesr   r   r   r   r   r	   test_editbox   s    &
r5   zContents of text box:)r.   r   Zcurses.asciir
   r   r+   r5   wrapperstrprintreprr   r   r   r	   <module>   s   	