B
    nôb\[  ã               @   sV  d Z ddlmZ ddlmZ ddlZddlmZ ddl	m
Z
mZ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mZmZ ddlm Z  G dd„ de!ƒZ"G dd„ deƒZ#G dd„ deƒZ$G dd„ de$ƒZ%G dd„ de$ƒZ&G dd„ de$ƒZ'G dd„ de$ƒZ(dd„ Z)dd„ Z*d$dd„Z+G d d!„ d!e ƒZ,G d"d#„ d#eƒZ-dS )%z$Editor tools: outline explorer, etc.é    )Úprint_functionN)Úfrom_qvariant)ÚQtÚSignalÚSlot)ÚQHBoxLayoutÚQTreeWidgetItemÚQVBoxLayoutÚQWidget)Ú_ÚSTDOUT)Úto_text_string)Úicon_manager)Úcreate_actionÚcreate_toolbuttonÚset_item_user_textÚcreate_plugin_layout)ÚOneColumnTreec               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú	PythonCFMa%  
    Collection of helpers to match functions and classes
    for Python language
    This has to be reimplemented for other languages for the outline explorer 
    to be supported (not implemented yet: outline explorer won't be populated
    unless the current script is a Python script)
    c             C   s&   t  d| |¡}|d k	r"| d¡S d S )Nz#[\ ]*%s ([a-zA-Z0-9_]*)[\ ]*[\(|\:]é   )ÚreÚmatchÚgroup)ÚselfZstatmtÚtextr   © r   ú9lib/python3.7/site-packages/spyder/widgets/editortools.pyZ
__get_name'   s    zPythonCFM.__get_namec             C   s   |   d|¡S )NÚdef)Ú_PythonCFM__get_name)r   r   r   r   r   Úget_function_name,   s    zPythonCFM.get_function_namec             C   s   |   d|¡S )NÚclass)r   )r   r   r   r   r   Úget_class_name/   s    zPythonCFM.get_class_nameN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r!   r   r   r   r   r      s   r   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚFileRootItemc             C   sB   t  | |t j¡ || _|  dt d¡¡ |  d|¡ t| |ƒ d S )Nr   Zpython)	r   Ú__init__ÚTypeÚpathÚsetIconÚimaÚiconÚ
setToolTipr   )r   r)   Ú
treewidgetr   r   r   r'   4   s
    zFileRootItem.__init__c             C   s   || _ |  |¡ d S )N)r)   Úset_text)r   r)   Úfullpathr   r   r   Úset_path;   s    zFileRootItem.set_pathc             C   s"   |   d|r| jn
t | j¡¡ d S )Nr   )ÚsetTextr)   ÚospÚbasename)r   r0   r   r   r   r/   ?   s    zFileRootItem.set_textN)r"   r#   r$   r'   r1   r/   r   r   r   r   r&   3   s   r&   c               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTreeItemzClass browser item base classc             C   s®   |d krt  | |t j¡ nX||k	rFx"| ¡ |k	rD| ¡ }|d kr$P q$W |d kr`t  | |t j¡ nt  | ||t j¡ |  d|¡ t| dtj¡t	ƒ}t
| |d | ƒ || _d S )Nr   ú/)r   r'   r(   Úparentr2   r   Údatar   ZUserRoler   r   Úline)r   Únamer9   r7   Ú	precedingZparent_textr   r   r   r'   D   s     
zTreeItem.__init__c             C   s   |   d|¡ d S )Nr   )r*   )r   r,   r   r   r   Úset_iconZ   s    zTreeItem.set_iconc             C   s   |   dtdƒt| jƒ ¡ d S )Nr   zLine %s)r-   r   Ústrr9   )r   r   r   r   Úsetup]   s    zTreeItem.setupN)r"   r#   r$   r%   r'   r<   r>   r   r   r   r   r5   B   s   r5   c               @   s   e Zd Zdd„ ZdS )Ú	ClassItemc             C   s.   |   t d¡¡ |  dtdƒt| jƒ ¡ d S )Nr    r   zClass defined at line %s)r<   r+   r,   r-   r   r=   r9   )r   r   r   r   r>   a   s    zClassItem.setupN)r"   r#   r$   r>   r   r   r   r   r?   `   s   r?   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚFunctionItemc             C   s   t |  ¡ tƒS )N)Ú
isinstancer7   r?   )r   r   r   r   Ú	is_methodf   s    zFunctionItem.is_methodc             C   s¨   |   ¡ rz|  dtdƒt| jƒ ¡ t|  d¡ƒ}| d¡rL|  t	 
d¡¡ q¤| d¡rh|  t	 
d¡¡ q¤|  t	 
d¡¡ n*|  t	 
d¡¡ |  dtd	ƒt| jƒ ¡ d S )
Nr   zMethod defined at line %sÚ__Zprivate2r   Zprivate1ÚmethodZfunctionzFunction defined at line %s)rB   r-   r   r=   r9   r   r   Ú
startswithr<   r+   r,   )r   r:   r   r   r   r>   i   s    

