o
    >h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                   @     e Zd ZdZdS )
YieldFocusz,
    Input focus manipulation exception
    N)__name__
__module____qualname____doc__ r   r   |/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-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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  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+   7   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.   D   s   zWidget.drawc                 C     d S r   r   r/   r   r   r   r2   K      zWidget.renderc                 C  r3   r   r   r"   r   r   r   sizeHintN   r4   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   keystrokeReceivedQ   s   
zWidget.keystrokeReceivedc                 C     t  r   r   r   r?   r   r   r   r8   [      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 r1   rE   r"   r   r   r   	focusLosth      zWidget.focusLostc                 C  r3   r   r   r"   r   r   r   r9   l   r4   zWidget.backspaceReceivedc                 C  sL   |}t |ts|d}d|dd  }t| |d }|d ur$|| d S d S )Nutf-8func_   )
isinstancestrdecodegetattr)r   r>   r?   name
methodNamefuncr   r   r   r;   o   s   

zWidget.functionKeyReceivedc                 C  r3   r   r   r=   r   r   r   r<   |   r4   zWidget.characterReceived)r   r	   r
   rF   r*   r)   r   __annotations__r   r+   r,   r0   r.   r2   r5   r@   r8   rG   rH   r9   r;   r<   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         

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*   rW   appendfocusedChildrF   rG   r   r+   r   childr   r   r   addChild   s   zContainerWidget.addChildc                 C  s,   |j | u sJ d |_ | j| |   d S r   )r*   rW   remover+   r[   r   r   r   remChild   s   zContainerWidget.remChildc                 C  s"   | j D ]}|  qt|  d S r   )rW   r,   r'   )r   chr   r   r   r,      s   

zContainerWidget.filthyc                 C  s   | j D ]	}|||| qd S r   )rW   r.   )r   r   r   r   r`   r   r   r   r2      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 )NrL   r   )	r+   rZ   rH   rW   index
ValueErrorr   lenrG   )r   rZ   curFocusr   r   r   changeFocus   s*   

	zContainerWidget.changeFocusc                 C  s   |    d| _d S r(   )re   rF   r"   r   r   r   rG      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   )rZ   r@   r   re   r+   r'   r=   r   r   r   r@      s   
z!ContainerWidget.keystrokeReceived)r   r	   r
   r   rZ   rF   r   r]   r_   r,   r2   re   rG   r@   r   r   r   r   rV      s    rV   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   )rV   r   painter	scheduler)r   rh   ri   r   r   r   r         

zTopWindow.__init__Nc                 C  s,   | j d u rt | _ | | j t|  d S r   )
_paintCallobjectri   _paintrV   r+   r"   r   r   r   r+      s   
zTopWindow.repaintc                 C  s   d | _ |   d S r   )rk   rh   r"   r   r   r   rm      rI   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   )rV   re   r   r"   r   r   r   re      s   zTopWindow.changeFocusc                 C  s2   z
t | || W d S  ty   |   Y d S w r   )rV   r@   r   re   r=   r   r   r   r@     s
   zTopWindow.keystrokeReceived)r   r	   r
   r   rF   r   rk   r+   rm   re   r@   r   r   r   r   rf      s    	rf   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)rangerc   rW   rb   )r   r\   r    r!   nr   r   r   	moveChild  s   
zAbsoluteBox.moveChildc                 C  s<   | j D ]\}}}t||| || ||}|||| qd S r   )rW   r   r.   )r   r   r   r   r`   r    r!   wrapr   r   r   r2     s   zAbsoluteBox.renderN)r   r	   r
   rq   r2   r   r   r   r   rn   
  s    rn   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   )rV   r   gravity)r   rv   r   r   r   r     rX   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   NNrL   )rW   r5   variableDimensionmax)r   r   r   r`   hintr   r   r   r5      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   rw   rL   c                 s  s    | ]	}|d ur|V  qd S r   r   ).0wr   r   r   	<genexpr>L  s    z_Box.render.<locals>.<genexpr>)	rW   r5   rx   rY   sumintzipr   r.   )r   r   r   r   greedywantsr`   rz   length	totalWantleftForGreedywidthOffsetheightOffsetwantsubWidth	subHeightrr   r   r   r   r2   =  sF   





