ó
)sEOc           @   s_   d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d d d „  ƒ  YZ d S(   iÿÿÿÿNt   FindReplacec           B   sÔ   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 d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s&   Handler of Bulleted and Numbered Listsc         C   s@   | |  _  t |  _ t |  _ d d g |  _ t |  _ t |  _ d S(   s   Lists Handler boott    N(   t   dadt   Falset   replace_activet   replace_subsequentt   Nonet	   curr_findt   from_find_iteratedt   from_find_back(   t   selfR   (    (    s   modules/findreplace.pyt   __init__   s    				c            sÝ   |  j  j j ‰  ‡  f d †  } ˆ  j d | ƒ ˆ  j ƒ  } ˆ  j ƒ  | d k rf t |  _ |  j ƒ  ns | d k rš t	 |  _ t	 |  _
 |  j ƒ  t |  _
 n? | d k rÀ |  j  j ƒ  |  j ƒ  n | d k rÙ |  j ƒ  n  d S(   s   Iterated Find/Replace Dialogc            sI   t  j j | j ƒ d k rE ˆ  j ƒ  } | j ƒ  } | d j ƒ  t Sd  S(   Nt   Returni   (   t   gtkt   gdkt   keyval_namet   keyvalt   get_action_areat   get_childrent   clickedt   True(   t   widgett   eventt
   button_boxt   buttons(   t   dialog(    s   modules/findreplace.pyt!   on_key_press_iterated_find_dialog*   s
    t   key_press_eventi   i   i   i   N(   R   t   gladet   iteratedfinddialogt   connectt   runt   hideR   R   t
   find_againR   R   t   requested_step_backt   iterated_find_dialogt	   find_back(   R
   R   t   response(    (   R   s   modules/findreplace.pyR#   '   s$    
			
c   	   	   C   sÝ  d } |  j  sA|  j j j |  j j j ƒ  ƒ } |  j j j |  j j j ƒ  ƒ } |  j j j | | ƒ } |  j sœ |  j j d t	 d ƒ d | d t
 ƒ } n- |  j j d t	 d ƒ d | d t
 d t
 ƒ } | d k r|  j j j |  j j j ƒ  | ƒ |  j j j |  j j j ƒ  | ƒ n  | d	 k r:d | g |  _ qNd	 Sn |  j d
 } |  j j j j ƒ  } |  j r| } t |  _ n  |  j j j j ƒ  } |  j j j j ƒ  } d |  _ | rÿ|  j ƒ  t
 |  _ xX |  j | | | | t
 ƒ rû|  j d
 7_ qÎWn' |  j | | | | t
 ƒ r&d
 |  _ n  |  j d k rXt j t	 d ƒ | |  j j ƒ n | r·|  j j j j t |  j ƒ t j  t	 d ƒ ƒ |  j j j j! ƒ  |  j j j j" ƒ  n" |  j j j# j ƒ  rÙ|  j$ ƒ  n  d	 S(   s)   Search for a pattern in the selected NodeR   t   titles   Search in Current Node...t
   entry_hintt
   search_opts   Replace in Current Node...t   replace_optt   in_selected_nodeNi   i    s   The pattern '%s' was not foundt   Matches(%   R   R   t   curr_buffert   get_iter_at_markt
   get_insertt   get_selection_boundt   get_textR   t   dialog_inputt   _R   t	   move_markR   R   R   t   search_fw_radiobuttont
   get_activeR	   R   t    search_first_fromsel_radiobuttont   search_all_radiobuttont   matches_numt   liststore_create_or_cleant   all_matches_first_in_nodet   parse_current_node_contentt   supportt   dialog_infot   windowt   allmatchesdialogt	   set_titlet   strt   const
   CHAR_SPACER   R    t    checkbutton_iterated_find_dialogR#   (	   R
   R'   t   iter_insertt
   iter_boundt   entry_predefined_textt   patternt   forwardt   first_fromselt   all_matches(    (    s   modules/findreplace.pyt   find_in_selected_nodeE   sR    	!!	"% 		
	#0c      	   C   s0  |  j  s;|  j j j |  j j j ƒ  ƒ } |  j j j |  j j j ƒ  ƒ } |  j j j | | ƒ } |  j s– |  j j d t	 d ƒ d | d t
 ƒ } n- |  j j d t	 d ƒ d | d t
 d t
 ƒ } | d k r|  j j j |  j j j ƒ  | ƒ |  j j j |  j j j ƒ  | ƒ n  | d	 k r4d | g |  _ qHd	 Sn |  j d
 } |  j j j ƒ  } |  j j j d ƒ } |  j j j j ƒ  } |  j r | } t |  _ n  |  j j j j ƒ  } |  j j j j ƒ  }	 | rît |  _ |  j j j ƒ  }
 n6 t
 |  _ | r|  j j j ƒ  }
 n |  j j d	 ƒ }
 d |  _ |	 r@|  j ƒ  n  t j |  j ƒ |  j j  rqt |  j _  t
 } n t } x|
 r—t
 |  _! x8 |  j" |
 | | | |	 ƒ rÃ|  j d
 7_ |	 sŒPqŒqŒW|  j d
 k rÞ|	 rÞPn  |
 j ƒ  } | r|  j j j# |
 ƒ }
 n |  j j$ |  j j |
 ƒ }
 xn |
 s“|  j j j% | ƒ }
 |
 r|
 j ƒ  } | rq|  j j j# |
 ƒ }
 q|  j j$ |  j j |
 ƒ }
 q&Pq&WqzW|  j d k r>t j& |  j ƒ t' j( t	 d ƒ | |  j j) ƒ |  j j* | ƒ |  j j+ j, ƒ  |  j j j- |  j j j. | ƒ ƒ |  j j+ j/ |  j j j ƒ  d ƒ nÙ t j& |  j ƒ |	 r­|  j j j0 j1 t2 |  j ƒ t3 j4 t	 d ƒ ƒ |  j j j0 j5 ƒ  |  j j j0 j6 ƒ  nj |  j j* |  j j ƒ |  j j+ j, ƒ  |  j j+ j/ |  j j j ƒ  d ƒ |  j j j7 j ƒ  r|  j8 ƒ  n  | r,t
 |  j _  n  d	 S(   s*   Search for a pattern in all the Tree NodesR&   s   Search in All Nodes...R'   R(   s   Replace in All Nodes...R)   R   t   in_all_nodesNi   s   cursor-positioni    s   The pattern '%s' was not foundg333333Ó?R+   (9   R   R   R,   R-   R.   R/   R0   R   R1   R2   R   R3   R   R   t   curr_tree_itert   copyt   get_propertyR   R4   R5   R	   R   R6   R7   t   first_useful_nodet	   treestoret   get_iter_firstt   get_tree_iter_last_siblingR8   R9   t   configt"   get_tree_expanded_collapsed_stringt   user_activeR:   t   parse_given_node_contentt	   iter_nextt   get_tree_iter_prev_siblingt   iter_parentt"   set_tree_expanded_collapsed_stringR<   R=   R>   t   treeview_safe_set_cursort
   sourceviewt
   grab_focust   place_cursort   get_iter_at_offsett   scroll_to_markR?   R@   RA   RB   RC   R   R    RD   R#   (   R
   RE   RF   RG   RH   t   starting_tree_itert   current_cursor_posRI   RJ   RK   t	   node_itert   user_active_restoret   last_top_node_iter(    (    s   modules/findreplace.pyt   find_in_all_nodesq   s     	!!	"% 			 	 			   	 	 "%0" c         G   s²  |  j  s‚ |  j s6 |  j j d t d ƒ d t ƒ } n' |  j j d t d ƒ d t d t ƒ } | d k r{ d | g |  _ q d Sn |  j d } |  j j j	 j
 ƒ  sþ t j | ƒ } |  j j j j
 ƒ  rÙ d	 | d	 } q|  j j j j
 ƒ  rd	 | } qn | } |  j j j j
 ƒ  r8t j | t j t j Bƒ } n# t j | t j t j Bt j Bƒ } |  j j j j
 ƒ  } |  j rŒ| } t |  _ n  |  j j j j
 ƒ  } |  j j j j
 ƒ  } | r‡| rà|  j j j |  j j ƒ } n! |  j j |  j j |  j j ƒ } |  j j j ƒ  }	 xž | sƒ|	 j ƒ  } | rF|  j j j | ƒ } n |  j j |  j j | ƒ } |  j j j |	 ƒ }	 |	 sPqqWn- | r¢|  j j j ƒ  } n |  j j  d ƒ } d
 |  _! | rÐ|  j" ƒ  n  x| d k rØ|  j# | | | | ƒ r|  j! d 7_! | sPqn  | j ƒ  }
 | r=|  j j j | ƒ } n |  j j |  j j | ƒ } xz | d k rÔ|  j j j |
 ƒ } | d k rÐ| j ƒ  }
 | r²|  j j j | ƒ } qÑ|  j j |  j j | ƒ } q[Pq[WqÓW|  j! d
 k rt$ j% t d ƒ | |  j j& ƒ n | rj|  j j j' j( t) |  j! ƒ t* j+ t d ƒ ƒ |  j j j' j, ƒ  |  j j j' j- ƒ  n" |  j j j. j
 ƒ  rŒ|  j/ ƒ  n  |  j! r®|  j r®|  j j0 ƒ  n  d S(   s1   Search for a pattern between all the Node's NamesR&   s   Search For a Node Name...R(   s   Replace in Node Names...R)   t   a_nodeNi   s   \bi    s   The pattern '%s' was not foundR+   (1   R   R   R   R1   R2   R   R   R   R   t   checkbutton_reR5   t   ret   escapet   checkbutton_whole_wordt   checkbutton_start_wordt   checkbutton_match_caset   compilet   UNICODEt	   MULTILINEt
   IGNORECASER4   R	   R   R6   R7   RR   RY   RN   RZ   RO   R[   RS   RT   R8   R9   t   parse_node_nameR<   R=   R>   R?   R@   RA   RB   RC   R   R    RD   R#   t   update_window_save_needed(   R
   t   argst   pattern_cleant   pattern_readyRH   RI   RJ   RK   Re   t   top_node_iterRg   (    (    s   modules/findreplace.pyt   find_a_nodeÃ   sŒ    		$' #	 !	   	    	#0 c         C   sR  |  j  j j |  j  j j ƒ  Œ  j d ƒ } |  j  j j j ƒ  s™ t j	 | ƒ } |  j  j j
 j ƒ  rt d | d } q™ |  j  j j j ƒ  r™ d | } q™ n  |  j  j j j ƒ  rÍ t j | t j t j Bƒ } n# t j | t j t j Bt j Bƒ } | j ƒ  } | |  j | ƒ 8} | d k r1t j | } t } n t } | rR| j | | ƒ } n, d } x# | j | d | ƒ D] }	 |	 } qnW| rö|  j r–d }
 n$ |  j | | j ƒ  | j ƒ  | ƒ }
 |
 d rÛ|
 d |
 d f } qM| j ƒ  | j ƒ  f } nW |  j rd }
 n |  j | | j ƒ  d | ƒ }
 |
 d rG|
 d |
 d f } n d } | d rJ| r|| d d | d d f } n  |
 d sœ|  j | d ƒ } n d } |  j  j | d | | d | d ƒ |  j  j j ƒ  } |  j  j j  | ƒ } |  j  j! j" | d ƒ | ru|  j# j$ |  j  j% | d | | d | |  j  j& |  j  j% d |
 d sd|  j' | ƒ n |
 d g ƒ n  |  j rF|  j  j j( j ƒ  j d ƒ } |  j  j j) d t d	 t ƒ |  j  j j* | ƒ | sõ|  j  j | d | t+ | ƒ ƒ n  |  j  j, j- |  j  j& |  j  j% d
 ƒ |  j  j. j/ |  j  j& |  j  j% d
 ƒ n  t St Sd S(   s.   Returns (start_iter, end_iter) or (None, None)s   utf-8s   \bi    i   iÿÿÿÿg      Ð?i   t   interactivet   default_editablei   N(   NN(   NN(   NN(0   R   R,   R0   t
   get_boundst   decodeR   Rj   R5   Rk   Rl   Rm   Rn   Ro   Rp   Rq   Rr   Rs   t
   get_offsett   get_num_objs_before_offsetRB   RC   R   R   t   searchR   t   finditerR   t   check_pattern_in_object_betweent   startt   endt   set_selection_at_offset_n_deltaR.   R-   R^   Rb   t	   liststoret   appendRN   RR   t   get_line_contentt   replace_entryt   delete_selectiont   insert_at_cursort   lent   state_machinet   update_statet   ctdb_handlert   pending_edit_db_node_buff(   R
   RH   t
   start_iterRI   RK   t   textt   start_offsett   workaround_first_empty_chart   matcht
   temp_matcht   obj_match_offsetst   match_offsetst   num_objst   mark_insertRE   t   replacer_text(    (    s   modules/findreplace.pyt   find_pattern  sˆ    *#	 
	 					
 	 				
 
 
 *	'*c         C   sœ   | d d k rZ x | d d d D]0 } x' | D] } | j  | ƒ r0 t d f Sq0 Wq# Wn8 | d d k r’ | j  | d d d ƒ r’ t d f Sn  t d	 f S(
   s*   Search for the pattern in the given objecti    t   tablei   t   matrixs   <table>t   codeboxt	   fill_texts	   <codebox>R   (   R   R   R   (   R
   RH   t   objt   rowt   col(    (    s   modules/findreplace.pyt   check_pattern_in_objectI  s      c   	      C   sF  | s | d 8} n  | d k  rF | r= |  j  j j ƒ  j ƒ  n d } n  | rX | | f n	 | | f } |  j  j j |  j  j d | ƒ} | s d S| rê xª | D]G } |  j | | ƒ } | d rœ | d d | d d d | d f Sqœ WnX xU t | ƒ D]G } |  j | | ƒ } | d r÷ | d d | d d d | d f Sq÷ Wd S(   s7   Search for the pattern in the given slice and directioni   i    t	   sel_rangeN(   NN(   NN(	   R   R,   t   get_end_iterR   RŽ   t%   get_embedded_pixbufs_tables_codeboxesR   R¥   t   reversed(	   R
   RH   R”   t
   end_offsetRI   R¦   t   obj_vect   elementt   patt_in_obj(    (    s   modules/findreplace.pyRƒ   S  s&     '	 
,
)c         C   st   d } | } |  j  j j ƒ  } xO | j ƒ  | k  ro | j ƒ  } | r\ | d 7} | d 7} n  | j ƒ  s! Pq! q! W| S(   s@   Returns the num of objects from buffer start to the given offseti    i   (   R   R,   t   get_start_iterR   t   get_child_anchort   forward_char(   R
   t
   max_offsetRš   t   local_limit_offsett	   curr_itert   anchor(    (    s   modules/findreplace.pyR€   h  s    
 c   	   
   C   sž  | r | s | rI|  j  rI|  j j j |  j j j ƒ  ƒ } |  j j j |  j j j ƒ  ƒ } |  j sq |  j rÝ | rª | d k r¡ | j	 | ƒ d k  r¡ | } qÚ | } qF| d k rÔ | j	 | ƒ d k rÔ | } qF| } qˆ| r| d k r| j	 | ƒ d k r| } qF| } qˆ| d k r@| j	 | ƒ d k  r@| } qˆ| } n? | rd|  j j j
 ƒ  } n |  j j j ƒ  } | rˆt |  _  n  |  j | | | | ƒ S(   s1   Returns True if pattern was find, False otherwisei    N(   R:   R   R,   R-   R.   R/   R   R   R   t   compareR®   R§   R   R   (	   R
   RH   RI   RJ   RK   t
   first_nodeRE   RF   R’   (    (    s   modules/findreplace.pyR;   u  s2    !!! 		! 		! 		! 		  c         C   s©  |  j  j j | ƒ } |  j s |  j  j d k sQ | |  j  j j |  j  j ƒ k r¾ t |  _ |  j  j | ƒ |  j | | | | t ƒ rŒ t Sq¾ n/ |  j  j | ƒ |  j | | | | t	 ƒ r¾ t S|  j  j j
 | ƒ } | d k rû | rû |  j  j | ƒ } n  x§ | d k r¤t |  _ x8 |  j | | | | | ƒ rM|  j d 7_ | sPqqW|  j d k rh| rhPn  | r†|  j  j j | ƒ } qþ |  j  j |  j  j | ƒ } qþ Wt	 S(   s2   Returns True if pattern was found, False otherwisei   N(   R   RR   t   get_pathRQ   RN   R   R   R]   R;   R   t   iter_childrenRT   R:   RX   R8   RY   RZ   (   R
   Re   RH   RI   RJ   RK   t	   node_path(    (    s   modules/findreplace.pyRX   ‘  s2    	3	 
  	   c   	      C   s  |  j  j | d j d ƒ } | j | ƒ } | sa |  j  j | d j d ƒ } | j | ƒ } n  | rV| r´ |  j j | d d |  j  j | d |  j |  j  j | d ƒ g ƒ n  |  j r)|  j  j j	 j
 ƒ  j d ƒ } | j |  j d | ƒ } | |  j  j | d <|  j j |  j  j | d ƒ n  | sR|  j  j | ƒ |  j  j j ƒ  n  t S|  j  j j | ƒ } | d k r“| r“|  j  j | ƒ } n  x} | d k r|  j | | | | ƒ rÖ|  j d 7_ | sÖt Sn  | rô|  j  j j | ƒ } q–|  j  j |  j  j | ƒ } q–Wt S(   s5   Recursive function that searchs for the given patterni   s   utf-8i   i    i   i   N(   R   RR   R~   R   R‡   Rˆ   t   get_first_line_contentR   R   RŠ   R0   t   replaceR   R   t   pending_edit_db_node_propR]   R^   R_   R   R¸   R   RT   Rt   R8   RY   RZ   R   (	   R
   Re   RH   RI   RK   t	   text_nameR–   t	   text_tagsRœ   (    (    s   modules/findreplace.pyRt   ª  sB    $	!   c         C   s    t  |  _ t |  _ |  j ƒ  d S(   s]   Continue the previous search (a_node/in_selected_node/in_all_nodes) but in Opposite DirectionN(   R   R	   R   R   R!   (   R
   (    (    s   modules/findreplace.pyR$   Ë  s    		c         C   s    t  |  _ |  j ƒ  t |  _ d S(   s&   Replace a pattern in the selected NodeN(   R   R   RL   R   (   R
   (    (    s   modules/findreplace.pyt   replace_in_selected_nodeÑ  s    	
c         C   s    t  |  _ |  j ƒ  t |  _ d S(   s)   Replace the pattern in all the Tree NodesN(   R   R   Rh   R   (   R
   (    (    s   modules/findreplace.pyt   replace_in_all_nodes×  s    	
c         C   s    t  |  _ |  j ƒ  t |  _ d S(   s0   Replace the pattern between all the Node's NamesN(   R   R   Rz   R   (   R
   (    (    s   modules/findreplace.pyt   replace_in_nodes_namesÝ  s    	
c         C   s¨   t  |  _ |  j d d k r; t j t d ƒ |  j j ƒ n` |  j d d k r[ |  j	 ƒ  n@ |  j d d k r{ |  j
 ƒ  n  |  j d d k r› |  j ƒ  n  t |  _ d S(   sC   Continue the previous search (a_node/in_selected_node/in_all_nodes)i    s4   No Previous Search Was Performed During This SessionR*   RM   Ri   N(   R   R   R   R   R<   t   dialog_warningR2   R   R>   RL   Rh   Rz   R   (   R
   (    (    s   modules/findreplace.pyR!   ã  s    	    c         C   s2   t  |  _ t  |  _ |  j ƒ  t |  _ t |  _ d S(   sD   Continue the previous replace (a_node/in_selected_node/in_all_nodes)N(   R   R   R   R!   R   (   R
   (    (    s   modules/findreplace.pyt   replace_againì  s
    		
	c         C   s    | j  ƒ  } | j  ƒ  } | j ƒ  s( d Sx3 | j ƒ  t j k rS | j ƒ  s+ Pq+ q+ W| j ƒ  x) | j ƒ  t j k r‰ | j ƒ  sa Pqa qa W|  j j j | | ƒ S(   s,   Returns the Line Content Given the Text IterR   (	   RO   t   backward_chart   get_charRB   t   CHAR_NEWLINER°   R   R,   R0   (   R
   t	   text_itert
   line_startt   line_end(    (    s   modules/findreplace.pyR‰   ô  s      
 c         C   s€   | j  ƒ  } x) | j ƒ  t j k r7 | j ƒ  s d Sq W| j ƒ  } x) | j ƒ  t j k ro | j ƒ  sG PqG qG W| j | | ƒ S(   s>   Returns the First Not Empty Line Content Given the Text BufferR   (   R®   RÅ   RB   RÆ   R°   RO   R0   (   R
   t   text_bufferR’   t   end_iter(    (    s   modules/findreplace.pyRº      s      c         C   s=  d t  |  ƒ k r# |  j j ƒ  d St j t j t t t t ƒ |  _ t j	 |  j ƒ |  _
 t j ƒ  |  _ t j ƒ  |  _ t j t d ƒ |  j d d ƒ|  _ |  j
 j |  j ƒ t j t d ƒ |  j d d ƒ|  _ |  j
 j |  j ƒ |  j
 j ƒ  |  _ |  j
 j d |  j ƒ |  j j j j |  j
 ƒ |  j j j j ƒ  d S(	   s6   Check Whether the Liststore was Already Created or NotR‡   Ns	   Node NameR“   i   s   Line Contenti   s   event-after(   t   dirR‡   t   clearR   t	   ListStoret   gobjectt   TYPE_PYOBJECTt   longRA   t   TreeViewt   treeviewt   CellRendererTextt   renderer_text_nodet   renderer_text_linet   TreeViewColumnR2   t   node_columnt   append_columnt   line_columnt   get_selectiont   treeviewselectionR   t   on_treeview_event_afterR   R   t   scrolledwindow_allmatchest   addt   show_all(   R
   (    (    s   modules/findreplace.pyR9   
  s    !$$c         C   s  | j  t j j k r d S|  j j ƒ  \ } } |  j j | | d ƒ | | d d k r| | d d k r|  j j j	 |  j j j
 ƒ  |  j j j | | d ƒ ƒ |  j j j	 |  j j j ƒ  |  j j j | | d ƒ ƒ |  j j j |  j j j
 ƒ  d ƒ n |  j j j ƒ  d S(   s   Catches mouse buttons clicksNi    i   i   g      Ð?(   t   typeR   R   t   BUTTON_PRESSRÜ   t   get_selectedR   R]   R,   R3   R.   Ra   R/   R^   Rb   R_   (   R
   RÓ   R   t   modelt	   list_iter(    (    s   modules/findreplace.pyRÝ     s     (%(   t   __name__t
   __module__t   __doc__R   R#   RL   Rh   Rz   R   R¥   Rƒ   R€   R;   RX   Rt   R$   R¿   RÀ   RÁ   R!   RÃ   R‰   Rº   R9   RÝ   (    (    (    s   modules/findreplace.pyR       s.   				,	R	D	B	
					!									
	(    (   R   RÏ   Rk   RB   R<   RU   R    (    (    (    s   modules/findreplace.pyt   <module>   s   $