o
    bk                     @   s  d Z ddlZddlmZmZ ddlmZ G dd deZ	G dd dZ
G d	d
 d
ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdd Zdd Zdd  ZG d!d" d"eZG d#d$ d$eZG d%d& d&eZG d'd( d(eZG d)d* d*eZG d+d, d,eZG d-d. d.eZG d/d0 d0eZG d1d2 d2eZG d3d4 d4eZ G d5d6 d6eZ!d7d8 Z"G d9d: d:eZ#dS );z<
Simple insults-based widget library

@author: Jp Calderone
    N)helperinsults)textc                   @      e Zd ZdZdS )
YieldFocusz,
    Input focus manipulation exception
    N)__name__
__module____qualname____doc__ r   r   >/usr/lib/python3/dist-packages/twisted/conch/insults/window.pyr          r   c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
BoundedTerminalWrapperc                 C   sJ   || _ || _|| _|| _|| _|j| _|j| _|j| _|j| _|j	| _	d S N)
widthheightxoffyoffterminalcursorForwardselectCharacterSetselectGraphicRendition
saveCursorrestoreCursor)selfr   r   r   r   r   r   r   r   __init__   s   zBoundedTerminalWrapper.__init__c                 C   s*   | j | jt| j| | jt| j| S r   )r   cursorPositionr   minr   r   r   )r   xyr   r   r   r   "   s    z%BoundedTerminalWrapper.cursorPositionc                 C   s   | j | j| jS r   )r   r   r   r   r   r   r   r   
cursorHome'   s   z!BoundedTerminalWrapper.cursorHomec                 C   s   | j |S r   )r   write)r   datar   r   r   r#   *      zBoundedTerminalWrapper.writeN)r   r   r	   r   r   r"   r#   r   r   r   r   r      s
    r   c                   @   s   e Zd ZdZdZdZd ZZdd Zdd Z	dd Z
d	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )WidgetFNc                 C   s4   | j sd| _ | jd ur| jj s| j  d S d S d S NT)dirtyparentrepaintr!   r   r   r   r*   4   s
   zWidget.repaintc                 C   s
   d| _ d S r'   )r(   r!   r   r   r   filthy:      
zWidget.filthyc                 C   s   |    | ||| d S r   )r+   drawr   r   r   r   r   r   r   redraw=   s   zWidget.redrawc                 C   sB   || j ks|| jks| jr|| _ || _d| _| ||| d S d S NF)r   r   r(   renderr.   r   r   r   r-   A   s   zWidget.drawc                 C      d S r   r   r.   r   r   r   r1   H      zWidget.renderc                 C   r2   r   r   r!   r   r   r   sizeHintK   r3   zWidget.sizeHintc                 C   sT   |dkr|  | d S |dkr|   d S |tjv r"| || d S | || d S )N   	   )tabReceivedbackspaceReceivedr   FUNCTION_KEYSfunctionKeyReceivedcharacterReceivedr   keyIDmodifierr   r   r   keystrokeReceivedN   s   
zWidget.keystrokeReceivedc                 C      t  r   r   r   r>   r   r   r   r7   X      zWidget.tabReceivedc                 C   s   d| _ |   dS )z
        Called when focus is being given to this widget.

        May raise YieldFocus is this widget does not want focus.
        TNfocusedr*   r!   r   r   r   focusReceived\   s   zWidget.focusReceivedc                 C   s   d| _ |   d S r0   rD   r!   r   r   r   	focusLoste      zWidget.focusLostc                 C   r2   r   r   r!   r   r   r   r8   i   r3   zWidget.backspaceReceivedc                 C   s@   |}t |ts|d}t| d| d }|d ur|| d S d S )Nutf-8func_)
isinstancestrdecodegetattr)r   r=   r>   namefuncr   r   r   r:   l   s   

