
    G@d                        d Z ddl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 ddlmZmZmZ ddlmZmZ ddlmZmZmZmZ ddlm Z  dd	l!m"Z"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/m0Z0m1Z1m2Z2 ddl3m4Z4 dZ5 G d de4e0e2          Z6 G d de1e6e/          Z7 G d de6          Z8dS )z(Shell widgets: base, python and terminal    N)getsavefilename)PropertyQtQTimerSignalSlot)QKeySequenceQTextCharFormatQTextCursor)QApplicationQMenu)_get_conf_pathget_debug_levelSTDERR)CONF)	is_stringis_text_stringto_text_string)encoding)ima)add_actionscreate_action
keybindingrestore_keyevent)GetHelpMixinSaveHistoryMixinTracebackLinksMixinBrowseHistoryMixin)ConsoleBaseWidgeti  c                   n   e Zd ZdZ ee          Z e            Z ee          Z	 eee          Z
	 	 	 	 d4dZd Zd Zd Zd Zd	 Zd
 Z e            d             Zd Zd Z edee          Zd Zd Z e            d             Zd Z e            d             Z e            d             Z e            d             Zd Zd Z d Z! e            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' Z0d( Z1d) Z2d* Z3d+ Z4d5d,Z5d6d-Z6d5d.Z7d/ Z8d0 Z9d1 Z:d2 Z;d3 Z<dS )7ShellBaseWidgetz
    Shell base widget
    FNc
                 2   t          j        | |           t          j        | |           t          j        |            d| _        d| _        t          |          sJ |                                 | _        t          j
        ddt          d                    | _        d| _        |                                  || _        g | _        |r| j                            |           d| _        t'          |           | _        | j                            d           | j        j                            | j                   |                                  |                     t          j
        dd                     | j        j                                         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   load_historyhistoryr   getr   r%   menusetup_context_menuprofile_ShellBaseWidget__bufferappend_ShellBaseWidget__timestampr   _ShellBaseWidget__flushtimersetSingleShottimeoutconnectflushsetFocussetCursorWidthcompletion_widgetcurrentRowChanged
disconnect)
selfparenthistory_filenamer.   initial_messagedefault_foreground_colorerror_foreground_colortraceback_foreground_colorprompt_foreground_colorbackground_colors
             Dlib/python3.11/site-packages/spyder/plugins/console/widgets/shell.pyr&   zShellBaseWidget.__init__:   s    	"4000!$(8999#D))) #'" ./////((** $(8F4I,9-,H,H$J $J  	!!!   	2M  111"4LL''---!))$*555 	 	DHV^<<=== 	0;;=====    c                 8    |                      |rdnd           dS )zEnable/disable wrap mode	characterN)set_wrap_mode)r<   enables     rE   toggle_wrap_modez ShellBaseWidget.toggle_wrap_modek   s%    &:;;d;;;;;rF   c                    |                      |           |                     |           |                                 }|                    t          j                   t                      }|                    |                                           |	                    |
                                           |                    |           dS )zSet shell styles fontN)setFontset_pythonshell_font
textCursorselectr   Documentr
   setFontFamilyfamilysetFontPointSize	pointSizemergeCharFormat)r<   fontcursor
