B
    b¹_“à  ã               @   sH  d Z dZddlZddlmZ ddlm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mZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZmZ de_dZdZ ej!ej"ej#ej$ej%ej&ej'fZ(G dd„ dej)ej*ƒZ+dZ,G dd„ dƒZ-dZ.G dd„ dej/ƒZ0dS )zëShell is an interactive text control in which a user types in
commands to be sent to the interpreter.  This particular shell is
based on wxPython's wxStyledTextCtrl.

Sponsored by Orbtech - Your source for Python programming expertise.z(Patrick K. O'Brien <pobrien@orbtech.com>é    N)Ústc)ÚPY3)Ú
cmp_to_keyé   )ÚBuffer)Ú
dispatcher)Ú
editwindow)Úframe)ÚPseudoFileIn)ÚPseudoFileOut)ÚPseudoFileErr)ÚVERSION)Úmagic)ÚlsÚcdÚpwdÚsxz<-- Té   c            
   @   sj   e Zd ZdZdZdddejejejddddf
dd„Z	dd	„ Z
d
d„ Zdd„ Zdd„ Zddd„Zdd„ ZdS )Ú
ShellFramez%Frame containing the shell component.zShell FrameNéÿÿÿÿZPyShellc          
   O   sš   t j | ||||||¡ t j | |	|
¡ |tjkr<|  d¡ dt }|  | 	dd¡¡ t
|| d|||| j| jdœ|—Ž| _| j| j_| j ¡  |  ¡  dS )zCreate ShellFrame instance.)iî  i  z&PyShell %s - The Flakiest Python ShellÚ
z, r   )ÚparentÚidÚ	introTextÚlocalsÚInterpClassÚstartupScriptÚexecStartupScriptN)r	   ÚFrameÚ__init__ÚShellFrameMixinÚwxÚDefaultSizeZSetSizer   ZSetStatusTextÚreplaceÚShellr   r   ÚshellÚsetStatusTextÚSetFocusÚLoadSettings)Úselfr   r   ÚtitleÚposÚsizeÚstyler   r   ÚconfigZdataDirÚargsÚkwdsZintro© r1   ú*lib/python3.7/site-packages/wx/py/shell.pyr   ,   s    

"

zShellFrame.__init__c             C   s:   | j jr| ¡ r6| d¡ n|  ¡  | j  ¡  |  ¡  dS )zEvent handler for closing.TN)r%   ÚwaitingZCanVetoZVetoÚSaveSettingsÚdestroyÚDestroy)r)   Úeventr1   r1   r2   ÚOnCloseH   s    
zShellFrame.OnClosec             C   s‚   d}dt  d d d dtj  dtj ¡ d   d	tj  d
d tjdd… ¡  }t 	| ||tj
tjB ¡}| ¡  | ¡  dS )zDisplay an About window.zAbout PyShellzPyShell %s

z)Yet another Python shell, only flakier.

z"Half-baked by Patrick K. O'Brien,
z&the other half is still in the oven.

zPlatform: %s
zPython Version: %s
r   zwxPython Version: %s
z	(%s)
z, r   N)r   ÚsysÚplatformÚversionÚsplitr!   ÚVERSION_STRINGÚjoinÚPlatformInfoZMessageDialogZOKZICON_INFORMATIONÚ	ShowModalr6   )r)   r7   r*   ÚtextÚdialogr1   r1   r2   ÚOnAboutS   s    8
zShellFrame.OnAboutc             C   s   t j | |¡ dS )zShow a help dialog.N)r	   r    ÚOnHelp)r)   r7   r1   r1   r2   rD   d   s    zShellFrame.OnHelpc             C   s8   | j d k	r4tj | ¡ tj | | j ¡ | j | j ¡ d S )N)r.   r	   r    r(   r   r%   )r)   r1   r1   r2   r(   i   s    
zShellFrame.LoadSettingsFc             C   sB   | j d k	r>tj | ¡ | js |r>tj | | j ¡ | j | j ¡ d S )N)r.   r	   r    r4   ZautoSaveSettingsr   r%   )r)   Úforcer1   r1   r2   r4   o   s
    

zShellFrame.SaveSettingsc             C   s$   | j d k	r | jdd | j  ¡  d S )NT)rE   )r.   r4   ÚFlush)r)   r1   r1   r2   ÚDoSaveSettingsv   s    
zShellFrame.DoSaveSettings)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Únamer!   ÚDefaultPositionr"   ZDEFAULT_FRAME_STYLEr   r8   rC   rD   r(   r4   rG   r1   r1   r1   r2   r   '   s   
r   a•  * Key bindings:
Home              Go to the beginning of the command or line.
Shift+Home        Select to the beginning of the command or line.
Shift+End         Select to the end of the line.
End               Go to the end of the line.
Ctrl+C            Copy selected text, removing prompts.
Ctrl+Shift+C      Copy selected text, retaining prompts.
Alt+C             Copy to the clipboard, including prefixed prompts.
Ctrl+X            Cut selected text.
Ctrl+V            Paste from clipboard.
Ctrl+Shift+V      Paste and run multiple commands from clipboard.
Ctrl+Up Arrow     Retrieve Previous History item.
Alt+P             Retrieve Previous History item.
Ctrl+Down Arrow   Retrieve Next History item.
Alt+N             Retrieve Next History item.
Shift+Up Arrow    Insert Previous History item.
Shift+Down Arrow  Insert Next History item.
F8                Command-completion of History item.
                  (Type a few characters of a previous command and press F8.)
