U
    
W[¤l  ã                   @   sÌ  d Z ddlZddlmZmZ ddlmZ ddlm	Z	m
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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 d0d1„ d1eƒZ#G d2d3„ d3e#ƒZ$G d4d5„ d5e#ƒZ%G d6d7„ d7eƒZ&d8d9„ Z'G d:d;„ d;eƒZ(dS )<z<
Simple insults-based widget library

@author: Jp Calderone
é    N)ÚinsultsÚhelper)Útext)Ú_PY3Ú	_bytesChrc                   @   s   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      s   r   c                   @   s,   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"   0   s    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   s,   | j sd| _ | jd k	r(| jj s(| j ¡  d S ©NT)ÚdirtyÚparentÚrepaintr    r   r   r   r(   ;   s    zWidget.repaintc                 C   s
   d| _ d S r%   )r&   r    r   r   r   ÚfilthyB   s    zWidget.filthyc                 C   s   |   ¡  |  |||¡ d S r   )r)   Údraw©r   r   r   r   r   r   r   ÚredrawF   s    zWidget.redrawc                 C   s>   || j ks|| jks| jr:|| _ || _d| _|  |||¡ d S ©NF)r   r   r&   Úrenderr+   r   r   r   r*   K   s
    zWidget.drawc                 C   s   d S r   r   r+   r   r   r   r.   S   s    zWidget.renderc                 C   s   d S r   r   r    r   r   r   ÚsizeHintW   s    zWidget.sizeHintc                 C   sN   |dkr|   |¡ n6|dkr&|  ¡  n$|tjkr>|  ||¡ n|  ||¡ d S )Nó   	ó   )ÚtabReceivedÚbackspaceReceivedr   ZFUNCTION_KEYSÚfunctionKeyReceivedÚcharacterReceived©r   ÚkeyIDÚmodifierr   r   r   ÚkeystrokeReceived[   s    

zWidget.keystrokeReceivedc                 C   s
   t ƒ ‚d S r   ©r   ©r   r8   r   r   r   r2   f   s    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   ÚfocusReceivedk   s    zWidget.focusReceivedc                 C   s   d| _ |  ¡  d S r-   r<   r    r   r   r   Ú	focusLostu   s    zWidget.focusLostc                 C   s   d S r   r   r    r   r   r   r3   z   s    zWidget.backspaceReceivedc                 C   s<   |}t |tƒs| d¡}t| d| d ƒ}|d k	r8||ƒ d S )Núutf-8Zfunc_)Ú
isinstanceÚstrÚdecodeÚgetattr)r   r7   r8   ÚnameÚfuncr   r   r   r4   ~   s    

zWidget.functionKeyReceivedc                 C   s   d S r   r   r6   r   r   r   r5   ‡   s    zWidget.characterReceived)r   r	   r
   r=   r'   r&   r   r   r(   r)   r,   r*   r.   r/   r9   r2   r>   r?   r3   r4   r5   r   r   r   r   r$   5   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   ”   s    
zContainerWidget.__init__c                 C   sd   |j d kst‚| |_ | j |¡ | jd krX| jrXz| ¡  W n tk
rP   Y nX || _|  ¡  d S r   )	r'   ÚAssertionErrorrH   ÚappendÚfocusedChildr=   r>   r   r(   ©r   Úchildr   r   r   ÚaddChild™   s    zContainerWidget.addChildc                 C   s,   |j | kst‚d |_ | j |¡ |  ¡  d S r   )r'   rI   rH   Úremover(   rL   r   r   r   ÚremChild§   s    zContainerWidget.remChildc                 C   s"   | j D ]}| ¡  qt | ¡ d S r   )rH   r)   r$   )r   Úchr   r   r   r)   ®   s    

zContainerWidget.filthyc                 C   s   | j D ]}| |||¡ qd S r   )rH   r*   )r   r   r   r   rQ   r   r   r   r.   ´   s    
zContainerWidget.renderc                 C   s¸   |   ¡  | jd k	rZ| j ¡  | j}d | _z| j |¡d }W q^ tk
rV   tƒ ‚Y q^X nd}|t| jƒk r®z| j|  ¡  W n tk
rš   |d7 }Y q^X | j| | _d S q^tƒ ‚d S )Né   r   )	r(   rK   r?   rH   ÚindexÚ
ValueErrorr   Úlenr>   )r   rK   ZcurFocusr   r   r   ÚchangeFocus¹   s$    

