
    Vhl                    F   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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/ d0e       Z! G d1 d2e       Z" G d3 d4e      Z#d5 Z$ G d6 d7e      Z%y)8z<
Simple insults-based widget library

@author: Jp Calderone
    )annotationsN)helperinsults)textc                      e Zd ZdZy)
YieldFocusz,
    Input focus manipulation exception
    N)__name__
__module____qualname____doc__     L/home/dcms/DCMS/lib/python3.12/site-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                      e Zd ZU dZdZdZdZded<   dZded<   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)WidgetFNz
int | Noner   r   c                    | j                   sd| _         | j                  2| j                  j                   s| j                  j                          y y y NT)dirtyparentrepaintr&   s    r   r1   zWidget.repaint7   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   )r3   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/   renderr6   s       r   r5   zWidget.drawD   sJ    DJJ&DKK"74::DJ DKDJKKvx0	 <Fr   c                     y r   r   r6   s       r   r:   zWidget.renderK       r   c                     y r   r   r&   s    r   sizeHintzWidget.sizeHintN   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.keystrokeReceivedQ   sY    E>X&g""$g+++$$UH5""5(3r   c                    t               r   r   r   rI   s     r   rB   zWidget.tabReceived[   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focusedr1   r&   s    r   focusReceivedzWidget.focusReceived_   s     r   c                2    d| _         | j                          y r9   rO   r&   s    r   	focusLostzWidget.focusLosth   s    r   c                     y r   r   r&   s    r   rC   zWidget.backspaceReceivedl   r<   r   c                    |}t        |t              s|j                  d      }d|dd z   }t        | |d       }|	 ||       y y )Nutf-8func_   )
isinstancestrdecodegetattr)r   rH   rI   name
methodNamefuncs         r   rE   zWidget.functionKeyReceivedo   sQ    %%;;w'D tAbz)
tZ.N r   c                     y r   r   rG   s      r   rF   zWidget.characterReceived|   r<   r   )r	   r
   r   rP   r0   r/   r   __annotations__r   r1   r3   r7   r5   r:   r>   rJ   rB   rQ   rS   rC   rE   rF   r   r   r   r,   r,   0   sf    GFEE:FJ"+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   )r0   rf   appendfocusedChildrP   rQ   r   r1   r   childs     r   addChildzContainerWidget.addChild   su    ||###U#$*##% %*!	  s   
A2 2	A>=A>c                    |j                   | u sJ d |_         | j                  j                  |       | j                          y r   )r0   rf   remover1   rj   s     r   remChildzContainerWidget.remChild   s6    ||t###U#r   c                p    | j                   D ]  }|j                           t        j                  |        y r   )rf   r3   r,   )r   chs     r   r3   zContainerWidget.filthy   s*    -- 	BIIK	dr   c                L    | j                   D ]  }|j                  |||        y r   )rf   r5   )r   r   r   r   rq   s        r   r:   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)NrX   r   )	r1   ri   rS   rf   index
ValueErrorr   lenrQ   )r   ri   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.   )rx   rP   r&   s    r   rQ   zContainerWidget.focusReceived   s    r   c                    | j                   	 | j                   j                  ||       y t
        j                  | ||       y # t        $ r# | j                          | j	                          Y y w xY wr   )ri   rJ   r   rx   r1   r,   rG   s      r   rJ   z!ContainerWidget.keystrokeReceived   sc    (!!33E8D
 $$T5(;	    "s   A )A/.A/)r	   r
   r   r   ri   rP   r   rl   ro   r3   r:   rx   rQ   rJ   r   r   r   rd   rd      s;    
 LG
-0<r   rd   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   )rd   r   painter	scheduler)r   r~   r   s      r   r   zTopWindow.__init__   s      &"r   Nc                    | j                   *t               | _         | j                  | j                         t        j                  |        y r   )
_paintCallobjectr   _paintrd   r1   r&   s    r   r1   zTopWindow.repaint   s3    ??"$hDONN4;;'%r   c                2    d | _         | j                          y r   )r   r~   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   )rd   rx   r   r&   s    r   rx   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   )rd   rJ   r   rx   rG   s      r   rJ   zTopWindow.keystrokeReceived  s4    	--dE8D 		s    66)r	   r
   r   r   rP   r   r   r1   r   rx   rJ   r   r   r   r|   r|      s.    , G#
 J&r   r|   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)rangerv   rf   ru   )r   rk   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   )rf   r   r5   )r   r   r   r   rq   r#   r$   wraps           r   r:   zAbsoluteBox.render  sE     	)HB1)(EAIvz1aPDGGE64(	)r   N)r	   r
   r   r   r:   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   )rd   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   NNrX   )rf   r>   variableDimensionmax)r   r   r   rq   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   rX   c              3  &   K   | ]	  }||  y wr   r   ).0ws     r   	<genexpr>z_Box.render.<locals>.<genexpr>L  s     :aAM:s   )	rf   r>   r   rh   sumintzipr   r5   )r   r   r   r   greedywantsrq   r   length	totalWantleftForGreedywidthOffsetheightOffsetwantsubWidth	subHeightr   s                    r   r:   z_Box.render=  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>   r:   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   j      r   r   c                      e Zd ZdZy)VBoxrX   Nr   r   r   r   r   r   n  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      ?)