zWidget.functionKeyReceivedc                 C   r2   r   r   r<   r   r   r   r;   t   r3   zWidget.characterReceived)r   r   r	   rE   r)   r(   r   r   r*   r+   r/   r-   r1   r4   r?   r7   rF   rG   r8   r:   r;   r   r   r   r   r&   .   s$    
	r&   c                   @   sX   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd ZdS )ContainerWidgetzZ
    @ivar focusedChild: The contained widget which currently has
    focus, or None.
    NFc                 C   s   t |  g | _d S r   )r&   r   childrenr!   r   r   r   r         

zContainerWidget.__init__c                 C   sb   |j d u sJ | |_ | j| | jd u r+| jr+z|  W n	 ty'   Y nw || _|   d S r   )r)   rR   appendfocusedChildrE   rF   r   r*   r   childr   r   r   addChild   s   zContainerWidget.addChildc                 C   s,   |j | u sJ d |_ | j| |   d S r   )r)   rR   remover*   rV   r   r   r   remChild   s   zContainerWidget.remChildc                 C   s"   | j D ]}|  qt|  d S r   )rR   r+   r&   )r   chr   r   r   r+      s   

zContainerWidget.filthyc                 C   s   | j D ]	}|||| qd S r   )rR   r-   )r   r   r   r   r[   r   r   r   r1      s   
zContainerWidget.renderc                 C   s   |    | jd ur)| j  | j}d | _z
| j|d }W n ty(   t w d}|t| jk rXz	| j|   W n tyH   |d7 }Y n	w | j| | _d S |t| jk s2t )N   r   )	r*   rU   rG   rR   index
ValueErrorr   lenrF   )r   rU   curFocusr   r   r   changeFocus   s*   

	zContainerWidget.changeFocusc                 C   s   |    d| _d S r'   )ra   rE   r!   r   r   r   rF      s   
zContainerWidget.focusReceivedc                 C   sV   | j d ur"z
| j || W d S  ty!   |   |   Y d S w t| || d S r   )rU   r?   r   ra   r*   r&   r<   r   r   r   r?      s   
z!ContainerWidget.keystrokeReceived)r   r   r	   r
   rU   rE   r   rX   rZ   r+   r1   ra   rF   r?   r   r   r   r   rQ   x   s    rQ   c                   @   s@   e Zd ZdZdZdd ZdZdd Zdd	 Zd
d Z	dd Z
dS )	TopWindowaM  
    A top-level container object which provides focus wrap-around and paint
    scheduling.

    @ivar painter: A no-argument callable which will be invoked when this
    widget needs to be redrawn.

    @ivar scheduler: A one-argument callable which will be invoked with a
    no-argument callable and should arrange for it to invoked at some point in
    the near future.  The no-argument callable will cause this widget and all
    its children to be redrawn.  It is typically beneficial for the no-argument
    callable to be invoked at the end of handling for whatever event is
    currently active; for example, it might make sense to call it at the end of
    L{twisted.conch.insults.insults.ITerminalProtocol.keystrokeReceived}.
    Note, however, that since calls to this may also be made in response to no
    apparent event, arrangements should be made for the function to be called
    even if an event handler such as C{keystrokeReceived} is not on the call
    stack (eg, using
    L{reactor.callLater<twisted.internet.interfaces.IReactorTime.callLater>}
    with a short timeout).
    Tc                 C      t |  || _|| _d S r   )rQ   r   painter	scheduler)r   rd   re   r   r   r   r         

zTopWindow.__init__Nc                 C   s,   | j d u rt | _ | | j t|  d S r   )
_paintCallobjectre   _paintrQ   r*   r!   r   r   r   r*      s   
zTopWindow.repaintc                 C   s   d | _ |   d S r   )rg   rd   r!   r   r   r   ri      rH   zTopWindow._paintc                 C   sJ   zt |  W d S  ty$   z	t |  W Y d S  ty#   Y Y d S w w r   )rQ   ra   r   r!   r   r   r   ra      s   zTopWindow.changeFocusc                 C   s2   z
t | || W d S  ty   |   Y d S w r   )rQ   r?   r   ra   r<   r   r   r   r?      s
   zTopWindow.keystrokeReceived)r   r   r	   r
   rE   r   rg   r*   ri   ra   r?   r   r   r   r   rb      s    	rb   c                   @   s   e Zd Zdd Zdd ZdS )AbsoluteBoxc                 C   sF   t t| jD ]}| j| d |u r|||f| j|<  d S qtd|)Nr   zNo such child)ranger_   rR   r^   )r   rW   r   r    nr   r   r   	moveChild  s   
