B
    nôb\í“  ã               @   st  d Z ddlZddlZddlZddlmZ ddlZddlZddl	Z	ddl
mZ ddlmZmZmZmZmZmZ ddlmZmZ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&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, ddl+m-Z. ddl/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z: G dd„ de:e6e8ƒZ;G dd„ de7e;e5ƒZ<G dd„ de;ƒZ=dS )z(Shell widgets: base, python and terminalé    N)Úgetsavefilename)ÚPropertyÚQCoreApplicationÚQtÚQTimerÚSignalÚSlot)ÚQKeySequenceÚQTextCharFormatÚQTextCursor)ÚQApplicationÚQMenuÚQToolTip)Ú_ÚDEBUGÚget_conf_pathÚSTDERR)Úconfig_shortcutÚget_shortcut)ÚCONF)ÚbuiltinsÚ	is_stringÚis_text_stringÚPY3Úto_text_string)Úencoding)Úicon_manager)Úadd_actionsÚcreate_actionÚ
keybindingÚrestore_keyevent)ÚGetHelpMixinÚSaveHistoryMixinÚTracebackLinksMixinÚBrowseHistoryMixin)ÚConsoleBaseWidgetc               @   sà  e Zd ZdZeeƒZeƒ ZeeƒZ	eeeƒZ
dcdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zeƒ dd„ ƒZdd„ Zdd„ ZedeeƒZdd„ Zdd„ Zeƒ dd„ ƒZdd „ Zeƒ d!d"„ ƒZeƒ d#d$„ ƒZeƒ d%d&„ ƒZd'd(„ Zd)d*„ Z d+d,„ Z!eƒ d-d.„ ƒZ"d/d0„ Z#d1d2„ Z$d3d4„ Z%d5d6„ Z&d7d8„ Z'd9d:„ Z(d;d<„ Z)d=d>„ Z*d?d@„ Z+dAdB„ Z,dCdD„ Z-dEdF„ Z.dGdH„ Z/dIdJ„ Z0dKdL„ Z1dMdN„ Z2dOdP„ Z3dQdR„ Z4dddSdT„Z5dedUdV„Z6dfdWdX„Z7dYdZ„ Z8d[d\„ Z9d]d^„ Z:d_d`„ Z;dadb„ Z<dS )gÚShellBaseWidgetz
    Shell base widget
    FNc             C   sÌ   t  | |¡ t | |¡ t | ¡ d| _d| _t|ƒs:t‚|  ¡ | _	t
 ddtdƒ¡| _d| _|  ¡  || _g | _|r‚| j |¡ d| _t| ƒ| _| j d¡ | jj | j¡ |  ¡  |  t
 dd¡¡ dS )z6
        parent : specifies the parent widget
        NTÚmainÚhistorylog_filenamezhistory.logg        zcursor/width)r%   Ú__init__r"   r$   Úcurrent_prompt_posÚnew_input_liner   ÚAssertionErrorÚload_historyÚhistoryr   Úgetr   r(   ÚmenuÚsetup_context_menuÚprofileÚ_ShellBaseWidget__bufferÚappendÚ_ShellBaseWidget__timestampr   Ú_ShellBaseWidget__flushtimerZsetSingleShotZtimeoutZconnectÚflushÚsetFocusZsetCursorWidth)ÚselfÚparentÚhistory_filenamer2   Úinitial_message© r=   ú3lib/python3.7/site-packages/spyder/widgets/shell.pyr)   7   s*    


zShellBaseWidget.__init__c             C   s   |   |rdnd¡ dS )zEnable/disable wrap modeÚ	characterN)Zset_wrap_mode)r9   Úenabler=   r=   r>   Útoggle_wrap_modec   s    z ShellBaseWidget.toggle_wrap_modec             C   sX   |   |¡ |  |¡ |  ¡ }| tj¡ tƒ }| | ¡ ¡ | 	| 
¡ ¡ | |¡ dS )zSet shell styles fontN)ZsetFontZset_pythonshell_fontZ
textCursorZselectr   ZDocumentr
   ZsetFontFamilyZfamilyZsetFontPointSizeZ	pointSizeZmergeCharFormat)r9   ZfontÚcursorZ
charformatr=   r=   r>   Úset_fontg   s    

zShellBaseWidget.set_fontc          
   C   s  t | ƒ| _t| tdƒtdƒt d¡| jd| _t| tdƒtdƒt d¡| j	d| _