rf   r   rv   r   r   	enumeraterl   r   mapr:   )	r   r   r   r   rootr   boxesrq   hs	            r   r:   zPacker.renders  s    }}3t}}%,s23!&t-A--t}}- 	/EAr!c%j.!**2.	/FAJJ	) .s   CN)r	   r
   r   r:   r   r   r   r   r   r  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 NrX   )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    rX   )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   rt   r#   r$   s       r   __getitem__zCanvas.__getitem__  s'    A}}dkkAo233r   c                L    |\  }}|| j                   | j                  |z  |z   <   y r   r   )r   rt   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   rv   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   r:   zCanvas.render  s    FDKK6T\\#9KKv&v 	!A##Aq)==a$++/DKK"?gi  <DNN4 	!r   )r	   r
   r   rP   r   r   r   r   r   r   r:   r   r   r   r   r     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         krX   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   	containeer0   r   r   s     r   r   zBorder.__init__  s!    " $r   c                6    | j                   j                         S r   )r   rQ   r&   s    r   rQ   zBorder.focusReceived  s    ~~++--r   c                6    | j                   j                         S r   )r   rS   r&   s    r   rS   zBorder.focusLost  s    ~~''))r   c                :    | j                   j                  ||      S r   )r   rJ   rG   s      r   rJ   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   rX   )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   r3   r,   r&   s    r   r3   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   rX   )r   rP   r)   r   r   r5   )r   r   r   r   r   s        r   r:   zBorder.render  so    >>!!NN;'(FUFO4z"%h	6A:q!LEAIvz48r   N)
r	   r
   r   r   rQ   rS   rJ   r>   r3   r:   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   )rv   r   r&   s    r   r>   zButton.sizeHint  s    4::!!r   c                0    |dk(  r| j                          y y N   )r   rG   s      r   rF   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!   rP   r)   r   r6   s       r   r:   zButton.render  sC    1%<<NN:

2Z?@NN4::&r   N)r	   r
   r   r   r>   rF   r:   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  rv   r	  r1   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   rX   )r	  r1   rM   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	  rv   r  r1   rM   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  r1   r&   s    r   rC   zTextInput.backspaceReceived4  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  rX   )r  r  rv   r  r	  r1   rG   s      r   rF   zTextInput.characterReceived:  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.sizeHintE  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   rX   r      _)_renderTextr!   rP   r)   r	  r  rv   )r   r   r   r   currentTextmores         r   r:   zTextInput.renderH  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._renderTextT  s    {{r   N)r	   r
   r   r   r  r  r  rC   rF   r>   r:   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*)rv   r  r&   s    r   r  zPasswordInput._renderTextY  s    S%%%r   N)r	   r
   r   r  r   r   r   r  r  X  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__`  s    	r   c                    | j                   S r   )r"  r&   s    r   r>   zTextOutput.sizeHintd  s    yyr   c                    |j                  dd       | j                  d | }|j                  |d|t        |      z
  z  z          y Nr   r   )r!   r   r)   rv   )r   r   r   r   r   s        r   r:   zTextOutput.renderg  sA    1%yy% tdec$i&7889r   c                2    || _         | j                          y r   )r   r1   r  s     r   r  zTextOutput.setTextl  s    	r   c                    t               r   rL   r&   s    r   rQ   zTextOutput.focusReceivedp  s
    lr   r   )	r	   r
   r   r   r   r>   r:   r  rQ   r   r   r   r   r   ]  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__w  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   rV   r   )r   
splitlinesr+  WRAPpoprZ   r[   r\   tptext
greedyWrapbytesencoderh   extendrv   r   r!   r)   )r   r   r   r   r   
inputLinesoutputLineslinewrappedLineswrappedLineLs              r   r:   zTextOutputArea.render{  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   r:   r   r   r   r)  r)  t  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?  r1   r   r   s     r   r@  zViewport.xOffset  #    ==E!!DMLLN "r   c                    | j                   S r   )_yOffsetr&   s    r   yOffsetzViewport.yOffset  rA  r   c                R    | j                   |k7  r|| _         | j                          y y r   )rF  r1   rC  s     r   rG  zViewport.yOffset  rD  r         c                0   t         j                  |        || _        | | j                  _        t	        j
                         | _        | j                  | j                  _        | j                  | j                  _
        | j                  j                          y r   )r,   r   r   r0   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   r3   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   rX   )r   r5   r   r   rM  r   linesrF  r!   r?  voidr)   )	r   r   r   r   r$   r7  r   rq   attrs	            r   r:   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?  rF  propertyr@  setterrG  r   r   r   r3   r:   r   r   r   r=  r=    s}    HH  ^^ 
   ^^ 
 FG#7r   r=  c                      e Zd Zd Zd Zd Zy)
_Scrollbarc                J    t         j                  |        || _        d| _        y )N        )r,   r   onScrollpercent)r   rZ  s     r   r   z_Scrollbar.__init__  s     r   c           	     x    t        dt        d| j                  d                  | _        | j	                          y )N      ?rY  rY   r"   r   rZ  r[  r1   r&   s    r   smallerz_Scrollbar.smaller  )    3Cr): ;<r   c           	     x    t        dt        d| j                  d                  | _        | j	                          y )Nr]  rY  rX   r^  r&   s    r   biggerz_Scrollbar.bigger  r`  r   N)r	   r
   r   r   r_  rb  r   r   r   rW  rW    s    
