
    G@d&                     v    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dS )
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dS )EditorSwitcherManagerz
    Switcher instance manager to handle base modes for an Editor.

    Symbol mode -> '@'
    Line mode -> ':'
    Files mode -> ''
    @: Editorc                     || _         || _        || _        || _        || _        d| _        |                                  dS )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         Dlib/python3.11/site-packages/spyder/plugins/editor/utils/switcher.py__init__zEditorSwitcherManager.__init__#   sH     *%+!    c                 "   | j                             | j        t          d                     | j                             | j        t          d                     | j         j                            | j                   | j         j                            | j	                   | j         j
                            | j                   | j         j                            | j                   | j         j                            | j                   dS )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!4J2K2KLLL(001KLLL(00*	, 	, 	,'//0IJJJ#++D,JKKK'//,	. 	. 	. 	. 	.r    c                     || j         k    r|                                  dS || j        k    r|                                  dS || j        k    r|                                  dS dS )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   sz    4###'')))))T^##%%'''''T_$$''))))) %$r    c           	         | j                             t          d                     |                                 }d |j        D             }d |j        D             }t          ||          }t          |j                  D ]\  }}|j        }t          j	        |          }t          |          }	t          ||                   dk    r	||         }n+t          j        |j                                                  }|dz   t          |j                  k    }
| j                             |||	| j        ||
           dS )z"Populate switcher with open files.z%Start typing the name of an open filec                 @    g | ]}|j                                         S  )filenamelower.0datas     r   
<listcomp>z@EditorSwitcherManager.create_editor_switcher.<locals>.<listcomp>Q   s6     / / / $$&& / / /r    c                     g | ]	}|j         
S r8   )newly_createdr;   s     r   r>   z@EditorSwitcherManager.create_editor_switcher.<locals>.<listcomp>S   s+     7 7 7! + 7 7 7r    K      )titledescriptioniconr   r=   	last_itemN)r   set_placeholder_textr   r   r=   r   	enumerater9   ospbasenamer   lendirnamer:   add_itemr   )r   editorstackpathssave_statusesshort_pathsidxr=   pathrC   rE   rF   s              r   r4   z,EditorSwitcherManager.create_editor_switcherK   sg   ++566	8 	8 	8 ''))/ /(-/ / /7 7%0%57 7 7#E=99";#344 	9 	9IC=DL&&E &&D 5:##"3'{4=#6#6#8#899a3{'7#8#88IN##%04)-,0M)-.7 $ 9 9 9 9	9 	9r    c                 l   |                                  }|                                 }|                                | _        | j                                         | j                            t          d                     |                                }|j	        }t          j        |          }|j                                        }t          |          }d}|                    ||t          d                    }t          d          }	| j                            ||	|| j        |d           dS )	z!Populate switcher with line info.zSelect linez{title} [{lines} {text}]lines)rC   rU   textz
Go to lineT)rC   rD   rE   r   r=   action_itemN)r   r   get_cursor_line_numberr   r   clearrG   r   get_current_finfor9   rI   rJ   editorget_line_countr   formatrM   r   )
r   r[   rN   r=   rS   rC   rU   rE   line_template_titlerD   s
             r   r2   z*EditorSwitcherManager.create_line_switcheri   s!   ''))#::<<++Am,<,<===,,..}T""**,,T""9#**e01'

 + < <ooe,7%)(,%),0 	  	2 	2 	2 	2 	2r    c                    |                                  }|j        }|                    dd           |                                | _        | j                                         | j                            t          d                     |j	        j
        pg }t          j        dd          }d}t          |          }t          |d           }|D ]}|d         }|d         }	|                                d	k    rF|	t           j        k    r|d