t| tdƒtdƒt d¡| jd}t| tdƒt d	¡td
ƒ| jd}t| tdƒtdƒt d¡| jd| _t| tdƒtdƒt d¡| jd}t| j| j| j
|| jd|d|fƒ dS )zSetup shell context menuZCutZeditcut)ZshortcutÚiconÚ	triggeredZCopyZeditcopyZPasteZ	editpastezSave history log...ZfilesavezESave current history log (i.e. all inputs and outputs) in a text file)rD   ÚtiprE   ZDeleteÚ
editdeletez
Select AllZ	SelectAllZ	selectallN)r   r0   r   r   r   ÚimarD   ÚcutÚ
cut_actionÚcopyÚcopy_actionÚpasteÚsave_historylogÚdeleteÚdelete_actionÚ	selectAllr   )r9   Zpaste_actionZsave_actionZselectall_actionr=   r=   r>   r1   t   s8    









z"ShellBaseWidget.setup_context_menuc             C   sH   |   ¡ }| j |¡ | j |¡ | j |¡ | j | ¡ ¡ | ¡  dS )zReimplement Qt methodN)	Úhas_selected_textrL   Ú
setEnabledrJ   rP   r0   ZpopupZ	globalPosÚaccept)r9   ÚeventÚstater=   r=   r>   ÚcontextMenuEvent”   s    z ShellBaseWidget.contextMenuEventc             C   s   |   dd¡S )NrB   Úeof)Úget_text)r9   r=   r=   r>   Úget_current_line_from_cursorŸ   s    z,ShellBaseWidget.get_current_line_from_cursorc             C   sB   |   d¡\}}| jdkr$|| }}n
| j\}}|  ||||¡ dS )z6Select current line (without selecting console prompt)rX   N)Úget_positionr*   ZsetSelection)r9   ÚlineÚindexZplineZpindexr=   r=   r>   Ú_select_input¢   s
    

zShellBaseWidget._select_inputc             C   s   |   ¡  dS )ze
        Clear terminal window
        Child classes reimplement this method to write prompt
        N)Úclear)r9   r=   r=   r>   Úclear_terminal«   s    zShellBaseWidget.clear_terminalc             C   s4   | j dk	r|  | j d|¡ n
|  |¡ |  d¡ dS )zSet input bufferNÚeolrX   )r*   Zreplace_textÚinsertÚset_cursor_position)r9   Útextr=   r=   r>   Ú_set_input_buffer´   s    

z!ShellBaseWidget._set_input_bufferc             C   s.   d}| j dk	r*|  | j d¡}| tjd¡}|S )zReturn input bufferÚ Nra   Ú
)r*   rY   ÚreplaceÚosÚlinesep)r9   Úinput_bufferr=   r=   r>   Ú_get_input_buffer¼   s
    
z!ShellBaseWidget._get_input_bufferZQStringc             C   sF   |   ¡ d dkr|  d¡ | j|dd |  d¡| _|  ¡  d| _dS )	zH
        Print a new prompt and save its (line, index) position
        é   r   rg   T)ÚpromptrB   FN)Zget_cursor_line_columnÚwriter[   r*   ZensureCursorVisibler+   )r9   rn   r=   r=   r>   Ú
new_promptÈ   s    
zShellBaseWidget.new_promptc             C   s&   | j dkr|  d¡ n|  | j ¡ dS )zf
        Check if selected text is r/w,
        otherwise remove read-only parts of selection
        NrX   )r*   rc   Ztruncate_selection)r9   r=   r=   r>   Úcheck_selectionÔ   s    
zShellBaseWidget.check_selectionc             C   s*   |   ¡ rt | ¡ ntjdks&|  ¡  dS )z/Copy text to clipboard... or keyboard interruptÚdarwinN)rR   r%   rK   ÚsysÚplatformÚ	interrupt)r9   r=   r=   r>   rK   à   s    
zShellBaseWidget.copyc             C   s   | j  ¡  dS )zKeyboard interruptN)Úsig_keyboard_interruptÚemit)r9   r=   r=   r>   ru   è   s    zShellBaseWidget.interruptc             C   s   |   ¡  |  ¡ rt | ¡ dS )zCut textN)rq   rR   r%   rI   )r9   r=   r=   r>   rI   ì   s    zShellBaseWidget.cutc             C   s   |   ¡  |  ¡ rt | ¡ dS )zRemove selected textN)rq   rR   r%   Úremove_selected_text)r9   r=   r=   r>   rO   ó   s    zShellBaseWidget.deletec             C   s   t dƒ}| j d¡ t| || jdt dƒ ƒ\}}| j d¡ |rŒt |¡}y,t t	|  
¡ ƒ|¡ || _t dd|¡ W n tk
rŠ   Y nX dS )	z.Save current history log (all text in console)zSave history logFz
%s (*.log)zHistory logsTr'   r(   N)r   Úredirect_stdiorw   r   r(   ÚospÚnormpathr   ro   r   Zget_text_with_eolr   ÚsetÚEnvironmentError)r9   ÚtitleÚfilenameZ
_selfilterr=   r=   r>   rN   ú   s    
zShellBaseWidget.save_historylogc             C   s   |   |¡ dS )Úon_enterN)Úexecute_command)r9   Úcommandr=   r=   r>   r€     s    zShellBaseWidget.on_enterc             C   s    | j  |¡ |  |¡ d| _d S )NT)Úexecuterw   Zadd_to_historyr+   )r9   r‚   r=   r=   r>   r     s    
zShellBaseWidget.execute_commandc             C   s    |   d¡ |  d¡| _d| _dS )zOn new input linerX   rB   FN)rc   r[   r*   r+   )r9   r=   r=   r>   Úon_new_line  s    
zShellBaseWidget.on_new_linec             C   s   | j r|  ¡  t | ¡ dS )z3Reimplemented slot to handle multiline paste actionN)r+   r„   r%   rM   )r9   r=   r=   r>   rM     s    zShellBaseWidget.pastec             C   s   |   |¡rdS |  |¡ dS )z˜
        Reimplement Qt Method
        Basic keypress event handler
        (reimplemented in InternalShell to add more sophisticated features)
        N)Úpreprocess_keyeventÚpostprocess_keyevent)r9   rU   r=   r=   r>   ÚkeyPressEvent#  s    