z_Box.renderN)
r   r	   r
   ro   TOPCENTERBOTTOMr   r5   r2   r   r   r   r   rs     s
    rs   c                   @  r   )HBoxr   Nr   r	   r
   rx   r   r   r   r   r   j  r   r   c                   @  r   )VBoxrL   Nr   r   r   r   r   r   n  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   )r{   rp   r   r   r   
<listcomp>x  s    z!Packer.render.<locals>.<listcomp>)	rW   r   rc   ro   	enumerater]   r   mapr2   )	r   r   r   r   rootboxesrp   r`   hr   r   r   r2   s  s   zPacker.renderN)r   r	   r
   r2   r   r   r   r   r   r      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 NrL   )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    rL   )arraycontentsro   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   ra   r    r!   r   r   r   __getitem__  s   zCanvas.__getitem__c                 C  s    |\}}|| j | j| | < d S r   r   )r   ra   valuer    r!   r   r   r   __setitem__  s   zCanvas.__setitem__c                 C  s   t  ddt| j | _d S )Nr   r   )r   rc   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   ro   r   r   tobytesr$   )r   r   r   r   ir   r   r   r   r2     s   zCanvas.render)r   r	   r
   rF   r   r   r   r   r   r   r2   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   ro   r   r$   r   )r   r    topbottomrp   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         krL   r   r      m   jN)	r   r   r   r   r   r$   ro   r   r   )r   position	dimensionr   r   r   r   rp   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   rG   r"   r   r   r   rG     r-   zBorder.focusReceivedc                 C  r   r   )r   rH   r"   r   r   r   rH     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 )Nrw   r   r   rL   )r   r5   )r   rz   r    r!   r   r   r   r5     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   rL   )r   rF   r$   r   r   r.   )r   r   r   r   rr   r   r   r   r2     s   

zBorder.renderN)
r   r	   r
   r   rG   rH   r@   r5   r,   r2   r   r   r   r   r     s    r   c                   @  r   )
Buttonc                 C  rg   r   )r'   r   labelonPress)r   r   r   r   r   r   r   	  rj   zButton.__init__c                 C  s   t | jdfS r   )rc   r   r"   r   r   r   r5     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   rF   r$   r   r/   r   r   r   r2     s   zButton.renderN)r   r	   r
   r   r5   r<   r2   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   rc   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   rL   )r   r+   rC   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   rc   r   r+   rC   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   r9   4  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   rL   )r   r   rc   r   r   r+   r=   r   r   r   r<   :  s   "zTextInput.characterReceivedc                 C  s   | j d dfS r   )r   r"   r   r   r   r5   E  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   rL   r      _)_renderTextr   rF   r$   r   r   rc   )r   r   r   r   currentTextmorer   r   r   r2   H  s    zTextInput.renderc                 C     | j S r   )r   r"   r   r   r   r   T     zTextInput._renderTextN)r   r	   r
   r   r   r   r   r9   r<   r5   r2   r   r   r   r   r   r     s    r   c                   @  r   )PasswordInputc                 C  s   dt | j S )N*)rc   r   r"   r   r   r   r   Y  r   zPasswordInput._renderTextN)r   r	   r
   r   r   r   r   r   r   X  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  ru   r   )r'   r   size)r   r   r   r   r   r   `  rX   zTextOutput.__init__c                 C  r   r   )r   r"   r   r   r   r5   d  r   zTextOutput.sizeHintc                 C  s8   | dd | jd | }||d|t|    d S Nr   r   )r   r   r$   rc   )r   r   r   r   r   r   r   r   r2   g  s   zTextOutput.renderc                 C  s   || _ |   d S r   )r   r+   r   r   r   r   r   l  rI   zTextOutput.setTextc                 C  rA   r   rB   r"   r   r   r   rG   p  r   zTextOutput.focusReceivedr   )	r   r	   r
   r   r   r5   r2   r   rG   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 }|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   rJ   r   )r   
