
    Je&                     n    d 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mZ  G d d	e      Zy)
z
Editor Switcher manager.
    N)_)CONF)ima)shorten_pathsget_file_icon)
SymbolKindSYMBOL_KIND_ICONc                   |    e Zd ZdZdZdZdZ ed      fdZd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd ZddZd Zy)EditorSwitcherManagerz
    Switcher instance manager to handle base modes for an Editor.

    Symbol mode -> '@'
    Line mode -> ':'
    Files mode -> ''
    @: Editorc                 x    || _         || _        || _        || _        || _        d| _        | j                          y)a  
        'get_codeeditor' and 'get_editorstack' params should be callables
        to get the current CodeEditor or EditorStack instance as needed.
        As an example:
            current_codeeditor = get_codeditor()
            current_editorstack = get_editorstack()
        N)_plugin	_switcher_editor_editorstack_section_current_linesetup_switcher)selfpluginswitcher_instanceget_codeeditorget_editorstacksections         F/usr/lib/python3/dist-packages/spyder/plugins/editor/utils/switcher.py__init__zEditorSwitcherManager.__init__#   s<     *%+!    c                    | j                   j                  | j                  t        d             | j                   j                  | j                  t        d             | j                   j
                  j                  | j                         | j                   j                  j                  | j                         | j                   j                  j                  | j                         | j                   j                  j                  | j                         | j                   j                  j                  | j                         y)z!Setup switcher modes and signals.z
Go to LinezGo to Symbol in FileN)r   add_mode	LINE_MODEr   SYMBOL_MODEsig_mode_selectedconnecthandle_switcher_modessig_item_selectedhandle_switcher_selectionsig_text_changedhandle_switcher_textsig_rejectedhandle_switcher_rejectionsig_item_changedhandle_switcher_item_change)r   s    r   r   z$EditorSwitcherManager.setup_switcher5   s    ,@ 0 0!4J2KL((001K1KL((00**	,''//0I0IJ##++D,J,JK''//,,	.r    c                     || j                   k(  r| j                          y|| j                  k(  r| j                          y|| j                  k(  r| j                          yy)z%Handle switcher for registered modes.N)r$   create_symbol_switcherr#   create_line_switcher
FILES_MODEcreate_editor_switcher)r   modes     r   r'   z+EditorSwitcherManager.handle_switcher_modesA   sQ    4###'')T^^#%%'T__$'') %r    c           	         | j                   j                  t        d             | j                         }|j                  D cg c]  }|j
                  j                          }}|j                  D cg c]  }|j                   }}t        ||      }t        |j                        D ]  \  }}|j
                  }t        j                  |      }t        |      }	t        ||         dkD  r||   }n-t        j                  |j
                  j                               }|dz   t        |j                        k(  }
| j                   j                  |||	| j                   ||
        yc c}w c c}w )z"Populate switcher with open files.z%Start typing the name of an open fileK      )titledescriptioniconr   data	last_itemN)r   set_placeholder_textr   r   r<   filenamelowernewly_createdr   	enumerateospbasenamer   lendirnameadd_itemr   )r   editorstackr<   pathssave_statusesshort_pathsidxpathr9   r;   r=   s              r   r4   z,EditorSwitcherManager.create_editor_switcherK   sY   ++56	8 '')(--/ $$& / / &1%5%57! ++ 7 7#E=9";#3#34 	9IC==DLL&E &D 5:#"3'{{4==#6#6#89a3{'7'7#88INN##%04)-,0MM)-.7 $ 9	9/7s   !E)4E.c                 @   | j                         }| j                         }|j                         | _        | j                  j                          | j                  j                  t        d             |j                         }|j                  }t        j                  |      }|j                  j                         }t        |      }d}|j                  ||t        d            }t        d      }	| j                  j!                  ||	|| j"                  |d       y)	z!Populate switcher with line info.zSelect linez{title} [{lines} {text}]lines)r9   rO   textz
Go to lineT)r9   r:   r;   r   r<   action_itemN)r   r   get_cursor_line_numberr   r   clearr>   r   get_current_finfor?   rC   rD   editorget_line_countr   formatrG   r   )
r   rU   rH   r<   rM   r9   rO   r;   line_template_titler:   s
             r   r2   z*EditorSwitcherManager.create_line_switcheri   s    '')#::<++Am,<=,,.}}T"**,T"9#**e01'
 + <oe,7%)(,%),0 	  	2r    c                    | j                         }|j                  }|j                  dd       |j                         | _        | j
                  j                          | j
                  j                  t        d             |j                  j                  xs g }t        j                  dd      }d}t        |      }t        |d       }|D ]  }|d   }|d   }	|j                         d	k(  rO|	t         j"                  k(  r|d
z  }:|	t         j$                  k(  r|s|d
z  }U|	t         j&                  k(  r|s|d
z  }p|d   d   }
|
d   d   }|j(                  |   }d|z  }dj+                  ||      }t-        j.                  t1        j                  |	d            }||d
z   d}|d
z   |k(  }| j
                  j3                  ||| j4                  ||       |d