zShellBaseWidget.keyPressEventc             C   s¨   |  ¡ tj@ }|  ¡ tj@ }| ¡ tjkrntjtjB |  ¡ @ rn|rVtjdkrV|  ¡  n|rb|  	¡  | 
¡  dS | jr¤t| ¡ ƒsœ| ¡ tjtjtjtjfkr¤|  ¡  dS )zUPre-process keypress event:
        return True if event is accepted, false otherwiserr   TF)Z	modifiersr   ZControlModifierZMetaModifierÚkeyZKey_Crs   rt   ru   rK   rT   r+   Úlenrd   ÚKey_UpÚKey_DownÚKey_LeftÚ	Key_Rightr„   )r9   rU   ÚctrlÚmetar=   r=   r>   r…   .  s    
z#ShellBaseWidget.preprocess_keyeventc             C   s€  t |ƒ\}}}}}t|ƒr8|  ¡ r*|  ¡  |  | jd¡ |  d¡}|tjtj	fkrz|  
¡ rd|  ¡  n| j|  ¡ dd n|tjkr |s |s |  |  ¡  ¡ nÜ|tjkrØ|  ¡ rÄ|  ¡  |  ¡  n|  
¡ rÔ|  ¡  n¤|tjkrð|  |¡ nŒ|tjkr|  ¡  nt|tjkr&|r&|  ¡  nV|tjkrn| j|krBdS |rN| jn| j}||r`dnddd	 n|tjkr´|  ¡ rˆdS |r”| jn| j}||r¦dndd
d	 nÈ|tjksÒ|tj krâ|râ|  !||¡ nš|tj"ks |tj#kr|r|  $||¡ nl|tj krt|  
¡ s0|  %d¡ |  &|¡d }|  &| j¡d }	||	krd|  '|¡ n| j(dd n|tj#krÖ|  
¡ s”|  %d¡ |  &|¡d }|  &d¡d }
||
k rÆ|  )|¡ n| j(dd n¦|tj*tj+fkrøt, -| |¡ n„|tj.kr|r|  /¡  nf|tj.kr.|  0¡  nN|tj1krL|rL|  2¡  n0|tj3krj|rj|  4¡  n|tj5kr†|r†|  6¡  nö|tj7kr¢|r¢|  8¡  nÚ|tj9kr¾|r¾|  :¡  n¾|tj;krÚ|rÚ|  <¡  n¢|tj=krü|  ¡ sü|  >|¡ n€|tj?kr|  ¡ s|  @|¡ n^|tjAkr@|  ¡ s@|  B|¡ n<t|ƒrp|  C¡ spd| _D|  |¡ |  E|¡ nt, -| |¡ dS )zcPost-process keypress event:
        in InternalShell, this is method is called when shell is readyrX   rB   T)Úat_endNZwordr?   Úleft)Ú	directionÚrightrm   )Zbackwardra   F)Fr    r‰   rR   rq   Zrestrict_cursor_positionr*   r[   r   Z
Key_ReturnZ	Key_EnterÚis_cursor_on_last_lineÚ
_key_enterÚinsert_textÚget_selected_textZ
Key_InsertZsetOverwriteModeZoverwriteModeZ
Key_Deleterx   Zstdkey_clearZKey_BackspaceÚ_key_backspaceZKey_TabÚ_key_tabZ	Key_SpaceÚ_key_ctrl_spacerŒ   Zextend_selection_to_nextZmove_cursor_to_nextr   Zis_cursor_at_endZKey_HomerŠ   Ú	_key_homeZKey_Endr‹   Ú_key_endrc   Zget_coordinatesZ	stdkey_upZbrowse_historyZstdkey_downZ
Key_PageUpZKey_PageDownr%   r‡   Z
Key_EscapeÚ
clear_lineÚ_key_escapeZKey_Lr`   ZKey_VrM   ZKey_XrI   ZKey_ZZundoZKey_YZredoZKey_ArQ   ZKey_QuestionÚ_key_questionZKey_ParenLeftÚ_key_parenleftZ
Key_PeriodÚ_key_periodZ
isReadOnlyZhist_wholelineÚ
_key_other)r9   rU   rd   rˆ   rŽ   ÚshiftÚcursor_positionÚmethodZy_cursorZy_promptZy_endr=   r=   r>   r†   E  sª    
