Ctrl+Enter        Insert new line into multiline command.
Ctrl+]            Increase font size.
Ctrl+[            Decrease font size.
Ctrl+=            Default font size.
Ctrl-Space        Show Auto Completion.
Ctrl-Alt-Space    Show Call Tip.
Shift+Enter       Complete Text from History.
Ctrl+F            Search
F3                Search next
Ctrl+H            "hide" lines containing selection / "unhide"
F12               on/off "free-edit" mode
c               @   s<   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚShellFacadezÃSimplified interface to all shell-related functionality.

    This is a semi-transparent facade, in that all attributes of other
    are accessible, even though only some are visible to the user.zShell Interfacec             C   s   | j }||d< t|d< dS )zCreate a ShellFacade instance.ÚotherÚhelpTextN)Ú__dict__Ú	HELP_TEXT)r)   rO   Údr1   r1   r2   r   §   s    zShellFacade.__init__c             C   s   |   | j¡ dS )z;Display some useful information about how to use the shell.N)ÚwriterP   )r)   r1   r1   r2   Úhelp­   s    zShellFacade.helpc             C   s$   t | j|ƒrt| j|ƒS t|ƒ‚d S )N)ÚhasattrrO   ÚgetattrÚAttributeError)r)   rL   r1   r1   r2   Ú__getattr__±   s    zShellFacade.__getattr__c             C   s>   || j kr|| j |< n$t| j|ƒr2t| j||ƒ nt|ƒ‚d S )N)rQ   rV   rO   ÚsetattrrX   )r)   rL   Úvaluer1   r1   r2   Ú__setattr__·   s
    
zShellFacade.__setattr__c             C   s:   ddddddddd	d
dddddddddddg}|  ¡  |S )z8Return list of magic attributes to extend introspection.ÚaboutÚaskÚautoCallTipÚautoCompleteÚautoCompleteAutoHideÚautoCompleteCaseInsensitiveÚautoCompleteIncludeDoubleÚautoCompleteIncludeMagicÚautoCompleteIncludeSingleÚcallTipInsertÚclearÚpauseÚpromptÚquitÚredirectStderrÚredirectStdinÚredirectStdoutÚrunÚrunfileÚwrapÚzoom)Úsort)r)   Úlistr1   r1   r2   Ú_getAttributeNames¿   s.    zShellFacade._getAttributeNamesN)
rH   rI   rJ   rK   rL   r   rU   rY   r\   rt   r1   r1   r1   r2   rN   Ÿ   s   rN   zi
Author: %r
Py Version: %s
Python Version: %s
wxPython Version: %s
wxPython PlatformInfo: %s
Platform: %sc            
   @   sL  e Zd ZdZd Zdejejejddddddf
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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dŠd2d3„Zd‹d4d5„Z d6d7„ Z!dŒd9d:„Z"d;d<„ Z#d=d>„ Z$d?d@„ Z%dAdB„ Z&dCdD„ Z'dEdF„ Z(ddGdH„Z)dŽdJdK„Z*dLdM„ Z+dNdO„ Z,ddPdQ„Z-dRdS„ Z.ddUdV„Z/d‘dWdX„Z0dYdZ„ Z1d[d\„ Z2d]d^„ Z3d’d_d`„Z4d“dadb„Z5d”dcdd„Z6dedf„ Z7dgdh„ Z8didj„ Z9dkdl„ Z:dmdn„ Z;dodp„ Z<dqdr„ Z=dsdt„ Z>dudv„ Z?dwdx„ Z@dydz„ ZAd•d{d|„ZBd–d}d~„ZCdd€„ ZDdd‚„ ZEdƒd„„ ZFd…d†„ ZGd‡dˆ„ ZHdS )—r$   zShell based on StyledTextCtrl.r   Ú NTc                s8  t j ˆ |||||¡ ˆ  ¡  |dkr4ddl}|j}tjˆ _tjˆ _tj	ˆ _	|dkrbddl
m} n|}tˆ jˆ jƒˆ _dˆ j_dˆ j_|||ˆ jˆ jtˆ jƒtˆ jƒdœ|—Žˆ _tƒ ˆ _ˆ j ¡ ˆ _dˆ _dˆ _dˆ _dˆ _g ˆ _ dˆ _!dˆ _"ˆ  #dt$j%¡ dˆ _&ˆ  't(j)ˆ j*¡ ˆ  't(j+ˆ j,¡ ˆ  't(j-ˆ j.¡ ˆ  't(j/ˆ j0¡ |r„t(j1ˆ _1t(j2ˆ _2t(j3ˆ _3t(j4ˆ _4t(j5ˆ _5t(j6ˆ _6t(j7ˆ _7nFt( 8¡ ˆ _1t( 8¡ ˆ _2t( 8¡ ˆ _3t( 8¡ ˆ _4t( 8¡ ˆ _5t( 8¡ ˆ _6t( 8¡ ˆ _7ˆ j't(j9‡ fd	d
„ˆ j1d ˆ j't(j9‡ fdd
„ˆ j2d ˆ j't(j9‡ fdd
„t:j;d ˆ j't(j9‡ fdd
„ˆ j3d ˆ j't(j9‡ fdd
„t:j<d ˆ j't(j9‡ fdd
„ˆ j4d ˆ j't(j9‡ fdd
„ˆ j5d ˆ j't(j9‡ fdd
„ˆ j6d ˆ j't(j9‡ fdd
„ˆ j7d dˆ _=ˆ  't(j>ˆ j?¡ ˆ  @|¡ ˆ  A¡  ˆ  B¡  |
r|	dkrtCjD Ed¡}	ˆ  F|	¡ nˆ  G¡  t( Hˆ jId¡ dS )zCreate Shell instance.Nr   r   )ÚInterpreterru   F)r   ZrawinÚstdinÚstdoutÚstderrr   c                s   ˆ   ¡ S )N)ÚCut)Úevt)r)   r1   r2   Ú<lambda>J  ó    z Shell.__init__.<locals>.<lambda>)r   c                s   ˆ   ¡ S )N)ÚCopy)r{   )r)   r1   r2   r|   K  r}   c                s   ˆ   ¡ S )N)ÚCopyWithPrompts)r{   )r)   r1   r2   r|   L  r}   c                s   ˆ   ¡ S )N)ÚPaste)r{   )r)   r1   r2   r|   M  r}   c                s   ˆ   ¡ S )N)ÚPasteAndRun)r{   )r)   r1   r2   r|   N  r}   c                s   ˆ   ¡ S )N)Z	SelectAll)r{   )r)   r1   r2   r|   O  r}   c                s   ˆ   ¡ S )N)ÚClear)r{   )r)   r1   r2   r|   P  r}   c                s   ˆ   ¡ S )N)ÚUndo)r{   )r)   r1   r2   r|   Q  r}   c                s   ˆ   ¡ S )N)ÚRedo)r{   )r)   r1   r2   r|   R  r}   ZPYTHONSTARTUP)Jr   Ú
EditWindowr   rp   Ú__main__rQ   r9   rw   rx   ry   Zinterpreterrv   r
   ÚreadlineÚ	readlinesÚreaderÚinputÚ	isreadingÚ	raw_inputr   ÚwriteOutr   ÚwriteErrÚinterpr   ÚbufferZgetAutoCompleteKeysÚautoCompleteKeysÚpromptPosStartÚpromptPosEndÚmoreÚ
