U
    Â“«jl  ã                   @  sÄ  d Z ddlm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 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
é    )ÚannotationsN)ÚhelperÚinsults)Útextc                   @  s   e Zd ZdZdS )Ú
YieldFocusz,
    Input focus manipulation exception
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú@/tmp/pip-unpacked-wheel-59kc99xd/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!   ,   s    zBoundedTerminalWrapper.writeN)r   r   r	   r   r   r    r!   r   r   r   r   r      s   r   c                   @  sš   e Zd ZU dZdZdZdZded< dZde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d„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS ) ÚWidgetFNz
int | Noner   r   c                 C  s,   | j sd| _ | jd k	r(| jj s(| j ¡  d S ©NT)ÚdirtyÚparentÚrepaintr   r   r   r   r'   7   s    zWidget.repaintc                 C  s
   d| _ d S r$   )r%   r   r   r   r   Úfilthy=   s    zWidget.filthyc                 C  s   |   ¡  |  |||¡ d S r   )r(   Údraw©r   r   r   r   r   r   r   Úredraw@   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)   D   s
    zWidget.drawc                 C  s   d S r   r   r*   r   r   r   r-   K   s    zWidget.renderc                 C  s   d S r   r   r   r   r   r   ÚsizeHintN   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   ÚkeystrokeReceivedQ   s    

zWidget.keystrokeReceivedc                 C  s
   t ƒ ‚d S r   ©r   ©r   r7   r   r   r   r1   [   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   ÚfocusReceived_   s    zWidget.focusReceivedc                 C  s   d| _ |  ¡  d S r,   r;   r   r   r   r   Ú	focusLosth   s    zWidget.focusLostc                 C  s   d S r   r   r   r   r   r   r2   l   s    zWidget.backspaceReceivedc                 C  sH   |}t |tƒs| d¡}d|dd…  }t| |d ƒ}|d k	rD||ƒ d S )Núutf-8Zfunc_é   éÿÿÿÿ)Ú
isinstanceÚstrÚdecodeÚgetattr)r   r6   r7   ÚnameÚ
methodNameÚfuncr   r   r   r3   o   s    

zWidget.functionKeyReceivedc                 C  s   d S r   r   r5   r   r   r   r4   |   s    zWidget.characterReceived)r   r   r	   r<   r&   r%   r   Ú__annotations__r   r'   r(   r+   r)   r-   r.   r8   r1   r=   r>   r2   r3   r4   r   r   r   r   r#   0   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&   ÚAssertionErrorrK   Ú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&   rL   rK   Úremover'   rO   r   r   r   ÚremChildš   s    zContainerWidget.remChildc                 C  s"   | j D ]}| ¡  qt | ¡ d S r   )rK   r(   r#   )r   Úchr   r   r   r(       s    

zContainerWidget.filthyc                 C  s   | j D ]}| |||¡ qd S r   )rK   r)   )r   r   r   r   rT   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 )Nr@   r   )	r'   rN   r>   rK   ÚindexÚ
ValueErrorr   Úlenr=   )r   rN   ZcurFocusr   r   r   ÚchangeFocus©   s$    