zFunctionItem.setupN)r"   r#   r$   rB   r>   r   r   r   r   r@   e   s   r@   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚCommentItemc             C   s    |  d¡}t | ||||¡ d S )Nz# )Úlstripr5   r'   )r   r:   r9   r7   r;   r   r   r   r'   y   s    
zCommentItem.__init__c             C   sN   |   t d¡¡ |  d¡}| d¡ |  d|¡ |  dtdƒt| j	ƒ ¡ d S )NZblockcommentr   TzLine %s)
r<   r+   r,   ÚfontÚ	setItalicÚsetFontr-   r   r=   r9   )r   rH   r   r   r   r>   }   s
    

zCommentItem.setupN)r"   r#   r$   r'   r>   r   r   r   r   rF   x   s   rF   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚCellItemc             C   sp   |  d¡}| d¡r&|dd …   ¡ }n4| d¡rZ|dd … }| d¡rR|d d… }| ¡ }t | ||||¡ d S )Nz#% z
<codecell>é
   zIn[é   z]:éÿÿÿÿ)rG   rE   ÚendswithÚstripr5   r'   )r   r:   r9   r7   r;   r   r   r   r'   …   s    



zCellItem.__init__c             C   sN   |   t d¡¡ |  d¡}| d¡ |  d|¡ |  dtdƒt| j	ƒ ¡ d S )NZcellr   TzCell starts at line %s)
r<   r+   r,   rH   rI   rJ   r-   r   r=   r9   )r   rH   r   r   r   r>      s
    

zCellItem.setupN)r"   r#   r$   r'   r>   r   r   r   r   rK   „   s   rK   c                sX   ‡ fdd„t ˆ  ¡ ƒD ƒ}x,|d d … D ]}t|ƒ}|d k	r(||7 }q(W t|dd„ dS )Nc                s   g | ]}ˆ   |¡‘qS r   )Úchild)Ú.0Úindex)Úitemr   r   ú
<listcomp>˜   s    z%get_item_children.<locals>.<listcomp>c             S   s   | j S )N)r9   )rQ   r   r   r   Ú<lambda>   s    z#get_item_children.<locals>.<lambda>)Úkey)ÚrangeÚ
childCountÚget_item_childrenÚsorted)rT   ZchildrenrQ   Zothersr   )rT   r   rZ   —   s    rZ   c             C   s,   | }x"t | ƒD ]}|j|kr |S |}qW d S )N)rZ   r9   )Ú	root_itemr9   Úprevious_itemrT   r   r   r   Úitem_at_lineŸ   s
    
