
    Ϫfk                     :   d Z ddlZddlmZmZ ddlmZ  G d de      Z	 G d d      Z
 G d	 d
      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zd Zd Zd Z G d de      Z G d  d!e      Z G d" d#e      Z G d$ d%e      Z G d& d'e      Z G d( d)e      Z G d* d+e      Z G d, d-e      Z G d. d/e      Z G d0 d1e      Z  G d2 d3e      Z!d4 Z" G d5 d6e      Z#y)7z<
Simple insults-based widget library

@author: Jp Calderone
    N)helperinsults)textc                       e Zd ZdZy)
YieldFocusz,
    Input focus manipulation exception
    N)__name__
__module____qualname____doc__     >/usr/lib/python3/dist-packages/twisted/conch/insults/window.pyr   r      s    r   r   c                   $    e Zd Zd Zd Zd Zd Zy)BoundedTerminalWrapperc                     || _         || _        || _        || _        || _        |j
                  | _        |j                  | _        |j                  | _        |j                  | _        |j                  | _	        y N)
widthheightxoffyoffterminalcursorForwardselectCharacterSetselectGraphicRendition
saveCursorrestoreCursor)selfr   r   r   r   r   s         r   __init__zBoundedTerminalWrapper.__init__   sj    
		 %33"*"="=&.&E&E#"--%33r   c                     | j                   j                  | j                  t        | j                  |      z   | j
                  t        | j                  |      z         S r   )r   cursorPositionr   minr   r   r   )r   xys      r   r    z%BoundedTerminalWrapper.cursorPosition"   sF    }}++IIDJJ**DIIDKK8K,K
 	
r   c                 b    | j                   j                  | j                  | j                        S r   )r   r    r   r   r   s    r   
cursorHomez!BoundedTerminalWrapper.cursorHome'   s!    }}++DIItyyAAr   c                 8    | j                   j                  |      S r   )r   write)r   datas     r   r(   zBoundedTerminalWrapper.write*   s    }}""4((r   N)r   r	   r
   r   r    r&   r(   r   r   r   r   r      s    
4

B)r   r   c                   n    e Zd ZdZdZdZdxZZd Zd Z	d Z
d Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zy)WidgetFNc                     | j                   sd| _         | j                  2| j                  j                   s| j                  j                          y y y NT)dirtyparentrepaintr%   s    r   r0   zWidget.repaint4   s>    zzDJ;;"4;;+<+<KK! ,="r   c                     d| _         y r-   )r.   r%   s    r   filthyzWidget.filthy:   s	    
r   c                 J    | j                          | j                  |||       y r   )r2   drawr   r   r   r   s       r   redrawzWidget.redraw=   s    		%*r   c                     || j                   k7  s|| j                  k7  s| j                  r)|| _         || _        d| _        | j                  |||       y y NF)r   r   r.   renderr5   s       r   r4   zWidget.drawA   sJ    DJJ&DKK"74::DJ DKDJKKvx0	 <Fr   c                      y r   r   r5   s       r   r9   zWidget.renderH       r   c                      y r   r   r%   s    r   sizeHintzWidget.sizeHintK   s    r   c                     |dk(  r| j                  |       y |dk(  r| j                          y |t        j                  v r| j	                  ||       y | j                  ||       y )N   	   )tabReceivedbackspaceReceivedr   FUNCTION_KEYSfunctionKeyReceivedcharacterReceivedr   keyIDmodifiers      r   keystrokeReceivedzWidget.keystrokeReceivedN   sY    E>X&g""$g+++$$UH5""5(3r   c                     t               r   r   r   rH   s     r   rA   zWidget.tabReceivedX   s
    lr   c                 2    d| _         | j                          y)z
        Called when focus is being given to this widget.

        May raise YieldFocus is this widget does not want focus.
        TNfocusedr0   r%   s    r   focusReceivedzWidget.focusReceived\   s     r   c                 2    d| _         | j                          y r8   rN   r%   s    r   	focusLostzWidget.focusLoste   s    r   c                      y r   r   r%   s    r   rB   zWidget.backspaceReceivedi   r;   r   c                     |}t        |t              s|j                  d      }t        | d|z   d       }|	 ||       y y )Nutf-8func_)