z  }A|	t           j        k    r|s|d
z  }Y|	t           j        k    r|s|d
z  }q|d         d         }
|
d         d         }|j        |         }d|z  }d                    ||          }t-          j        t1          j        |	d                    }||d
z   d}|d
z   |k    }| j                            ||| j        ||           |d
z  }| j                                         dS )z#Populate switcher with symbol info.r   zSelect symboloutline_explorerdisplay_variablesc                 6    | d         d         d         d         S )Nlocationrangestartliner8   )xs    r   <lambda>z>EditorSwitcherManager.create_symbol_switcher.<locals>.<lambda>   s    a
mG&<W&Ef&M r    )keynamekindpythonrB   rc   rd   re   rf    z{space}{title})rC   spaceno_match)rC   line_number)rC   rE   r   r=   rF   N)r   languageupdate_whitespace_countrX   r   r   rY   rG   r   oe_proxyinfor   getrK   sortedr:   r   MODULEVARIABLEFIELDleading_whitespacesr]   r   rE   r	   rM   r   setup)r   r[   rq   
oe_symbolsra   rR   total_symbolssymbolsymbol_namesymbol_kindsymbol_rangesymbol_start
fold_levelrn   formated_titlerE   r=   rF   s                     r   r1   z,EditorSwitcherManager.create_symbol_switcher   sH   ?&&q!,,,#::<<++Ao,>,>???_)/R
 H%79LMMJMMO O O
   	  	F .K .K~~8++*"333!Q&M:#666- 7!Q&M*"222;L2!Q&M!*-g6L'08L3LAJ*$E-44;;@ 5 B BN8,0jIIJJD(#/!#35 5Da=0IN##.)-,0M)-.7	 $ 9 9 9
 1HCCr    c                 N   |                                 }|dk    r|                     |           dS |dk    r|                     ||           dS |dk    rM|                                | j        k    r2|                     |           | j                                         dS dS dS )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9999RZZ!!T]22,,T222--/////	 Z22r    c                 Z   |                                  }| j                                        }|dk    rE| j                                        }|                     |                                |d           dS | j        r)|dk    r%|                    | j                   d| _        dS dS dS )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   rN   r5   r   s        r   r+   z*EditorSwitcherManager.handle_switcher_text   s    ''))~&&((3;;>..00D&&t}}/3 ' 5 5 5 5 5 	&DBJJ""4#5666!%D	& 	&JJr    c                     | j         r7|                                 }|                    | j                    d| _         dS dS )z)Do actions when the Switcher is rejected.N)r   r   r   )r   rN   s     r   r-   z/EditorSwitcherManager.handle_switcher_rejection   sO      	&++--K""4#5666!%D	& 	&r    c                     |                                  }| j                                        }|dk    r@|@t          |                                d                   }|                    |           dS dS dS )zHandle item selection change.r   Nrp   )r   r   r   intr   r   )r   currentrN   r5   rp   s        r   r/   z1EditorSwitcherManager.handle_switcher_item_change   sy    ''))~&&((3;;7.g..00?@@K"";///// ;..r    c                     |                                  }|                    |j                   | j                                         dS )z%Populate switcher with FileInfo data.N)r   set_current_filenamer9   r   hide)r   r=   rN   s      r   r   z-EditorSwitcherManager.editor_switcher_handler   sC    ''))((777r    Fc                    |                                  }|                    |j                   |                    d          d         }	 t	          |          }|                    |           | j                            |           |s#d| _        | j        	                    d           dS dS # t          $ r Y dS w xY w)zHandle line switcher selection.r   Nr   )r   r   r9   splitr   r   r   
setVisibler   set_search_text	Exception)r   r=   r   r   rN   rp   s         r   r   z+EditorSwitcherManager.line_switcher_handler   s    ''))((777!'',,R0
	k**K"";///N%%g... 3%)"..r222223 3  	 	 	DD	s   A!B0 0
B>=B>c                     |                                  }|d         }|                    t          |                     d| _        | j                                         | j                            d           dS )z!Handle symbol switcher selection.rp   Nr   )r   r   r   r   r   r   r   )r   r=   rN   rp   s       r   r   z-EditorSwitcherManager.symbol_switcher_handler   sq    ''))=)s;//00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   r8   r    r   r   r      s
         KIJ +,!H++   $
. 
. 
.* * *9 9 9<2 2 2.1 1 1f0 0 0
& 
& 
&& & &0 0 0     "+ + + + +r    r   )r   os.pathrS   rI   spyder.config.baser   spyder.config.managerr   spyder.utils.icon_managerr   spyder.utils.switcherr   r   spyder.plugins.completion.apir   r	   objectr   r8   r    r   <module>r      s    
       !           & & & & & & ) ) ) ) ) ) > > > > > > > > F F F F F F F Fd+ d+ d+ d+ d+F d+ d+ d+ d+ d+r    