r^   c                s¬   |d kr2x(t |  ¡ ƒD ]\}\}}}|ˆ krP qW |  |¡\‰ }}yBx.‡ fdd„tˆ  ¡ ƒD ƒD ]}t| |d q`W ˆ  ¡  ˆ ¡ W n" tk
r¦   t	d|t
d Y nX d S )Nc                s   g | ]}ˆ   |¡‘qS r   )rQ   )rR   Z_i)rT   r   r   rU   ®   s    z*remove_from_tree_cache.<locals>.<listcomp>)rT   zunable to remove tree item: )Úfile)ÚlistÚitemsÚpoprX   rY   Úremove_from_tree_cacher7   ZremoveChildÚRuntimeErrorÚprintr   )Ú
tree_cacher9   rT   Ú_itÚ_levelZ_debugÚdebugrQ   r   )rT   r   rc   §   s     rc   c               @   sÆ   e Zd Zd*dd„Zdd„ Zeeƒdd„ ƒZd	d
„ Zeeƒdd„ ƒZ	eeƒdd„ ƒZ
eƒ dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd+dd„Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ ZdS ),ÚOutlineExplorerTreeWidgetFTc             C   sf   || _ || _|| _t | |¡ d| _i | _i | _i | _d | _	t
dƒ}|  |¡ |  |¡ |  d¡ d S )NFZOutlineT)Úshow_fullpathÚshow_all_filesÚshow_commentsr   r'   ÚfreezeÚeditor_itemsÚeditor_tree_cacheÚ
editor_idsÚcurrent_editorr   Ú	set_titleZsetWindowTitleZsetUniformRowHeights)r   r7   rk   rl   rm   Útitler   r   r   r'   ·   s    

z"OutlineExplorerTreeWidget.__init__c             C   sŒ   t | tdƒt d¡| jd}t | tdƒ| jd}| | j¡ t | tdƒ| jd}| | j	¡ t | tdƒ| j
d}| | j¡ ||||g}|S )z"Reimplemented OneColumnTree methodzGo to cursor positionÚ
fromcursor)r   r,   Ú	triggeredzShow absolute path)r   ÚtoggledzShow all fileszShow special comments)r   r   r+   r,   Úgo_to_cursor_positionÚtoggle_fullpath_modeÚ
setCheckedrk   Útoggle_show_all_filesrl   Útoggle_show_commentsrm   )r   ra   Zfromcursor_actZfullpath_actZallfiles_actZcomment_actZactionsr   r   r   Úget_actions_from_itemsÇ   s    







z0OutlineExplorerTreeWidget.get_actions_from_itemsc             C   sJ   || _ |  |rtjntj¡ x(t|  ¡ ƒD ]}|  |¡j| j d q*W d S )N)r0   )	rk   ZsetTextElideModer   ZElideMiddleZ
ElideRightrX   ÚtopLevelItemCountÚtopLevelItemr/   )r   ÚstaterS   r   r   r   ry   Ø   s    z.OutlineExplorerTreeWidget.toggle_fullpath_modec             C   s,   x&|   ¡ D ]}| ||k	o | j ¡ q
W dS )z‹
        show_all_files option is disabled: hide all root items except *item*
        show_all_files option is enabled: do nothing
        N)Zget_top_level_itemsZ	setHiddenrl   )r   rT   rg   r   r   r   Z__hide_or_show_root_itemsß   s    z3OutlineExplorerTreeWidget.__hide_or_show_root_itemsc             C   s4   || _ | jd k	r0| j| j }| j| }|  |¡ d S )N)rl   rr   rq   ro   Ú3_OutlineExplorerTreeWidget__hide_or_show_root_items)r   r€   Ú	editor_idrT   r   r   r   r{   ç   s
    

z/OutlineExplorerTreeWidget.toggle_show_all_filesc             C   s   || _ |  ¡  d S )N)rm   Ú
update_all)r   r€   r   r   r   r|   ï   s    z.OutlineExplorerTreeWidget.toggle_show_commentsc             C   sL   | j d k	rH| j  ¡ }| j| j  }| j| }t||ƒ}|  |¡ |  |¡ d S )N)rr   Zget_cursor_line_numberrq   ro   r^   ZsetCurrentItemÚscrollToItem)r   r9   r‚   r\   rT   r   r   r   rx   ô   s    




z/OutlineExplorerTreeWidget.go_to_cursor_positionc             C   s   |   d¡ t | ¡ dS )zReimplemented Qt methodÚ N)rs   r   Úclear)r   r   r   r   r†   þ   s    
zOutlineExplorerTreeWidget.clearc             C   sò   |  ¡ }|t| j ¡ ƒkrv| j| }| jsH|  |¡ |  |¡ |  |¡ |rÔ|  	¡  | j
| }|  |||¡ |  ¡  n^t|| ƒ}|j| jd |  ||¡}|  ¡  |  |¡ |  |¡ || j|< || j
|< |  d¡ || jkrè|| j|< || _dS )zBind editor instance)r0   r   N)Úget_document_idr`   rq   Úvaluesro   rn   r„   Úroot_item_selectedr   Úsave_expanded_staterp   Úpopulate_branchÚrestore_expanded_stater&   r/   rk   Ú/_OutlineExplorerTreeWidget__sort_toplevel_itemsZresizeColumnToContentsrr   )r   ÚeditorÚfnameÚupdater‚   rT   rf   r\   r   r   r   Úset_current_editor  s0    













z,OutlineExplorerTreeWidget.set_current_editorc             C   s@   |  ¡ }|t| j ¡ ƒkr<| j| }|j|| jd |  ¡  dS )z0File was renamed, updating outline explorer tree)r0   N)r‡   r`   rq   rˆ   ro   r1   rk   r   )r   rŽ   Únew_filenamer‚   r\   r   r   r   Úfile_renamed"  s
    
z&OutlineExplorerTreeWidget.file_renamedc             C   sR   |   ¡  x<t| j ¡ ƒD ]*\}}| j| }| j| }|  |||¡ qW |  ¡  d S )N)rŠ   r`   rq   ra   ro   rp   r‹   rŒ   )r   rŽ   r‚   rT   rf   r   r   r   rƒ   *  s    