isinstancestrdecodegetattr)r   rG   rH   namefuncs        r   rD   zWidget.functionKeyReceivedl   sC    %%;;w'DtWt^T2N r   c                      y r   r   rF   s      r   rE   zWidget.characterReceivedt   r;   r   )r   r	   r
   rO   r/   r.   r   r   r0   r2   r6   r4   r9   r=   rI   rA   rP   rR   rB   rD   rE   r   r   r   r+   r+   .   s\    GFEEF"+14r   r+   c                   H    e Zd ZdZdZdZd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)ContainerWidgetzZ
    @ivar focusedChild: The contained widget which currently has
    focus, or None.
    NFc                 <    t         j                  |        g | _        y r   )r+   r   childrenr%   s    r   r   zContainerWidget.__init__   s    r   c                    |j                   J | |_         | j                  j                  |       | j                  $| j                  r	 |j                          || _        | j                          y # t        $ r Y w xY wr   )r/   ra   appendfocusedChildrO   rP   r   r0   r   childs     r   addChildzContainerWidget.addChild   su    ||###U#$*##% %*!	  s   
A2 2	A>=A>c                     |j                   | u sJ d |_         | j                  j                  |       | j                          y r   )r/   ra   remover0   re   s     r   remChildzContainerWidget.remChild   s6    ||t###U#r   c                 p    | j                   D ]  }|j                           t        j                  |        y r   )ra   r2   r+   )r   chs     r   r2   zContainerWidget.filthy   s*    -- 	BIIK	dr   c                 L    | j                   D ]  }|j                  |||        y r   )ra   r4   )r   r   r   r   rl   s        r   r9   zContainerWidget.render   s%    -- 	-BGGE68,	-r   c                    | j                          | j                  M| j                  j                          | j                  }d | _        	 | j                  j	                  |      dz   }nd}|t        | j                        k  r3	 | j                  |   j                          | j                  |   | _        y t               # t
        $ r t               w xY w# t        $ r |dz  }Y nw xY w|t        | j                        k  rO)N   r   )	r0   rd   rR   ra   index
ValueErrorr   lenrP   )r   rd   curFocuss      r   changeFocuszContainerWidget.changeFocus   s    (''),,L $D#==..|<q@ HT]]++h'557 %)MM($;!l  # l"#  A T]]++s   C C CC)(C)c                 2    | j                          d| _        y r-   )rt   rO   r%   s    r   rP   zContainerWidget.focusReceived   s    r   c                     | j                   	 | j                   j                  ||       y t
        j                  | ||       y # t        $ r# | j                          | j	                          Y y w xY wr   )rd   rI   r   rt   r0   r+   rF   s      r   rI   z!ContainerWidget.keystrokeReceived   sc    (!!33E8D
 $$T5(;	    "s   A )A/.A/)r   r	   r
   r   rd   rO   r   rg   rj   r2   r9   rt   rP   rI   r   r   r   r_   r_   x   s;    
 LG
-0<r   r_   c                   6    e Zd ZdZdZd ZdZd Zd Zd Z	d Z
y)		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                 J    t         j                  |        || _        || _        y r   )r_   r   painter	scheduler)r   rz   r{   s      r   r   zTopWindow.__init__   s      &"r   Nc                     | j                   *t               | _         | j                  | j                         t        j                  |        y r   )
_paintCallobjectr{   _paintr_   r0   r%   s    r   r0   zTopWindow.repaint   s3    ??"$hDONN4;;'%r   c                 2    d | _         | j                          y r   )r}   rz   r%   s    r   r   zTopWindow._paint   s    r   c                     	 t         j                  |        y # t        $ r) 	 t         j                  |        Y y # t        $ r Y Y y w xY ww xY wr   )r_   rt   r   r%   s    r   rt   zTopWindow.changeFocus   sI    	''- 	++D1 	s$    	A
9	AA
AA
c                 r    	 t         j                  | ||       y # t        $ r | j                          Y y w xY wr   )r_   rI   r   rt   rF   s      r   rI   zTopWindow.keystrokeReceived   s4    	--dE8D 		s    66)r   r	   r
   r   rO   r   r}   r0   r   rt   rI   r   r   r   rx   rx      s.    , G#
 J&r   rx   c                       e Zd Zd Zd Zy)AbsoluteBoxc                     t        t        | j                              D ]*  }| j                  |   d   |u s|||f| j                  |<    y  t        d|      )Nr   zNo such child)rangerr   ra   rq   )r   rf   r"   r#   ns        r   	moveChildzAbsoluteBox.moveChild  s[    s4==)* 	5A}}Q"e+$)1a=a 	5
 _e44r   c                 ~    | j                   D ].  \  }}}t        |||z
  ||z
  ||      }|j                  |||       0 y r   )ra   r   r4   )r   r   r   r   rl   r"   r#   wraps           r   r9   zAbsoluteBox.render  sE     	)HB1)(EAIvz1aPDGGE64(	)r   N)r   r	   r
   r   r9   r   r   r   r   r     s    5)r   r   c                   :    e Zd Z ed      \  ZZZefdZd Zd Z	y)_Box   c                 <    t         j                  |        || _        y r   )r_   r   gravity)r   r   s     r   r   z_Box.__init__  s      &r   c                 ,   d}d}| j                   D ]~  }|j                         }|d}| j                  dk(  r-|d   d }n