splitlinesr   WRAPpoprN   rO   rP   tptext
greedyWrapbytesencoderY   extendrc   r   r   r$   )r   r   r   r   rp   
inputLinesoutputLineslinewrappedLineswrappedLineLr   r   r   r2   {  s,   





zTextOutputArea.render)r   r	   r
   ro   r   TRUNCATEr   r2   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  r   r   )_xOffsetr"   r   r   r   xOffset  rD   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  rD   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   rL   )r   r.   r   r   r   r   linesr   r   r   voidr$   )	r   r   r   r   r!   r   rp   r`   attrr   r   r   r2     s   $zViewport.renderN)r   r	   r
   r   r   propertyr   setterr   r   r   r   r,   r2   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     rj   z_Scrollbar.__init__c                 C  $   t dtd| d| _|   d S )N      ?r  rM   r   ry   r  r	  r+   r"   r   r   r   smaller     z_Scrollbar.smallerc                 C  r
  )Nr  r  rL   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   r5     r4   zHorizontalScrollbar.sizeHintc                 C     |    d S r   r  rC   r   r   r   r     r&   z#HorizontalScrollbar.func_LEFT_ARROWc                 C  r  r   r  rC   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   rt   rJ   )	r   r   r	  _left_bar_slider_rightr$   r   )r   r   r   r   rp   beforeaftermer   r   r   r2     s   zHorizontalScrollbar.renderN)r   r	   r
   r5   r   r   r  r  r  r  r2   r   r   r   r   r        r  c                   @  r  )VerticalScrollbarc                 C  r  )N)rL   Nr   r"   r   r   r   r5     r4   zVerticalScrollbar.sizeHintc                 C  r  r   r  rC   r   r   r   func_UP_ARROW  r&   zVerticalScrollbar.func_UP_ARROWc                 C  r  r   r  rC   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   rJ   rL   )
r   r   r	  r$   _upr   ro   r  r  _down)r   r   r   r   knobr   r   r   r   r2   	  s   zVerticalScrollbar.renderN)r   r	   r
   r5   r!  r"  r#  r$  r  r  r2   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   r|   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   ry   r   rp   r   r   r   r(  &     zScrolledArea._horizScrollc                 C  r,  r-  )r'  r   ry   r.  r   r   r   r*  +  r/  zScrolledArea._vertScrollc                 C     | j   d S r   )r+  r  rC   r   r   r   r!  0  r   zScrolledArea.func_UP_ARROWc                 C  r0  r   )r+  r  rC   r   r   r   r"  3  r   zScrolledArea.func_DOWN_ARROWc                 C  r0  r   )r)  r  rC   r   r   r   r   6  r   zScrolledArea.func_LEFT_ARROWc                 C  r0  r   )r)  r  rC   r   r   r   r   9  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,   <  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   rL   r   r   r   )	r   r'  r.   rF   r$   r   r   r+  r)  )r   r   r   r   wrapperr   r   r   r2   B  s   
zScrolledArea.renderN)r   r	   r
   r   r   r(  r*  r!  r"  r   r   r,   r2   r   r   r   r   r&    s    	r&  c                 C  s6   |    | ttj | | |   |   d S r   )r   r   rO   r   REVERSE_VIDEOr$   r   r   )r   r`   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 urttt| j| _d S d S r   )	r'   r   sequenceonSelect
minVisiblery   r   rc   r   )r   r4  r5  r6  r   r   r   r   a  s   
zSelection.__init__c                 C  s   | j d ur| j| j fS d S r   )r6  r   r"   r   r   r   r5   i  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+   rC   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   )r8  r7  ry   r   r+   rC   r   r   r   	func_PGUPt  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   )r7  rc   r4  r8  r   r+   rC   r   r   r   r"  |  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   )r8  r   r7  rc   r4  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   )r5  r4  r7  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   r7  r8  rc   r4  ry   r   r   r   rF   rO   r   r2  BOLDr   r$   r   )
r   r   r   r   startelementsrp   elemodesr   r   r   r   r2     s&   


zSelection.renderr   )r   r	   r
   r7  r8  r   r5   r!  r9  r"  r;  r<   r2   r   r   r   r   r3  Z  s    
r3  )&r   
__future__r   r   twisted.conch.insultsr   r   twisted.pythonr   r   	Exceptionr   r   r'   rV   rf   rn   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r&  r   r3  r   r   r   r   <module>   s@   PP:Q1*;:;