r   rW  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_  rM   s     r   r  z#HorizontalScrollbar.func_LEFT_ARROW      r   c                $    | j                          y r   rb  rM   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   rV   )	r!   r   r[  _left_bar_slider_rightr)   r3  )r   r   r   r   r   beforeaftermes           r   r:   zHorizontalScrollbar.render  s    1%AIQ%&F
JJyy6!#ll yy5 " kk	 	 	ryy)*r   N)r	   r
   r   r>   r  r  rp  rs  rq  rr  r:   r   r   r   rd  rd    s,     /E0FDG+r   rd  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)rX   Nr   r&   s    r   r>   zVerticalScrollbar.sizeHint  rf  r   c                $    | j                          y r   rh  rM   s     r   func_UP_ARROWzVerticalScrollbar.func_UP_ARROW  ri  r   c                $    | j                          y r   rk  rM   s     r   func_DOWN_ARROWz!VerticalScrollbar.func_DOWN_ARROW  rl  r   u   ▲u   ▼rm  rn  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   rV   rX   )
r!   r   r[  r)   _upr3  r   rq  rr  _down)r   r   r   r   knobr   s         r   r:   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>   r{  r}  r  r  rq  rr  r:   r   r   r   rx  rx    s,     +C.EDG3r   rx  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   r=  	_viewportrd  _horizScroll_horizrx  _vertScroll_vertr0   )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  rG  r   r  s     r   r  zScrolledArea._vertScroll+  r  r   c                8    | j                   j                          y r   )r  r_  rM   s     r   r{  zScrolledArea.func_UP_ARROW0  s    

r   c                8    | j                   j                          y r   )r  rb  rM   s     r   r}  zScrolledArea.func_DOWN_ARROW3  s    

r   c                8    | j                   j                          y r   )r  r_  rM   s     r   r  zScrolledArea.func_LEFT_ARROW6  s    r   c                8    | j                   j                          y r   )r  rb  rM   s     r   r  zScrolledArea.func_RIGHT_ARROW9  s    r   c                    | j                   j                          | j                  j                          | j                  j                          t        j                  |        y r   )r  r3   r  r  r,   r&   s    r   r3   zScrolledArea.filthy<  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   rX   r   r   r   )	r   r  r5   rP   r)   r   r   r  r  )r   r   r   r   wrappers        r   r:   zScrolledArea.renderB  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  r{  r}  r  r  r3   r:   r   r   r   r  r    s4    
-
-
#r   r  c                    | j                          | j                  t        t        j                               | j                  |       | j                          | j                          y r   )r   r   r[   r   REVERSE_VIDEOr)   r   r   )r   rq   s     r   r	  r	  R  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   rv   r   )r   r  r  r  s       r   r   zSelection.__init__a  sE      $!c#t}}56DK "r   c                L    | j                   | j                  | j                   fS y r   )r  r   r&   s    r   r>   zSelection.sizeHinti  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renderOffsetr1   rM   s     r   r{  zSelection.func_UP_ARROWm  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   r1   rM   s     r   	func_PGUPzSelection.func_PGUPt  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  rv   r  r  r   r1   rM   s     r   r}  zSelection.func_DOWN_ARROW|  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  rv   r  r"   r1   )r   rI   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  rG   s      r   rF   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  rv   r  r   r   r!   r   rP   r[   r   r  BOLDr   r)   r   )
r   r   r   r   startelementsr   elemodesr   s
             r   r:   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>   r{  r  r}  r  rF   r:   r   r   r   r  r  Z  s6    L L70<)r   r  )&r   
__future__r   r   twisted.conch.insultsr   r   twisted.pythonr   r0  	Exceptionr   r   r,   rd   r|   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r)  r=  rW  rd  rx  r  r	  r  r   r   r   <module>r     sM   #  1 ) ) )2M M`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   