zAbsoluteBox.moveChildc                 C   s<   | j D ]\}}}t||| || ||}|||| qd S r   )rR   r   r-   )r   r   r   r   r[   r   r    wrapr   r   r   r1     s   zAbsoluteBox.renderN)r   r   r	   rm   r1   r   r   r   r   rj     s    rj   c                   @   s6   e Zd Zed\ZZZefddZdd Zdd Z	dS )	_Box   c                 C      t |  || _d S r   )rQ   r   gravity)r   rr   r   r   r   r     rS   z_Box.__init__c                 C   s   d}d}| j D ]`}| }|d u rd}| jdkr@|d d u r!d }n
|d ur+||d 7 }|d d u r4d }q|d ur?t||d }q|d d u rId }n|d urTt||d }|d d u r]d }q|d urg||d 7 }q||fS )Nr   NNr\   )rR   r4   variableDimensionmax)r   r   r   r[   hintr   r   r   r4     s4   

z_Box.sizeHintc                 C   s  | j sd S d}g }| j D ]}| }|d u rd}|| j d u r#|d7 }||| j  q||f| j }tdd |D }	|rFt||	 | }
d }}t|| j D ]6\}}|d u rZ|
}||}}| jdkrg|}n|}t|||||}|||| | jdkr||7 }qP||7 }qPd S )Nr   rs   r\   c                 s   s    | ]	}|d ur|V  qd S r   r   ).0wr   r   r   	<genexpr>D  s    z_Box.render.<locals>.<genexpr>)	rR   r4   rt   rT   sumintzipr   r-   )r   r   r   r   greedywantsr[   rv   length	totalWantleftForGreedywidthOffsetheightOffsetwantsubWidth	subHeightrn   r   r   r   r1   5  sF   





z_Box.renderN)
r   r   r	   rk   TOPCENTERBOTTOMr   r4   r1   r   r   r   r   ro     s
    ro   c                   @   r   )HBoxr   Nr   r   r	   rt   r   r   r   r   r   b  r   r   c                   @   r   )VBoxr\   Nr   r   r   r   r   r   f  r   r   c                   @      e Zd Zdd ZdS )Packerc           	      C   s   | j sd S tt| j d d }dd t|D }t| j D ]\}}||t|  | qt }t|j| |||| d S )Ng      ?c                 S   s   g | ]}t  qS r   )r   )rw   rl   r   r   r   
<listcomp>p  s    z!Packer.render.<locals>.<listcomp>)	rR   r{   r_   rk   	enumeraterX   r   mapr1   )	r   r   r   r   rootboxesrl   r[   hr   r   r   r1   k  s   zPacker.renderN)r   r   r	   r1   r   r   r   r   r   j      r   c                   @   sD   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )CanvasFNc                 C   s   t |  | dd d S Nr\   )r&   r   resizer!   r   r   r   r   }  s   
zCanvas.__init__c                 C   s   t  dd| | }| jd ur1tt|| jD ]}tt|| jD ]}| ||f ||| | < q!q|| _|| _|| _| j|krD|d | _| j|krP|d | _d S d S )NB    r\   )arraycontentsrk   r   _width_heightr   r    )r   r   r   r   r   r    r   r   r   r     s   



zCanvas.resizec                 C   s   |\}}| j | j| |  S r   r   r   )r   r]   r   r    r   r   r   __getitem__  s   zCanvas.__getitem__c                 C   s    |\}}|| j | j| | < d S r   r   )r   r]   valuer   r    r   r   r   __setitem__  s   zCanvas.__setitem__c                 C   s   t  ddt| j | _d S )Nr   r   )r   r_   r   r!   r   r   r   clear  s   zCanvas.clearc                 C   s   |r|sd S || j ks|| jkr| || t|D ]%}|d| | j| j | | j | | j    }|d | }|| qd S Nr   )r   r   r   rk   r   r   tobytesr#   )r   r   r   r   ir   r   r   r   r1     s   zCanvas.render)r   r   r	   rE   r   r   r   r   r   r   r1   r   r   r   r   r   x  s    r   c                 C   sB   |  tjtj | || | d||   |  tjtj d S )N   q)r   r   
CS_DRAWINGG0r   r#   CS_US)r   r    leftrightr   r   r   horizontalLine  s   r   c                 C   sJ   |  tjtj t||D ]}| || | d q|  tjtj d S )N   x)r   r   r   r   rk   r   r#   r   )r   r   topbottomrl   r   r   r   verticalLine  s
   r   c                 C   s   |\}}|\}}|  tjtj | || | d | d|d   | d t|d D ]}| ||| d  | d | |d  | d q/| d|| d  | d | d|d   | d	 |  tjtj d
S )z
    Draw a rectangle

    @type position: L{tuple}
    @param position: A tuple of the (top, left) coordinates of the rectangle.
    @type dimension: L{tuple}
    @param dimension: A tuple of the (width, height) size of the rectangle.
       lr         kr\   r   r      m   jN)	r   r   r   r   r   r#   rk   r   r   )r   position	dimensionr   r   r   r   rl   r   r   r   	rectangle  s"   	




r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )Borderc                 C   s   t |  || _| | j_d S r   )r&   r   	containeer)   r   r   r   r   r   r     s   
zBorder.__init__c                 C   
   | j  S r   )r   rF   r!   r   r   r   rF     r,   zBorder.focusReceivedc                 C   r   r   )r   rG   r!   r   r   r   rG     r,   zBorder.focusLostc                 C   s   | j ||S r   )r   r?   r<   r   r   r   r?        zBorder.keystrokeReceivedc                 C   s`   | j  }|d u rd}|d d u rd }n|d d }|d d u r&d }||fS |d d }||fS )Nrs   r   r   r\   )r   r4   )r   rv   r   r    r   r   r   r4     s   