zContainerWidget.changeFocusc                 C  s   |   ¡  d| _d S r$   )rX   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   )rN   r8   r   rX   r'   r#   r5   r   r   r   r8   Å   s    
z!ContainerWidget.keystrokeReceived)r   r   r	   r
   rN   r<   r   rQ   rS   r(   r-   rX   r=   r8   r   r   r   r   rJ   €   s   rJ   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   )rJ   r   ÚpainterÚ	scheduler)r   rZ   r[   r   r   r   r   é   s    
zTopWindow.__init__Nc                 C  s,   | j d krtƒ | _ |  | j¡ t | ¡ d S r   )Ú
_paintCallÚobjectr[   Ú_paintrJ   r'   r   r   r   r   r'   ð   s    
zTopWindow.repaintc                 C  s   d | _ |  ¡  d S r   )r\   rZ   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   )rJ   rX   r   r   r   r   r   rX   ú   s    zTopWindow.changeFocusc                 C  s4   zt  | ||¡ W n tk
r.   |  ¡  Y nX d S r   )rJ   r8   r   rX   r5   r   r   r   r8     s    zTopWindow.keystrokeReceived)r   r   r	   r
   r<   r   r\   r'   r^   rX   r8   r   r   r   r   rY   Ð   s   	rY   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)ÚrangerW   rK   rV   )r   rP   r   r   Únr   r   r   Ú	moveChild  s
    zAbsoluteBox.moveChildc                 C  s<   | j D ]0\}}}t||| || ||ƒ}| |||¡ qd S r   )rK   r   r)   )r   r   r   r   rT   r   r   Úwrapr   r   r   r-     s    zAbsoluteBox.renderN)r   r   r	   rb   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   )rJ   r   Úgravity)r   rf   r   r   r   r     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   ©NNr@   )rK   r.   ÚvariableDimensionÚmax)r   r   r   rT   Ú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   rg   r@   c                 s  s   | ]}|d k	r|V  qd S r   r   )Ú.0Úwr   r   r   Ú	<genexpr>L  s      z_Box.render.<locals>.<genexpr>)	rK   r.   rh   rM   ÚsumÚintÚzipr   r)   )r   r   r   r   ZgreedyZwantsrT   rj   ÚlengthZ	totalWantZleftForGreedyZwidthOffsetZheightOffsetZwantZsubWidthZ	subHeightrc   r   r   r   r-   =  sD    


û
z_Box.renderN)
r   r   r	   r`   ZTOPZCENTERZBOTTOMr   r.   r-   r   r   r   r   rd     s   rd   c                   @  s   e Zd ZdZdS )ÚHBoxr   N©r   r   r	   rh   r   r   r   r   rr   j  s   rr   c                   @  s   e Zd ZdZdS )ÚVBoxr@   Nrs   r   r   r   r   rt   n  s   rt   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   )rt   )rk   ra   r   r   r   Ú
<listcomp>x  s     z!Packer.render.<locals>.<listcomp>)	rK   ro   rW   r`   Ú	enumeraterQ   rr   Úmapr-   )	r   r   r   r   ÚrootZboxesra   rT   Úhr   r   r   r-   s  s    zPacker.renderN)r   r   r	   r-   r   r   r   r   ru   r  s   ru   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 k	rbtt|| jƒƒD ]2}tt|| jƒƒD ]}| ||f ||| | < qBq.|| _|| _|| _| j|krˆ|d | _| j|krœ|d | _d S )NÚBó    r@   )ÚarrayÚcontentsr`   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   rU   r   r   r   r   r   Ú__getitem__—  s    zCanvas.__getitem__c                 C  s    |\}}|| j | j| | < d S r   r„   )r   rU   Úvaluer   r   r   r   r   Ú__setitem__›  s    zCanvas.__setitem__c                 C  s   t   ddt| jƒ ¡| _d S )Nr~   r   )r€   rW   r�   r   r   r   r   ÚclearŸ  s    zCanvas.clearc                 C  s„   |r|sd S || j ks || jkr,|  ||¡ t|ƒD ]J}| d|¡ | j| j | | j | | j  …  ¡ }|d |… }| |¡ q4d S ©Nr   )r‚   rƒ   r}   r`   r   r�   Útobytesr!   )r   r   r   r   Úir   r   r   r   r-   ¢  s     ÿ
zCanvas.render)r   r   r	   r<   r�   r   r}   r…   r‡   rˆ   r-   r   r   r   r   r{   €  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Ž   r`   r   r!   r�   )r   r   ÚtopZbottomra   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!   r`   r   r�   )r   ÚpositionZ	dimensionr”   r�   r   r   ra   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ž   r8   r5   r   r   r   r8   ê  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 )Nrg   r   r—   r@   )rž   r.   )r   rj   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—   r@   )rž   r<   r!   rœ   r   r)   )r   r   r   r   rc   r   r   r   r-   ÿ  s    

zBorder.renderN)
r   r   r	   r   r=   r>   r8   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 r|   )rW   r¤   r   r   r   r   r.     s    zButton.sizeHintc                 C  s   |dkr|   ¡  d S ©Nó   )r¥   r5   r   r   r   r4     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-     s    zButton.renderN)r   r   r	   r   r.   r4   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     s
    