lastUpdateÚhistoryÚhistoryIndexÚnoteModeZMarkerDefiner   ZSTC_MARK_ROUNDRECTZ	searchTxtZBindr!   ZEVT_CHARÚOnCharZEVT_KEY_DOWNÚ	OnKeyDownZEVT_CONTEXT_MENUÚOnContextMenuZEVT_UPDATE_UIÚ
OnUpdateUIÚID_CUTÚID_COPYÚID_PASTEÚID_SELECTALLÚID_CLEARÚID_UNDOÚID_REDOZNewIdRefZEVT_MENUr	   ÚID_COPY_PLUSÚID_PASTE_PLUSr3   ZEVT_IDLEÚOnIdleÚ	showIntroÚsetBuiltinKeywordsÚsetLocalShellÚosÚenvironÚgetr   ri   Z	CallAfterZScrollToLine)r)   r   r   r+   r,   r-   r   r   r   r   r   Z
useStockIdr/   r0   r†   rv   r1   )r)   r2   r   ê   s„    *	









zShell.__init__c             C   s   g | _ d| _tjdd d S )Nr   zShell.clearHistory)Úsignal)r–   r—   r   Úsend)r)   r1   r1   r2   ÚclearHistoryr  s    zShell.clearHistoryc             C   s   | ` d S )N)r   )r)   r1   r1   r2   r5   x  s    zShell.destroyc             C   s   |   ¡  dS )zSet focus to the shell.N)r'   )r)   r1   r1   r2   ÚsetFocus{  s    zShell.setFocusc             C   s   | j rt d¡ | ¡  dS )z Free the CPU to do other things.gš™™™™™©?N)r3   ÚtimeZsleepÚSkip)r)   r7   r1   r1   r2   r¦     s    
zShell.OnIdlec             C   s^   |r|   |¡ y6| jjrB|r4| tj¡s4|   tj¡ |   | jj¡ W n tk
rX   Y nX dS )z'Display introductory text in the shell.N)rT   r   r   Úendswithrª   ÚlineseprX   )r)   rA   r1   r1   r2   r§   …  s    
zShell.showIntroc             C   s:   ddl m} d |_ |_|_t|_t|_t|_t|_dS )zwCreate pseudo keywords as part of builtins.

        This sets "close", "exit" and "quit" to a helpful string.
        r   )Úbuiltinsz3Click on the close button to leave the application.N)	Z	six.movesrµ   ÚcloseÚexitrj   r   r   r   r   )r)   rµ   r1   r1   r2   r¨   ‘  s    zShell.setBuiltinKeywordsc             C   s   |   d¡ dS )zQuit the application.z3Click on the close button to leave the application.N)rT   )r)   r1   r1   r2   rj   Ÿ  s    z
Shell.quitc             C   s   t | d| jjd< dS )z;Add 'shell' to locals as reference to ShellFacade instance.)rO   r%   N)rN   r   r   )r)   r1   r1   r2   r©   ©  s    zShell.setLocalShellc             C   sd   |rVt j |¡rVd| }tr:|  d| ¡ |  d| ¡ n|  d||f ¡ || j_n
|  d¡ dS )z9Execute the user's PYTHONSTARTUP script if they have one.zStartup script executed: z	print(%r)z,with open(%r, "r") as f:
    exec(f.read())
zprint(%r); execfile(%r)ru   N)rª   ÚpathÚisfiler   Úpushr   r   )r)   r   rA   r1   r1   r2   r   ®  s    

zShell.execStartupScriptc             C   s:   t tttj ¡ d tjttj	ƒtj
f }|  | ¡ ¡ dS )zDisplay information about Py.r   N)ÚDISPLAY_TEXTÚ
__author__r   r9   r;   r<   r!   r=   Ústrr?   r:   rT   Ústrip)r)   rA   r1   r1   r2   r]   ½  s
    
zShell.aboutc             C   sú   | j r| ¡  dS |  ¡ sdS | ¡ }|  ¡ }| j}|tjtjgkrFn°|| j	kr”|  
¡ r`|  ¡  |  ||¡t|ƒ }|  t|ƒ¡ | jrö|  |¡ nb|tdƒkrî|  
¡ r°|  ¡  |  d¡ |  ||¡d }|  d¡ |  ||  ¡ |  ¡ k¡ n| ¡  dS )z|Keypress event handler.

        Only receives an event if OnKeyDown calls event.Skip() for the
        corresponding event.Nú(ru   )r˜   r²   ÚCanEditÚ