charformats       rE   set_fontzShellBaseWidget.set_fonto   s    T!!$'''""k*+++$&&
  ///##DNN$4$4555z*****rF   c                    t          |           | _        t          | t          d          t	          d          t          j        d          | j                  | _        t          | t          d          t	          d          t          j        d          | j	                  | _
        t          | t          d          t	          d          t          j        d          | j                  }t          | t          d          t          j        d	          t          d
          | j                  }t          | t          d          t	          d          t          j        d          | j                  | _        t          | t          d          t	          d          t          j        d          | j                  }t!          | j        | j        | j
        || j        d|d|f           dS )zSetup shell context menuCuteditcut)shortcuticon	triggeredCopyeditcopyPaste	editpastezSave history log...filesavezESave current history log (i.e. all inputs and outputs) in a text filer_   tipr`   Delete
editdeletez
Select All	SelectAll	selectallN)r   r,   r   r   r   r   r_   cut
cut_actioncopycopy_actionpastesave_historylogdeletedelete_action	selectAllr   )r<   paste_actionsave_actionselectall_actions       rE   r-   z"ShellBaseWidget.setup_context_menu|   s   $KK	'ahh1;E1B1B-0Xi-@-@26(< < < )qyy2<V2D2D.1hz.B.B379> > > %T1W::.8.A.A*-(;*?*?/3z; ; ; $D!,A*B*B),*)=)=() +O )P )P.2.B	D D D
 +48-7-A-A),,)?)?.2k; ; ; )q-7-D-D),+)>)>.2n> > > 	DI1A ,d.@$ 0$ E 	G 	G 	G 	G 	GrF   c                 J   |                                  }| j                            |           | j                            |           | j                            |           | j                            |                                           |                                 dS )zReimplement Qt methodN)	has_selected_textro   
setEnabledrm   rs   r,   popup	globalPosacceptr<   eventstates      rE   contextMenuEventz ShellBaseWidget.contextMenuEvent   s    &&((##E***""5)))%%e,,,	))***rF   c                 .    |                      dd          S )NrX   eof)get_textr<   s    rE   get_current_line_from_cursorz,ShellBaseWidget.get_current_line_from_cursor   s    }}Xu---rF   c                     |                      d          \  }}| j        ||}}n
| j        \  }}|                     ||||           dS )z6Select current line (without selecting console prompt)r   N)get_positionr'   setSelection)r<   lineindexplinepindexs        rE   _select_inputzShellBaseWidget._select_input   sY    ''..e"* %6EE 3ME6%u55555rF   c                 .    |                                   dS )ze
        Clear terminal window
        Child classes reimplement this method to write prompt
        N)clearr   s    rE   clear_terminalzShellBaseWidget.clear_terminal   s     	

rF   c                     | j         |                     | j         d|           n|                     |           |                     d           dS )zSet input bufferNeolr   )r'   replace_textinsertset_cursor_positionr<   texts     rE   _set_input_bufferz!ShellBaseWidget._set_input_buffer   sU    ".d5udCCCCKK  '''''rF   c                     d}| j         ;|                     | j         d          }|                    t          j        d          }|S )zReturn input buffer Nr   
)r'   r   replaceoslinesep)r<   input_buffers     rE   _get_input_bufferz!ShellBaseWidget._get_input_buffer   sC    ".==)@%HHL'//
DAALrF   QStringc                    |                                  d         dk    r|                     d           |                     |d           |                     d          | _        |                                  d| _        dS )	zH
        Print a new prompt and save its (line, index) position
           r   r   T)promptrX   FN)get_cursor_line_columnwriter   r'   ensureCursorVisibler(   )r<   r   s     rE   