z$ShellBaseWidget.postprocess_keyeventc             C   s*   | j }| jddd |  |¡ |  ¡  d S )Nrg   T)r   )rk   r–   r€   r7   )r9   r‚   r=   r=   r>   r•   È  s    
zShellBaseWidget._key_enterc             C   s   t ‚d S )N)ÚNotImplementedError)r9   rd   r=   r=   r>   r¢   Í  s    zShellBaseWidget._key_otherc             C   s   t ‚d S )N)r¦   )r9   r¤   r=   r=   r>   r˜   Ï  s    zShellBaseWidget._key_backspacec             C   s   t ‚d S )N)r¦   )r9   r=   r=   r>   r™   Ñ  s    zShellBaseWidget._key_tabc             C   s   t ‚d S )N)r¦   )r9   r=   r=   r>   rš   Ó  s    zShellBaseWidget._key_ctrl_spacec             C   s   |   ¡ r|  ||| j¡ d S )N)r”   Zstdkey_homer*   )r9   r£   rŽ   r=   r=   r>   r›   Õ  s    zShellBaseWidget._key_homec             C   s   |   ¡ r|  ||¡ d S )N)r”   Z
stdkey_end)r9   r£   rŽ   r=   r=   r>   rœ   Ø  s    zShellBaseWidget._key_endc             C   s   t ‚d S )N)r¦   )r9   r=   r=   r>   Ú_key_pageupÛ  s    zShellBaseWidget._key_pageupc             C   s   t ‚d S )N)r¦   )r9   r=   r=   r>   Ú_key_pagedownÝ  s    zShellBaseWidget._key_pagedownc             C   s   t ‚d S )N)r¦   )r9   r=   r=   r>   rž   ß  s    zShellBaseWidget._key_escapec             C   s   t ‚d S )N)r¦   )r9   rd   r=   r=   r>   rŸ   á  s    zShellBaseWidget._key_questionc             C   s   t ‚d S )N)r¦   )r9   rd   r=   r=   r>   r    ã  s    zShellBaseWidget._key_parenleftc             C   s   t ‚d S )N)r¦   )r9   rd   r=   r=   r>   r¡   å  s    zShellBaseWidget._key_periodc             C   sÌ   t  | j¡rLt | j¡\}}dd„ |D ƒ}|d | jd krR| jd |d< n| j}dd„ |D ƒ}x>t|ƒt dd¡krž|d= x|d  	d¡r”|d= q~W |d= qbW yt 
|| j¡ W n tk
rÆ   Y nX |S )	z3Load history from a .py file in user home directoryc             S   s   g | ]}|  d d¡‘qS )rg   rf   )rh   )Ú.0r\   r=   r=   r>   ú
<listcomp>î  s    z0ShellBaseWidget.load_history.<locals>.<listcomp>rm   c             S   s   g | ]}|r|  d ¡s|‘qS )ú#)Ú
startswith)r©   r\   r=   r=   r>   rª   ó  s    Z
historylogZmax_entriesr   r«   )rz   Úisfiler;   r   Ú	readlinesÚINITHISTORYr‰   r   r/   r¬   Ú
writelinesr}   )r9   Z
rawhistoryr   r.   r=   r=   r>   r-   ê  s"    