zBorder.sizeHintc                 C      | j   t|  d S r   r   r+   r&   r!   r   r   r   r+        
zBorder.filthyc                 C   s`   | j jr	|d t|d||f |d t||d |d dd}| j |d |d | d S )N   [31m)r   r      [0mr   r\   )r   rE   r#   r   r   r-   )r   r   r   r   rn   r   r   r   r1     s   

zBorder.renderN)
r   r   r	   r   rF   rG   r?   r4   r+   r1   r   r   r   r   r     s    r   c                   @   r   )
Buttonc                 C   rc   r   )r&   r   labelonPress)r   r   r   r   r   r   r     rf   zButton.__init__c                 C   s   t | jdfS r   )r_   r   r!   r   r   r   r4     r   zButton.sizeHintc                 C   s   |dkr
|    d S d S N   )r   r<   r   r   r   r;   	  s   zButton.characterReceivedc                 C   s:   | dd | jr|d| j d  d S || j d S )Nr   s   [1mr   )r   rE   r#   r   r.   r   r   r   r1     s   zButton.renderN)r   r   r	   r   r4   r;   r1   r   r   r   r   r      s
    r   c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )	TextInputc                 C   s&   t |  || _|| _d| _d| _d S )N    r   )r&   r   onSubmitmaxwidthbuffercursor)r   r   r   r   r   r   r     s
   

zTextInput.__init__c                 C   s(   |d | j  | _t| j| _|   d S r   )r   r   r_   r   r*   r   r   r   r   r   setText  s   zTextInput.setTextc                 C   s(   | j dkr|  j d8  _ |   d S d S Nr   r\   )r   r*   rB   r   r   r   func_LEFT_ARROW"  s   
zTextInput.func_LEFT_ARROWc                 C   s.   | j t| jk r|  j d7  _ |   d S d S r   )r   r_   r   r*   rB   r   r   r   func_RIGHT_ARROW'  s   zTextInput.func_RIGHT_ARROWc                 C   sN   | j dkr%| jd | j d  | j| j d   | _|  j d8  _ |   d S d S r   )r   r   r*   r!   r   r   r   r8   ,  s
   
&zTextInput.backspaceReceivedc                 C   sl   |dkr|  | j d S t| j| jk r4| jd | j | | j| jd   | _|  jd7  _|   d S d S )Nr   r\   )r   r   r_   r   r   r*   r<   r   r   r   r;   2  s   "zTextInput.characterReceivedc                 C   s   | j d dfS r   )r   r!   r   r   r   r4   =  r   zTextInput.sizeHintc                 C   s   |   }|dd | jrB||d | j  t||| j| jd  p$d ||| jd d   |d| jt| d   d S | jt| }||d|   d S )Nr   r\   r      _)_renderTextr   rE   r#   r   r   r_   )r   r   r   r   currentTextmorer   r   r   r1   @  s    zTextInput.renderc                 C      | j S r   )r   r!   r   r   r   r   L     zTextInput._renderTextN)r   r   r	   r   r   r   r   r8   r;   r4   r1   r   r   r   r   r   r     s    r   c                   @   r   )PasswordInputc                 C   s   dt | j S )N*)r_   r   r!   r   r   r   r   Q  r   zPasswordInput._renderTextN)r   r   r	   r   r   r   r   r   r   P  r   r   c                   @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )
TextOutputr   Nc                 C   rq   r   )r&   r   size)r   r   r   r   r   r   X  rS   zTextOutput.__init__c                 C   r   r   )r   r!   r   r   r   r4   \  r   zTextOutput.sizeHintc                 C   s8   | dd | jd | }||d|t|    d S Nr   r   )r   r   r#   r_   )r   r   r   r   r   r   r   r   r1   _  s   zTextOutput.renderc                 C   s   || _ |   d S r   )r   r*   r   r   r   r   r   d  rH   zTextOutput.setTextc                 C   r@   r   rA   r!   r   r   r   rF   h  r   zTextOutput.focusReceivedr   )	r   r   r	   r   r   r4   r1   r   rF   r   r   r   r   r   U  s    
r   c                   @   s.   e Zd Zed\ZZdefddZdd ZdS )TextOutputArear   Nc                 C   s   t | | || _d S r   )r   r   	longLines)r   r   r   r   r   r   r   o  s   
zTextOutputArea.__init__c                 C   s   d}| j  }g }|rX| j| jkrC|d}t|ts |d}g }t	||D ]}	t|	t
s4|	d}	||	 q(||p@dg n||dd |  t||krVn|st|d | D ]\}}
|d| ||
 q`d S )Nr   rI   r   )r   