new_promptzShellBaseWidget.new_prompt   s~     &&((+q00JJt

6$
'''"&"3"3H"="=  """#rF   c                 v    | j         |                     d           dS |                     | j                    dS )zf
        Check if selected text is r/w,
        otherwise remove read-only parts of selection
        Nr   )r'   r   truncate_selectionr   s    rE   check_selectionzShellBaseWidget.check_selection   sD    
 "*$$U+++++##D$;<<<<<rF   c                     |                                  rt          j        |            dS t          j        dk    s|                                  dS dS )z/Copy text to clipboard... or keyboard interruptdarwinN)ry   r    rn   sysplatform	interruptr   s    rE   rn   zShellBaseWidget.copy   sZ     !!## 	"4((((())NN *)rF   c                 8    | j                                          dS )zKeyboard interruptN)sig_keyboard_interruptemitr   s    rE   r   zShellBaseWidget.interrupt   s    #((*****rF   c                     |                                   |                                 rt          j        |            dS dS )zCut textN)r   ry   r    rl   r   s    rE   rl   zShellBaseWidget.cut   sK     	!!## 	(!$'''''	( 	(rF   c                     |                                   |                                 rt          j        |            dS dS )zRemove selected textN)r   ry   r    remove_selected_textr   s    rE   rr   zShellBaseWidget.delete   sK     	!!## 	92488888	9 	9rF   c           	         t          d          }| j                            d           t          | || j        dt          d          z            \  }}| j                            d           |ryt          j        |          }	 t          j        t          | 
                                          |           || _        t          j        dd|           dS # t          $ r Y dS w xY wdS )	z.Save current history log (all text in console)zSave history logFz
%s (*.log)zHistory logsTr$   r%   N)r   sig_redirect_stdio_requestedr   r   r%   ospnormpathr   r   r   get_text_with_eolr   setEnvironmentError)r<   titlefilename
_selfilters       rE   rq   zShellBaseWidget.save_historylog  s    $%%)..u555.tU,lQ~=N=N.N P  P*)..t444 	|H--H~d.D.D.F.FGG') ) )+3(!6AAAAA#   	 	s   AC 
C&%C&c                 0    |                      |           dS )on_enterN)execute_commandr<   commands     rE   r   zShellBaseWidget.on_enter  s    W%%%%%rF   c                 r    | j                             |           |                     |           d| _        d S )NT)executer   add_to_historyr(   r   s     rE   r   zShellBaseWidget.execute_command  s:    '"""G$$$"rF   c                 r    |                      d           |                     d          | _        d| _        dS )zOn new input liner   rX   FN)r   r   r'   r(   r   s    rE   on_new_linezShellBaseWidget.on_new_line  s:      '''"&"3"3H"="=#rF   c                 d    | j         r|                                  t          j        |            dS )3Reimplemented slot to handle multiline paste actionN)r(   r   r    rp   r   s    rE   rp   zShellBaseWidget.paste$  s8      	%%%%%rF   c                 ^    |                      |          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r<   r   s     rE   keyPressEventzShellBaseWidget.keyPressEvent+  s9     ##E** 	F!!%(((((rF   c                    |                                 t          j        z  }|                                 t          j        z  }|                                t          j        k    rt          j        t          j        z  |                                 z  rS|r%t          j        dk    r|                                  n|r| 	                                 |
                                 dS | j        rwt          |                                          sB|                                t          j        t          j        t          j        t          j        fv r|                                  dS )zUPre-process keypress event:
        return True if event is accepted, false otherwiser   TF)	modifiersr   ControlModifierMetaModifierkeyKey_Cr   r   r   rn   r}   r(   lenr   Key_UpKey_DownKey_Left	Key_Rightr   )r<   r   ctrlmetas       rE   r   z#ShellBaseWidget.preprocess_keyevent6  s      2#55  2?299;;"(""Ob00EOO4E4EE # 00     		LLNNN4 	S%6%6 	%))++Ir{BK>;? ;?urF   c                    t          |          \  }}}}}t          |          rC|                                 r|                                  |                     | j        d           |                     d          }|t          j        t          j	        fv rU| 
                                r|                                  dS |                     |                                 d           dS |t          j        k    r.|s,|s*|                     |                                             dS |t          j        k    rj|                                 r*|                                  |                                  dS | 
                                r|                                  dS dS |t          j        k    r|                     |           dS |t          j        k    r|                                  dS |t          j        k    r|r|                                  dS |t          j        k    r0| j        |k    rdS |r| j        n| j        } ||rdndd	           dS |t          j        k    r9|                                 rdS |r| j        n| j        } ||rdndd
	           dS |t          j        k    s|t          j         k    r|r| !                    ||           dS |t          j"        k    s|t          j#        k    r|r| $                    ||           dS |t          j         k    r| 
                                s| %                    d           | &                    |          d         }| &                    | j                  d         }	||	k    r| '                    |           dS | (                    d           dS |t          j#        k    r| 
                                s| %                    d           | &                    |          d         }| &                    d          d         }
||
k     r| )                    |           dS | (                    d           dS |t          j*        t          j+        fv rtY          j-        | |           dS |t          j.        k    r|r| /                                 dS |t          j.        k    r| 0                                 dS |t          j1        k    r|r| 2                                 dS |t          j3        k    r|r| 4                                 dS |t          j5        k    r|r| 6                                 dS |t          j7        k    r|r| 8                                 dS |t          j9        k    r|r| :                                 dS |t          j;        k    r|r| <                                 dS |t          j=        k    r+|                                 s| >                    |           dS |t          j?        k    r+|                                 s| @                    |           dS |t          jA        k    r+|                                 s| B                    |           dS t          |          rG| C                                s3d| _D        |                     |           | E                    |           dS tY          j-        | |           dS )zcPost-process keypress event:
        in InternalShell, this is method is called when shell is readyr   rX   Tat_endNwordrH   left)	directionrightr   )backwardr   F)Fr   r   ry   r   restrict_cursor_positionr'   r   r   
Key_Return	Key_Enteris_cursor_on_last_line
_key_enterinsert_textget_selected_text
Key_InsertsetOverwriteModeoverwriteMode
Key_Deleter   stdkey_clearKey_Backspace_key_backspaceKey_Tab_key_tab	Key_Space_key_ctrl_spacer   extend_selection_to_nextmove_cursor_to_nextr   is_cursor_at_endKey_Homer   	_key_homeKey_Endr   _key_endr   get_coordinates	stdkey_upbrowse_historystdkey_down
Key_PageUpKey_PageDownr    r   
Key_Escape
clear_line_key_escapeKey_Lr   Key_Vrp   Key_Xrl   Key_ZundoKey_YredoKey_Art   Key_Question_key_questionKey_ParenLeft_key_parenleft
Key_Period_key_period
isReadOnlyhist_wholeline
_key_other)r<   r   r   r   r   shiftcursor_positionmethody_cursory_prompty_ends              rE   r   z$ShellBaseWidget.postprocess_keyeventM  s     )9(?(?%tS$ t99 	J%%'' '$$&&&))$*A5III++H552=",///**,, H!!!!!   !7!7!9!9$ GGGGGBM!!%!!!!d&8&8&:&:":;;;;;BM!!%%'' $$$&&&))+++++,,.. $!!#####$ $ B$$$00000BJMMOOOOOBL  T   """""BK&/996; 3T222 FT266{fEEEEEEBL  $$&& 6; 3T222 FT266{gFFFFFFR[  sbi'7'7T'7NN5$'''''RZcR[&8&8d&8MM%&&&&&BI..00 0((///++O<<Q?H++D,CDDQGH(""u%%%%%##T#22222BK..00 0((///++O<<Q?H((//2E%  '''''##U#33333R]BO444 +D%88888BM!!e!OOBM!!BH___!!!!!BH___JJLLLLLBH___HHJJJJJBH___IIKKKKKBH___IIKKKKKBH___NNBO##D,B,B,D,D#t$$$$$B$$$T-C-C-E-E$%%%%%BM!!$*@*@*B*B!T"""""YY 	9t00 	9"'DT"""OOD!!!!! +D%88888rF   c                     | j         }|                     dd           |                     |           |                                  d S )Nr   Tr   )r   r   r   r6   r   s     rE   r   zShellBaseWidget._key_enter  sF    #d+++g

rF   c                     t           NNotImplementedErrorr   s     rE   r  zShellBaseWidget._key_other      !!rF   c                     t           r#  r$  r<   r  s     rE   r   zShellBaseWidget._key_backspace  r&  rF   c                     t           r#  r$  r   s    rE   r   zShellBaseWidget._key_tab  r&  rF   c                     t           r#  r$  r   s    rE   r   zShellBaseWidget._key_ctrl_space  r&  rF   c                 j    |                                  r|                     ||| j                   d S d S r#  )r   stdkey_homer'   r<   r  r   s      rE   r   zShellBaseWidget._key_home  sD    &&(( 	CUD$*ABBBBB	C 	CrF   c                 ^    |                                  r|                     ||           d S d S r#  )r   
stdkey_endr-  s      rE   r   zShellBaseWidget._key_end  s:    &&(( 	)OOE4(((((	) 	)rF   c                     t           r#  r$  r   s    rE   _key_pageupzShellBaseWidget._key_pageup  r&  rF   c                     t           r#  r$  r   s    rE   _key_pagedownzShellBaseWidget._key_pagedown  r&  rF   c                     t           r#  r$  r   s    rE   r	  zShellBaseWidget._key_escape  r&  rF   c                     t           r#  r$  r   s     rE   r  zShellBaseWidget._key_question  r&  rF   c                     t           r#  r$  r   s     rE   r  zShellBaseWidget._key_parenleft  r&  rF   c                     t           r#  r$  r   s     rE   r  zShellBaseWidget._key_period  r&  rF   c                 d   t          j        | j                  rh	 t          j        | j                  \  }}d |D             }|d         | j        d         k    r| j        d         |d<   n# t          $ r
 | j        }Y nw xY w| j        }d |D             }t          |          t          k    rW|d= |d         	                    d          r|d= |d         	                    d          |d= t          |          t          k    W	 t          j
        || j                   n# t          $ r Y nw xY w|S )z3Load history from a .py file in user home directoryc                 :    g | ]}|                     d d          S )r   r   )r   .0r   s     rE   
<listcomp>z0ShellBaseWidget.load_history.<locals>.<listcomp>  s&    LLLdll444LLLrF   r   c                 @    g | ]}||                     d           |S )#
startswithr:  s     rE   r<  z0ShellBaseWidget.load_history.<locals>.<listcomp>  s@     9 9 9D9#'??3#7#794 9 9 9rF   r   r>  )r   isfiler>   r   	readlinesINITHISTORY	Exceptionr   	MAX_LINESr@  
writelinesr   )r<   
rawhistoryr   r*   s       rE   r)   zShellBaseWidget.load_history  ss   :d+,, 	*. ( 243H I I
ALLLLL
a=D$4Q$777$($4Q$7JqM . . .!-


. )J9 9J 9 9 9 'lli''
Q-**3// "qM Q-**3// "1	 'lli''	
D,ABBBB 	 	 	D	 s$   AA+ +A?>A?D   
D-,D-c                     |                                   |                     |dd           t                      rt          j        |           dS dS )zSimulate stderrT)r6   errorN)r6   r   r   r   r   s     rE   write_errorzShellBaseWidget.write_error  sU    