zShellBaseWidget.load_historyc             C   s*   |   ¡  | j|ddd tr&t |¡ dS )zSimulate stderrT)r7   ÚerrorN)r7   ro   r   r   )r9   rd   r=   r=   r>   Úwrite_error  s    zShellBaseWidget.write_errorc             C   sx   |r|   ¡  t|ƒst|ƒ}| j |¡ t ¡ }|s8|rH| j ||d n,|| j dkrt| j |d || _| j d¡ dS )zSimulate stdout and stderr)r±   rn   gš™™™™™©?)r±   é2   N)	r7   r   r   r3   r4   Útimer5   r6   Ústart)r9   rd   r7   r±   rn   Ztsr=   r=   r>   ro     s    zShellBaseWidget.writec          	   C   sš   t r\yd | j¡}W qh tk
rX   d | j¡}y| t ¡ d ¡}W n   Y nX Y qhX nd | j¡}g | _| j|d||d t 	¡  |  
¡  d| _dS )z#Flush buffer, write text to consolerf   ó    rm   T)r   r±   rn   N)r   Újoinr3   Ú	TypeErrorÚdecodeÚlocaleZgetdefaultlocaler–   r   ZprocessEventsZrepaintr+   )r9   r±   rn   rd   r=   r=   r>   r7     s    zShellBaseWidget.flushc             C   s$   |r|   |||¡ nt | |¡ dS )zf
        Insert text at the current cursor position
        or at the end of the command line
        N)Zappend_text_to_shellr%   r–   )r9   rd   r   r±   rn   r=   r=   r>   r–   6  s    zShellBaseWidget.insert_textc             C   s   |rdS t  | |¡S )zE
        Reimplemented to stop Tab moving to the next window
        F)r%   ÚfocusNextPrevChild)r9   Únextr=   r=   r>   r»   D  s    z"ShellBaseWidget.focusNextPrevChildc             C   s   |  | ¡  d¡¡ dS )zDrag and Drop - Enter eventz
text/plainN)ZsetAcceptedÚmimeDataÚ	hasFormat)r9   rU   r=   r=   r>   ÚdragEnterEventN  s    zShellBaseWidget.dragEnterEventc             C   s0   |  ¡  d¡r$| tj¡ | ¡  n| ¡  dS )zDrag and Drop - Move eventz
text/plainN)r½   r¾   ÚsetDropActionr   Ú
MoveActionrT   Úignore)r9   rU   r=   r=   r>   ÚdragMoveEventR  s    
zShellBaseWidget.dragMoveEventc             C   sd   |  ¡  d¡rXt|  ¡  ¡ ƒ}| jr,|  ¡  | j|dd |  ¡  | t	j
¡ | ¡  n| ¡  dS )zDrag and Drop - Drop eventz
text/plainT)r   N)r½   r¾   r   rd   r+   r„   r–   r8   rÀ   r   rÁ   rT   rÂ   )r9   rU   rd   r=   r=   r>   Ú	dropEventZ  s    
zShellBaseWidget.dropEventc             C   s   t ‚dS )zDrop path listN)r¦   )r9   Úpathlistr=   r=   r>   Údrop_pathlistg  s    zShellBaseWidget.drop_pathlist)FN)FFF)FF)FFF)=Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úboolry   rv   Ústrrƒ   Zappend_to_historyr)   rA   rC   r1   rW   rZ   r^   r   r`   re   rl   r   rk   rp   rq   rK   ru   rI   rO   rN   r€   r   r„   rM   r‡   r…   r†   r•   r¢   r˜   r™   rš   r›   rœ   r§   r¨   rž   rŸ   r    r¡   r-   r²   ro   r7   r–   r»   r¿   rÃ   rÄ   rÆ   r=   r=   r=   r>   r&   ,   sn   
 
+ 		 



r&   c               @   s4  e Zd ZdZeZddgZdejd e	 
¡ f ZeeƒZdDdd	„Zd
d„ Zdd„ Zdd„ Z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!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Z d*d+„ Z!d,d-„ Z"d.d/„ Z#d0d1„ Z$d2d3„ Z%d4d5„ Z&d6d7„ Z'd8d9„ Z(d:d;„ Z)d<d=„ Z*dEd>d?„Z+d@dA„ Z,dBdC„ Z-dS )FÚPythonShellWidgetzPython shell widgetz# -*- coding: utf-8 -*-z+# *** Spyder Python Console History Log ***z%s##---(%s)---é   FNc             C   s4   t  | ||||¡ t | ¡ t | ¡ |  ¡ | _d S )N)r&   r)   r#   r!   Úcreate_shortcutsÚ	shortcuts)r9   r:   r;   r2   r<   r=   r=   r>   r)   z  s
    

zPythonShellWidget.__init__c                sL   t ‡ fdd„ddˆ d}t ‡ fdd„ddˆ d}t ˆ jdd	ˆ d}|||gS )
Nc                  s   ˆ   ¡ S )N)Zenter_array_inliner=   )r9   r=   r>   Ú<lambda>„  s    z4PythonShellWidget.create_shortcuts.<locals>.<lambda>Zarray_builderzenter array inline)ÚcontextÚnamer:   c                  s   ˆ   ¡ S )N)Zenter_array_tabler=   )r9   r=   r>   rÑ   ‡  s    zenter array tableZConsolezInspect current object)r   Zinspect_current_object)r9   Zarray_inlineZarray_tableZ	inspectscr=   )r9   r>   rÏ   ƒ  s    

z"PythonShellWidget.create_shortcutsc             C   s   dd„ | j D ƒS )zæ
        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
        c             S   s   g | ]
}|j ‘qS r=   )Údata)r©   Zscr=   r=   r>   rª   —  s    z7PythonShellWidget.get_shortcut_data.<locals>.<listcomp>)rÐ   )r9   r=   r=   r>   Úget_shortcut_data  s    z#PythonShellWidget.get_shortcut_datac             C   sœ   t  | ¡ t| tdƒt d¡| jd| _t| tdƒtt	ddƒƒt d¡tdƒ| j
d}t| tdƒtt	ddƒƒt d	¡td
ƒ| jd}t| j| j||fƒ dS )z#Reimplements ShellBaseWidget methodzCopy without promptsZcopywop)rD   rE   z
Clear lineZconsolerG   )rD   rF   rE   zClear shellZ	editclearz$Clear shell contents ('cls' command)N)r&   r1   r   r   rH   rD   Úcopy_without_promptsÚcopy_without_prompts_actionr	   r   r   r`   r   r0   )r9   Zclear_line_actionZclear_actionr=   r=   r>   r1   š  s&    