splitlinesr   WRAPpoprK   rL   rM   tptext
greedyWrapbytesencoderT   extendr_   r   r   r#   )r   r   r   r   rl   
inputLinesoutputLineslinewrappedLineswrappedLineLr   r   r   r1   s  s,   





zTextOutputArea.render)r   r   r	   rk   r   TRUNCATEr   r1   r   r   r   r   r   l  s    r   c                   @   sh   e Zd ZdZdZedd Zejdd Zedd Zejdd ZdZ	d	Z
d
d Zdd Zdd ZdS )Viewportr   c                 C   r   r   )_xOffsetr!   r   r   r   xOffset  rC   zViewport.xOffsetc                 C       | j |kr|| _ |   d S d S r   )r   r*   r   r   r   r   r   r        
c                 C   r   r   )_yOffsetr!   r   r   r   yOffset  rC   zViewport.yOffsetc                 C   r   r   )r   r*   r   r   r   r   r     r         c                 C   sD   t |  || _| | j_t | _| j| j_| j	| j_
| j  d S r   )r&   r   r   r)   r   TerminalBuffer_bufr   r   r   r   connectionMader   r   r   r   r     s   



zViewport.__init__c                 C   r   r   r   r!   r   r   r   r+     r   zViewport.filthyc           	      C   s   | j | j| j| j t| jj| j| j|  D ];\}}|d| d}t|| j	| j	|  D ]\}\}}|| jj
u r?d}|| q1||k rT|d|| d   qd S )Nr   r   r\   )r   r-   r   r   r   r   linesr   r   r   voidr#   )	r   r   r   r   r    r   rl   r[   attrr   r   r   r1     s   $zViewport.renderN)r   r   r	   r   r   propertyr   setterr   r   r   r   r+   r1   r   r   r   r   r     s     