4t4
000 	L	 	rF   c                    |r|                                   t          |          st          |          }| j                            |           t          j                    }|s|r|                      ||           dS || j        z
  dk    r9|                      |           || _        | j                            d           dS dS )zSimulate stdout and stderr)rI  r   g?)rI  2   N)	r6   r   r   r/   r0   timer1   r2   start)r<   r   r6   rI  r   tss         rE   r   zShellBaseWidget.write  s     	JJLLL 	(!$''DT"""Y[[ 	(F 	(JJU6J22222$""T))JJUJ###!D##B'''''	 *)rF   c                 r   	 d                     | j                  }n_# t          $ rR d                     | j                  }	 |                    t	          j                    d                   }n#  Y nxY wY nw xY wg | _        |                     |d||           |                                  d| _        dS )z#Flush buffer, write text to consoler   rF   r   T)r   rI  r   N)	joinr/   	TypeErrordecodelocalegetdefaultlocaler   updater(   )r<   rI  r   r   s       rE   r6   zShellBaseWidget.flush,  s    	774=))DD 	 	 	88DM**D{{6#:#<#<Q#?@@	 d%GGG 	 #s'    $A9,A/.A9/A31A98A9c                 f    |r|                      |||           dS t          j        | |           dS )zf
        Insert text at the current cursor position
        or at the end of the command line
        N)append_text_to_shellr    r   )r<   r   r   rI  r   s        rE   r   zShellBaseWidget.insert_textH  sE    
  	6%%dE6::::: )$55555rF   c                 4    |rdS t          j        | |          S )zE
        Reimplemented to stop Tab moving to the next window
        F)r    focusNextPrevChild)r<   nexts     rE   rZ  z"ShellBaseWidget.focusNextPrevChildV  s$      	5 3D$???rF   c                 z    |                     |                                                    d                     dS )zDrag and Drop - Enter event
text/plainN)setAcceptedmimeData	hasFormatr   s     rE   dragEnterEventzShellBaseWidget.dragEnterEvent`  s4    %..**44\BBCCCCCrF   c                     |                                                     d          r5|                    t          j                   |                                 dS |                                 dS )zDrag and Drop - Move eventr]  N)r_  r`  setDropActionr   
MoveActionr}   ignorer   s     rE   dragMoveEventzShellBaseWidget.dragMoveEventd  sZ    NN&&|44 	...LLNNNNNLLNNNNNrF   c                    |                                                     d          rt          |                                                                           }| j        r|                                  |                     |d           |                                  |                    t          j
                   |                                 dS |                                 dS )zDrag and Drop - Drop eventr]  Tr   N)r_  r`  r   r   r(   r   r   r7   rc  r   rd  r}   re  )r<   r   r   s      rE   	dropEventzShellBaseWidget.dropEventl  s    NN&&|44 		!%.."2"2"7"7"9"9::D" #  """T$///MMOOO...LLNNNNNLLNNNNNrF   c                     t           )Drop path listr$  )r<   pathlists     rE   drop_pathlistzShellBaseWidget.drop_pathlisty      !!rF   )FNNNNNN)FFF)FF)=__name__
__module____qualname____doc__r   boolr   r   strr   sig_append_to_history_requestedr&   rK   rZ   r-   r   r   r   r   r   r   r   r   r   r   r   rn   r   rl   rr   rq   r   r   r   rp   r   r   r   r   r  r   r   r   r   r   r1  r3  r	  r  r  r  r)   rJ  r   r6   r   rZ  ra  rf  rh  rl   rF   rE   r"   r"   /   s         $*6$<< #VXXfSkkG&,fS#&6&6#9>@DIM@D/> /> /> />b< < <	+ 	+ 	+G G G@  . . .6 6 6 
TVV  V( ( (   8I'8:KLLL
$ 
$ 
$= = = 
TVV  V+ + + 
TVV( ( V( 
TVV9 9 V9 
TVV  V$& & &# # #
$ $ $ 
TVV& & V&	) 	) 	)  .9 9 9F  
" " "" " "" " "" " "C C C) ) )" " "" " "" " "" " "" " "" " "
  D  ( ( ( ("# # # #8
6 
6 
6 
6@ @ @D D D    " " " " "rF   r"   c                   n   e Zd ZdZeZddgZej        dz  d e	j
                    dZ ee          Z ee          Z	 d+d	Zd
 Zd Zd Zd Z e            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,d#Z,d$ Z-d-d&Z.d.d(Z/d) Z0d* Z1dS )/PythonShellWidgetzPython shell widgetz# -*- coding: utf-8 -*-z+# *** Spyder Python Console History Log ***   z##---()---FNc                     t                               | ||||           t          j        |            t          j        |            |                                 | _        d S )N)r.   r?   )r"   r&   r   r   create_shortcuts	shortcuts)r<   r=   r>   r.   r?   s        rE   r&   zPythonShellWidget.__init__  sl      v/?)01@ 	! 	B 	B 	B 	$T***d### ..00rF   c                 2   t          j        | j        dd|           }t          j        | j        dd|           }t          j        | j        dd|           }t          j        | j        dd|           }t          j        | j        dd|           }|||||gS )	Narray_builderzenter array inline)contextnamer=   zenter array tableConsolezInspect current object
Clear lineClear shell)r   config_shortcutenter_array_inlineenter_array_tableinspect_current_objectr  r   )r<   array_inlinearray_table	inspectscclear_line_scclear_shell_scs         rE   r{  z"PythonShellWidget.create_shortcuts  s    +##%	  
 *"#$	  
 (')	  	
 ,O	
 
 
 -	
 
 
 <m  	 rF   c                 $    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                     g | ]	}|j         
S ru  )data)r;  scs     rE   r<  z7PythonShellWidget.get_shortcut_data.<locals>.<listcomp>  s    111B111rF   )r|  r   s    rE   get_shortcut_dataz#PythonShellWidget.get_shortcut_data  s     21$.1111rF   c           
         t                               |            t          | t          d          t	          j        d          | j                  | _        t          | t          d          t          t          j
        dd                    t	          j        d          t          d          | j                  }t          | t          d          t          t          j
        dd                    t	          j        d	          t          d
          | j                  }t          | j        | j        ||f           dS )#Reimplements ShellBaseWidget methodzCopy without promptscopywop)r_   r`   r  consoleri   rf   r  	editclearz$Clear shell contents ('cls' command)N)r"   r-   r   r   r   r_   copy_without_promptscopy_without_prompts_actionr	   r   get_shortcutr  r   r   r,   )r<   clear_line_actionclear_actions      rE   r-   z$PythonShellWidget.setup_context_menu  s1   **4000+8$%%)$$/	,1 ,1 ,1( *lOO*9lCCDD,'',o' ' ' %m*9mDDEE+&&899)+ + + 	DI @%| 5 	6 	6 	6 	6 	6rF   c                     |                                  }| j                            |           t                              | |           dS )r  N)ry   r  rz   r"   r   r~   s      rE   r   z"PythonShellWidget.contextMenuEvent  sF    &&(((33E:::((u55555rF   c                    |                                  }|                    t          j                  }t	          |          D ]<\  }}|                    d          s|                    d          r|dd         ||<   =t          j                            |          }t          j                    	                    |           dS )z&Copy text to clipboard without promptsz>>> z...    N)