zTextInput.__init__c                 C  s(   |d | j … | _t| jƒ| _|  ¡  d S r   )r«   r¬   rW   r­   r'   ©r   r   r   r   r   ÚsetText%  s    zTextInput.setTextc                 C  s$   | j dkr |  j d8  _ |  ¡  d S ©Nr   r@   )r­   r'   r:   r   r   r   Úfunc_LEFT_ARROW*  s    
zTextInput.func_LEFT_ARROWc                 C  s*   | j t| jƒk r&|  j d7  _ |  ¡  d S r|   )r­   rW   r¬   r'   r:   r   r   r   Úfunc_RIGHT_ARROW/  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   r2   4  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§   r@   )rª   r¬   rW   r«   r­   r'   r5   r   r   r   r4   :  s    "ÿzTextInput.characterReceivedc                 C  s   | j d dfS r|   )r«   r   r   r   r   r.   E  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   r@   r   ó   _)Ú_renderTextr   r<   r!   r­   r«   rW   )r   r   r   r   ZcurrentTextZmorer   r   r   r-   H  s    zTextInput.renderc                 C  s   | j S r   )r¬   r   r   r   r   r´   T  s    zTextInput._renderTextN)r   r   r	   r   r¯   r±   r²   r2   r4   r.   r-   r´   r   r   r   r   r¨     s   r¨   c                   @  s   e Zd Zdd„ ZdS )ÚPasswordInputc                 C  s   dt | jƒ S )NÚ*)rW   r¬   r   r   r   r   r´   Y  s    zPasswordInput._renderTextN)r   r   r	   r´   r   r   r   r   rµ   X  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.   d  s    zTextOutput.sizeHintc                 C  s8   |  dd¡ | jd |… }| |d|t|ƒ   ¡ d S ©Nr   r   )r   r   r!   rW   )r   r   r   r   r   r   r   r   r-   g  s    zTextOutput.renderc                 C  s   || _ |  ¡  d S r   )r   r'   r®   r   r   r   r¯   l  s    zTextOutput.setTextc                 C  s
   t ƒ ‚d S r   r9   r   r   r   r   r=   p  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   w  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ÚpoprB   rC   rD   ÚtptextZ