r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )
_Scrollbarc                 C   s   t |  || _d| _d S )N        )r&   r   onScrollpercent)r   r  r   r   r   r     rf   z_Scrollbar.__init__c                 C   $   t dtd| d| _|   d S )N      ?r  r   ru   r  r  r*   r!   r   r   r   smaller     z_Scrollbar.smallerc                 C   r  )Nr  r  r\   r	  r!   r   r   r   bigger  r  z_Scrollbar.biggerN)r   r   r	   r   r
  r  r   r   r   r   r    s    r  c                   @   <   e Zd Zdd Zdd Zdd ZdZdZd	Zd
Z	dd Z
dS )HorizontalScrollbarc                 C      dS )Nr   r   r!   r   r   r   r4     r3   zHorizontalScrollbar.sizeHintc                 C      |    d S r   r
  rB   r   r   r   r     r%   z#HorizontalScrollbar.func_LEFT_ARROWc                 C   r  r   r  rB   r   r   r   r     r%   z$HorizontalScrollbar.func_RIGHT_ARROWu   ◀u   ▶   ░   ▓c                 C   sd   | dd |d }t|| j }|| }| j| j|  | j | j|  | j }||d d S )Nr   rp   rI   )	r   r{   r  _left_bar_slider_rightr#   r   )r   r   r   r   rl   beforeaftermer   r   r   r1     s   zHorizontalScrollbar.renderN)r   r   r	   r4   r   r   r  r  r  r  r1   r   r   r   r   r        r  c                   @   r  )VerticalScrollbarc                 C   r  )N)r\   Nr   r!   r   r   r   r4     r3   zVerticalScrollbar.sizeHintc                 C   r  r   r  rB   r   r   r   func_UP_ARROW  r%   zVerticalScrollbar.func_UP_ARROWc                 C   r  r   r  rB   r   r   r   func_DOWN_ARROW  r%   z!VerticalScrollbar.func_DOWN_ARROWu   ▲u   ▼r  r  c                 C   s   | dd t| j|d  }|| jd td|d D ]!}| d| ||d kr7|| jd q|| jd q| d|d  || j	d d S )Nr   r   rI   r\   )
r   r{   r  r#   _upr   rk   r  r  _down)r   r   r   r   knobr   r   r   r   r1     s   zVerticalScrollbar.renderN)r   r   r	   r4   r  r  r   r!  r  r  r1   r   r   r   r   r    r  r  c                   @   sX   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd ZdS )ScrolledAreaz
    A L{ScrolledArea} contains another widget wrapped in a viewport and
    vertical and horizontal scrollbars for moving the viewport around.
    c                 C   sL   t |  t|| _t| j| _t| j| _	| j| j| j	fD ]}| |_
qd S r   )r&   r   r   	_viewportr  _horizScroll_horizr  _vertScroll_vertr)   )r   r   rx   r   r   r   r     s   