z$OutlineExplorerTreeWidget.update_allc             C   s~   || j krz| j|krd | _| j  |¡}|t| j  ¡ ƒkrz| j |¡}| j |¡ y|  |  |¡¡ W n t	k
rx   Y nX d S )N)
rq   rr   rb   r`   rˆ   ro   rp   ZtakeTopLevelItemZindexOfTopLevelItemrd   )r   rŽ   r‚   r\   r   r   r   Úremove_editor2  s    

z'OutlineExplorerTreeWidget.remove_editorc             C   s   dd„ }| j |d d S )Nc             S   s   t  | j ¡ ¡S )N)r3   r4   r)   Úlower)rT   r   r   r   rV   A  s    zAOutlineExplorerTreeWidget.__sort_toplevel_items.<locals>.<lambda>)rW   )Zsort_top_level_items)r   Z	sort_funcr   r   r   Z__sort_toplevel_items@  s    z/OutlineExplorerTreeWidget.__sort_toplevel_itemsNc             C   sn  |d kri }x4t | ¡ ƒD ]$}|| ¡ kr||krt||d qW |dfg}d }d }|j ¡ }| dd¡|_xút| ¡ ƒD ]è}	|	d }
| |	¡}|d kr¢d }n|j	}| |
d¡\}}}|d krØ|d k	r|t||
d q|| 
¡ }|s | ¡ }|d kr | ¡ }|d kr |d k	r|t||
d q||d k	r˜||kr6nb||d krHq|nP||krb| ||f¡ n6x4t|ƒdkr–||kr–| d¡ |d \}}qdW |d \}}|d k	r¼t| d¡ƒ}|d krÊ|n|}|r‚| ¡ rü| jsü|d k	r|t||
d q||d k	r4|j|kr(||kr(|}|}q|nt||
d | ¡ rp|j|jkr^t|j|
||ƒ}nt|j|
||ƒ}nt|j|
||ƒ}n”|d k	rÒ|d k	rÂ||kr¶||kr¶|}|}q|nt||
d t||
||ƒ}nD|d k	r||krü||krü|}|}q|nt||
d t||
||ƒ}| ¡  d	t|jƒ d
¡t| ¡  d¡ƒt| d¡ƒf }|||f||
< |}|}q|W |S )N)r9   r   Zfound_cell_separatorsFr   )NNr…   é   rN   z%s -- %s/%sé   ) r`   ÚkeysZget_line_countrc   ÚhighlighterZget_outlineexplorer_dataÚgetZhas_cell_separatorsrX   Z
fold_levelZis_not_class_nor_functionr!   r   ÚappendÚlenrb   r   r   Z
is_commentrm   Zdef_typeZCELLrK   rF   r5   r?   r@   r>   r=   r9   Úrjustr7   )r   rŽ   r\   rf   Z_lZ	ancestorsr]   Zprevious_levelZoe_dataZblock_nbZline_nbr8   ÚlevelZcitemZclevelZ_dZnot_class_nor_functionÚ
class_nameZ	func_nameZ_itemr7   rh   Zcnamer;   rT   ri   r   r   r   r‹   D  sª    














z)OutlineExplorerTreeWidget.populate_branchc             C   sB   x<t |  ¡ ƒD ],}|  |¡}||kr0|  |¡ q|  |¡ qW dS )z?Root item has been selected: expanding it and collapsing othersN)rX   r~   r   Z
expandItemZcollapseItem)r   rT   rS   r\   r   r   r   r‰   ²  s
    