z$PythonShellWidget.setup_context_menuc             C   s$   |   ¡ }| j |¡ t | |¡ dS )z#Reimplements ShellBaseWidget methodN)rR   r×   rS   r&   rW   )r9   rU   rV   r=   r=   r>   rW   ±  s    z"PythonShellWidget.contextMenuEventc             C   sl   |   ¡ }| tj¡}x8t|ƒD ],\}}| d¡s:| d¡r|dd… ||< qW tj |¡}t ¡  	|¡ dS )z&Copy text to clipboard without promptsz>>> z... é   N)
r—   Úsplitri   rj   Ú	enumerater¬   r·   r   Ú	clipboardZsetText)r9   rd   Úlinesr]   r\   r=   r=   r>   rÖ   ·  s    z&PythonShellWidget.copy_without_promptsc             C   s4   t  | |¡ t ¡ r0t|ƒ\}}}}}|  |¡ dS )zProcess keypress eventN)r&   r†   r   Z	isVisibler    Zhide_tooltip_if_necessary)r9   rU   Z_eventZ_textrˆ   Z_ctrlZ_shiftr=   r=   r>   r†   Ä  s    z&PythonShellWidget.postprocess_keyeventc             C   s   |   ¡ r|  j|7  _dS )z1 character keyN)Úis_completion_widget_visibleÚcompletion_text)r9   rd   r=   r=   r>   r¢   Ë  s    zPythonShellWidget._key_otherc             C   sT   |   ¡ r|  ¡  |  ¡  n6| j|kr(dS |  ¡ rP|  ¡  |  ¡ rP| jdd… | _dS )zAction for Backspace keyNéÿÿÿÿ)rR   rq   rx   r*   r”   Ústdkey_backspacerÝ   rÞ   )r9   r¤   r=   r=   r>   r˜   Ð  s    

z PythonShellWidget._key_backspacec             C   s4   |   ¡ r0|  ¡  ¡  }|r$|  ¡  n| jdd dS )zAction for TAB keyF)Ú	automaticN)r”   Úget_current_line_to_cursorÚstripÚ
stdkey_tabÚshow_code_completion)r9   Z
empty_liner=   r=   r>   r™   ß  s
    
zPythonShellWidget._key_tabc             C   s   |   ¡ s| jdd dS )zAction for Ctrl+SpaceF)rá   N)rÝ   rå   )r9   r=   r=   r>   rš   è  s    z!PythonShellWidget._key_ctrl_spacec             C   s   dS )zAction for PageUp keyNr=   )r9   r=   r=   r>   r§   í  s    zPythonShellWidget._key_pageupc             C   s   dS )zAction for PageDown keyNr=   )r9   r=   r=   r>   r¨   ñ  s    zPythonShellWidget._key_pagedownc             C   s   |   ¡ r|  ¡  dS )zAction for ESCAPE keyN)rÝ   Úhide_completion_widget)r9   r=   r=   r>   rž   õ  s    zPythonShellWidget._key_escapec             C   sJ   |   ¡ r&|  ¡ }|r&| ¡ s&|  |¡ |  |¡ |  ¡ rF|  jd7  _dS )zAction for '?'ú?N)râ   Úget_last_objÚisdigitÚshow_object_infor–   rÝ   rÞ   )r9   rd   Úlast_objr=   r=   r>   rŸ   ú  s    