GetKeyCodeÚGetCurrentPosr“   r!   Ú
WXK_RETURNÚWXK_NUMPAD_ENTERr‘   ÚAutoCompActiveÚAutoCompCancelÚGetTextRangeÚchrrT   r`   ÚautoCompleteShowÚordÚReplaceSelectionÚautoCallTipShowÚGetTextLength)r)   r7   ÚkeyÚcurrposÚstopposÚcommandr1   r1   r2   r™   Ç  s2    


zShell.OnCharc             C   s–  |  ¡ }|  ¡ r| ¡  dS | ¡ }| ¡ }| ¡ }| ¡ }|  ¡ }|  ¡ }|  	¡ |  
¡ k}	|sf|rŒ|rŒ|tdƒtdƒfkrŒ|  ¡ }
|  |
¡}|d@ r|  |
¡}|  |
d¡ |  ¡ }|
d7 }
|
}x"|
|k rê|  |
¡dkrê|
d7 }
qÊW |  |
d ¡}|  ||
d ¡ |  ||¡ dS |  ¡ \}}|d8 }|  |¡}|  |¡}||  | j¡kr\|d8 }|  |¡}|  |d¡ |  |d |¡ |  |¡ |tjkr0| jr|  |  ¡ d ¡ttt j!ƒƒ | _|  "|  ¡ ¡ |  #| j¡ |  $¡  |  %d¡ |  &d¡ |  'd¡ n|  %d¡ |  &d	¡ |  'd¡ | j | _dS | jrD| ¡  dS |sŒ|sŒ|sŒ|sŒ|tj(tj)gkrŒ|  *¡ r€|  +¡  |  ,¡  n|r°|tj(tj)gkr°|  -¡  nâ|s¼|r |tj(tj)gkr |  *¡ rà|  +¡  ||krô|  ,¡  n|  .¡  n’|s|r|r| ¡  nt|tj/krJ|  *¡ r>| ¡  n|  0¡  nH|tj1krt|sb|rt|rt|  0¡  n|s€|r¤|td
ƒtj2fkr¤t3j4dd nî|s°|rÔ|tdƒtj5fkrÔt3j4dd n¾|sà|r|tdƒtj6fkrt3j4dd nŽ|s|r&|tdƒtdƒfks8|rD|tj7krD|  8¡  nN|sP|r||s||tdƒtdƒtj9fkr||  :¡  n|sˆ|r´|r´|tdƒtdƒtj9fkr´|  ;¡  nÞ|ræ|sæ|tdƒtdƒtj9fkræ|  <¡  n¬|sò|rD|tj=krD| j}||kr8|  |¡ |	s@|s@|  >|¡ |  ?¡  n| ¡  nN|tj=krâ| j}||krÖ|  @¡ \}}|  ¡ }|dd	… t j!t jAt jBgkrÌ|  |d	 | ¡ |	sÔ|sÔ|  >|d	 | ¡ |  ?¡  n| ¡  n| ¡  n°|	r |tCkr |  D¡ s n’|s|r(|s(|tdƒtdƒfks@|rL|sL|tj9krL|  E¡  nF|sX|rr|tjFkrr|  G|¡ n |s~|r¦|r¦|tdƒtdƒfkr¦|  H¡  nì|s²|rÄ|sÄ|tjIksà|rð|tdƒtdƒfkrð| jJdd n¢|sü|r|s|tjKks*|r:|tdƒtdƒfkr:| jJdd nX|sF|rr|rr|tjIkrr|  D¡ rr| jLdd n |s~|r¨|r¨|tjKkr¨|  D¡ r¨| jLdd nê|tjMkr¾|  N¡  nÔ|tj1krú|	rä|  D¡ rä| ¡  n|| jkr’| ¡  n˜|tjOtj7fkr |  D¡ r’| ¡  nr|tj9kr.nd|rL|tdƒtdƒfkrLnF|rj|tdƒtd ƒfkrjn(|tCkr~| ¡  n|  D¡ sŠn| ¡  dS )!zKey down event handler.NÚFÚfr   r   Zblackiô  Zredé   ú]ZFontIncrease)r­   ú[ZFontDecreaseú=ZFontDefaultÚXÚxÚCÚcÚVÚvÚPÚp)ÚstepÚNÚnr   ÚLÚlÚTÚt)PrÁ   rÅ   r²   ZControlDownZRawControlDownZAltDownZ	ShiftDownrÂ   rÍ   ÚGetSelectionStartÚGetSelectionEndrÊ   ÚGetCurrentLineZ	MarkerGetZPositionFromLineZMarkerDeleteZGetLineCountZGetLineVisibleZGetLineEndPositionZ	ShowLinesÚSetSelectionZGetSelectionZLineFromPositionr“   Z	MarkerAddZ	HideLinesÚSetCurrentPosr!   ZWXK_F12r˜   Úlenr½   r9   Úps1ÚGotoLineZGotoPosri   ZSetCaretForegroundZSetCaretWidthZSetCaretPeriodrÃ   rÄ   ÚCallTipActiveÚCallTipCancelÚprocessLineÚOnShowCompHistoryÚinsertLineBreakZ
WXK_ESCAPEÚclearCommandZWXK_BACKZWXK_NUMPAD_ADDr   r®   ZWXK_NUMPAD_SUBTRACTZWXK_NUMPAD_DIVIDEZ
WXK_DELETErz   Z
WXK_INSERTr~   r   ÚCopyWithPromptsPrefixedZWXK_HOMEÚ	SetAnchorÚEnsureCaretVisibleÚ
GetCurLineÚps2Úps3ÚNAVKEYSrÀ   r€   Z	WXK_SPACEÚOnCallTipAutoCompleteManuallyr   ÚWXK_UPÚOnHistoryReplaceÚWXK_DOWNÚOnHistoryInsertZWXK_F8ÚOnHistorySearchZWXK_TAB)r)   r7   rÎ   ZcontrolDownZrawControlDownZaltDownÚ	shiftDownrÏ   ÚendposZ	selectingZliÚmZstartPZmaxliZli0ZendPZstartLZendLÚhomeZline_strZline_lenr+   r1   r1   r2   rš   õ  s2   &


















   "






((((







zShell.OnKeyDownc       	         sê   | j dd… }d |¡}ddl}| d|¡}g ‰x"|D ]}t|ƒdkr6ˆ |¡ q6W ‡fdd„ttˆƒƒD ƒ}dd	„ ‰ |jt‡ fd
d„ƒd |  	d¡ d |¡}|  
¡ d }xt|  |¡ƒ ¡ rÌ|d8 }q°W |  |  
¡ | d |¡ dS )z<Show possible autocompletion Words from already typed words.Nú r   z[ \.\[\]=}(\)\,0-9"]r   c                s(   g | ] }ˆ | ˆ d |… krˆ | ‘qS )Nr1   )Ú.0Úi)Úthlistr1   r2   ú
<listcomp>  s    z+Shell.OnShowCompHistory.<locals>.<listcomp>c             S   s   | |k| |k  S )Nr1   )ÚaÚbr1   r1   r2   Ú_cmp	  s    z%Shell.OnShowCompHistory.<locals>._cmpc                s   ˆ |   ¡ |  ¡ ƒS )N)Úlower)r  r  )r  r1   r2   r|     r}   z)Shell.OnShowCompHistory.<locals>.<lambda>)rÎ   T)r–   r>   Úrer<   rì   ÚappendÚrangerr   r   ÚAutoCompSetIgnoreCaserÂ   rÈ   Ú	GetCharAtÚisalnumÚAutoCompShow)	r)   ZhisZjoinedr  Znewlistr  ZunlistZ
stringlistÚcposr1   )r  r	  r2   rò   ñ  s"    



zShell.OnShowCompHistoryc             C   s.   | j }|  ¡ }|  ||¡ |  d¡ d| _dS )z'Delete the current, unexecuted command.ru   FN)r“   rÍ   rê   rË   r”   )r)   Ústartposr  r1   r1   r2   rô     s
    
zShell.clearCommandc             C   s   |   ¡  |  |¡ dS )z?Replace with the previous/next command from the history buffer.N)rô   ÚreplaceFromHistory)r)   rà   r1   r1   r2   rþ   &  s    zShell.OnHistoryReplacec             C   s   t tjƒ}|  d¡ | j| }d|  kr8t| jƒkrBn n|| _d|  kr`t| jƒd krŒn n(| j| j }| dtj	| ¡}|  |¡ dS )z7Replace selection with command from the history buffer.ru   r   r   r   r   N)
r½   r9   rù   rË   r—   rì   r–   r#   rª   r´   )r)   rà   rù   ZnewindexrÑ   r1   r1   r2   r  +  s    