|||d   z  }|d   d }@|Ct        ||d         }S|d   d }n|t        ||d         }|d   d }t|w||d   z  } ||fS )Nr   NNro   )ra   r=   variableDimensionmax)r   r   r   rl   hints        r   r=   z_Box.sizeHint  s    -- 	&B;;=D|#%%*7? E&T!W$E7?!F' a1F7? E&tAw/E7?!F'd1g%F-	&0 f}r   c                 4   | j                   sy d}g }| j                   D ]H  }|j                         }|d}|| j                     |dz  }|j                  || j                            J ||f| j                     }t	        d |D              }	|rt        ||	z
  |z        }
dx}}t        || j                         D ]]  \  }}|
}||}}| j                  dk(  r|}n|}t        |||||      }|j                  |||       | j                  dk(  r||z  }Y||z  }_ y )Nr   r   ro   c              3   &   K   | ]	  }||  y wr   r   ).0ws     r   	<genexpr>z_Box.render.<locals>.<genexpr>D  s     :aAM:s   )	ra   r=   r   rc   sumintzipr   r4   )r   r   r   r   greedywantsrl   r   length	totalWantleftForGreedywidthOffsetheightOffsetwantsubWidth	subHeightr   s                    r   r9   z_Box.render5  sL   }}-- 	7B;;=D|#D**+3!LLd4456	7 !7!78:5::	)!3v =>M%&&lE4==1 	%HD"|$"'iH%%* 	)D GGHi.%%*t#$+	%r   N)
r   r	   r
   r   TOPCENTERBOTTOMr   r=   r9   r   r   r   r   r     s$    (C% :*%r   r   c                       e Zd ZdZy)HBoxr   Nr   r	   r
   r   r   r   r   r   r   b      r   r   c                       e Zd ZdZy)VBoxro   Nr   r   r   r   r   r   f  r   r   r   c                       e Zd Zd Zy)Packerc                    | j                   sy t        t        | j                         dz  dz         }t        |      D cg c]  }t	                }}t        | j                         D ]%  \  }}||t        |      z     j                  |       ' t               }t        |j                  |       |j                  |||       y c c}w )Ng      ?)
ra   r   rr   r   r   	enumeraterg   r   mapr9   )	r   r   r   r   rootr   boxesrl   hs	            r   r9   zPacker.renderk  s    }}3t}}%,s23!&t-A--t}}- 	/EAr!c%j.!**2.	/FAJJ	) .s   CN)r   r	   r
   r9   r   r   r   r   r   j  s    
*r   r   c                   8    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
y)	CanvasFNc                 R    t         j                  |        | j                  dd       y Nro   )r+   r   resizer%   s    r   r   zCanvas.__init__}  s    Aqr   c                    t        j                   dd|z  |z        }| j                  Xt        t        || j                              D ]6  }t        t        || j
                              D ]  }| ||f   |||z  |z   <    8 || _        || _        || _        | j                  |k\  r