z  } | j
                  j7                          y)z#Populate switcher with symbol info.r   zSelect symboloutline_explorerdisplay_variablesc                     | d   d   d   d   S )Nlocationrangestartline )xs    r   <lambda>z>EditorSwitcherManager.create_symbol_switcher.<locals>.<lambda>   s    a
mG&<W&Ef&M r    )keynamekindpythonr8   r]   r^   r_   r`    z{space}{title})r9   spaceno_match)r9   line_number)r9   r;   r   r<   r=   N)r   languageupdate_whitespace_countrR   r   r   rS   r>   r   oe_proxyinfor   getrE   sortedr@   r   MODULEVARIABLEFIELDleading_whitespacesrW   r   r;   r	   rG   r   setup)r   rU   rl   
oe_symbolsr[   rL   total_symbolssymbolsymbol_namesymbol_kindsymbol_rangesymbol_start
fold_levelri   formated_titler;   r<   r=   s                     r   r1   z,EditorSwitcherManager.create_symbol_switcher   s   ??&&q!,#::<++Ao,>?__))/R
 HH%79LMJMO
   	F .K .K~~8+*"3"33!Q&M:#6#66-!Q&M*"2"22;L!Q&M!*-g6L'08L33LAJ*$E-44;;@ 5 BN88,00jIJD(#/!#35Da=0INN##.)-,0MM)-.7	 $ 9
 1HCA 	D 	r    c                     |j                         }|dk(  r| j                  |       y|dk(  r| j                  ||       y|dk(  rJ|j                         | j                  k(  r,| j                  |       | j                  j                          yyy)z&Handle item selection of the switcher.r   r   r   N)get_datasymbol_switcher_handlerline_switcher_handlerget_sectionr   editor_switcher_handlerr   switch_to_plugin)r   itemr5   search_textr<   s        r   r)   z/EditorSwitcherManager.handle_switcher_selection   s}    }}3;((.S[&&t[9RZ!T]]2,,T2--/ 3 r    c                 F   | j                         }| j                  j                         }|dk(  r=| j                  j                         }| j	                  |j                         |d       y| j                  r)|dk(  r#|j                  | j                         d| _        yyy)z*Handle switcher search text for line mode.r   T)visibler   N)r   r   get_modecurrent_itemr   r   r   
go_to_line)r   r   rH   r5   r   s        r   r+   z*EditorSwitcherManager.handle_switcher_text   s    '')~~&&(3;>>..0D&&t}}/3 ' 5DBJ""4#5#56!%D %/r    c                     | j                   r3| j                         }|j                  | j                          d| _         yy)z)Do actions when the Switcher is rejected.N)r   r   r   )r   rH   s     r   r-   z/EditorSwitcherManager.handle_switcher_rejection   s<     ++-K""4#5#56!%D r    c                     | j                         }| j                  j                         }|dk(  r1|.t        |j	                         d         }|j                  |       yyy)zHandle item selection change.r   Nrk   )r   r   r   intr   r   )r   currentrH   r5   rk   s        r   r/   z1EditorSwitcherManager.handle_switcher_item_change   s[    '')~~&&(3;7.g..0?@K"";/ /;r    c                     | j                         }|j                  |j                         | j                  j	                          y)z%Populate switcher with FileInfo data.N)r   set_current_filenamer?   r   hide)r   r<   rH   s      r   r   z-EditorSwitcherManager.editor_switcher_handler   s2    '')((7r    c                 Z   | j                         }|j                  |j                         |j                  d      d   }	 t	        |      }|j                  |       | j                  j                  |       |s#d| _        | j                  j                  d       yy# t        $ r Y yw xY w)zHandle line switcher selection.r   Nr   )r   r   r?   splitr   r   r   
setVisibler   set_search_text	Exception)r   r<   r   r   rH   rk   s         r   r   z+EditorSwitcherManager.line_switcher_handler   s    '')((7!'',R0
	k*K"";/NN%%g.%)"..r2   		s   AB 	B*)B*c                     | j                         }|d   }|j                  t        |             d| _        | j                  j                          | j                  j                  d       y)z!Handle symbol switcher selection.rk   Nr   )r   r   r   r   r   r   r   )r   r<   rH   rk   s       r   r   z-EditorSwitcherManager.symbol_switcher_handler   sW    '')=)s;/0!&&r*r    N)F)__name__
__module____qualname____doc__r$   r#   r3   r   r   r   r'   r4   r2   r1   r)   r+   r-   r/   r   r   r   ra   r    r   r   r      sc     KIJ +,H+$
.*9<2.1f0
&&0"+r    r   )r   os.pathrM   rC   spyder.config.baser   spyder.config.managerr   spyder.utils.icon_managerr   spyder.utils.switcherr   r   spyder.plugins.completion.apir   r	   objectr   ra   r    r   <module>r      s.   
  ! & ) > Fd+F d+r    