"zShell.replaceFromHistoryc             C   s6   |   ¡ sdS |  ¡ }|  |¡ |  ¡ }|  ||¡ dS )z9Insert the previous/next command from the history buffer.N)rÀ   rÂ   r  rê   )r)   rà   r  r  r1   r1   r2   r   7  s    
zShell.OnHistoryInsertc             C   sú   |   ¡ sdS |  ¡ }|  ¡ | }| jdd}|dkrB|d| … }|sJdS | jdksh| jt| jƒd krxtt| jƒƒ}n t| jd t| jƒƒt| jƒ }x\|D ]T}| j| }|dt|ƒ… |krž|  |t|ƒd… ¡ |  ¡ }|  	||¡ || _P qžW dS )zASearch up the history buffer for the text in front of the cursor.NF)Úrstripr   r   r   r   )
rÀ   rÂ   rÍ   Ú
getCommandr—   rì   r–   r  rË   rê   )r)   r  ZnumCharsAfterCursorZ
searchTextZsearchOrderr  rÑ   r  r1   r1   r2   r  @  s,    


zShell.OnHistorySearchc             C   s   t |ƒ dS )zDisplay status information.N)Úprint)r)   rA   r1   r1   r2   r&   _  s    zShell.setStatusTextc             C   s&   |   ¡ r"|  tj¡ d| _|  ¡  dS )zInsert a new line break.TN)rÀ   rT   rª   r´   r”   ri   )r)   r1   r1   r2   ró   f  s    zShell.insertLineBreakc             C   sî   |   ¡ }| j}|  ¡ }ttjƒ}|  ¡ r®|  |¡ d| j_	|  
||¡}| tj| ¡}dd„ |D ƒ}d |¡}| jjr”|s~d}|| j_|  tj¡ qê|  |¡ t d| j¡ n<| jddrÖ|  ¡ }|  ¡  |  |¡ n|  |¡ |  |¡ dS )z5Process the line of text at which the user hit Enter.Fc             S   s   g | ]}|  ¡ ‘qS r1   )r  )r  Úliner1   r1   r2   r
  ~  s    z%Shell.processLine.<locals>.<listcomp>r   r   )r  N)rÂ   r“   rÍ   r½   r9   rù   rÀ   rë   r   r”   rÇ   r<   rª   r´   r>   r‰   r‹   rŠ   rT   rº   r!   Z	CallLaterr÷   r  ÚgetMultilineCommandrô   rö   )r)   Ztheposr  r  rù   rÑ   Úlinesr1   r1   r2   rñ   m  s0    




zShell.processLinec             C   s>  t tjƒ}t|ƒ}t tjƒ}t|ƒ}|  ¡ d }|  ¡ }x:|d|… |krr|dkrr|d8 }|  |¡ |  ¡ d }q:W |d|… |kr(|  ¡ }|  |¡ |  ¡ | }|d7 }|  |¡ x.|  ¡ d d|… |krä|d7 }|  |¡ q¸W |  ¡ }	|  	||	¡}
|
 
tj| d¡}
|
 ¡ }
|
 
dtj| ¡}
nd}
|r:|
 ¡ }
|
S )znExtract a multi-line command from the editor.

        The command may not necessarily be valid Python syntax.r   Nr   r   ru   )r½   r9   rí   rì   rù   rø   ré   rî   rÂ   rÇ   r#   rª   r´   r  )r)   r  rí   Úps1sizerù   Úps2sizerA   r  r  rÐ   rÑ   r1   r1   r2   r  —  s8    




zShell.getMultilineCommandc             C   s6   |s|   ¡ d }|  |¡}||kr&d}|r2| ¡ }|S )z~Extract a command from text which may include a shell prompt.

        The command may not necessarily be valid Python syntax.r   ru   )rø   ÚlstripPromptr  )r)   rA   r  rÑ   r1   r1   r2   r  ¼  s    
zShell.getCommandc             C   sb   t tjƒ}t|ƒ}t tjƒ}t|ƒ}|d|… |krB||d… }n|d|… |kr^||d… }|S )z%Return text without a leading prompt.N)r½   r9   rí   rì   rù   )r)   rA   rí   r  rù   r   r1   r1   r2   r!  Ê  s    