greedyWrapÚbytesÚencoderM   ÚextendrW   rw   r   r!   )r   r   r   r   ra   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º   t  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  s   | j S r   )Ú_xOffsetr   r   r   r   ÚxOffset—  s    zViewport.xOffsetc                 C  s   | j |kr|| _ |  ¡  d S r   )rÆ   r'   ©r   r†   r   r   r   rÇ   ›  s    
c                 C  s   | j S r   )Ú_yOffsetr   r   r   r   ÚyOffset¡  s    zViewport.yOffsetc                 C  s   | j |kr|| _ |  ¡  d S r   )rÉ   r'   rÈ   r   r   r   rÊ   ¥  s    
é    é   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   r@   )rž   r)   r‚   rƒ   rÍ   rw   ÚlinesrÉ   r   rÆ   Úvoidr!   )	r   r   r   r   r   rÃ   ra   rT   Úattrr   r   r   r-   ¼  s    ÿ$zViewport.renderN)r   r   r	   rÆ   rÉ   ÚpropertyrÇ   ÚsetterrÊ   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Ô   rA   ©r   ri   rÕ   rÖ   r'   r   r   r   r   ÚsmallerÓ  s    z_Scrollbar.smallerc                 C  s$   t dtd|  d¡ƒƒ| _|  ¡  d S )Nr×   rÔ   r@   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 )Nr|   r   r   r   r   r   r.   Ý  s    zHorizontalScrollbar.sizeHintc                 C  s   |   ¡  d S r   ©rÙ   r:   r   r   r   r±   à  s    z#HorizontalScrollbar.func_LEFT_ARROWc                 C  s   |   ¡  d S r   ©rÚ   r:   r   r   r   r²   ã  s    z$HorizontalScrollbar.func_RIGHT_ARROWu   â—€u   â–¶õ   â–‘õ   â–“c                 C  sd   |  dd¡ |d }t|| j ƒ}|| }| j| j|  | j | j|  | j }| | d¡¡ d S )Nr   re   r?   )	r   ro   rÖ   Ú_leftÚ_barÚ_sliderÚ_rightr!   rÁ   )r   r   r   r   ra   ÚbeforeÚ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)r@   Nr   r   r   r   r   r.   û  s    zVerticalScrollbar.sizeHintc                 C  s   |   ¡  d S r   rÜ   r:   r   r   r   Úfunc_UP_ARROWþ  s    zVerticalScrollbar.func_UP_ARROWc                 C  s   |   ¡  d S r   rÝ   r:   r   r   r   Úfunc_DOWN_ARROW  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?   r@   )
r   ro   rÖ   r!   Ú_uprÁ   r`   rá   râ   Ú_down)r   r   r   r   Zknobr‹   r   r   r   r-   	  s    zVerticalScrollbar.renderN)r   r   r	   r.   rè   ré   rê   rë   rá   râ   r-   r   r   r   r   rç   ú  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ž   rl   r   r   r   r     s    

zScrolledArea.__init__c                 C  s.   | j  j|7  _td| j jƒ| j _| j jd S ©Nr   g      9@)rí   rÇ   ri   ©r   ra   r   r   r   rî   &  s    zScrolledArea._horizScrollc                 C  s.   | j  j|7  _td| j jƒ| j _| j jd S rò   )rí   rÊ   ri   ró   r   r   r   rð   +  s    zScrolledArea._vertScrollc                 C  s   | j  ¡  d S r   )rñ   rÙ   r:   r   r   r   rè   0  s    zScrolledArea.func_UP_ARROWc                 C  s   | j  ¡  d S r   )rñ   rÚ   r:   r   r   r   ré   3  s    zScrolledArea.func_DOWN_ARROWc                 C  s   | j  ¡  d S r   )rï   rÙ   r:   r   r   r   r±   6  s    zScrolledArea.func_LEFT_ARROWc                 C  s   | j  ¡  d S r   )rï   rÚ   r:   r   r   r   r²   9  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—   r@   r¡   r   r¢   )	r   rí   r)   r<   r!   r’   r•   rñ   rï   )r   r   r   r   Úwrapperr   r   r   r-   B  s"    
  ÿ  ÿzScrolledArea.renderN)r   r   r	   r
   r   rî   rð   rè   ré   r±   r²   r(   r-   r   r   r   r   rì     s   	rì   c                 C  s6   |   ¡  |  ttjƒ¡ |  |¡ |  ¡  |  ¡  d S r   )r   r   rC   r   ÚREVERSE_VIDEOr!   r   r   )r   rT   r   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Ú
minVisibleri   rx   rW   r‚   )r   r÷   rø   rù   r   r   r   r   a  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.   i  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è   m  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ú   ri   r   r'   r:   r   r   r   Ú	func_PGUPt  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 r|   )rú   rW   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 r|   )rû   r   rú   rW   r÷   r   r'   )r   r7   Zchanger   r   r   Ú	func_PGDNƒ  s     
ÿzSelection.func_PGDNc                 C  s   |dkr|   | j| j ¡ d S r¦   )rø   r÷   rú   r5   r   r   r   r4   �  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û   rW   r÷   ri   rw   r   r   r<   rC   r   rõ   ZBOLDr   r!   r   )
r   r   r   r   ÚstartÚelementsra   ZeleÚmodesr   r   r   r   r-   ”  s"    


zSelection.render)N)r   r   r	   rú   rû   r   r.   rè   rü   ré   rý   r4   r-   r   r   r   r   rö   Z  s   
rö   )&r
   Ú
__future__r   r€   Ztwisted.conch.insultsr   r   Ztwisted.pythonr   r¿   Ú	Exceptionr   r   r#   rJ   rY   r_   rd   rr   rt   ru   r{   r’   r•   rœ   r�   r£   r¨   rµ   r·   rº   rÅ   rÓ   rÛ   rç   rì   r­   rö   r   r   r   r   Ú<module>   s>   PP:Q1*;:;