r   splitr   r   	enumerater@  rQ  r   	clipboardsetText)r<   r   linesr   r   s        rE   r  z&PythonShellWidget.copy_without_prompts  s     %%''

2:&&$U++ 	( 	(KE4v&& ($//&*A*A (#ABBxezu%%  ((.....rF   c                 <    t                               | |           dS )zProcess keypress eventN)r"   r   r   s     rE   r   z&PythonShellWidget.postprocess_keyevent  s    ,,T599999rF   c                 R    |                                  r| xj        |z  c_        dS dS z1 character keyN)is_completion_widget_visiblecompletion_textr   s     rE   r  zPythonShellWidget._key_other  s:    ,,.. 	)  D(    	) 	)rF   c                 D   |                                  r*|                                  |                                  dS | j        |k    rdS |                                 r>|                                  |                                 r| j        dd         | _        dS dS dS )Action for Backspace keyN)ry   r   r   r'   r   stdkey_backspacer  r  r(  s     rE   r   z PythonShellWidget._key_backspace  s    !!## 	A  """%%'''''$77F((** 	A!!###0022 A (,';CRC'@$$$	A 	AA ArF   c                     |                                  rU|                                                                  }|r|                                  dS |                                  dS dS zAction for TAB keyN)r   get_current_line_to_cursorstrip
stdkey_tabshow_code_completion)r<   
empty_lines     rE   r   zPythonShellWidget._key_tab  sv    &&(( 	,!<<>>DDFFFJ ,!!!!!))+++++	, 	,rF   c                 Z    |                                  s|                                  dS dS zAction for Ctrl+SpaceN)r  r  r   s    rE   r   z!PythonShellWidget._key_ctrl_space  s8    0022 	(%%'''''	( 	(rF   c                     dS )zAction for PageUp keyNru  r   s    rE   r1  zPythonShellWidget._key_pageup$      rF   c                     dS )zAction for PageDown keyNru  r   s    rE   r3  zPythonShellWidget._key_pagedown(  r  rF   c                 Z    |                                  r|                                  dS dS zAction for ESCAPE keyN)r  hide_completion_widgetr   s    rE   r	  zPythonShellWidget._key_escape,  s8    ,,.. 	*'')))))	* 	*rF   c                 "   |                                  r?|                                 }|r)|                                s|                     |           |                     |           |                                 r| xj        dz  c_        dS dS )Action for '?'?N)r  get_last_objisdigitshow_object_infor   r  r  r<   r   last_objs      rE   r  zPythonShellWidget._key_question1  s    **,, 	0((**H 0 0 0 2 2 0%%h///,,.. 	(  C'    	( 	(rF   c                 0   |                                   |                                 rX|                                 }|rB|                                s.|                     |           |                     |d           dS |                     |           dS )Action for '('T)callN)r  r  r  r  r   r  r  s      rE   r  z PythonShellWidget._key_parenleft<  s    ##%%%**,, 	((**H  0 0 2 2   &&&%%hT%:::rF   c                     |                      |           | j        r@|                                 }|r,|                                s|                                  dS dS dS dS zAction for '.'N)r   codecompletion_autor  r  r  r  s      rE   r  zPythonShellWidget._key_periodG  s    # 	,((**H , 0 0 2 2 ,))+++++		, 	,, , , ,rF   c                 >   t          t          j                                                              }t	          |                                          dk    r| j        r|                                  |                                  | 	                                }| 
                                |z   |z   }|                                  |                     |           |                     t	          |                      dS t                              |            dS )r   r   N)r   r   r  r   r   
splitlinesr(   r   r   r   r  r  execute_linesmove_cursorr"   rp   )r<   r   endr  s       rE   rp   zPythonShellWidget.pasteR  s    l466;;==>>t  !!A%%" #  """%%'''3355C3355<sBEOOu%%%c#hhY''''' !!$'''''rF   c                     t           )zReturn dir(object)r$  r<   objtxts     rE   get_dirzPythonShellWidget.get_dirf  rm  rF   c                     t           )zReturn shell globals() keysr$  r   s    rE   get_globals_keysz"PythonShellWidget.get_globals_keysj  rm  rF   c                     t           )z'Return shell current directory list dirr$  r   s    rE   get_cdlistdirzPythonShellWidget.get_cdlistdirn  rm  rF   c                     t           )zIs object callable?r$  r  s     rE   
iscallablezPythonShellWidget.iscallabler  rm  rF   c                     t           )zGet func/method argument listr$  r  s     rE   get_arglistzPythonShellWidget.get_arglistv  rm  rF   c                     t           )zGet object __doc__r$  r  s     rE   
get__doc__zPythonShellWidget.get__doc__z  rm  rF   c                     t           )z#Get object documentation dictionaryr$  r  s     rE   get_doczPythonShellWidget.get_doc~  rm  rF   c                     t           )zGet object sourcer$  r  s     rE   
get_sourcezPythonShellWidget.get_source  rm  rF   c                     t           )z Return True if object is definedr$  )r<   r  force_imports      rE   
is_definedzPythonShellWidget.is_defined  rm  rF   c                 @    | j                             |dd           dS )zShow completion widgetFN)	automaticposition)r9   	show_list)r<   textlists     rE   show_completion_widgetz(PythonShellWidget.show_completion_widget  s3    (( 	) 	6 	6 	6 	6 	6rF   Tc                 <    | j                             |           dS )zHide completion widget)focus_to_parentN)r9   hide)r<   r  s     rE   r  z(PythonShellWidget.hide_completion_widget  s"    ##O#DDDDDrF   r   c                    |sdS t          |d         t                    sd |D             }t          |          dk    r|d         d         |k    rdS || _        t	          d |D                       }t          t	          |          |z
  d           }|t          |d           z  }|                     |           dS )	z Display the possible completionsNr   c                     g | ]}|d fS r   ru  )r;  cs     rE   r<  z:PythonShellWidget.show_completion_list.<locals>.<listcomp>  s    888qAr7888rF   r   c                 F    g | ]\  }}|                     d           ||fS )r   r?  )r;  compts      rE   r<  z:PythonShellWidget.show_completion_list.<locals>.<listcomp>  s@     3 3 3	q!__S1134) 3 3 3rF   c                 B    t                               | d                   S Nr   rs  lowerxs    rE   <lambda>z8PythonShellWidget.show_completion_list.<locals>.<lambda>  s    399QqT?? rF   )r   c                 B    t                               | d                   S r  r  r  s    rE   r  z8PythonShellWidget.show_completion_list.<locals>.<lambda>  s    		!A$ rF   )