zShell.lstripPromptFc             C   sp   |s|   tj¡ trt|ƒ}t ¡ }d| _d| _| j	 
|¡| _d| _d| _~| js`|  | ¡ ¡ |sl|  ¡  dS )z.Send command to the interpreter for execution.TNF)rT   rª   r´   Ú	USE_MAGICr   r!   Z
BusyCursorr3   r•   r   rº   r”   Ú
addHistoryr  ri   )r)   rÑ   ZsilentZbusyr1   r1   r2   rº   ×  s    z
Shell.pushc             C   sJ   d| _ |dkrFt| jƒdks*|| jd krF| j d|¡ tjd|d dS )z#Add command to the command history.r   ru   r   zShell.addHistory)r­   rÑ   N)r—   rì   r–   Úinsertr   r®   )r)   rÑ   r1   r1   r2   r#  ì  s
    zShell.addHistoryc             C   s^   |   |¡}|  |¡ |  ¡  | jrZ| jdkr6t ¡ | _t ¡ | j tkrZ|  ¡  t ¡ | _dS )zRDisplay text in the shell.

        Replace line endings with OS-specific endings.N)ÚfixLineEndingsZAddTextr÷   r3   r•   r±   ÚPRINT_UPDATE_MAX_TIMEZUpdate)r)   rA   r1   r1   r2   rT   ÷  s    



zShell.writec             C   s~   |  d¡}xbtt|ƒƒD ]R}||   d¡}x.tt|ƒƒD ]}tj ||   d¡¡||< q8W tj |¡||< qW tj |¡}|S )z>Return text with line endings replaced by OS-specific endings.z
úr   )r<   r  rì   rª   r´   r>   )r)   rA   r  rä   ZchunksrÛ   r1   r1   r2   r%    s    
zShell.fixLineEndingsc             C   s‚  | j j}d}|rttjƒ}n| jr.ttjƒ}n
ttjƒ}|  ¡ d }|dkrb|rVd}n|  	t
j¡ | jsr|  ¡ | _|s€|  	|¡ | js˜|  ¡ | _|  ¡  | jrl|  ¡ }|  |¡}|  |d ¡t|ƒd… }| ¡ }| ¡ }	g }
x"|D ]}| ¡ rþ|
 |¡ qæP qæW d |
¡}
|dkr*| d¡ d¡}n8|dt|ƒt|	ƒ … }|d	 d
krb|
dkrb|d7 }|  	|¡ |  ¡  |  d¡ dS )zyDisplay proper prompt for the context: ps1, ps2 or ps3.

        If this is a continuation line, autoindent as necessary.Fr   r   TNru   r   r'  r   ú:)
ÚifÚelseÚelifÚforÚwhileÚdefÚclassÚtryÚexceptÚfinallyz    )r‰   r‹   r½   r9   rú   r”   rù   rí   rø   rT   rª   r´   rÂ   r’   r“   ZEmptyUndoBufferré   ZGetLinerì   r¾   Úlstripr  r  r>   r÷   ZScrollToColumn)r)   r‹   Úskipri   r+   Zline_numZcurrentLineZpreviousLineZpstripr3  Z
first_wordr  Úindentr1   r1   r2   ri     sP    









zShell.promptc             C   sZ   d}| j }d|_|  ¡  z&x|js4t ¡ jdd qW |j}W dd|_d|_X t|ƒ}|S )z!Replacement for stdin.readline().ru   T)ZonlyIfNeededNF)r‰   r‹   ri   rŠ   r!   ZGetAppZYieldr½   )r)   rŠ   r‰   r1   r1   r2   r‡   J  s    
zShell.readlinec             C   s.   g }x$|dd… dgkr(|  |  ¡ ¡ qW |S )z"Replacement for stdin.readlines().r   Nr   )r  r‡   )r)   r  r1   r1   r2   rˆ   Z  s    zShell.readlinesc             C   s   |r|   |¡ |  ¡ S )z"Return string based on user input.)rT   r‡   )r)   ri   r1   r1   r2   rŒ   a  s    
zShell.raw_inputúPlease enter your response:c             C   s>   t  d|dd¡}z| ¡ t jkr,| ¡ }|S W d| ¡  X dS )z.Get response from the user using a dialog box.NzInput Dialog (Raw)ru   )r!   ZTextEntryDialogr@   ZID_OKZGetValuer6   )r)   ri   rB   rA   r1   r1   r2   r^   g  s    
z	Shell.askc             C   s   |   d¡ dS )z0Halt execution pending a response from the user.zPress enter to continue:N)r^   )r)   r1   r1   r2   rh   s  s    zShell.pausec             C   s   |   ¡  dS )zDelete all text from the shell.N)ZClearAll)r)   r1   r1   r2   rg   w  s    zShell.clearc             C   sB   |   ¡ }|  |¡ | ¡ }|r&|  ¡  |r4|  |¡ |  |¡ dS )z’Execute command as if it was typed in directly.
        >>> shell.run('print("this")')
        >>> print("this")
        this
        >>>
        N)rÍ   rë   r  ri   rT   rº   )r)   rÑ   ri   Úverboser  r1   r1   r2   rn   {  s    
  
z	Shell.runc          	   C   s`   |   ¡  t|ƒF}x>|D ]6}|dd… dkr>| j|ddd q| j|ddd qW W dQ R X dS )zJExecute all commands in file as if they were typed into the
        shell.Né   zshell.F)ri   r7  T)ri   Úopenrn   )r)   ÚfilenameZfile_rÑ   r1   r1   r2   ro   Š  s    

zShell.runfiler   c             C   sP   |   | j¡ |  | j¡ | jj|| j| j| jd}|rLd 	|¡}|  
||¡ dS )z#Display auto-completion popup list.)ZincludeMagicZincludeSingleZincludeDoubler  N)ZAutoCompSetAutoHidera   r  rb   r   ZgetAutoCompleteListrd   re   rc   r>   r  )r)   rÑ   Úoffsetrs   Zoptionsr1   r1   r2   rÉ   –  s    