zPythonShellWidget._key_questionc             C   sN   |   ¡  |  ¡ r@|  ¡ }|r@| ¡ s@|  |¡ | j|dd dS |  |¡ dS )zAction for '('T)ZcallN)ræ   râ   rè   ré   r–   rê   )r9   rd   rë   r=   r=   r>   r      s    
z PythonShellWidget._key_parenleftc             C   s4   |   |¡ | jr0|  ¡ }|r0| ¡ s0| jdd dS )zAction for '.'T)rá   N)r–   Zcodecompletion_autorè   ré   rå   )r9   rd   rë   r=   r=   r>   r¡     s
    
zPythonShellWidget._key_periodc             C   s€   t t ¡  ¡ ƒ}t| ¡ ƒdkrr| jr.|  ¡  |  ¡  |  	¡ }|  
¡ | | }|  ¡  |  |¡ |  t|ƒ ¡ n
t | ¡ dS )z3Reimplemented slot to handle multiline paste actionrm   N)r   r   rÛ   rd   r‰   Ú
splitlinesr+   r„   rx   rZ   râ   r   Zexecute_linesZmove_cursorr&   rM   )r9   rd   ÚendrÜ   r=   r=   r>   rM     s    
zPythonShellWidget.pastec             C   s   t ‚dS )zReturn dir(object)N)r¦   )r9   Úobjtxtr=   r=   r>   Úget_dir0  s    zPythonShellWidget.get_dirc             C   s   dS )z7Return module completion list associated to object nameNr=   )r9   rî   r=   r=   r>   Úget_module_completion3  s    z'PythonShellWidget.get_module_completionc             C   s   t ‚dS )zReturn shell globals() keysN)r¦   )r9   r=   r=   r>   Úget_globals_keys6  s    z"PythonShellWidget.get_globals_keysc             C   s   t ‚dS )z'Return shell current directory list dirN)r¦   )r9   r=   r=   r>   Úget_cdlistdir9  s    zPythonShellWidget.get_cdlistdirc             C   s   t ‚dS )zIs object callable?N)r¦   )r9   rî   r=   r=   r>   Ú
iscallable<  s    zPythonShellWidget.iscallablec             C   s   t ‚dS )zGet func/method argument listN)r¦   )r9   rî   r=   r=   r>   Úget_arglist?  s    zPythonShellWidget.get_arglistc             C   s   t ‚dS )zGet object __doc__N)r¦   )r9   rî   r=   r=   r>   Ú
get__doc__B  s    zPythonShellWidget.get__doc__c             C   s   t ‚dS )z#Get object documentation dictionaryN)r¦   )r9   rî   r=   r=   r>   Úget_docE  s    zPythonShellWidget.get_docc             C   s   t ‚dS )zGet object sourceN)r¦   )r9   rî   r=   r=   r>   Ú
get_sourceH  s    zPythonShellWidget.get_sourcec             C   s   t ‚dS )z Return True if object is definedN)r¦   )r9   rî   Zforce_importr=   r=   r>   Ú
is_definedK  s    zPythonShellWidget.is_definedc             C   st  t |  ¡ ƒ}|  ¡ }|sdS | d¡rl|  |¡}| d¡}d|d krT|d  d¡}| j||d |d dS | d¡rú|  |¡}|dkrŒdS | d¡}d|d kr¼|dd	… |d  d¡ }d|d krâ|dd	… |d  d¡ }| j||d |d dS |  |¡}|r.|r.| d
¡r.| j||d dS | d
¡s¢|r¢t	 
d|¡r¢ttƒ|  ¡  tj }x<|D ]0}| |¡rj||krj| j|||d dS qjW dS |dkr°|}| d
¡}	|	dkr |	t|ƒd krÜd}
n||	d d… }
|d|	… }|  |¡}|dk	r | j||
|d dS t| d¡| d¡gƒ}|dkrp|  ¡ }|rl| j|||d d… |d dS dS )z3Display a completion list based on the current lineNzimport ú ú,rß   )rÞ   rá   zfrom ú(éþÿÿÿÚ.)rá   z[a-zA-Z_0-9]*$rm   rf   ú'ú")r   râ   rè   r¬   rð   rÙ   Zshow_completion_listrï   ÚendswithÚreÚmatchÚdirr   rñ   ÚkeywordÚkwlistÚrfindr‰   Úmaxrò   )r9   rá   rd   rë   Zobj_listZwordsZobj_dirZb_k_gZobjnameZdot_posrÞ   ZcompletionsZq_posr=   r=   r>   rå   O  sv    