isinstancetupler   r  r   sortedr  )r<   completionsr  
underscores       rE   show_completion_listz&PythonShellWidget.show_completion_list  s     	F+a.%00 	988K888K{q  [^A%6/%I%IF.  3 3[ 3 3 3 4 4
 S--
:!:!:< < <vj.G.GHHHH##K00000rF   c                 *   t          |                                           }|                                 }|sdS |                     |          }|r.|r,|                    d          r|                     |           dS |                    d          s|rt          j        d|          rrt          t                    | 
                                z   t          j        z   }|D ]7}|                    |          r ||k    r|                     ||            dS 8dS ||}|                    d          }|dk    r`|t          |          dz
  k    rd}n||dz   d         }|d|         }|                     |          }||                     ||           dS t!          |                    d          |                    d	          g          }	|	dk    r:|                                 }|r"|                     |||	dz   d                    dS dS )
z3Display a completion list based on the current lineN.z[a-zA-Z_0-9]*$)r  r  r   r   '")r   r  r  r  endswithr  rematchdirbuiltinsr  keywordkwlistr@  rfindr   maxr  )
r<   r   r  obj_dirb_k_gobjnamedot_posr  r  q_poss
             rE   r  z&PythonShellWidget.show_code_completion  s]    d==??@@$$&& 	F,,x(( 	 	DMM#$6$6 	%%g...F }}S!! 	h 	x)844	MM$"7"7"9"99'.HE   %%h// Gx4G4G--eX-NNNFF H..%%b==#h--/))"$"*719::"6#HWH-,,x00K&))+:I * K K K TZZ__djjoo677B;;,,..K J))+:>uQwxx. * J J JF ;rF   c                    |rd |D             }t          |          dk    r	|d         }ndd                    |          z   dz   }| j        r|                                  |                     |           |                                  dS dS )rj  c                     g | ]}d |z  S )zr'%s'ru  r;  paths     rE   r<  z3PythonShellWidget.drop_pathlist.<locals>.<listcomp>  s    999Wt^999rF   r   r   [z, ]Nr   rQ  r(   r   r   r7   r<   rk  filesr   s       rE   rl  zPythonShellWidget.drop_pathlist  s     		99999E5zzQQxTYYu---3" #  """T"""MMOOOOO		 		rF   )FNF)Tr  )2rn  ro  rp  rq  r"   QT_CLASSrC  r   r   rM  ctime	SEPARATORr   rs  sig_go_to_error_requesteddictsig_help_requestedr&   r{  r  r-   r   r   r  r   r  r   r   r   r1  r3  r	  r  r  r  rp   r  r  r  r  r  r  r  r  r  r  r  r  r  rl  ru  rF   rE   rw  rw    s       H,@CK$&JqLLL*$*,,,,?I
 !'s  1 1 1 1     @2 2 26 6 686 6 6 
TVV/ / V/: : :) ) )
A A A, , ,( ( (
    * * *
	( 	( 	(	 	 	, , ,( ( ((" " "" " "" " "" " "" " "" " "" " "" " "" " " "6 6 6
E E E E1 1 1 1&/ / /d    rF   rw  c                       e Zd ZdZej        dk    rdndZdez  egZej        dz  ed e	j
                    dZ ee          Zdd
Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )TerminalWidgetz
    Terminal widget
    ntremr>  z&%s *** Spyder Terminal History Log ***rx  z ---(ry  Fc                 @    t                               | |||           d S r#  )r"   r&   )r<   r=   r>   r.   s       rE   r&   zTerminalWidget.__init__  s#      v/?IIIIIrF   c                     dS r  ru  r   s     rE   r  zTerminalWidget._key_other  r  rF   c                     |                                  r*|                                  |                                  dS | j        |k    rdS |                                 r|                                  dS dS )r  N)ry   r   r   r'   r   r  r(  s     rE   r   zTerminalWidget._key_backspace  s    !!## 	$  """%%'''''$77F((** 	$!!#####	$ 	$rF   c                 Z    |                                  r|                                  dS dS r  )r   r  r   s    rE   r   zTerminalWidget._key_tab  s6    &&(( 	OO	 	rF   c                     dS r  ru  r   s    rE   r   zTerminalWidget._key_ctrl_space
  r  rF   c                 .    |                                   dS r  )r  r   s    rE   r	  zTerminalWidget._key_escape  s    rF   c                 0    |                      |           dS )r  Nr   r   s     rE   r  zTerminalWidget._key_question      rF   c                 0    |                      |           dS )r  Nr/  r   s     rE   r  zTerminalWidget._key_parenleft  r0  rF   c                 0    |                      |           dS r  r/  r   s     rE   r  zTerminalWidget._key_period  r0  rF   c                    |rd |D             }t          |          dk    r	|d         }nd                    |          }| j        r|                                  |                     |           |                                  dS dS )rj  c                     g | ]}d |z  S )z"%s"ru  r  s     rE   r<  z0TerminalWidget.drop_pathlist.<locals>.<listcomp>#  s    888tVd]888rF   r   r    Nr  r  s       rE   rl  zTerminalWidget.drop_pathlist   s     		88x888E5zzQQxxx" #  """T"""MMOOOOO		 		rF   Nr  )rn  ro  rp  rq  r   r  COMrC  r   rM  r  r   r   rs  r!  r&   r  r   r   r   r	  r  r  r  rl  ru  rF   rE   r%  r%    s         7d??%%C;cA3HK%'Z\\333

EI !'sJ J J J  	$ 	$ 	$  
              rF   r%  )9rq  r
  r  rT  r   os.pathr  r   r  r   rM  qtpy.compatr   qtpy.QtCorer   r   r   r   r   
qtpy.QtGuir	   r
   r   qtpy.QtWidgetsr   r   spyder.config.baser   r   r   r   spyder.config.managerr   spyder.py3compatr   r   r   spyder.utilsr   spyder.utils.icon_managerr   spyder.utils.qthelpersr   r   r   r   spyder.widgets.mixinsr   r   r   r   &spyder.plugins.console.widgets.consoler    rE  r"   rw  r%  ru  rF   rE   <module>rD     s   / .    				       				 



  ( ' ' ' ' ' : : : : : : : : : : : : : : A A A A A A A A A A . . . . . . . . I H H H H H H H H H H H & & & & & & F F F F F F F F F F ! ! ! ! ! ! ) ) ) ) ) )6 6 6 6 6 6 6 6 6 6 6 6L L L L L L L L L L L L D D D D D D 	L	" L	" L	" L	" L	"')9(L	" L	" L	"h` ` ` ` `+_$` ` `FE E E E E_ E E E E ErF   