zShell.autoCompleteShowc             C   s¸   |   ¡ r|  ¡  | j |¡\}}}|r6tjd| |d | jsD|sDdS |  ¡ }|r||r|| jr||  	|d ¡ |  ¡ }|  
||¡ |r´|t|ƒd  }	||  |¡ }
t|	|
ƒ}	|  |	|¡ dS )z6Display argument spec and docstring in a popup window.zShell.calltip)r­   ZsenderZcalltipNú)r   )rï   rð   r   Z
getCallTipr   r®   r_   rÂ   rf   rT   rê   rì   Z	GetColumnÚmaxZCallTipShow)r)   rÑ   ZinsertcalltipZforceCallTiprL   ZargspecZtipr  r  ZtipposZfallbackr1   r1   r2   rÌ   £  s"    

zShell.autoCallTipShowc             C   sL  |   ¡ r|  ¡  |  ¡ }| j}|}d}x,||krR|  |¡tdƒkrH|}P |d8 }q(W |dkrH|  |d |¡}|d7 }|sž| j}|  ||¡}|  |t|ƒ¡ nª|}d}x,||krÒt	|  |¡ƒ 
¡ rÈ|}P |d8 }q¨W |dkrà|}|  ||¡}	|	 d¡}
|
dkrH|  ¡ sH|  |	d|
d … |  |d ¡tdƒkoB|  ¡ |  ¡ kd¡ dS )z#AutoComplete and Calltips manually.r   Ú.r   r¿   NT)rÅ   rÆ   rÂ   r“   r  rÊ   rÇ   rÉ   rì   rÈ   ÚisspaceÚfindrï   rÌ   rÍ   )r)   r  rÏ   rÐ   r  ZpointavailposZ
textbehindZ
textbeforeZbegposZctipsZctindexr1   r1   r2   rü   ¹  sD    



z#Shell.OnCallTipAutoCompleteManuallyc             C   s   |   |¡ dS )zReplacement for stdout.N)rT   )r)   rA   r1   r1   r2   r   é  s    zShell.writeOutc             C   s   |   |¡ dS )zReplacement for stderr.N)rT   )r)   rA   r1   r1   r2   rŽ   í  s    zShell.writeErrc             C   s   |r| j t_n| jt_dS )z<If redirect is true then sys.stdin will come from the shell.N)r‰   r9   rw   )r)   Úredirectr1   r1   r2   rl   ñ  s    
zShell.redirectStdinc             C   s   |rt | jƒt_n| jt_dS )z9If redirect is true then sys.stdout will go to the shell.N)r   r   r9   rx   )r)   rA  r1   r1   r2   rm   ø  s    zShell.redirectStdoutc             C   s   |rt | jƒt_n| jt_dS )z9If redirect is true then sys.stderr will go to the shell.N)r   rŽ   r9   ry   )r)   rA  r1   r1   r2   rk   ÿ  s    zShell.redirectStderrc             C   s8   |   ¡ |  ¡ kr0|   ¡ | jkr0|  ¡ | jkr0dS dS dS )z/Return true if text is selected and can be cut.TFN)rç   rè   r“   )r)   r1   r1   r2   ÚCanCut  s
    zShell.CanCutc             C   s    |   ¡ rtj | ¡rdS dS dS )z&Return true if a paste should succeed.TFN)rÀ   r   r…   ÚCanPaste)r)   r1   r1   r2   rC    s    zShell.CanPastec             C   sH   |   ¡ |  ¡ kr6|   ¡ | jkr0|  ¡ | jkr0dS dS n|  ¡ | jkS dS )z&Return true if editing should succeed.TFN)rç   rè   r“   rÂ   )r)   r1   r1   r2   rÀ     s    zShell.CanEditc             C   sF   |   ¡ rB|  ¡ rB|  ¡ r |  ¡  |  ¡ r0|  ¡  |  ¡  |  d¡ dS )z/Remove selection and place it on the clipboard.ru   N)rB  ÚCanCopyrÅ   rÆ   rï   rð   r~   rË   )r)   r1   r1   r2   rz   !  s    z	Shell.Cutc             C   sp   |   ¡ rlttjƒ}ttjƒ}|  ¡ }| tj| tj¡}| tj| tj¡}| j	|d}t
 |¡}|  |¡ dS )z-Copy selection and place it on the clipboard.)rA   N)rD  r½   r9   rí   rù   ÚGetSelectedTextr#   rª   r´   r!  r!   ÚTextDataObjectÚ_clip)r)   rí   rù   rÑ   Údatar1   r1   r2   r~   +  s    


z
Shell.Copyc             C   s(   |   ¡ r$|  ¡ }t |¡}|  |¡ dS )zACopy selection, including prompts, and place it on the clipboard.N)rD  rE  r!   rF  rG  )r)   rÑ   rH  r1   r1   r2   r   7  s    
zShell.CopyWithPromptsc             C   sD   |   ¡ r@|  ¡ }d}|| tjtj| ¡ }t |¡}|  |¡ dS )zcCopy selection, including prompts prefixed with four
        spaces, and place it on the clipboard.z    N)rD  rE  r#   rª   r´   r!   rF  rG  )r)   rÑ   ZspacesrH  r1   r1   r2   rõ   >  s    

zShell.CopyWithPromptsPrefixedc             C   s:   t j ¡ r6t j d¡ t j |¡ t j ¡  t j ¡  d S )NF)r!   ÚTheClipboardÚOpenZUsePrimarySelectionZSetDatarF   ÚClose)r)   rH  r1   r1   r2   rG  I  s
    

zShell._clipc             C   s¾   |   ¡ rºtj ¡ rºttjƒ}tj t tj	¡¡r°t 
¡ }tj |¡r°|  d¡ | ¡ }| ¡ }|  |¡}| j|d}| tj| d¡}| tjd¡}| dtj| ¡}|  |¡ tj ¡  dS )z*Replace selection with clipboard contents.ru   )rA   r   N)rC  r!   rI  rJ  r½   r9   rù   ÚIsSupportedÚ
DataFormatÚDF_TEXTrF  ÚGetDatarË   ÚGetTextr  r%  r!  r#   rª   r´   rT   rK  )r)   rù   rH  rÑ   r1   r1   r2   r€   P  s    