|dz
  | _        | j                  |k\  r|dz
  | _        y y )NB    ro   )arraycontentsr   r!   _width_heightr"   r#   )r   r   r   r   r"   r#   s         r   r   zCanvas.resize  s    ;;sD5L6$9:==$3udkk23 9s64<<89 9A.21a4jHUQY]+99 !66U?QYDF66VaZDF r   c                 J    |\  }}| j                   | j                  |z  |z      S r   r   r   )r   rp   r"   r#   s       r   __getitem__zCanvas.__getitem__  s'    A}}dkkAo233r   c                 L    |\  }}|| j                   | j                  |z  |z   <   y r   r   )r   rp   valuer"   r#   s        r   __setitem__zCanvas.__setitem__  s&    A/4t{{Q!+,r   c                 f    t        j                   ddt        | j                        z        | _        y )Nr   r   )r   rr   r   r%   s    r   clearzCanvas.clear  s"    CDMM0B)BCr   c                 f   |r|sy || j                   k7  s|| j                  k7  r| j                  ||       t        |      D ]n  }|j	                  d|       | j
                  | j                   |z  | j                   |z  | j                   z    j                         }|d | }|j                  |       p y Nr   )r   r   r   r   r    r   tobytesr(   )r   r   r   r   ir   s         r   r9   zCanvas.render  s    FDKK6T\\#9KKv&v 	!A##Aq)==a$++/DKK"?gi  <DNN4 	!r   )r   r	   r
   rO   r   r   r   r   r   r   r9   r   r   r   r   r   x  s+    GH 45D!r   r   c                    | j                  t        j                  t        j                         | j	                  ||       | j                  d||z
  z         | j                  t        j                  t        j                         y )N   q)r   r   
CS_DRAWINGG0r    r(   CS_US)r   r#   leftrights       r   horizontalLiner     sY     2 2GJJ?D!$NN7edl+,wzz:r   c                 $   | j                  t        j                  t        j                         t	        ||      D ]%  }| j                  ||       | j                  d       ' | j                  t        j                  t        j                         y )N   x)r   r   r   r   r   r    r(   r   )r   r"   topbottomr   s        r   verticalLiner     sh     2 2GJJ?3  1%w  wzz:r   c                    |\  }}|\  }}| j                  t        j                  t        j                         | j	                  ||       | j                  d       | j                  d|dz
  z         | j                  d       t        |dz
        D ]P  }| j	                  |||z   dz          | j                  d       | j                  |dz
         | j                  d       R | j	                  d||z   dz
         | j                  d       | j                  d|dz
  z         | j                  d	       | j                  t        j                  t        j                         y
)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         kro   r   r      m   jN)	r   r   r   r   r    r(   r   r   r   )r   position	dimensionr   r   r   r   r   s           r   	rectangler     s'    KS$OUF 2 2GJJ?C&NN7NN7eai()NN76A:  cAgk2wuqy)w	 
 AsV|a/0NN7NN7eai()NN7wzz:r   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	Borderc                 ^    t         j                  |        || _        | | j                  _        y r   )r+   r   	containeer/   r   r   s     r   r   zBorder.__init__  s!    " $r   c                 6    | j                   j                         S r   )r   rP   r%   s    r   rP   zBorder.focusReceived  s    ~~++--r   c                 6    | j                   j                         S r   )r   rR   r%   s    r   rR   zBorder.focusLost  s    ~~''))r   c                 :    | j                   j                  ||      S r   )r   rI   rF   s      r   rI   zBorder.keystrokeReceived  s    ~~//x@@r   c                     | j                   j                         }|d}|d   d }n|d   dz   }|d   d }||fS |d   dz   }||fS )Nr   r   r   ro   )r   r=   )r   r   r"   r#   s       r   r=   zBorder.sizeHint  sj    ~~&&(<D7?AQ!A7?A !t Q!A!tr   c                 b    | j                   j                          t        j                  |        y r   r   r2   r+   r%   s    r   r2   zBorder.filthy      dr   c                    | j                   j                  r|j                  d       t        |d||f       |j                  d       t	        ||dz
  |dz
  dd      }| j                   j                  |dz
  |dz
  |       y )N   [31m)r   r      [0mr   ro   )r   rO   r(   r   r   r4   )r   r   r   r   r   s        r   r9   zBorder.render  so    >>!!NN;'(FUFO4z"%h	6A:q!LEAIvz48r   N)
r   r	   r
   r   rP   rR   rI   r=   r2   r9   r   r   r   r   r     s&    %
.*A9r   r   c                   $    e Zd Zd Zd Zd Zd Zy)Buttonc                 J    t         j                  |        || _        || _        y r   )r+   r   labelonPress)r   r   r   s      r   r   zButton.__init__  s    
r   c                 0    t        | j                        dfS r   )rr   r   r%   s    r   r=   zButton.sizeHint  s    4::!!r   c                 0    |dk(  r| j                          y y N   )r   rF   s      r   rE   zButton.characterReceived	  s    E>LLN r   c                     |j                  dd       | j                  r"|j                  d| j                  z   dz          y |j                  | j                         y )Nr   s   [1mr   )r    rO   r(   r   r5   s       r   r9   zButton.render  sC    1%<<NN:

2Z?@NN4::&r   N)r   r	   r
   r   r=   rE   r9   r   r   r   r   r      s    
"'r   r   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)	TextInputc                 f    t         j                  |        || _        || _        d| _        d| _        y )Nr   r   )r+   r   onSubmitmaxwidthbuffercursor)r   r  r  s      r   r   zTextInput.__init__  s*      r   c                     |d | j                    | _        t        | j                        | _        | j	                          y r   )r  r  rr   r  r0   r   r   s     r   setTextzTextInput.setText  s-    ?T]]+$++&r   c                 n    | j                   dkD  r&| xj                   dz  c_         | j                          y y Nr   ro   )r  r0   rL   s     r   func_LEFT_ARROWzTextInput.func_LEFT_ARROW"  s)    ;;?KK1KLLN r   c                     | j                   t        | j                        k  r&| xj                   dz  c_         | j                          y y r   )r  rr   r  r0   rL   s     r   func_RIGHT_ARROWzTextInput.func_RIGHT_ARROW'  s3    ;;T[[))KK1KLLN *r   c                     | j                   dkD  ra| j                  d | j                   dz
   | j                  | j                   d  z   | _        | xj                   dz  c_         | j                          y y r
  )r  r  r0   r%   s    r   rB   zTextInput.backspaceReceived,  sX    ;;?++&7a84;;t{{};UUDKKK1KLLN r   c                 L   |dk(  r| j                  | j                         y t        | j                        | j                  k  ra| j                  d | j                   |z   | j                  | j                  d  z   | _        | xj                  dz  c_        | j                          y y )Nr   ro   )r  r  rr   r  r  r0   rF   s      r   rE   zTextInput.characterReceived2  s~    E>MM$++&4;;$--/KK$++.6T[[]9SS  q  0r   c                 $    | j                   dz   dfS r   )r  r%   s    r   r=   zTextInput.sizeHint=  s    }}q !##r   c                    | j                         }|j                  dd       | j                  r|j                  |d | j                          t	        ||| j                  | j                  dz    xs d       |j                  || j                  dz   d         |j                  d| j
                  t        |      z
  dz   z         y | j
                  t        |      z
  }|j                  |d|z  z          y )Nr   ro   r      _)_renderTextr    rO   r(   r  r  rr   )r   r   r   r   currentTextmores         r   r9   zTextInput.render@  s    &&(1%<<NN;}568[t{{QGO4PNN;t{{Q'89:NN44==3{3C#Ca#GHI==3{#33DNN;45r   c                     | j                   S r   )r  r%   s    r   r  zTextInput._renderTextL  s    {{r   N)r   r	   r
   r   r  r  r  rB   rE   r=   r9   r  r   r   r   r   r     s/    


	$
6r   r   c                       e Zd Zd Zy)PasswordInputc                 2    dt        | j                        z  S )N*)rr   r  r%   s    r   r  zPasswordInput._renderTextQ  s    S%%%r   N)r   r	   r
   r  r   r   r   r  r  P  s    &r   r  c                   0    e Zd ZdZddZd Zd Zd Zd Zy)	
TextOutputr   Nc                 <    t         j                  |        || _        y r   )r+   r   size)r   r  s     r   r   zTextOutput.__init__X  s    	r   c                     | j                   S r   )r  r%   s    r   r=   zTextOutput.sizeHint\  s    yyr   c                     |j                  dd       | j                  d | }|j                  |d|t        |      z
  z  z          y Nr   r   )r    r   r(   rr   )r   r   r   r   r   s        r   r9   zTextOutput.render_  sA    1%yy% tdec$i&7889r   c                 2    || _         | j                          y r   )r   r0   r  s     r   r  zTextOutput.setTextd  s    	r   c                     t               r   rK   r%   s    r   rP   zTextOutput.focusReceivedh  s
    lr   r   )	r   r	   r
   r   r   r=   r9   r  rP   r   r   r   r  r  U  s     D:
r   r  c                   4    e Zd Z ed      \  ZZdefdZd Zy)TextOutputArear   Nc                 >    t         j                  | |       || _        y r   )r  r   	longLines)r   r  r'  s      r   r   zTextOutputArea.__init__o  s    D$'"r   c                    d}| j                   j                         }g }|r| j                  | j                  k(  r|j	                  d      }t        |t              s|j                  d      }g }t        j                  ||      D ]4  }	t        |	t              s|	j                  d      }	|j                  |	       6 |j                  |xs dg       n#|j                  |j	                  d      d |        t        |      |k\  rn|rt        |d |       D ](  \  }}
|j!                  d|       |j#                  |
       * y )Nr   rU   r   )r   
splitlinesr'  WRAPpoprW   rX   rY   tptext
greedyWrapbytesencoderc   extendrr   r   r    r(   )r   r   r   r   r   
inputLinesoutputLineslinewrappedLineswrappedLineLs              r   r9   zTextOutputArea.renders  s'   YY))+
~~*!~~a(!$,;;w/D!#)#4#4T5#A 5K%k59&1&8&8&A ''45 ""<#8C59"":>>!#4Ve#<=;6)  k'623 	DAq##Aq)NN1	r   )r   r	   r
   r   r*  TRUNCATEr   r9   r   r   r   r%  r%  l  s    1XND( D #r   r%  c                       e Zd ZdZdZed        Zej                  d        Zed        Zej                  d        ZdZ	dZ
d Zd	 Zd
 Zy)Viewportr   c                     | j                   S r   )_xOffsetr%   s    r   xOffsetzViewport.xOffset      }}r   c                 R    | j                   |k7  r|| _         | j                          y y r   )r;  r0   r   r   s     r   r<  zViewport.xOffset  #    ==E!!DMLLN "r   c                     | j                   S r   )_yOffsetr%   s    r   yOffsetzViewport.yOffset  r=  r   c                 R    | j                   |k7  r|| _         | j                          y y r   )rB  r0   r?  s     r   rC  zViewport.yOffset  r@  r         c                 0   t         j                  |        || _        | | j                  _        t	        j
                         | _        | j                  | j                  _        | j                  | j                  _
        | j                  j                          y r   )r+   r   r   r/   r   TerminalBuffer_bufr   r   r   r   connectionMader   s     r   r   zViewport.__init__  s`    " $))+	++		<<				  "r   c                 b    | j                   j                          t        j                  |        y r   r   r%   s    r   r2   zViewport.filthy  r   r   c                    | j                   j                  | j                  | j                  | j                         t        | j                  j                  | j                  | j                  |z          D ]  \  }}|j                  d|       d}t        || j                  | j                  |z          D ]3  \  }\  }}|| j                  j                  u rd}|j                  |       5 ||k  s{|j                  d||z
  dz
  z          y )Nr   r   ro   )r   r4   r   r   rI  r   linesrB  r    r;  voidr(   )	r   r   r   r   r#   r3  r   rl   attrs	            r   r9   zViewport.render  s    DKKtyyA !IIOODMMDMMF,BC
 
	7GAt ##Aq)A!*4PU@U+V!W #:B'Br"# 5ytuqy1}56
	7r   N)r   r	   r
   r;  rB  propertyr<  setterrC  r   r   r   r2   r9   r   r   r   r9  r9    s}    HH  ^^ 
   ^^ 
 FG#7r   r9  c                       e Zd Zd Zd Zd Zy)
_Scrollbarc                 J    t         j                  |        || _        d| _        y )N        )r+   r   onScrollpercent)r   rV  s     r   r   z_Scrollbar.__init__  s     r   c           	      x    t        dt        d| j                  d                  | _        | j	                          y )N      ?rU  r!   r   rV  rW  r0   r%   s    r   smallerz_Scrollbar.smaller  )    3Cr): ;<r   c           	      x    t        dt        d| j                  d                  | _        | j	                          y )NrY  rU  ro   r[  r%   s    r   biggerz_Scrollbar.bigger  r]  r   N)r   r	   r
   r   r\  r_  r   r   r   rS  rS    s    
r   rS  c                   4    e Zd Zd Zd Zd ZdZdZdZdZ	d Z
y	)
HorizontalScrollbarc                      y)Nr   r   r%   s    r   r=   zHorizontalScrollbar.sizeHint      r   c                 $    | j                          y r   r\  rL   s     r   r  z#HorizontalScrollbar.func_LEFT_ARROW      r   c                 $    | j                          y r   r_  rL   s     r   r  z$HorizontalScrollbar.func_RIGHT_ARROW      r   u   ◀u   ▶   ░   ▓c                 8   |j                  dd       |dz
  }t        || j                  z        }||z
  }| j                  | j                  |z  z   | j
                  z   | j                  |z  z   | j                  z   }|j                  |j                  d             y )Nr   r   rU   )	r    r   rW  _left_bar_slider_rightr(   r/  )r   r   r   r   r   beforeaftermes           r   r9   zHorizontalScrollbar.render  s    1%AIQ%&F
JJyy6!#ll yy5 " kk	 	 	ryy)*r   N)r   r	   r
   r=   r  r  rm  rp  rn  ro  r9   r   r   r   ra  ra    s,     /E0FDG+r   ra  c                   4    e Zd Zd Zd Zd ZdZdZdZdZ	d Z
y	)
VerticalScrollbarc                      y)N)ro   Nr   r%   s    r   r=   zVerticalScrollbar.sizeHint  rc  r   c                 $    | j                          y r   re  rL   s     r   func_UP_ARROWzVerticalScrollbar.func_UP_ARROW  rf  r   c                 $    | j                          y r   rh  rL   s     r   func_DOWN_ARROWz!VerticalScrollbar.func_DOWN_ARROW  ri  r   u   ▲u   ▼rj  rk  c                 6   |j                  dd       t        | j                  |dz
  z        }|j                  | j                  j                  d             t        d|dz
        D ]q  }|j                  d|       ||dz   k7  r+|j                  | j                  j                  d             H|j                  | j                  j                  d             s |j                  d|dz
         |j                  | j                  j                  d             y )Nr   r   rU   ro   )
r    r   rW  r(   _upr/  r   rn  ro  _down)r   r   r   r   knobr   s         r   r9   zVerticalScrollbar.render  s    1%4<<6A:./txxw/0q&1*% 	=A##Aq)TAXtyy//89t||227;<	= 	6A:.tzz((12r   N)r   r	   r
   r=   rx  rz  r|  r}  rn  ro  r9   r   r   r   ru  ru    s,     +C.EDG3r   ru  c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)ScrolledAreaz
    A L{ScrolledArea} contains another widget wrapped in a viewport and
    vertical and horizontal scrollbars for moving the viewport around.
    c                    t         j                  |        t        |      | _        t	        | j
                        | _        t        | j                        | _	        | j                  | j                  | j                  fD ]	  }| |_
         y r   )r+   r   r9  	_viewportra  _horizScroll_horizru  _vertScroll_vertr/   )r   r   r   s      r   r   zScrolledArea.__init__  sg    !),)$*;*;<&t'7'78
djj8 	AAH	r   c                     | j                   xj                  |z  c_        t        d| j                   j                        | j                   _        | j                   j                  dz  S Nr   g      9@)r  r<  r   r   r   s     r   r  zScrolledArea._horizScroll  I    !#!$Q(>(>!?~~%%,,r   c                     | j                   xj                  |z  c_        t        d| j                   j                        | j                   _        | j                   j                  dz  S r  )r  rC  r   r  s     r   r  zScrolledArea._vertScroll#  r  r   c                 8    | j                   j                          y r   )r  r\  rL   s     r   rx  zScrolledArea.func_UP_ARROW(  s    

r   c                 8    | j                   j                          y r   )r  r_  rL   s     r   rz  zScrolledArea.func_DOWN_ARROW+  s    

r   c                 8    | j                   j                          y r   )r  r\  rL   s     r   r  zScrolledArea.func_LEFT_ARROW.  s    r   c                 8    | j                   j                          y r   )r  r_  rL   s     r   r  zScrolledArea.func_RIGHT_ARROW1  s    r   c                     | j                   j                          | j                  j                          | j                  j                          t        j                  |        y r   )r  r2   r  r  r+   r%   s    r   r2   zScrolledArea.filthy4  s>    

dr   c                    t        ||dz
  |dz
  dd      }| j                  j                  |dz
  |dz
  |       | j                  r|j	                  d       t        |dd|dz
         t        |dd|dz
         | j                  j                  d|dz
  t        |d|dz
  |dz
  d             | j                  j                  |dt        ||dd|dz
               |j	                  d       y )Nr   ro   r   r   r   )	r   r  r4   rO   r(   r   r   r  r  )r   r   r   r   wrappers        r   r9   zScrolledArea.render:  s    (519fqj!QOEAIvz7;<<NN;'xAuqy1Xq!VaZ0

vz1(Avz5ST9VWX	
 	1,XuaFQJO	
 	z"r   N)r   r	   r
   r   r   r  r  rx  rz  r  r  r2   r9   r   r   r   r  r    s4    
-
-
#r   r  c                     | j                          | j                  t        t        j                               | j                  |       | j                          | j                          y r   )r   r   rX   r   REVERSE_VIDEOr(   r   r   )r   rl   s     r   r  r  J  sK    ##C(=(=$>?NN2r   c                   F    e Zd ZdZdZddZd Zd Zd Zd Z	d Z
d	 Zd
 Zy)	Selectionr   Nc                     t         j                  |        || _        || _        || _        |)t        t        t        | j                              | _        y y r   )	r+   r   sequenceonSelect
minVisibler   r   rr   r   )r   r  r  r  s       r   r   zSelection.__init__Y  sE      $!c#t}}56DK "r   c                 L    | j                   | j                  | j                   fS y r   )r  r   r%   s    r   r=   zSelection.sizeHinta  s$    ??&;;// 'r   c                     | j                   dkD  rJ| xj                   dz  c_         | j                  dkD  r| xj                  dz  c_        | j                          y y r
  )focusedIndexrenderOffsetr0   rL   s     r   rx  zSelection.func_UP_ARROWe  sN    q "  1$!!Q&!LLN	 !r   c                     | j                   dk7  r'| xj                  | j                   z  c_        d| _         n(t        d| j                  | j                  z
        | _        | j	                          y r   )r  r  r   r   r0   rL   s     r   	func_PGUPzSelection.func_PGUPl  sV    !!2!22 !D #At'8'84;;'F GDr   c                     | j                   t        | j                        dz
  k  rW| xj                   dz  c_         | j                  | j                  dz
  k  r| xj                  dz  c_        | j                          y y r   )r  rr   r  r  r   r0   rL   s     r   rz  zSelection.func_DOWN_ARROWt  sd    s4==1A55"  4;;?2!!Q&!LLN	 6r   c                    | j                   | j                  dz
  k7  r| j                  | j                   z
  dz
  }|| j                  z   t        | j                        k\  r%t        | j                        | j                  z
  dz
  }| xj                  |z  c_        | j                  dz
  | _         n>t        t        | j                        dz
  | j                  | j                  z         | _        | j                          y r   )r  r   r  rr   r  r!   r0   )r   rH   changes      r   	func_PGDNzSelection.func_PGDN{  s    a/[[4#4#44q8F)))S-??T]]+d.?.??!C' $aD #DMM"Q&(9(9DKK(G!D 	r   c                 `    |dk(  r)| j                  | j                  | j                            y y r   )r  r  r  rF   s      r   rE   zSelection.characterReceived  s)    E>MM$--(9(9:; r   c           	         || _         | j                  | j                  z
  }|t        | j                        |z
  kD  r"t        dt        | j                        |z
        }| j                  |||z    }t        |      D ]  \  }}|j                  d|       || j                  k(  rx|j                          | j                  r3t        t        j                        t        t        j                        f}nt        t        j                        f} |j                  |  |d | }	|j                  |	d|t        |	      z
  z  z          || j                  k(  s|j!                           y r!  )r   r  r  rr   r  r   r   r    r   rO   rX   r   r  BOLDr   r(   r   )
r   r   r   r   startelementsr   elemodesr   s
             r   r9   zSelection.render  s1   !!D$5$553t}}%..3t}}-67E==8) 	)FAs##Aq)D%%%##%<< 5 56GLL8IIE !6!679E///7v;DNN4453t9+<#=>?D%%%&&(	)r   r   )r   r	   r
   r  r  r   r=   rx  r  rz  r  rE   r9   r   r   r   r  r  R  s6    L L70<)r   r  )$r   r   twisted.conch.insultsr   r   twisted.pythonr   r,  	Exceptionr   r   r+   r_   rx   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r%  r9  rS  ra  ru  r  r  r  r   r   r   <module>r     sJ    1 ) ) )2G GTM<f M<`7 7t)/ )N%? N%b4 4 *_ *.!V .!b;;;<'9V '9T'V '*8 8v&I &
 .Z >77v 77t +* +<3
 3:8#6 8#vN) N)r   