zContainerWidget.changeFocusc                 C   s   |   ¡  d| _d S r%   )rV   r=   r    r   r   r   r>   Ò   s    zContainerWidget.focusReceivedc                 C   sV   | j d k	rDz| j  ||¡ W qR tk
r@   |  ¡  |  ¡  Y qRX nt | ||¡ d S r   )rK   r9   r   rV   r(   r$   r6   r   r   r   r9   ×   s    
z!ContainerWidget.keystrokeReceived)r   r	   r
   r   rK   r=   r   rN   rP   r)   r.   rV   r>   r9   r   r   r   r   rG   Œ   s   rG   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   s   t  | ¡ || _|| _d S r   )rG   r   ÚpainterÚ	scheduler)r   rX   rY   r   r   r   r   û   s    
zTopWindow.__init__Nc                 C   s,   | j d krtƒ | _ |  | j¡ t | ¡ d S r   )Ú
_paintCallÚobjectrY   Ú_paintrG   r(   r    r   r   r   r(     s    
zTopWindow.repaintc                 C   s   d | _ |  ¡  d S r   )rZ   rX   r    r   r   r   r\   
  s    zTopWindow._paintc                 C   sL   zt  | ¡ W n8 tk
rF   zt  | ¡ W n tk
r@   Y nX Y nX d S r   )rG   rV   r   r    r   r   r   rV     s    zTopWindow.changeFocusc                 C   s4   zt  | ||¡ W n tk
r.   |  ¡  Y nX d S r   )rG   r9   r   rV   r6   r   r   r   r9     s    zTopWindow.keystrokeReceived)r   r	   r
   r   r=   r   rZ   r(   r\   rV   r9   r   r   r   r   rW   ã   s   
rW   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚAbsoluteBoxc                 C   sH   t t| jƒƒD ]*}| j| d |kr|||f| j|<  qDqtd|ƒ‚d S )Nr   zNo such child)ÚrangerU   rH   rT   )r   rM   r   r   Únr   r   r   Ú	moveChild"  s
    zAbsoluteBox.moveChildc                 C   s<   | j D ]0\}}}t||| || ||ƒ}| |||¡ qd S r   )rH   r   r*   )r   r   r   r   rQ   r   r   Úwrapr   r   r   r.   +  s    zAbsoluteBox.renderN)r   r	   r
   r`   r.   r   r   r   r   r]   !  s   	r]   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   s   t  | ¡ || _d S r   )rG   r   Úgravity)r   rd   r   r   r   r   5  s    
z_Box.__init__c                 C   sØ   d}d}| j D ]À}| ¡ }|d kr&d}| jdkr€|d d krBd }n|d k	rV||d 7 }|d d krhd }qÎ|d k	rÎt||d ƒ}q|d d kr’d }n|d k	r¨t||d ƒ}|d d krºd }q|d k	r||d 7 }q||fS )Nr   ©NNrR   )rH   r/   ÚvariableDimensionÚmax)r   r   r   rQ   Úhintr   r   r   r/   :  s0    

z_Box.sizeHintc                 C   s  | j s
d S d}g }| j D ]>}| ¡ }|d kr0d}|| j d krF|d7 }| || j ¡ q||f| j }tdd„ |D ƒƒ}	|rŒt||	 | ƒ}
d }}t|| j ƒD ]n\}}|d kr´|
}|| }}| jdkrÎ|}n|}t|||||ƒ}| |||¡ | jdkr||7 }q ||7 }q d S )Nr   re   rR   c                 S   s   g | ]}|d k	r|‘qS r   r   )Ú.0Úwr   r   r   Ú
<listcomp>g  s      z_Box.render.<locals>.<listcomp>)	rH   r/   rf   rJ   ÚsumÚintÚzipr   r*   )r   r   r   r   ZgreedyZwantsrQ   rh   ZlengthZ	totalWantZleftForGreedyZwidthOffsetZheightOffsetZwantZsubWidthZ	subHeightra   r   r   r   r.   X  sD    


û
z_Box.renderN)
r   r	   r
   r^   ZTOPZCENTERZBOTTOMr   r/   r.   r   r   r   r   rb   2  s   rb   c                   @   s   e Zd ZdZdS )ÚHBoxr   N©r   r	   r
   rf   r   r   r   r   ro   †  s   ro   c                   @   s   e Zd ZdZdS )ÚVBoxrR   Nrp   r   r   r   r   rq   ‹  s   rq   c                   @   s   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   )rq   )ri   r_   r   r   r   rk   –  s     z!Packer.render.<locals>.<listcomp>)	rH   rm   rU   r^   Ú	enumeraterN   ro   Úmapr.   )	r   r   r   r   ÚrootZboxesr_   rQ   Úhr   r   r   r.   ‘  s    zPacker.renderN)r   r	   r
   r.   r   r   r   r   rr     s   rr   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 ©NrR   )r$   r   Úresizer    r   r   r   r   ¤  s    
zCanvas.__init__c                 C   s    t   dd| | ¡}| jd k	rbtt|| jƒƒD ]2}tt|| jƒƒD ]}| ||f ||| | < qBq.|| _|| _|| _| j|krˆ|d | _| j|krœ|d | _d S )NÚBó    rR   )ÚarrayÚcontentsr^   r   Ú_widthÚ_heightr   r   )r   r   r   r}   r   r   r   r   r   ry   ©  s    



zCanvas.resizec                 C   s   |\}}| j | j| |  S r   ©r}   r~   )r   rS   r   r   r   r   r   Ú__getitem__¸  s    zCanvas.__getitem__c                 C   s    |\}}|| j | j| | < d S r   r€   )r   rS   Úvaluer   r   r   r   r   Ú__setitem__½  s    zCanvas.__setitem__c                 C   s   t   ddt| jƒ ¡| _d S )Nrz   r{   )r|   rU   r}   r    r   r   r   ÚclearÂ  s    zCanvas.clearc                 C   s®   |r|sd S || j ks || jkr,|  ||¡ t|ƒD ]t}| d|¡ trn| j| j | | j | | j  …  ¡ }n$| j| j | | j | | j  …  ¡ }|d |… }| 	|¡ q4d S ©Nr   )
r~   r   ry   r^   r   r   r}   ÚtobytesZtostringr"   )r   r   r   r   Úir   r   r   r   r.   Æ  s    ÿÿ
zCanvas.render)r   r	   r
   r=   r}   r   ry   r   rƒ   r„   r.   r   r   r   r   rw   Ÿ  s   rw   c                 C   sF   |   tjtj¡ |  ||¡ |  tdƒ||  ¡ |   tjtj¡ d S )Néq   )r   r   Ú
CS_DRAWINGÚG0r   r"   ÚchrÚCS_US)r   r   ÚleftÚrightr   r   r   ÚhorizontalLineÛ  s    r   c                 C   sN   |   tjtj¡ t||ƒD ]}|  ||¡ |  tdƒ¡ q|   tjtj¡ d S )Néx   )	r   r   r‰   rŠ   r^   r   r"   r‹   rŒ   )r   r   ÚtopZbottomr_   r   r   r   ÚverticalLineã  s
    r’   c                 C   s  |\}}|\}}|   tjtj¡ |  ||¡ |  tdƒ¡ |  tdƒ|d  ¡ |  tdƒ¡ t|d ƒD ]B}|  ||| d ¡ |  tdƒ¡ |  |d ¡ |  tdƒ¡ qj|  d|| d ¡ |  tdƒ¡ |  tdƒ|d  ¡ |  t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.
    él   rˆ   é   ék   rR   r   r   ém   éj   N)
r   r   r‰   rŠ   r   r"   r‹   r^   r   rŒ   )r   ZpositionZ	dimensionr‘   r   r   r   r_   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   s
   | j  ¡ S r   )rš   r>   r    r   r   r   r>     s    zBorder.focusReceivedc                 C   s
   | j  ¡ S r   )rš   r?   r    r   r   r   r?     s    zBorder.focusLostc                 C   s   | j  ||¡S r   )rš   r9   r6   r   r   r   r9     s    zBorder.keystrokeReceivedc                 C   sZ   | j  ¡ }|d krd}|d d kr(d }n|d d }|d d krFd }n|d d }||fS )Nre   r   r”   rR   )rš   r/   )r   rh   r   r   r   r   r   r/     s    
zBorder.sizeHintc                 C   s   | j  ¡  t | ¡ d S r   ©rš   r)   r$   r    r   r   r   r)   ,  s    
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”   rR   )rš   r=   r"   r˜   r   r*   )r   r   r   r   ra   r   r   r   r.   1  s    

zBorder.renderN)
r   r	   r
   r   r>   r?   r9   r/   r)   r.   r   r   r   r   r™   
  s   r™   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚButtonc                 C   s   t  | ¡ || _|| _d S r   )r$   r   ÚlabelÚonPress)r   r    r¡   r   r   r   r   <  s    
zButton.__init__c                 C   s   t | jƒdfS rx   )rU   r    r    r   r   r   r/   B  s    zButton.sizeHintc                 C   s   |dkr|   ¡  d S ©Nó   )r¡   r6   r   r   r   r5   F  s    zButton.characterReceivedc                 C   s8   |  dd¡ | jr(| d| j d ¡ n| | j¡ d S )Nr   s   [1mrž   )r   r=   r"   r    r+   r   r   r   r.   K  s    zButton.renderN)r   r	   r
   r   r/   r5   r.   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   U  s
    
zTextInput.__init__c                 C   s(   |d | j … | _t| jƒ| _|  ¡  d S r   )r§   r¨   rU   r©   r(   ©r   r   r   r   r   ÚsetText]  s    zTextInput.setTextc                 C   s$   | j dkr |  j d8  _ |  ¡  d S ©Nr   rR   )r©   r(   r;   r   r   r   Úfunc_LEFT_ARROWc  s    
zTextInput.func_LEFT_ARROWc                 C   s*   | j t| jƒk r&|  j d7  _ |  ¡  d S rx   )r©   rU   r¨   r(   r;   r   r   r   Úfunc_RIGHT_ARROWi  s    zTextInput.func_RIGHT_ARROWc                 C   sJ   | j dkrF| jd | j d … | j| j d …  | _|  j d8  _ |  ¡  d S r¬   )r©   r¨   r(   r    r   r   r   r3   o  s    
&zTextInput.backspaceReceivedc                 C   sf   |dkr|   | j¡ nLt| jƒ| jk rb| jd | j… | | j| jd …  | _|  jd7  _|  ¡  d S )Nr£   rR   )r¦   r¨   rU   r§   r©   r(   r6   r   r   r   r5   v  s    &zTextInput.characterReceivedc                 C   s   | j d dfS rx   )r§   r    r   r   r   r/   €  s    zTextInput.sizeHintc                 C   s¦   |   ¡ }| dd¡ | jr‚| |d | j… ¡ t||| j| jd … pHdƒ | || jd d … ¡ | d| jt|ƒ d  ¡ n | jt|ƒ }| |d|  ¡ d S )Nr   rR   r{   ó   _)Ú_renderTextr   r=   r"   r©   r§   rU   )r   r   r   r   ZcurrentTextZmorer   r   r   r.   „  s    zTextInput.renderc                 C   s   | j S r   )r¨   r    r   r   r   r°   ‘  s    zTextInput._renderTextN)r   r	   r
   r   r«   r­   r®   r3   r5   r/   r.   r°   r   r   r   r   r¤   T  s   
r¤   c                   @   s   e Zd Zdd„ ZdS )ÚPasswordInputc                 C   s   dt | jƒ S )NÚ*)rU   r¨   r    r   r   r   r°   —  s    zPasswordInput._renderTextN)r   r	   r
   r°   r   r   r   r   r±   –  s   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   s   t  | ¡ || _d S r   )r$   r   Úsize)r   r´   r   r   r   r   Ÿ  s    
zTextOutput.__init__c                 C   s   | j S r   )r´   r    r   r   r   r/   ¥  s    zTextOutput.sizeHintc                 C   s8   |  dd¡ | jd |… }| |d|t|ƒ   ¡ d S ©Nr   r{   )r   r   r"   rU   )r   r   r   r   r   r   r   r   r.   ª  s    zTextOutput.renderc                 C   s   || _ |  ¡  d S r   )r   r(   rª   r   r   r   r«   ±  s    zTextOutput.setTextc                 C   s
   t ƒ ‚d S r   r:   r    r   r   r   r>   ¶  s    zTextOutput.focusReceived)N)	r   r	   r
   r   r   r/   r.   r«   r>   r   r   r   r   r³   œ  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   ¾  s    zTextOutputArea.__init__c                 C   sâ   d}| j  ¡ }g }|r®| j| jkr†| d¡}t|tƒs@| d¡}g }t 	||¡D ]"}	t|	t
ƒsh|	 d¡}	| |	¡ qP| |p€dg¡ n| | d¡d |… ¡ t|ƒ|krq®qt|d |… ƒD ]\}}
| d|¡ | |
¡ q¾d S )Nr   r@   r¥   )r   Ú
splitlinesr·   ÚWRAPÚpoprA   rB   rC   ÚtptextZ
greedyWrapÚbytesÚencoderJ   ÚextendrU   rs   r   r"   )r   r   r   r   r_   Z
inputLinesZoutputLinesÚlineZwrappedLinesZwrappedLineÚLr   r   r   r.   Ã  s(    





zTextOutputArea.render)r   r	   r
   r^   r¹   ZTRUNCATEr   r.   r   r   r   r   r¶   »  s   r¶   c                   @   sX   e Zd ZdZdZdd„ Zeeƒ Ž Zdd„ Zeeƒ Ž ZdZdZ	dd	„ Z
d
d„ Zdd„ ZdS )ÚViewportr   c                  C   s   dd„ } dd„ }| |fS )Nc                 S   s   | j S r   )Ú_xOffsetr    r   r   r   Úgetá  s    zViewport.xOffset.<locals>.getc                 S   s   | j |kr|| _ |  ¡  d S r   )rÂ   r(   ©r   r‚   r   r   r   Úsetã  s    
zViewport.xOffset.<locals>.setr   ©rÃ   rÅ   r   r   r   ÚxOffsetà  s    zViewport.xOffsetc                  C   s   dd„ } dd„ }| |fS )Nc                 S   s   | j S r   )Ú_yOffsetr    r   r   r   rÃ   ì  s    zViewport.yOffset.<locals>.getc                 S   s   | j |kr|| _ |  ¡  d S r   )rÈ   r(   rÄ   r   r   r   rÅ   î  s    
zViewport.yOffset.<locals>.setr   rÆ   r   r   r   ÚyOffsetë  s    zViewport.yOffseté    é   c                 C   sD   t  | ¡ || _| | j_t ¡ | _| j| j_| j	| j_
| j ¡  d S r   )r$   r   rš   r'   r   ZTerminalBufferÚ_bufr~   r   r   r   ZconnectionMader›   r   r   r   r   ù  s    



zViewport.__init__c                 C   s   | j  ¡  t | ¡ d S r   rœ   r    r   r   r   r)     s    
zViewport.filthyc           	      C   s®   | j  | j| j| j¡ t| jj| j| j| … ƒD ]v\}}| d|¡ d}t|| j	| j	| … ƒD ]&\}\}}|| jj
kr~d}| |¡ qb||k r2| d|| d  ¡ q2d S )Nr   r{   rR   )rš   r*   r~   r   rÌ   rs   ÚlinesrÈ   r   rÂ   Zvoidr"   )	r   r   r   r   r   r¿   r_   rQ   Úattrr   r   r   r.   	  s    $$zViewport.renderN)r   r	   r
   rÂ   rÈ   rÇ   ÚpropertyrÉ   r~   r   r   r)   r.   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     s    
z_Scrollbar.__init__c                 C   s$   t dtd|  d¡ƒƒ| _|  ¡  d S )Nç      ð?rÑ   éÿÿÿÿ©r   rg   rÒ   rÓ   r(   r    r   r   r   Úsmaller   s    z_Scrollbar.smallerc                 C   s$   t dtd|  d¡ƒƒ| _|  ¡  d S )NrÔ   rÑ   rR   rÖ   r    r   r   r   Úbigger%  s    z_Scrollbar.biggerN)r   r	   r
   r   r×   rØ   r   r   r   r   rÐ     s   rÐ   c                   @   s<   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   s   dS )Nrx   r   r    r   r   r   r/   ,  s    zHorizontalScrollbar.sizeHintc                 C   s   |   ¡  d S r   ©r×   r;   r   r   r   r­   0  s    z#HorizontalScrollbar.func_LEFT_ARROWc                 C   s   |   ¡  d S r   ©rØ   r;   r   r   r   r®   4  s    z$HorizontalScrollbar.func_RIGHT_ARROWu   â—€u   â–¶õ   â–‘õ   â–“c                 C   sd   |  dd¡ |d }t|| j ƒ}|| }| j| j|  | j | j|  | j }| | d¡¡ d S )Nr   rc   r@   )	r   rm   rÓ   Ú_leftÚ_barÚ_sliderÚ_rightr"   r½   )r   r   r   r   r_   ZbeforeZafterÚmer   r   r   r.   =  s    &zHorizontalScrollbar.renderN)r   r	   r
   r/   r­   r®   rÞ   rá   rß   rà   r.   r   r   r   r   rÙ   +  s   rÙ   c                   @   s<   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 )ÚVerticalScrollbarc                 C   s   dS )N)rR   Nr   r    r   r   r   r/   H  s    zVerticalScrollbar.sizeHintc                 C   s   |   ¡  d S r   rÚ   r;   r   r   r   Úfunc_UP_ARROWL  s    zVerticalScrollbar.func_UP_ARROWc                 C   s   |   ¡  d S r   rÛ   r;   r   r   r   Úfunc_DOWN_ARROWP  s    z!VerticalScrollbar.func_DOWN_ARROWu   â–²u   â–¼rÜ   rÝ   c                 C   s¨   |  dd¡ t| j|d  ƒ}| | j d¡¡ td|d ƒD ]B}|  d|¡ ||d krn| | j d¡¡ q>| | j d¡¡ q>|  d|d ¡ | | j	 d¡¡ d S )Nr   r”   r@   rR   )
r   rm   rÓ   r"   Ú_upr½   r^   rß   rà   Ú_down)r   r   r   r   Zknobr‡   r   r   r   r.   Y  s    zVerticalScrollbar.renderN)r   r	   r
   r/   rä   rå   ræ   rç   rß   rà   r.   r   r   r   r   rã   G  s   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š   rj   r   r   r   r   m  s    

zScrolledArea.__init__c                 C   s.   | j  j|7  _td| j jƒ| j _| j jd S ©Nr   g      9@)ré   rÇ   rg   ©r   r_   r   r   r   rê   w  s    zScrolledArea._horizScrollc                 C   s.   | j  j|7  _td| j jƒ| j _| j jd S rî   )ré   rÉ   rg   rï   r   r   r   rì   }  s    zScrolledArea._vertScrollc                 C   s   | j  ¡  d S r   )rí   r×   r;   r   r   r   rä   ƒ  s    zScrolledArea.func_UP_ARROWc                 C   s   | j  ¡  d S r   )rí   rØ   r;   r   r   r   rå   ‡  s    zScrolledArea.func_DOWN_ARROWc                 C   s   | j  ¡  d S r   )rë   r×   r;   r   r   r   r­   ‹  s    zScrolledArea.func_LEFT_ARROWc                 C   s   | j  ¡  d S r   )rë   rØ   r;   r   r   r   r®     s    zScrolledArea.func_RIGHT_ARROWc                 C   s,   | j  ¡  | j ¡  | j ¡  t | ¡ d S r   )ré   r)   rë   rí   r$   r    r   r   r   r)   “  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”   rR   r   r   rž   )	r   ré   r*   r=   r"   r   r’   rí   rë   )r   r   r   r   Úwrapperr   r   r   r.   š  s    
( zScrolledArea.renderN)r   r	   r
   r   r   rê   rì   rä   rå   r­   r®   r)   r.   r   r   r   r   rè   h  s   
rè   c                 C   s6   |   ¡  |  ttjƒ¡ |  |¡ |  ¡  |  ¡  d S r   )r   r   rB   r   ÚREVERSE_VIDEOr"   r   r   )r   rQ   r   r   r   r©   §  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 k	r6ttt| jƒƒ| _d S r   )	r$   r   ÚsequenceÚonSelectÚ
minVisiblerg   rt   rU   r~   )r   ró   rô   rõ   r   r   r   r   ·  s    
zSelection.__init__c                 C   s   | j d k	r| j| j fS d S r   )rõ   r~   r    r   r   r   r/   À  s    
zSelection.sizeHintc                 C   s<   | j dkr8|  j d8  _ | jdkr0|  jd8  _|  ¡  d S r¬   )ÚfocusedIndexÚrenderOffsetr(   r;   r   r   r   rä   Å  s
    

zSelection.func_UP_ARROWc                 C   sB   | j dkr"|  j| j 8  _d| _ ntd| j| j ƒ| _|  ¡  d S r…   )r÷   rö   rg   r   r(   r;   r   r   r   Ú	func_PGUPÍ  s
    
zSelection.func_PGUPc                 C   sL   | j t| jƒd k rH|  j d7  _ | j| jd k r@|  jd7  _|  ¡  d S rx   )rö   rU   ró   r÷   r   r(   r;   r   r   r   rå   Ö  s
    zSelection.func_DOWN_ARROWc                 C   sŽ   | j | jd krd| j| j  d }|| j t| jƒkrHt| jƒ| j d }|  j|7  _| jd | _ ntt| jƒd | j| j ƒ| _|  ¡  d S rx   )r÷   r   rö   rU   ró   r   r(   )r   r8   Zchanger   r   r   Ú	func_PGDNÞ  s    zSelection.func_PGDNc                 C   s   |dkr|   | j| j ¡ d S r¢   )rô   ró   rö   r6   r   r   r   r5   ê  s    zSelection.characterReceivedc           
      C   sè   || _ | j| j }|t| jƒ| kr8tdt| jƒ| ƒ}| j||| … }t|ƒD ]\}}| d|¡ || jkrª| ¡  | j	r”t
tjƒt
tjƒf}nt
tjƒf}|j|Ž  |d |… }	| |	d|t|	ƒ   ¡ || jkrR| ¡  qRd S rµ   )r   rö   r÷   rU   ró   rg   rs   r   r   r=   rB   r   rñ   ZBOLDr   r"   r   )
r   r   r   r   ÚstartÚelementsr_   ZeleZmodesr   r   r   r   r.   ï  s"    


zSelection.render)N)r   r	   r
   rö   r÷   r   r/   rä   rø   rå   rù   r5   r.   r   r   r   r   rò   °  s   
		rò   ))r   r|   Ztwisted.conch.insultsr   r   Ztwisted.pythonr   r»   Ztwisted.python.compatr   r   r‹   Ú	Exceptionr   r[   r   r$   rG   rW   r]   rb   ro   rq   rr   rw   r   r’   r˜   r™   rŸ   r¤   r±   r³   r¶   rÁ   rÐ   rÙ   rã   rè   r©   rò   r   r   r   r   Ú<module>   s>   WW>T<1B!=!?	