zShell.Pastec             C   sZ   d}t j ¡ rHt j t  t j¡¡r>t  ¡ }t j |¡r>| ¡ }t j 	¡  |rV|  
|¡ dS )z8Replace selection with clipboard contents, run commands.ru   N)r!   rI  rJ  rL  rM  rN  rF  rO  rP  rK  ÚExecute)r)   rA   rH  r1   r1   r2   r   c  s    

zShell.PasteAndRunc             C   sp  t tjƒ}t tjƒ}|  ¡ }|  |¡ | j}|  ||¡ |  d¡ | 	¡ }|  
|¡}|  |¡}| tj| d¡}| tj| d¡}| tjd¡}| d¡}g }d}xŠ|D ]‚}	|	 ¡ | ¡ krÀd}	|	 	¡ }
|	 ¡ dkr|
|	kr|
dd… dkr|
dd… dkr|r| |¡ |	}q¨|d7 }||	7 }q¨W | |¡ x2|D ]*}| dtj| ¡}|  |¡ |  ¡  q>W dS )z-Replace selection with text and run commands.ru   r   NrÔ   )r*  r+  r8  r1  )r½   r9   rí   rù   rÍ   rë   r“   rê   rË   r3  r%  r!  r#   rª   r´   r<   r¾   r  rT   rñ   )r)   rA   rí   rù   r  r  r  ZcommandsrÑ   r  r3  r1   r1   r2   rQ  p  sB    











zShell.Executec             C   s   |   |¡ dS )z"Sets whether text is word wrapped.N)ÚSetWrapMode)r)   rp   r1   r1   r2   rp     s    z
Shell.wrapc             C   s   |   |¡ dS )z“Set the zoom level.

        This number of points is added to the size of all fonts.  It
        may be positive to magnify or negative to reduce.N)ÚSetZoom)r)   Zpointsr1   r1   r2   rq   ¡  s    z
Shell.zoomc             C   s¢   |  dd¡| _|  dd¡| _|  dd¡| _|  dd¡| _|  dd¡| _|  dd¡| _|  |  dd¡¡ |  d	d¡| _|  	| j¡ | 
d
d¡}|dkrž|  |¡ d S )NzOptions/AutoCompleteTz Options/AutoCompleteIncludeMagicz!Options/AutoCompleteIncludeSinglez!Options/AutoCompleteIncludeDoublezOptions/AutoCallTipzOptions/CallTipInsertzView/WrapModezView/ShowLineNumberszView/Zoom/Shelliÿÿÿ)ZReadBoolr`   rd   re   rc   r_   rf   rR  ÚlineNumbersZsetDisplayLineNumbersZReadIntrS  )r)   r.   rq   r1   r1   r2   r(   ª  s    zShell.LoadSettingsc             C   s†   |  d| j¡ |  d| j¡ |  d| j¡ |  d| j¡ |  d| j¡ |  d| j¡ |  d|  ¡ ¡ |  d| j¡ | 	d	|  
¡ ¡ d S )
NzOptions/AutoCompletez Options/AutoCompleteIncludeMagicz!Options/AutoCompleteIncludeSinglez!Options/AutoCompleteIncludeDoublezOptions/AutoCallTipzOptions/CallTipInsertzView/WrapModezView/ShowLineNumberszView/Zoom/Shell)Z	WriteBoolr`   rd   re   rc   r_   rf   ZGetWrapModerT  ZWriteIntZGetZoom)r)   r.   r1   r1   r2   r4   ¿  s    zShell.SaveSettingsc             C   sš   t  ¡ }| | jd¡ | | jd¡ | ¡  | | jd¡ | | jd¡ | tj	d¡ | | j
d¡ | tjd¡ | | jd¡ | ¡  | | jd	¡ |S )
zÄ
            Create and return a context menu for the shell.
            This is used instead of the scintilla default menu
            in order to correctly respect our immutable buffer.
        rƒ   r„   rz   r~   zCopy With Promptsr€   zPaste And Runr‚   z
Select All)r!   ZMenuZAppendr¢   r£   ZAppendSeparatorr   rž   r	   r¤   rŸ   r¥   r¡   r    )r)   Úmenur1   r1   r2   ÚGetContextMenuÍ  s    zShell.GetContextMenuc             C   s   |   ¡ }|  |¡ d S )N)rV  Z	PopupMenu)r)   r{   rU  r1   r1   r2   r›   å  s    zShell.OnContextMenuc             C   sœ   |j }|| j| jfkr&| |  ¡ ¡ nr|| jtjfkrF| |  ¡ ¡ nR|| j	tj
fkrf| |  ¡ ¡ n2|| jkr€| |  ¡ ¡ n|| jkr˜| |  ¡ ¡ d S )N)ZIdr   r¡   ZEnablerB  rž   r	   r¤   rD  rŸ   r¥   rC  r¢   ZCanUndor£   ZCanRedo)r)   r{   r   r1   r1   r2   rœ   é  s    

zShell.OnUpdateUI)ru   )T)NT)F)ru   )r6  )TT)r   )TF)T)T)T)T)r   )IrH   rI   rJ   rK   rL   r!   rM   r"   ZCLIP_CHILDRENr   r¯   r5   r°   r¦   r§   r¨   rj   r©   r   r]   r™   rš   rò   rô   rþ   r  r   r  r&   ró   rñ   r  r  r!  rº   r#  rT   r%  ri   r‡   rˆ   rŒ   r^   rh   rg   rn   ro   rÉ   rÌ   rü   r   rŽ   rl   rm   rk   rB  rC  rÀ   rz   r~   r   rõ   rG  r€   r   rQ  rp   rq   r(   r4   rV  r›   rœ   r1   r1   r1   r2   r$   å   s    


. }-	*
%

9




0


	
-

	r$   )1rK   r¼   r!   r   Zsixr   Úkeywordrª   r9   r±   Ú	functoolsr   r   r   ru   r   r   r	   Zpseudor
   r   r   r;   r   r   r¸   r   r   r   r   rú   r"  r&  ZWXK_ENDZWXK_LEFTZ	WXK_RIGHTrý   rÿ   Z
WXK_PAGEUPZWXK_PAGEDOWNrû   r   r    r   rR   rN   r»   r…   r$   r1   r1   r1   r2   Ú<module>   s:   vD