z&PythonShellWidget.show_code_completionc             C   s^   |rZdd„ |D ƒ}t |ƒdkr(|d }ndd |¡ d }| jrH|  ¡  |  |¡ |  ¡  dS )	zDrop path listc             S   s   g | ]}d | ‘qS )zr'%s'r=   )r©   Úpathr=   r=   r>   rª   ž  s    z3PythonShellWidget.drop_pathlist.<locals>.<listcomp>rm   r   ú[z, ú]N)r‰   r·   r+   r„   r–   r8   )r9   rÅ   Úfilesrd   r=   r=   r>   rÆ   ›  s    

zPythonShellWidget.drop_pathlist)FN)F).rÇ   rÈ   rÉ   rÊ   r&   ZQT_CLASSr¯   ri   rj   r´   ÚctimeÚ	SEPARATORr   rÌ   Úgo_to_errorr)   rÏ   rÕ   r1   rW   r   rÖ   r†   r¢   r˜   r™   rš   r§   r¨   rž   rŸ   r    r¡   rM   rï   rð   rñ   rò   ró   rô   rõ   rö   r÷   rø   rå   rÆ   r=   r=   r=   r>   rÍ   q  sH   
	
	
LrÍ   c               @   s    e Zd ZdZejdkrdndZde egZdejd ee	 
¡ f ZeeƒZdd	d
„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTerminalWidgetz
    Terminal widget
    ÚntZremr«   z&%s *** Spyder Terminal History Log ***z%s%s ---(%s)---rÎ   Fc             C   s   t  | |||¡ d S )N)r&   r)   )r9   r:   r;   r2   r=   r=   r>   r)   ²  s    zTerminalWidget.__init__c             C   s   dS )z1 character keyNr=   )r9   rd   r=   r=   r>   r¢   ¶  s    zTerminalWidget._key_otherc             C   s<   |   ¡ r|  ¡  |  ¡  n| j|kr(dS |  ¡ r8|  ¡  dS )zAction for Backspace keyN)rR   rq   rx   r*   r”   rà   )r9   r¤   r=   r=   r>   r˜   º  s    

zTerminalWidget._key_backspacec             C   s   |   ¡ r|  ¡  dS )zAction for TAB keyN)r”   rä   )r9   r=   r=   r>   r™   Å  s    zTerminalWidget._key_tabc             C   s   dS )zAction for Ctrl+SpaceNr=   )r9   r=   r=   r>   rš   Ê  s    zTerminalWidget._key_ctrl_spacec             C   s   |   ¡  dS )zAction for ESCAPE keyN)r   )r9   r=   r=   r>   rž   Î  s    zTerminalWidget._key_escapec             C   s   |   |¡ dS )zAction for '?'N)r–   )r9   rd   r=   r=   r>   rŸ   Ò  s    zTerminalWidget._key_questionc             C   s   |   |¡ dS )zAction for '('N)r–   )r9   rd   r=   r=   r>   r    Ö  s    zTerminalWidget._key_parenleftc             C   s   |   |¡ dS )zAction for '.'N)r–   )r9   rd   r=   r=   r>   r¡   Ú  s    zTerminalWidget._key_periodc             C   sV   |rRdd„ |D ƒ}t |ƒdkr(|d }n
d |¡}| jr@|  ¡  |  |¡ |  ¡  dS )zDrop path listc             S   s   g | ]}d | ‘qS )z"%s"r=   )r©   r  r=   r=   r>   rª   ã  s    z0TerminalWidget.drop_pathlist.<locals>.<listcomp>rm   r   rù   N)r‰   r·   r+   r„   r–   r8   )r9   rÅ   r  rd   r=   r=   r>   rÆ   à  s    


zTerminalWidget.drop_pathlistN)F)rÇ   rÈ   rÉ   rÊ   ri   rÓ   ZCOMr¯   rj   r´   r  r  r   rÌ   r  r)   r¢   r˜   r™   rš   rž   rŸ   r    r¡   rÆ   r=   r=   r=   r>   r  ©  s   
r  )>rÊ   r  rº   ri   Úos.pathr  rz   r  rs   r´   Zqtpy.compatr   Zqtpy.QtCorer   r   r   r   r   r   Z
qtpy.QtGuir	   r
   r   Zqtpy.QtWidgetsr   r   r   Zspyder.config.baser   r   r   r   Zspyder.config.guir   r   Zspyder.config.mainr   Zspyder.py3compatr   r   r   r   r   Zspyder.utilsr   r   rH   Zspyder.utils.qthelpersr   r   r   r    Zspyder.widgets.mixinsr!   r"   r#   r$   Zspyder.widgets.sourcecode.baser%   r&   rÍ   r  r=   r=   r=   r>   Ú<module>   s>        H  9