ó
‹²,]c           @   s  d  Z  d d l Z d d l m Z m Z m Z m Z m Z d d l m	 Z	 d d l
 m Z 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 d d
 l m Z d d l m Z m Z d d l m Z d „  Z  d „  Z! d e f d „  ƒ  YZ" d S(   s   Find/Replace widgetiÿÿÿÿN(   t   Qtt   QTimert   Signalt   Slott   QEvent(   t   QTextCursor(   t   QGridLayoutt   QHBoxLayoutt   QLabelt   QSizePolicyt   QWidget(   t   _(   t   config_shortcut(   t   to_text_string(   t   icon_manager(   t   regexp_error_msg(   t   create_toolbuttont   get_icon(   t   PatternComboBoxc         C   s
   |  | k S(   s   Return True is pos1 > pos2(    (   t   pos1t   pos2(    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyt   is_position_sup!   s    c         C   s
   |  | k  S(   s   Return True is pos1 < pos2(    (   R   R   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyt   is_position_inf%   s    t   FindReplacec           B   sÌ  e  Z d  Z i d e 6d e 6d d! 6d d 6Z i e d ƒ e 6e d ƒ e 6e d ƒ d! 6e d ƒ d 6Z e	 e
 ƒ Z e	 ƒ  Z e	 ƒ  Z e d „ Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z e e
 ƒ d „  ƒ Z e d „ Z e ƒ  d „  ƒ Z d „  Z d „  Z d „  Z e d „ Z e ƒ  d „  ƒ Z e ƒ  d „  ƒ Z d „  Z d „  Z  d „  Z! e e e e e d „ Z" e ƒ  e e d „ ƒ Z# e ƒ  e d „ ƒ Z$ e ƒ  e d „ ƒ Z% d d d  „ Z& RS("   s   Find widgets#   background-color:rgb(255, 175, 90);t    s"   background-color:rgb(255, 80, 80);t   regexp_errors
   No matchess   Search strings   Regular expression errorc      
      sÅ  t  j ˆ  | ƒ | ˆ  _ d  ˆ  _ d  ˆ  _ t ƒ  } | j d d d d ƒ ˆ  j | ƒ t	 ˆ  d ˆ  j
 d t j d ƒ ƒˆ  _ | j ˆ  j d d ƒ t ˆ  d t d ƒ d t ƒˆ  _ ˆ  j j ‡  f d †  ƒ ˆ  j j ‡  f d	 †  ƒ ˆ  j j ƒ  j j ˆ  j ƒ t ˆ  ƒ ˆ  _ t	 ˆ  d ˆ  j d t j d
 ƒ ƒˆ  _ t	 ˆ  d ˆ  j d t j d ƒ ƒˆ  _ ˆ  j j j ˆ  j  ƒ ˆ  j j j ˆ  j  ƒ t	 ˆ  d t! d ƒ d t d ƒ ƒˆ  _" ˆ  j" j# t$ ƒ ˆ  j" j% j ‡  f d †  ƒ t	 ˆ  d t! d ƒ d t d ƒ ƒˆ  _& ˆ  j& j# t$ ƒ ˆ  j& j% j ‡  f d †  ƒ t	 ˆ  d t! d ƒ d t d ƒ ƒˆ  _' ˆ  j' j# t$ ƒ ˆ  j' j% j ‡  f d †  ƒ t	 ˆ  d t! d ƒ d t d ƒ ƒˆ  _( ˆ  j( j# t$ ƒ ˆ  j( j% j ˆ  j) ƒ t* ƒ  } ˆ  j ˆ  j ˆ  j ˆ  j ˆ  j ˆ  j" ˆ  j& ˆ  j' ˆ  j( g	 ˆ  _+ x" ˆ  j+ d D] } | j | ƒ q(W| j, | d d ƒ t t d ƒ ƒ } t ˆ  d t d t d ƒ ƒˆ  _- ˆ  j- j. j ‡  f d †  ƒ t	 ˆ  d t d ƒ d t j d ƒ d ˆ  j/ d t$ ƒˆ  _0 t	 ˆ  d t d ƒ d t j d ƒ d ˆ  j1 d t$ ƒˆ  _2 ˆ  j2 j j ˆ  j3 ƒ ˆ  j2 j j ˆ  j  ƒ t	 ˆ  d t d  ƒ d t j d ƒ d ˆ  j4 d t$ ƒˆ  _5 ˆ  j5 j j ˆ  j3 ƒ ˆ  j5 j j ˆ  j  ƒ t* ƒ  ˆ  _6 | ˆ  j- ˆ  j0 ˆ  j2 ˆ  j5 g } x | D] } ˆ  j6 j | ƒ qØW| j, ˆ  j6 d d ƒ ˆ  j+ j7 | ƒ | ˆ  _8 ˆ  j9 ƒ  ˆ  j j: ˆ  j ˆ  j- ƒ ˆ  j; t< j= t< j> ƒ ˆ  j? | ƒ ˆ  _@ tA ˆ  ƒ ˆ  _B ˆ  jB jC t$ ƒ ˆ  jB jD d! ƒ ˆ  jB jE j ˆ  jF ƒ ˆ  j jG ˆ  ƒ d  S("   Ni    t	   triggeredt   icont   DialogCloseButtont   tips   Search stringt   adjust_to_minimumc        	      s"   ˆ  j  d t d t d t d t ƒ S(   Nt   changedt   forwardt   rehighlightt   multiline_replace_check(   t   findt   False(    (   t   self(    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyt   <lambda>M   s    c        	      s"   ˆ  j  d t d t d t d t ƒ S(   NR   R    R!   R"   (   R#   R$   t   True(    (   R%   (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR&   R   s    t   ArrowUpt	   ArrowDowns
   regexp.svgs   Regular expressionc            s
   ˆ  j  ƒ  S(   N(   R#   (   t   state(   R%   (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR&   f   R   s   upper_lower.pngs   Case Sensitivec            s
   ˆ  j  ƒ  S(   N(   R#   (   R*   (   R%   (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR&   l   R   s   whole_words.pngs   Whole wordsc            s
   ˆ  j  ƒ  S(   N(   R#   (   R*   (   R%   (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR&   r   R   s   highlight.pngs   Highlight matchesi   s   Replace with:s   Replace stringc            s   ˆ  j  d t ƒ S(   Nt   focus_replace_text(   t   replace_findR'   (   R   (   R%   (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR&   ˆ   R   t   texts   Replace/find nextt   DialogApplyButtont   text_beside_icons   Replace selections   Replace alliè  (H   R
   t   __init__t   enable_replacet   Nonet   editort   is_code_editorR   t   setContentsMarginst	   setLayoutR   t   hidet   imaR   t   close_buttont	   addWidgetR   R   R$   t   search_textt   return_shift_pressedt   connectt   return_pressedt   lineEditt
   textEditedt   text_has_been_editedR   t   number_matches_textt   find_previoust   previous_buttont	   find_nextt   next_buttont   clickedt   update_search_comboR   t	   re_buttont   setCheckableR'   t   toggledt   case_buttont   words_buttont   highlight_buttont   toggle_highlightingR   t   widgetst	   addLayoutt   replace_textt   validR,   t   replace_buttont   replace_find_selectiont   replace_sel_buttont   update_replace_combot   replace_find_allt   replace_all_buttont   replace_layoutt   extendt   replace_widgetst   hide_replacet   setTabOrdert   setSizePolicyR	   t	   Expandingt   Fixedt   create_shortcutst	   shortcutsR   t   highlight_timert   setSingleShott   setIntervalt   timeoutt   highlight_matchest   installEventFilter(   R%   t   parentR1   t   glayoutt   hlayoutt   widgett   replace_withRP   (    (   R%   s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR0   :   s¾    						
															
c         C   sÌ   | j  ƒ  t j k r³ | j ƒ  } | j ƒ  t j @} | t j k ri | rY |  j j	 ƒ  qi |  j
 j	 ƒ  n  | t j k r³ |  j j ƒ  r£ |  j j |  j j ƒ  ƒ n  |  j ƒ  q³ n  t t |  ƒ j | | ƒ S(   sð   Event filter for search_text widget.

        Emits signals when presing Enter and Shift+Enter.
        This signals are used for search forward and backward.
        Also, a crude hack to get tab working in the Find/Replace boxes.
        (   t   typeR   t   KeyPresst   keyt	   modifiersR    t   ShiftModifiert
   Key_ReturnR<   t   emitR>   t   Key_TabR;   t   hasFocusRR   t   set_current_textt   currentTextt   focusNextChildt   superR   t   eventFilter(   R%   Rm   t   eventRq   t   shift(    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR|   ´   s    	c         C   s¸   t  |  j d d d d d | ƒ} t  |  j d d d d d | ƒ} t  |  j d d d d d | ƒ} t  |  j d d d d d | ƒ} t  |  j d d d d	 d |  ƒ} | | | | | g S(
   s    Create shortcuts for this widgett   contextR   t   names	   Find nextRj   s   Find previouss	   Find texts   Replace texts   hide find and replace(   R   RE   RC   t   showt   show_replaceR7   (   R%   Rj   t   findnextt   findprevt
   togglefindt   togglereplaceR7   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyRb   Í   s    		c         C   s   g  |  j  D] } | j ^ q
 S(   sæ   
        Returns shortcut data, a list of tuples (shortcut, text, default)
        shortcut (QShortcut or QAction instance)
        text (string): action/shortcut description
        default (string): default key sequence
        (   Rc   t   data(   R%   t   sc(    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyt   get_shortcut_dataÞ   s    c         C   s   |  j  j ƒ  j j ƒ  d  S(   N(   R;   R?   t   returnPressedRu   (   R%   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyRH   ç   s    c         C   s   |  j  j ƒ  j j ƒ  d  S(   N(   RR   R?   RŠ   Ru   (   R%   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyRW   ê   s    c         C   su   |  j  rq |  j d j ƒ  r3 |  j ƒ  |  j ƒ  qq |  j ƒ  t t |  j j	 ƒ  ƒ ƒ d k rq |  j
 j ƒ  qq n  d  S(   Ni    (   R1   R\   t	   isVisibleR]   R7   R‚   t   lenR   R;   Ry   RR   t   setFocus(   R%   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyt   toggle_replace_widgetsí   s    	

!c         C   s3   |  j  d k	 r/ | r" |  j ƒ  q/ |  j ƒ  n  d S(   s*   Toggle the 'highlight all results' featureN(   R3   R2   Rh   t   clear_matches(   R%   R*   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyRO   ø   s    c         C   s`  t  j |  ƒ |  j j t ƒ |  j ƒ  |  j d k	 r\| r_ |  j d j	 ƒ  r_ |  j
 ƒ  q_ n  |  j j ƒ  } | sŒ t | j ƒ  ƒ d k rLt } | sê t } y5 |  j j ƒ  } | j t j ƒ t | j ƒ  ƒ } Wqê t k
 ræ qê Xn  | r |  j j ƒ  s| r6|  j j | ƒ |  j j ƒ  j ƒ  |  j ƒ  qL|  j j ƒ  j ƒ  n  |  j j ƒ  n  d S(   s   Overrides Qt Methodi    i   N(   R
   R   t   visibility_changedRu   R'   t   change_number_matchesR3   R2   R\   R‹   R]   t   get_selected_textRŒ   t
   splitlinesR$   t
   textCursort   selectR   t   WordUnderCursorR   t   selectedTextt   AttributeErrorR;   Ry   t   setEditTextR?   t	   selectAllt   refreshR   (   R%   R]   R-   t   highlightedt   cursor(    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR     s0    
c         C   sh   x |  j  D] } | j ƒ  q
 Wt j |  ƒ |  j j t ƒ |  j d k	 rd |  j j ƒ  |  j	 ƒ  n  d S(   s   Overrides Qt MethodN(
   R\   R7   R
   R   Ru   R$   R3   R2   R   R   (   R%   Rm   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR7   $  s    c         C   s2   |  j  d t ƒ x |  j D] } | j  ƒ  q Wd S(   s   Show replace widgetsR]   N(   R   R$   R\   (   R%   Rm   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR‚   /  s    c         C   s"   x |  j  D] } | j ƒ  q
 Wd S(   s   Hide replace widgetsN(   R\   R7   (   R%   Rm   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR]   5  s    c         C   ss   |  j  ƒ  r, |  j d k	 r( |  j ƒ  n  d S|  j d k	 } x |  j D] } | j | ƒ qE W| ro |  j ƒ  n  d S(   s   Refresh widgetN(   t   isHiddenR3   R2   R   RP   t
   setEnabledR#   (   R%   R*   Rm   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR›   :  s    c         C   sâ   | |  _  y d d l m } Wn t k
 r< t d ƒ } n X|  j j t | | ƒ ƒ |  j	 j t | | ƒ ƒ d d l
 m } t | | ƒ |  _ |  j j |  j ƒ | r¹ |  j ƒ  n  |  j ƒ  rÞ | d k	 rÞ |  j ƒ  n  d S(   s|   
        Set associated editor/web page:
            codeeditor.base.TextEditBaseWidget
            browser.WebView
        iÿÿÿÿ(   t   QWebEngineView(   t
   CodeEditorN(   R3   t   qtpy.QtWebEngineWidgetsR    t   ImportErrorRo   R2   RM   t
   setVisiblet
   isinstanceRI   t$   spyder.widgets.sourcecode.codeeditorR¡   R4   RN   R›   Rž   R   (   R%   R3   R›   R    R¡   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyt
   set_editorF  s    	c      	   C   sB   |  j  d t d t d t d t ƒ } |  j j ƒ  |  j j ƒ  | S(   s   Find next occurrenceR   R    R!   R"   (   R#   R$   R'   R3   R   R;   t   add_current_text(   R%   R*   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyRE   ]  s
    	c      	   C   s5   |  j  d t d t d t d t ƒ } |  j j ƒ  | S(   s   Find previous occurrenceR   R    R!   R"   (   R#   R$   R3   R   (   R%   R*   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyRC   f  s    	c         C   s    |  j  d t d t d t ƒ d S(   s   Find text has been edited (this slot won't be triggered when 
        setting the search pattern combo box text programmatically)R   R    t   start_highlight_timerN(   R#   R'   (   R%   R-   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyRA   n  s    c         C   sh   |  j  rd |  j j ƒ  rd |  j j ƒ  } |  j j ƒ  } |  j j ƒ  } |  j j | d | d | ƒn  d S(   s   Highlight found resultst   wordst   regexpN(	   R4   RN   t	   isCheckedR;   Ry   RM   RI   R3   t   highlight_found_results(   R%   R-   Rª   R«   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyRh   s  s    c         C   s   |  j  r |  j j ƒ  n  d S(   s   Clear all highlighted matchesN(   R4   R3   t   clear_found_results(   R%   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR   |  s    	c      
   C   sW  | rD |  j  d j ƒ  rD t t |  j j ƒ  ƒ j ƒ  ƒ d k rD d S|  j j	 ƒ  } t | ƒ d k r¥ |  j j
 ƒ  j d ƒ |  j s— |  j j d ƒ n  |  j ƒ  d S|  j j ƒ  } |  j j ƒ  } |  j j ƒ  }	 |  j j | | | d | d | d |	 ƒ}
 |  j |
 } |  j |
 } |
 r]|	 r]t | ƒ } | r]|  j d } |  j d d | } q]n  |  j j
 ƒ  j | ƒ |  j j | ƒ |  j rØ|
 rØ| s¥|  j j râ|  j j ƒ  | rÈ|  j j ƒ  qÕ|  j ƒ  qân
 |  j ƒ  |  j j | d | d |	 ƒ} t |  j d	 ƒ r3|  j j | d | d |	 ƒ} n d } |  j d
 | d | ƒ |
 Sd S(   s   Call the find functioni    i   R   t   caseRª   R«   R   s   : t   get_match_numbert   current_matcht   total_matchesN(    R\   R‹   RŒ   R   R3   R’   R“   R2   R;   Ry   R?   t   setStyleSheetR4   t	   find_textR‘   RL   R¬   RM   RI   t   STYLEt   TOOLTIPR   t
   setToolTipt   found_resultsRd   t   stopt   startRh   R   t   get_number_matchest   hasattrR°   (   R%   R   R    R!   R©   R"   R-   R¯   Rª   R«   t   foundt
   stylesheett   tooltipt	   error_msgt   number_matchest   match_number(    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR#     sP    '	

	c         C   s@  |  j  d k	 r<t |  j j ƒ  ƒ } t |  j j ƒ  ƒ } d } |  j j ƒ  rŒ y# t j	 | ƒ } | j
 | d ƒ WqŒ t j k
 rˆ d SXn  |  j j ƒ  } t } d } x`t r	| rÐt |  j  j ƒ  ƒ }	 | r× | n	 | j ƒ  }
 | rï |	 n	 |	 j ƒ  } | d k rP|  j  j ƒ  } | r+|
 | k r+q|  j d t d t d t ƒ sPqn@ t | j | ƒ ƒ d k rnn" |  j d t d t d t ƒ sPn  t } t } |  j  j d ƒ } | } |  j  j ƒ  } | j ƒ  n€ |  j  j d ƒ } t | | t | ƒ t | ƒ d ƒ rt } n  | r:| | k s3t | | ƒ r:Pq:n  | | k rJPn  | } | d k rv| j ƒ  | j | ƒ n5 t | j ƒ  ƒ }	 | j ƒ  | j | j
 | |	 ƒ ƒ |  j ƒ  rû|  j  j ƒ  } | j | j ƒ  t  j! ƒ | j | j" ƒ  t  j# ƒ n P| sª Pqª qª W| d k	 r#| j$ ƒ  n  | r<|  j j% ƒ  q<n  d S(	   s   Replace and findR   NR   R    R!   i    R   i   (&   R3   R2   R   RR   Ry   R;   RI   R¬   t   ret   compilet   subt   errorRL   R'   R’   t   lowert   has_selected_textR#   R$   RŒ   t   findallt   get_positionR”   t   beginEditBlockR   R   t   removeSelectedTextt
   insertTextR—   RE   t   setPositiont   selectionStartR   t
   MoveAnchort   selectionEndt
   KeepAnchort   endEditBlockR   (   R%   R+   t   replace_allRR   R;   t
   re_patternR¯   t   firstR   t   seltxtt   cmptxt1t   cmptxt2t   has_selectedt   wrappedt   positiont	   position0t	   position1t   found_cursor(    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR,   ¸  s„    			!	


c         C   s   |  j  | d t ƒd S(   s)   Replace and find all matching occurrencesRÔ   N(   R,   R'   (   R%   R+   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyRX     s    c         C   sÑ  |  j  d k	 rÍt |  j j ƒ  ƒ } t |  j j ƒ  ƒ } |  j j ƒ  } |  j j ƒ  } | rf t	 j
 n t	 j t	 j
 B} d } |  j j ƒ  r” | } n t	 j | ƒ } t	 j | ƒ } | rÍ d j d | ƒ } n  y) t	 j | d | ƒ} | j | d ƒ Wn t	 j k
 r}	 d SXt |  j  j ƒ  ƒ }
 | j | |
 ƒ } | |
 k r§|  j  j ƒ  } | j ƒ  | j ƒ  |  j j ƒ  st	 j d d | ƒ } n  | j | ƒ | j ƒ  n  | r½|  j j ƒ  qÍ|  j  j ƒ  n  d S(   s)   Replace and find in the current selections   \b{pattern}\bt   patternt   flagsR   Ns   \\(?![nrtf])(.)s   \1(   R3   R2   R   RR   Ry   R;   RL   R¬   RM   RÃ   t	   MULTILINEt
   IGNORECASERI   t   escapet   formatRÄ   RÅ   RÆ   R’   R”   RË   RÌ   RÍ   RÓ   R   (   R%   R+   RR   R;   R¯   Rª   t   re_flagsRÕ   Rà   t   et   selected_textt   replacementR   (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyRU     s>    	

i    c         C   s…   | r: | r: d j  | t d ƒ | ƒ } |  j j | ƒ nG | rk d j  | t d ƒ ƒ } |  j j | ƒ n |  j j t d ƒ ƒ d S(   s)   Change number of match and total matches.u   {} {} {}u   ofu   {} {}u   matchesu
   no matchesN(   Rå   R   RB   t   setText(   R%   R±   R²   t   matches_string(    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR‘   D  s    	N('   t   __name__t
   __module__t   __doc__R$   R'   R2   Rµ   R   R¶   R   t   boolR   R<   R>   R0   R|   Rb   R‰   RH   RW   RŽ   R   RO   R   R7   R‚   R]   R›   R§   RE   RC   RA   Rh   R   R#   R,   RX   RU   R‘   (    (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyR   *   sP   

		z								#								6Y+(#   Rî   RÃ   t   qtpy.QtCoreR    R   R   R   R   t
   qtpy.QtGuiR   t   qtpy.QtWidgetsR   R   R   R	   R
   t   spyder.config.baseR   t   spyder.config.guiR   t   spyder.py3compatR   t   spyder.utilsR   R8   t   spyder.utils.miscR   t   spyder.utils.qthelpersR   R   t   spyder.widgets.comboboxesR   R   R   R   (    (    (    s9   lib/python2.7/site-packages/spyder/widgets/findreplace.pyt   <module>   s   ((		