zScrolledArea.__init__c                 C   .   | j  j|7  _td| j j| j _| j jd S Nr   g      9@)r$  r   ru   r   rl   r   r   r   r%       zScrolledArea._horizScrollc                 C   r)  r*  )r$  r   ru   r+  r   r   r   r'  #  r,  zScrolledArea._vertScrollc                 C      | j   d S r   )r(  r
  rB   r   r   r   r  (  r   zScrolledArea.func_UP_ARROWc                 C   r-  r   )r(  r  rB   r   r   r   r  +  r   zScrolledArea.func_DOWN_ARROWc                 C   r-  r   )r&  r
  rB   r   r   r   r   .  r   zScrolledArea.func_LEFT_ARROWc                 C   r-  r   )r&  r  rB   r   r   r   r   1  r   zScrolledArea.func_RIGHT_ARROWc                 C   s,   | j   | j  | j  t|  d S r   )r$  r+   r&  r(  r&   r!   r   r   r   r+   4  s   


zScrolledArea.filthyc                 C   s   t ||d |d dd}| j|d |d | | jr |d t|dd|d  t|dd|d  | jd|d t |d|d |d d | j|dt ||dd|d  |d d S )Nr   r\   r   r   r   )	r   r$  r-   rE   r#   r   r   r(  r&  )r   r   r   r   wrapperr   r   r   r1   :  s   
zScrolledArea.renderN)r   r   r	   r
   r   r%  r'  r  r  r   r   r+   r1   r   r   r   r   r#    s    	r#  c                 C   s6   |    | ttj | | |   |   d S r   )r   r   rL   r   REVERSE_VIDEOr#   r   r   )r   r[   r   r   r   r   J  s
   
r   c                   @   sV   e Zd 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 Zdd ZdS )	Selectionr   Nc                 C   s>   t |  || _|| _|| _|d urttt| j| _d S d S r   )	r&   r   sequenceonSelect
minVisibleru   r   r_   r   )r   r1  r2  r3  r   r   r   r   Y  s   
zSelection.__init__c                 C   s   | j d ur| j| j fS d S r   )r3  r   r!   r   r   r   r4   a  s   
zSelection.sizeHintc                 C   s@   | j dkr|  j d8  _ | jdkr|  jd8  _|   d S d S r   )focusedIndexrenderOffsetr*   rB   r   r   r   r  e  s   

zSelection.func_UP_ARROWc                 C   sB   | j dkr|  j| j 8  _d| _ n
td| j| j | _|   d S r   )r5  r4  ru   r   r*   rB   r   r   r   	func_PGUPl  s
   
zSelection.func_PGUPc                 C   sP   | j t| jd k r&|  j d7  _ | j| jd k r |  jd7  _|   d S d S r   )r4  r_   r1  r5  r   r*   rB   r   r   r   r  t  s   zSelection.func_DOWN_ARROWc                 C   s   | j | jd kr2| j| j  d }|| j t| jkr$t| j| j d }|  j|7  _| jd | _ ntt| jd | j| j | _|   d S r   )r5  r   r4  r_   r1  r   r*   )r   r>   changer   r   r   	func_PGDN{  s   zSelection.func_PGDNc                 C   s"   |dkr|  | j| j  d S d S r   )r2  r1  r4  r<   r   r   r   r;     s   zSelection.characterReceivedc           
      C   s   || _ | j| j }|t| j| krtdt| j| }| j|||  }t|D ]H\}}|d| || jkrU|  | j	rJt
tjt
tjf}nt
tjf}|j|  |d | }	||	d|t|	    || jkrq|  q)d S r   )r   r4  r5  r_   r1  ru   r   r   r   rE   rL   r   r/  BOLDr   r#   r   )
r   r   r   r   startelementsrl   elemodesr   r   r   r   r1     s&   


zSelection.renderr   )r   r   r	   r4  r5  r   r4   r  r6  r  r8  r;   r1   r   r   r   r   r0  R  s    
r0  )$r
   r   twisted.conch.insultsr   r   twisted.pythonr   r   	Exceptionr   r   r&   rQ   rb   rj   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r#  r   r0  r   r   r   r   <module>   s>   JP:Q1*;:;