ó
±xYc           @  ss  d  d l  m Z d  d l m Z m Z d  d l m Z m Z m Z m	 Z	 d  d l
 m Z d  d l m Z d  d l m Z d d l m Z m Z m Z m Z d d	 l m Z m Z d d
 l m Z d d l m Z d d l m Z m Z d  d l Z d Z  d e f d „  ƒ  YZ! d „  Z" d e f d „  ƒ  YZ# d e f d „  ƒ  YZ$ d e f d „  ƒ  YZ% d e f d „  ƒ  YZ& d S(   iÿÿÿÿ(   t   unicode_literals(   t   zip_longestt   range(   t   HasCompletionst   IsDonet	   Conditiont   to_cli_filter(   t   MouseEventType(   t   Token(   t
   get_cwidthi   (   t   Windowt   HSplitt   ConditionalContainert   ScrollOffsets(   t	   UIControlt	   UIContent(   t   LayoutDimension(   t   ScrollbarMargin(   t   Pointt   CharNu   CompletionsMenuu   MultiColumnCompletionsMenut   CompletionsMenuControlc           B  sw   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 d „  Z RS(   uJ  
    Helper for drawing the complete menu to the screen.

    :param scroll_offset: Number (integer) representing the preferred amount of
        completions to be displayed before and after the current one. When this
        is a very high number, the current completion will be shown in the
        middle most of the time.
    i   c         C  s   t  j j |  _ d  S(   N(   R   t   Menut   Completionst   token(   t   self(    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt   __init__%   s    c         C  s   t  S(   N(   t   False(   R   t   cli(    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt	   has_focus(   s    c         C  sF   | j  j } | r> |  j d | ƒ } |  j d | ƒ } | | Sd Sd  S(   Niô  i    (   t   current_buffert   complete_statet   _get_menu_widtht   _get_menu_meta_width(   R   R   t   max_available_widthR   t
   menu_widtht   menu_meta_width(    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt   preferred_width+   s    c         C  s'   | j  j } | r t | j ƒ Sd Sd  S(   Ni    (   R   R   t   lent   current_completions(   R   R   t   widtht   max_available_heightt
   wrap_linesR   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt   preferred_height5   s    c           sÆ   | j  j } | r¿ | j ‰  | j ‰ ˆ j | | ƒ ‰ ˆ j | ˆ | ƒ ‰ ˆ j | ƒ ‰ ‡  ‡ ‡ ‡ ‡ ‡ f d †  } t d | d t d d d ˆ pš d ƒ d t	 ˆ  ƒ d t
 d	 ˆ j ƒ ƒ St ƒ  S(
   u=   
        Create a UIContent object for this control.
        c           sQ   ˆ  |  } |  ˆ k } ˆ j  | | ˆ ƒ } ˆ rM | ˆ j | | ˆ ƒ 7} n  | S(   N(   t   _get_menu_item_tokenst   _get_menu_item_meta_tokens(   t   it   ct   is_current_completiont   result(   t   completionst   indexR#   R"   R   t	   show_meta(    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt   get_lineJ   s    
R4   t   cursor_positiont   xi    t   yt
   line_countt   default_charu    (   R   R   R&   t   complete_indexR   R    t
   _show_metaR   R   R%   R   R   (   R   R   R'   t   heightR   R4   (    (   R1   R2   R#   R"   R   R3   s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt   create_content<   s    			c         C  s   t  d „  | j Dƒ ƒ S(   uT   
        Return ``True`` if we need to show a column with meta information.
        c         s  s   |  ] } | j  Vq d  S(   N(   t   display_meta(   t   .0R.   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pys	   <genexpr>^   s    (   t   anyR&   (   R   R   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR;   Z   s    c         C  s0   t  | t |  j t d „  | j Dƒ ƒ d ƒ ƒ S(   u6   
        Return the width of the main column.
        c         s  s   |  ] } t  | j ƒ Vq d  S(   N(   R	   t   display(   R?   R.   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pys	   <genexpr>d   s   i   (   t   mint   maxt	   MIN_WIDTHR&   (   R   t	   max_widthR   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR   `   s    c         C  s;   |  j  | ƒ r3 t | t d „  | j Dƒ ƒ d ƒ Sd Sd S(   u6   
        Return the width of the meta column.
        c         s  s   |  ] } t  | j ƒ Vq d  S(   N(   R	   R>   (   R?   R.   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pys	   <genexpr>l   s   i   i    N(   R;   RB   RC   R&   (   R   RE   R   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR    g   s    c         C  si   | r |  j  j j } n |  j  j } t | j | d ƒ \ } } d | d | } | d | | f f g S(   Ni   u    u    %s%s (   R   t
   Completiont   Currentt
   _trim_textRA   (   R   t
   completionR/   R'   R   t   textt   twt   padding(    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR+   q   s    c         C  si   | r |  j  j j } n |  j  j } t | j | d ƒ \ } } d | d | } | d | | f f g S(   Ni   u    u    %s%s (   R   t   MetaRG   RH   R>   (   R   RI   R/   R'   R   RJ   RK   RL   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR,   {   s    c         C  s”   | j  } | j t j k r: | j | j j ƒ d | _ nV | j t j	 k re | j
 d d d t ƒ n+ | j t j k r | j d d d t ƒ n  d S(   u>   
        Handle mouse events: clicking and scrolling.
        t   counti   t   disable_wrap_aroundN(   R   t
   event_typeR   t   MOUSE_UPt   go_to_completiont   positionR7   t   NoneR   t   SCROLL_DOWNt   complete_nextt   Truet	   SCROLL_UPt   complete_previous(   R   R   t   mouse_eventt   b(    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt   mouse_handler…   s    	(   t   __name__t
   __module__t   __doc__RD   R   R   R$   R*   R=   R;   R   R    R+   R,   R\   (    (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR      s   			
					
	
	
c         C  sÂ   t  |  ƒ } | | k r´ t |  ƒ | k rY |  t d | d ƒ  d |  } | t | ƒ f Sd } x5 |  D]- } t  | | ƒ | d k rf | | 7} qf qf W| d 7} | t  | ƒ f Sn
 |  | f Sd S(   uo   
    Trim the text to `max_width`, append dots when the text is too long.
    Returns (text, width) tuple.
    i   i   u   ...u    N(   R	   R%   RC   (   RJ   RE   R'   t   trimmed_textR.   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyRH   ™   s    
t   CompletionsMenuc           B  s   e  Z d d  e e d „ Z RS(   i    c         C  s§   t  | ƒ } t  | ƒ } t t |  ƒ j d t d t ƒ  d t d d ƒ d t d d d | ƒ d t d	 | d
 | ƒ d t d | ƒ g d t	 ƒ d t
 ƒ  t ƒ  @| @ƒ d  S(   Nt   contentR'   RB   i   R<   i   RC   t   scroll_offsetst   topt   bottomt   right_marginst   display_arrowst   dont_extend_widtht   filter(   R   t   superRa   R   R
   R   R   R   R   RW   R   R   (   R   t
   max_heightt   scroll_offsett   extra_filterRg   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR   ¶   s    		N(   R]   R^   RT   RW   R   R   (    (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyRa   µ   s   t    MultiColumnCompletionMenuControlc           B  sk   e  Z d  Z d Z d d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d	 „  Z
 d
 „  Z d „  Z RS(   u†  
    Completion menu that displays all the completions in several columns.
    When there are more completions than space for them to be displayed, an
    arrow is shown on the left or right side.

    `min_rows` indicates how many rows will be available in any possible case.
    When this is langer than one, in will try to use less columns and more
    rows until this value is reached.
    Be careful passing in a too big value, if less than the given amount of
    rows are available, more columns would have been required, but
    `preferred_width` doesn't know about that and reports a too small value.
    This results in less completions displayed and additional scrolling.
    (It's a limitation of how the layout engine currently works: first the
    widths are calculated, then the heights.)

    :param suggested_max_column_width: The suggested max width of a column.
        The column can still be bigger than this, but if there is place for two
        columns of this width, we will display two columns. This to avoid that
        if there is one very wide completion, that it doesn't significantly
        reduce the amount of columns.
    i   i   c         C  sŽ   t  | t ƒ r | d k s! t ‚ | |  _ | |  _ t j j |  _ d |  _	 d |  _
 d |  _ d |  _ i  |  _ t |  _ t |  _ d |  _ d  S(   Ni   i    (   t
   isinstancet   intt   AssertionErrort   min_rowst   suggested_max_column_widthR   R   R   R   t   scrollt   _rendered_rowst   _rendered_columnst   _total_columnst   _render_pos_to_completionR   t   _render_left_arrowt   _render_right_arrowt   _render_width(   R   Rr   Rs   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR   à   s    !									c         C  s   d |  _  d  S(   Ni    (   Rt   (   R   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt   resetñ   s    c         C  s   t  S(   N(   R   (   R   R   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR   ô   s    c         C  s…   | j  j } |  j | ƒ } t | t j t | j ƒ t |  j	 ƒ ƒ ƒ } x- | | k ry | | |  j
 k ry | | 8} qM W| |  j
 S(   u{   
        Preferred width: prefer to use at least min_rows, but otherwise as much
        as possible horizontally.
        (   R   R   t   _get_column_widthRp   t   matht   ceilR%   R&   t   floatRr   t   _required_margin(   R   R   R!   R   t   column_widthR0   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR$   ÷   s    /"c         C  s[   | j  j } |  j | ƒ } t d | |  j | ƒ } t t j t | j	 ƒ t
 | ƒ ƒ ƒ S(   u^   
        Preferred height: as much as needed in order to display all the completions.
        i   (   R   R   R}   RC   R   Rp   R~   R   R%   R&   R€   (   R   R   R'   R(   R)   R   R‚   t   column_count(    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR*     s    c           s
  | j  j ‰ |  j ˆ ƒ } i  |  _ d d „ } ‡  ‡ f d †  } d } ˆ rt | | | ƒ } | |  j k r„ | | |  j } n  t d | |  j | ƒ } t	 | | ˆ j
 ƒ ƒ }	 t	 t |	 Œ  ƒ }
 ˆ j pÔ d | } t | t |  j | | d ƒ ƒ |  _ |  j d k } |  j t |
 d ƒ | k  } g  ‰ x`t |
 ƒ D]I\ } } g  } | t |
 ƒ d k } | r“| t j | rƒd n d f g 7} n  x¢ t | |  j |  ƒ D]‰ \ } ‰  ˆ  d k	 r| |  j ˆ  | ˆ  ƒ | ƒ 7} xO t | ƒ D]! } ˆ  |  j | | | | f <qïWq«| |  j j d | f g 7} q«W| |  j j d f g 7} | r|| t j | rld	 n d f g 7} n  ˆ j | ƒ q@Wn g  } | |  _ | |  _ t |	 ƒ |  _ | |  _ | |  _ | | | | d |  _ ‡ f d
 †  } t d | d t |
 ƒ ƒ S(   u:   
        Create a UIContent object for this menu.
        c         S  s#   t  | ƒ g |  } t d | | Œ S(   u,    grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx t	   fillvalue(   t   iterR   (   t   nt   iterableR„   t   args(    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt   grouper  s    c           s   ˆ j  d k	 o ˆ  ˆ j k S(   uB    Returns True when this completion is the currently selected one. N(   R:   RT   t   current_completion(   RI   (   R.   R   (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR/     s    i   i   i    i   u   <u    u   >c           s   ˆ  |  S(   N(    (   R-   (   t   tokens_for_line(    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR4   h  s    R4   R8   N(   R   R   R}   Rx   RT   RB   Rs   RC   R   t   listR&   t   zipR:   Rt   R%   t	   enumerateR   t	   ScrollbarR+   R   R   RF   t   appendRu   Rv   Rw   Ry   Rz   R{   R   (   R   R   R'   R<   R‚   R‰   R/   t   HORIZONTAL_MARGIN_REQUIREDt   visible_columnst   columns_t   rows_t   selected_columnt   render_left_arrowt   render_right_arrowt	   row_indext   rowt   tokenst
   middle_rowt   column_indexR6   R4   (    (   R.   R   R‹   s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR=     sT    	&%$"!%				c         C  s   t  d „  | j Dƒ ƒ d S(   u2   
        Return the width of each column.
        c         s  s   |  ] } t  | j ƒ Vq d  S(   N(   R	   RA   (   R?   R.   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pys	   <genexpr>q  s    i   (   RC   R&   (   R   R   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR}   m  s    c         C  se   | r |  j  j j } n |  j  j } t | j | ƒ \ } } d | | d } | d | | f f g S(   Nu    i   u    %s%s(   R   RF   RG   RH   RA   (   R   RI   R/   R'   R   RJ   RK   RL   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR+   s  s    c           s  | j  ‰  ‡  ‡ f d †  } ‡  ‡ f d †  } | j t j k rI | ƒ  nÂ | j t j k re | ƒ  n¦ | j t j k r| j j } | j j } | d k r± ˆ j	 r| ƒ  qq| ˆ j
 d k rÚ ˆ j r| ƒ  qqˆ j j | | f ƒ } | rˆ  j | ƒ qn  d S(   u0   
        Handle scoll and click events.
        c             s6   ˆ  j  d ˆ j d t ƒ t d ˆ j d ƒ ˆ _ d  S(   NRN   RO   i    i   (   RY   Ru   RW   RC   Rt   (    (   R[   R   (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt   scroll_left„  s    c             s@   ˆ  j  d ˆ j d t ƒ t ˆ j ˆ j ˆ j d ƒ ˆ _ d  S(   NRN   RO   i   (   RV   Ru   RW   RB   Rw   Rv   Rt   (    (   R[   R   (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt   scroll_rightˆ  s    i    i   N(   R   RP   R   RU   RX   RQ   RS   R6   R7   Ry   R{   Rz   Rx   t   gett   apply_completion(   R   R   RZ   R   Rž   R6   R7   RI   (    (   R[   R   s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR\   ~  s&    	

		(   R]   R^   R_   R   R   R|   R   R$   R*   R=   R}   R+   R\   (    (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyRn   È   s   				
	\		t   MultiColumnCompletionsMenuc           B  s#   e  Z d  Z d d e e d „ Z RS(   uÍ   
    Container that displays the completions in several columns.
    When `show_meta` (a :class:`~prompt_toolkit.filters.CLIFilter`) evaluates
    to True, it shows the meta information at the bottom.
    i   i   c   	      C  sÐ   t  | ƒ } t  | ƒ } t ƒ  t ƒ  @| @} t d „  ƒ } t d t d t d | d | ƒ d t d d ƒ d t d d	 ƒ ƒ d
 | ƒ } t d t d t ƒ  ƒ d
 | | @| @ƒ } t	 t
 |  ƒ j | | g ƒ d  S(   Nc         S  s   t  d „  |  j j j Dƒ ƒ S(   Nc         s  s   |  ] } | j  Vq d  S(   N(   R>   (   R?   R.   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pys	   <genexpr>¶  s    (   R@   R   R   R&   (   R   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt   <lambda>µ  s    Rb   Rr   Rs   R'   RB   i   R<   i   Ri   (   R   R   R   R   R   R
   Rn   R   t   _SelectedCompletionMetaControlRj   R¡   R   (	   R   Rr   Rs   R3   Rm   t   full_filtert   any_completion_has_metat   completions_windowt   meta_window(    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR   ­  s"    	(   R]   R^   R_   RW   R   (    (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR¡   §  s   R£   c           B  s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   uH   
    Control that shows the meta information of the selected token.
    c         C  s;   | j  j r3 | j  j } d t d „  | j Dƒ ƒ Sd Sd S(   u?  
        Report the width of the longest meta text as the preferred width of this control.

        It could be that we use less width, but this way, we're sure that the
        layout doesn't change when we select another completion (E.g. that
        completions are suddenly shown in more or fewer columns.)
        i   c         s  s   |  ] } t  | j ƒ Vq d  S(   N(   R	   R>   (   R?   R.   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pys	   <genexpr>Ú  s    i    N(   R   R   RC   R&   (   R   R   R!   t   state(    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR$   Ð  s    c         C  s   d S(   Ni   (    (   R   R   R'   R(   R)   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR*   Þ  s    c           s=   |  j  | ƒ ‰  ‡  f d †  } t d | d ˆ  r6 d n d ƒ S(   Nc           s   ˆ  S(   N(    (   R-   (   Rš   (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR4   ä  s    R4   R8   i   i    (   t   _get_tokensR   (   R   R   R'   R<   R4   (    (   Rš   s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR=   á  s    c         C  sQ   t  j j j } | j j } | rM | j rM | j j rM | d | j j f g Sg  S(   Nu    %s (   R   R   R   t   MultiColumnMetaR   R   RŠ   R>   (   R   R   R   R¨   (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR©   é  s
    (   R]   R^   R_   R$   R*   R=   R©   (    (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyR£   Ì  s
   			(   u   CompletionsMenuu   MultiColumnCompletionsMenu('   t
   __future__R    t	   six.movesR   R   t   prompt_toolkit.filtersR   R   R   R   t   prompt_toolkit.mouse_eventsR   t   prompt_toolkit.tokenR   t   prompt_toolkit.utilsR	   t
   containersR
   R   R   R   t   controlsR   R   t	   dimensionR   t   marginsR   t   screenR   R   R~   t   __all__R   RH   Ra   Rn   R¡   R£   (    (    (    s:   lib/python2.7/site-packages/prompt_toolkit/layout/menus.pyt   <module>   s&   "" ‚	ß%