z,OutlineExplorerTreeWidget.root_item_selectedc             C   s2   | j dk	r.|  ¡  | j| j  }|  | j| ¡ dS )z"Reimplemented OneColumnTree methodN)rr   ZcollapseAllrq   r‰   ro   )r   r‚   r   r   r   Úrestore»  s    
z!OutlineExplorerTreeWidget.restorec             C   s$   |}xt | ¡ tƒr| ¡ }qW |S )N)rA   r7   r   )r   rT   r\   r   r   r   Úget_root_itemÂ  s    z'OutlineExplorerTreeWidget.get_root_itemc       	      C   sÊ   d}t |tƒr|j}|  |¡}d| _|rF|  ¡ j |j|| 	d¡¡ n|  ¡ j
 |j¡ d| _| j ¡ }x\t| j ¡ ƒD ]J\}}||krxx6t| j ¡ ƒD ]$\}}||kr˜| ¡ |kr˜|| _P q˜W P qxW dS )zDouble-click eventr   TFN)rA   r5   r9   r¡   rn   r7   Ú	edit_gotoÚemitr)   r   Úeditrr   r`   ro   ra   rq   )	r   rT   r9   r\   r7   r‚   Zi_itemrŽ   Z_idr   r   r   Ú	activatedÈ  s"    


z#OutlineExplorerTreeWidget.activatedc             C   s"   t |tƒr|  |¡ |  |¡ dS )zClick eventN)rA   r&   r‰   r¥   )r   rT   r   r   r   ÚclickedÝ  s    

z!OutlineExplorerTreeWidget.clicked)FTT)N)r"   r#   r$   r'   r}   r   Úboolry   r   r{   r|   rx   r†   r‘   r“   rƒ   r”   r   r‹   r‰   r    r¡   r¥   r¦   r   r   r   r   rj   ¶   s(    


n	rj   c               @   st   e Zd ZdZeeeeƒZeeƒZeƒ Z	ddd„Z
eeƒdd„ ƒZdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚOutlineExplorerWidgetzClass browserNTc             C   sŠ   t  | |¡ t| |||d| _t| tdƒd| jd| _| j d¡ t	ƒ }| 
tj¡ x|  ¡ D ]}| |¡ q^W t|| jƒ}|  |¡ d S )N)rk   rl   rm   zShow/hide outline explorerzoutline_explorer_vis.png)r,   rw   T)r
   r'   rj   r.   r   r   Útoggle_visibilityZvisibility_actionrz   r   ZsetAlignmentr   Z	AlignLeftÚsetup_buttonsZ	addWidgetr   Z	setLayout)r   r7   rk   rl   rm   Z
btn_layoutZbtnZlayoutr   r   r   r'   ê  s     
zOutlineExplorerWidget.__init__c             C   s<   |   |¡ | jj}|d k	r8| ¡  | ¡  |r8| j ¡  d S )N)Z
setVisibler.   rr   Z
clearFocusZsetFocusÚoutlineexplorer_is_visibler£   )r   r€   rr   r   r   r   r©     s    
z'OutlineExplorerWidget.toggle_visibilityc             C   sp   t | t d¡tdƒ| jjd}|g}xF| jj| jj| jj| jj	| jj
gD ] }| t | ƒ¡ |d  |¡ qHW |S )z9Setup the buttons of the outline explorer widget toolbar.ru   zGo to cursor position)r,   Ztiprv   rN   )r   r+   r,   r   r.   rx   Zcollapse_all_actionZexpand_all_actionZrestore_actionZcollapse_selection_actionZexpand_selection_actionr›   ZsetDefaultAction)r   Zfromcursor_btnZbuttonsÚactionr   r   r   rª     s    
z#OutlineExplorerWidget.setup_buttonsc             C   s,   |r|   |¡ |jd k	r(| j |||¡ d S )N)r”   r™   r.   r‘   )r   rŽ   r   r   r†   r   r   r   r‘     s    

z(OutlineExplorerWidget.set_current_editorc             C   s   | j  |¡ d S )N)r.   r”   )r   rŽ   r   r   r   r”   "  s    z#OutlineExplorerWidget.remove_editorc             C   s0   t | jj| jj| jj| j ¡ | j ¡ |  ¡ dS )z1
        Return outline explorer options
        )rk   rl   rm   Zexpanded_stateZscrollbar_positionZ
visibility)Údictr.   rk   rl   rm   Zget_expanded_stateZget_scrollbar_positionZ	isVisible)r   r   r   r   Úget_options%  s    z!OutlineExplorerWidget.get_optionsc             C   s   | j  ¡  d S )N)r.   rƒ   )r   r   r   r   r   0  s    zOutlineExplorerWidget.updatec             C   s   | j  ||¡ d S )N)r.   r“   )r   rŽ   r’   r   r   r   r“   3  s    z"OutlineExplorerWidget.file_renamed)NTTT)r"   r#   r$   r%   r   r=   Úintr¢   r¤   r«   r'   r   r§   r©   rª   r‘   r”   r®   r   r“   r   r   r   r   r¨   ä  s    

r¨   )NN).r%   Z
__future__r   Úos.pathr)   r3   r   Zqtpy.compatr   Zqtpy.QtCorer   r   r   Zqtpy.QtWidgetsr   r   r	   r
   Zspyder.config.baser   r   Zspyder.py3compatr   Zspyder.utilsr   r+   Zspyder.utils.qthelpersr   r   r   r   Zspyder.widgets.onecolumntreer   Úobjectr   r&   r5   r?   r@   rF   rK   rZ   r^   rc   rj   r¨   r   r   r   r   Ú<module>   s2   
  0