B
    b¹_%H ã               @   s   d Z dZed7 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 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+ej,fZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7d Z8d!Z9d"Z:d#Z;d$Z<d%Z=d&Z>de0> de1> B de2> B de3> B Z?de4> de5> B de6> B de7> B Z@de8> de9> B de:> B de;> B ZAe@eAB ZBde4> de8> B ZCde5> de9> B ZDde4> de8> B de5> B de9> B ZEde6> de:> B ZFde7> de;> B ZGd'ZHd(d)gZId*ZJd+ZKd,ZLd-ZMG d.d/„ d/ejNejOƒZPd0ZQG d1d2„ d2ƒZRd3ZSG d4d5„ d5ejTƒZUdS )6a%  Slices 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.
Slices is a version of shell modified by David Mashburn.z1David N. Mashburn <david.n.mashburn@gmail.com> / z(Patrick K. O'Brien <pobrien@orbtech.com>é    N)Ústc)ÚPY3)Ú
cmp_to_keyé   )ÚBuffer)Ú
dispatcher)Úeditor)Ú
editwindow)Údocument)Úframe)ÚPseudoFileIn)ÚPseudoFileOut)ÚPseudoFileErr)ÚVERSION)Úmagic)ÚtestForContinuations)ÚlsÚcdÚpwdÚsxz<-- Té   é   é   é   é   é   é   é	   é
   é   é   é   é   é   é   z#!/usr/bin/env python
z@#PySlices Save Format Version 1.1 (PySlices v0.9.7.8 and later)
z>#PySlices Save Format Version 1.2 (PySlices v0.9.8 and later)
z5#PySlices Marker Information -- Begin Grouping Slice
z2#PySlices Marker Information -- Begin Input Slice
z3#PySlices Marker Information -- Begin Output Slice
aò  

                            Tutorial!!!
------------------------------------------------------------------------
PySlices is the newest member of the Py suite!
It is a modified version of PyCrust that supports multi-line commands.

Input and output are contained in "Slices" shown as markers in the left margin.
Input Slices have RED margins (active, editable).
Output Slices have BLUE margins (frozen, not editable).

Commands in slices can be on more than one line, as with Sage or Mathematica.
For example, the command:
a=1
b=2
print(a+b)
will all run in sequence, much like a script.
Try running the above Input Slice by clicking somewhere in its text and
using Ctrl-Return, Shift-Return, or Numpad Enter to execute.
Previous commands (Old Slices) can be re-edited and run again in place.

Slices can also be:
 * selceted (click on the margin, Shift-click for multiple selection)
 * folded (click the margin twice)
 * selected and deleted (hit delete while selected)
 * divided (Ctrl-D)
 * merged (Ctrl-M while selecting adjacent, like-colored slices)

Try deleting the slice above this one by clicking on the red margin.

If you want a more traditional shell feel, try enabling "Shell Mode" in
"Options->Settings->Shell Mode" (or try PyCrust).
In Shell Mode, two returns in a row executes the command, and
    Ctrl-Return and Shift-Return always print newlines.

Saving and opening "sessions" is now supported!  This is a little
different to other shells where the history is saved.  With PySlices,
the whole document is saved in a simple text format!

To disable this Tutorial on startup, uncheck it in the menu at:
"Options->Startup->Show PySlices tutorial"

PySlices may not be the best thing since sliced bread, but
I hope it makes using Python a little bit sweeter!
c               @   sú   e Zd ZdZdZdddejejejdddddfdd„Z	dd	„ Z
d
d„ Zdd„ Zdd„ Zd7dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd8d!d"„Zd#d$„ Zd%d&„ Zd'd(„ Zd9d)d*„Zd:d+d,„Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Z dS );ÚSlicesShellFramez*Frame containing the sliceshell component.zSlicesShell FrameNéÿÿÿÿZPySlicesShellc             O   sì   t jj| ||||||dd t j | |	|
¡ |tjkr@|  d¡ dt }|  | 	dd¡¡ t
|| d|||| j| j| j| j| jdœ
|—Ž| _| j| _| jj| _| j| j_| j ¡  |  ¡  tj d	¡| _|d
krØ|  |¡ |  tj| j¡ d
S )z!Create SlicesShellFrame instance.ÚPySlices)Z	shellName)iî  i  z2PySlices %s - The Flakiest Python Shell... Cut Up!Ú
z, r&   )
ÚparentÚidÚ	introTextÚlocalsÚInterpClassÚstartupScriptÚexecStartupScriptÚshowPySlicesTutorialÚenableShellModeÚhideFoldingMarginú~N)r   ÚFrameÚ__init__ÚShellFrameMixinÚwxÚDefaultSizeZSetSizer   ÚSetStatusTextÚreplaceÚSlicesShellr.   r/   r0   r1   r2   Ú
sliceshellÚshellÚbufferÚsetStatusTextÚSetFocusÚLoadSettingsÚosÚpathÚ
expanduserÚcurrentDirectoryÚ
bufferOpenÚBindÚEVT_IDLEÚOnIdle)Úselfr)   r*   ÚtitleÚposÚsizeÚstyler,   r-   ÚconfigZdataDirÚfilenameÚargsÚkwdsZintro© rS   ú/lib/python3.7/site-packages/wx/py/sliceshell.pyr5   –   s"    

.



zSlicesShellFrame.__init__c             C   s   |   ¡  dS )zEvent handler for closing.N)ÚbufferClose)rJ   ÚeventrS   rS   rT   ÚOnClose¾   s    zSlicesShellFrame.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 PySliceShellzPySliceShell %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Úsplitr7   ÚVERSION_STRINGÚjoinÚPlatformInfoZMessageDialogZOKZICON_INFORMATIONÚ	ShowModalÚDestroy)rJ   rV   rK   ÚtextÚdialogrS   rS   rT   ÚOnAboutË   s    8
zSlicesShellFrame.OnAboutc             C   s   t j | |¡ dS )zShow a help dialog.N)r   r6   ÚOnHelp)rJ   rV   rS   rS   rT   rd   Ü   s    zSlicesShellFrame.OnHelpc             C   s8   | j d k	r4tj | ¡ tj | | j ¡ | j | j ¡ d S )N)rO   r   r6   rA   r4   r<   )rJ   rS   rS   rT   rA   á   s    
zSlicesShellFrame.LoadSettingsFc             C   sD   | j d k	r@tj | |¡ | js"|r@tj | | j ¡ | j | j ¡ d S )N)rO   r   r6   ÚSaveSettingsZautoSaveSettingsr4   r<   )rJ   ÚforcerS   rS   rT   re   ç   s
    

zSlicesShellFrame.SaveSettingsc             C   s$   | j d k	r | jdd | j  ¡  d S )NT)rf   )rO   re   ÚFlush)rJ   rS   rS   rT   ÚDoSaveSettingsî   s    
zSlicesShellFrame.DoSaveSettingsc             C   s    t j | |¡ | j | j¡ dS )z)Change between Slices Mode and Shell ModeN)r   r4   ÚOnEnableShellModer<   ÚToggleShellModer1   )rJ   rV   rS   rS   rT   ri   ó   s    z"SlicesShellFrame.OnEnableShellModec             C   s    t j | |¡ | j | j¡ dS )z)Change between Slices Mode and Shell ModeN)r   r4   ÚOnHideFoldingMarginr<   ÚToggleFoldingMarginr2   )rJ   rV   rS   rS   rT   rk   ø   s    z$SlicesShellFrame.OnHideFoldingMarginc             C   s   |   ¡  | ¡  dS )zEvent handler for idle time.N)Ú_updateTitleÚSkip)rJ   rV   rS   rS   rT   rI     s    zSlicesShellFrame.OnIdlec             C   sL   |   ¡ }|  ¡ r,| d¡rqH|  d| ¡ n| d¡rH|  |dd… ¡ dS )zShow current title information.z* r   N)ZGetTitleÚbufferHasChangedÚ
startswithÚSetTitle)rJ   rK   rS   rS   rT   rm     s    

zSlicesShellFrame._updateTitlec             C   s   | j r
dS dS dS )z)Return True if there is a current buffer.TFN)r>   )rJ   rS   rS   rT   Ú	hasBuffer  s    zSlicesShellFrame.hasBufferc             C   s@   | j  ¡ r|  ¡ }|r|S |  ¡  | j ¡  |  ¡  |  ¡  dS )zClose buffer.F)r>   Ú
hasChangedÚbufferSuggestSavere   r<   ÚdestroyÚbufferDestroyr`   )rJ   ÚcancelrS   rS   rT   rU     s    

zSlicesShellFrame.bufferClosec             C   s²   |   ¡  tƒ }tj| dd | _}| tjdd„ ¡ t|d}||_t 	tj
¡}| |jdtj¡ | |¡ | d¡ | ¡  | |¡ | |¡ |  |¡ | j ¡  |  ¡  dS )	zCreate new buffer.r&   )r)   r*   c             S   s   | S )NrS   )ÚxrS   rS   rT   Ú<lambda>,  ó    z/SlicesShellFrame.bufferCreate.<locals>.<lambda>)r)   r   TN)rv   r   r7   ZPanelÚpanelrG   ZEVT_ERASE_BACKGROUNDZEditorr   ZBoxSizerZVERTICALZAddZwindowZEXPANDZSetSizerZSetAutoLayoutZLayoutÚ	addEditorÚopenZ	setEditorÚsetFocusZSendSizeEvent)rJ   rP   r>   r{   r   ZsizerrS   rS   rT   ÚbufferCreate'  s     






zSlicesShellFrame.bufferCreatec             C   s   | j rd| _d| _ dS )zDestroy the current buffer.N)r>   r   )rJ   rS   rS   rT   rv   ;  s    zSlicesShellFrame.bufferDestroyc             C   s   | j r| j  ¡ S dS dS )z2Return True if buffer has changed since last save.FN)r>   rs   )rJ   rS   rS   rT   ro   B  s    
z!SlicesShellFrame.bufferHasChangedc             C   s^   |   ¡ }|r|S |  ¡  |  d¡ d| j_| j ¡  t ¡ | j_	d| j_
| jj	j| j_d}|S )zCreate new buffer.r'   Fz
This shell)rt   Úclearrq   r<   ÚNeedsCheckForSaveÚSetSavePointr
   ÚDocumentr>   ÚdocÚnameÚfilebaseÚ
modulename)rJ   rw   rS   rS   rT   Ú	bufferNewI  s    

zSlicesShellFrame.bufferNewc          	   C   sÜ   |   ¡ r|  ¡ }|r|S |dkr2tjdd| jd}|dkrØ|dkrØt|dƒ}| j |¡ W dQ R X tj	 
|¡d | _|  tj	 
|¡d d	 ¡ d
| j_| j ¡  t |¡| j_| jjj| j_| jjj| j_| j d¡ dS )zOpen file in buffer.NzOpen a PySlices Filez
*.pyslices)ÚwildcardZdefault_pathÚ Úrr   r   z - PySlicesF)ro   rt   r7   ÚFileSelectorrE   r}   r<   ÚLoadPySlicesFilerB   rC   r[   rq   r   r‚   r
   rƒ   r>   r„   rP   r…   r†   r‡   ÚScrollToLine)rJ   Úfilerw   ÚfidrS   rS   rT   rF   Y  s(    

zSlicesShellFrame.bufferOpenc          	   C   s    | j jj}|| j _|sd S tj |¡s.d| j _| j jsF| j  |¡| j _| j jrœt|dƒ}| j	 
|¡ W d Q R X | j	 ¡  |  tj |¡d d ¡ d| j	_d S )NTÚwbr   z - PySlicesF)r>   r„   ÚfilepathÚ	confirmedrB   rC   ÚexistsZoverwriteConfirmr}   r<   ÚSavePySlicesFiler‚   rq   r[   r   )rJ   r“   r’   r   rS   rS   rT   Ú
simpleSave{  s    

zSlicesShellFrame.simpleSavec             C   s(   | j jjr| jdd d}n|  ¡ }|S )zSave buffer to its file.T)r“   F)r>   r„   r’   r–   ÚbufferSaveAs)rJ   rw   rS   rS   rT   Ú
bufferSaveŒ  s
    
zSlicesShellFrame.bufferSavec             C   sÀ   |   ¡ r"| jjjr"|  ¡ }|r"|S d}| jr@| jjjr@| jjj}tjd|dd}|jdkr¸|jdd… dkrz| jd7  _t	 
|j¡| j_| jjj| j_| jjj| j_| jd	d
 d}nd	}|S )zSave buffer to a new filename.rŠ   zSave PySlices Filez&PySlices Files (*.pyslices)|*.pyslices)rK   Ú	directoryr‰   )rŠ   Ni÷ÿÿÿNz	.pyslicesT)r“   F)ro   r>   r„   r’   rt   Úfiledirr   Ú
saveSinglerC   r
   rƒ   rP   r…   r†   r‡   r–   )rJ   rw   rš   ÚresultrS   rS   rT   r—   –  s&    

zSlicesShellFrame.bufferSaveAsc          	   C   sŠ   d}| j r| j jjr| j jj}tjd|dd}|jdkr‚|jdd… dkrX| jd7  _t|jd	ƒ}| j |¡ W dQ R X d
}nd}|S )zSave buffer to a new filename.rŠ   zSave a Copy of PySlices Filez&PySlices Files (*.pyslices)|*.pyslices)rK   r™   r‰   )rŠ   Ni÷ÿÿÿNz	.pyslicesr‘   FT)	r>   r„   rš   r   r›   rC   r}   r<   r•   )rJ   rš   rœ   r   rw   rS   rS   rT   ÚbufferSaveACopy®  s    

z SlicesShellFrame.bufferSaveACopyc             C   sR   t jdd| jj dtjtjB tjB tjB tj	B d}|j
rD|  ¡ }n
|jdk}|S )z=Suggest saving changes.  Return True if user selected Cancel.Nz0%s has changed.
Would you like to save it first?zSave current file?)r)   ÚmessagerK   rN   ZCancel)r   ZmessageDialogr>   r…   r7   ZYES_NOZCANCELZ
NO_DEFAULTZCENTREZICON_QUESTIONZpositiver˜   ra   )rJ   rœ   rw   rS   rS   rT   rt   Ä  s    "

z"SlicesShellFrame.bufferSuggestSavec             C   s$   | j  ¡ r|  d¡ n
|  d¡ dS )z<Update the buffer namespace for autocompletion and calltips.zNamespace updatedz+Error executing, unable to update namespaceN)r>   ÚupdateNamespacer9   )rJ   rS   rS   rT   rŸ   Ó  s    
z SlicesShellFrame.updateNamespace)F)N)N)F)!Ú__name__Ú
__module__Ú__qualname__Ú__doc__r…   r7   ÚDefaultPositionr8   ZDEFAULT_FRAME_STYLEr5   rW   rc   rd   rA   re   rh   ri   rk   rI   rm   rr   rU   r   rv   ro   rˆ   rF   r–   r˜   r—   r   rt   rŸ   rS   rS   rS   rT   r%   ‘   s<   $
	

"

r%   a®  * Key bindings:
Home              Go to the beginning of the line.
End               Go to the end of the line.
Shift+Home        Select to the beginning of the line.
Shift+End         Select to the end of the line.
Ctrl-Home         Jump to the beginning of the slice;
                  If already there, jump to beginning of previous slice
Ctrl-End          Jump to the end of the slice;
                  If already there, jump to end of next slice
Ctrl-PageUp       Jump to the beginning of the shell
Ctrl-PageDown     Jump to the end of the shell
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+]            Increase font size.
Ctrl+[            Decrease font size.
Ctrl+=            Default font size.

Ctrl-Space        Show Auto Completion.
Ctrl-Shift-Space  Show Call Tip.
Ctrl-Shift-H      Complete Text from History.

Ctrl+F            Search
Ctrl+G            Search next
F12               on/off "free-edit" mode
                  For testing only -- This does not preserve markers!

In "Slices Mode":
Return            Insert new line
Enter (Numpad)    Run command in slice
Ctrl+Return       ""
Shift+Return      ""

In "Shell Mode":
Return or Enter   Insert a new line
Ctrl+Return       ""
Shift+Return      ""
2 Returns in a row   Run command in slice
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 )ÚSlicesShellFacadezÃ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SlicesShell Interfacec             C   s   | j }||d< t|d< dS )z$Create a SlicesShellFacade instance.ÚotherÚhelpTextN)Ú__dict__Ú	HELP_TEXT)rJ   r¦   ÚdrS   rS   rT   r5     s    zSlicesShellFacade.__init__c             C   s   | j | jdd dS )zBDisplay some useful information about how to use the slices shell.ÚOutput)ÚtypeN)Úwriter§   )rJ   rS   rS   rT   Úhelp  s    zSlicesShellFacade.helpc             C   s$   t | j|ƒrt| j|ƒS t|ƒ‚d S )N)Úhasattrr¦   ÚgetattrÚAttributeError)rJ   r…   rS   rS   rT   Ú__getattr__#  s    zSlicesShellFacade.__getattr__c             C   s>   || j kr|| j |< n$t| j|ƒr2t| j||ƒ nt|ƒ‚d S )N)r¨   r¯   r¦   Úsetattrr±   )rJ   r…   ÚvaluerS   rS   rT   Ú__setattr__)  s
    
zSlicesShellFacade.__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ÚcallTipInsertr€   ÚpauseÚpromptÚquitÚredirectStderrÚredirectStdinÚredirectStdoutÚrunÚrunfileÚwrapÚzoom)Úsort)rJ   ÚlistrS   rS   rT   Ú_getAttributeNames1  s.    z$SlicesShellFacade._getAttributeNamesN)
r    r¡   r¢   r£   r…   r5   r®   r²   rµ   rÌ   rS   rS   rS   rT   r¥     s   r¥   zi
Author: %r
Py Version: %s
Python Version: %s
wxPython Version: %s
wxPython PlatformInfo: %s
Platform: %sc               @   s®  e Zd ZdZd Zdejejejdddddddddfdd„Z	dØd	d
„Z
dÙ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%d&„ZdÜd'd(„ZdÝd)d*„ZdÞd+d,„Zdßd-d.„Zdàd/d0„Zdád1d2„Zdâd3d4„Zdãd5d6„Z d7d8„ Z!d9d:„ Z"d;d<„ Z#d=d>„ Z$d?d@„ Z%dAdB„ Z&dCdD„ Z'dEdF„ Z(dGdH„ Z)dIdJ„ Z*dKdL„ Z+dMdN„ Z,dädOdP„Z-dQdR„ Z.dSdT„ Z/dUdV„ Z0dWdX„ Z1dYdZ„ Z2d[d\„ Z3d]d^„ Z4d_d`„ Z5dådadb„Z6dædcdd„Z7dedf„ Z8dçdgdh„Z9didj„ Z:dèdkdl„Z;dédmdn„Z<dêdodp„Z=dëdqdr„Z>dsdt„ Z?dudv„ Z@dwdx„ ZAdìdzd{„ZBd|d}„ ZCd~d„ ZDd€d„ ZEd‚dƒ„ ZFdíd„d…„ZGdîd‡dˆ„ZHd‰dŠ„ ZId‹dŒ„ ZJdïddŽ„ZKdd„ ZLdðd’d“„ZMdñd”d•„ZNd–d—„ ZOd˜d™„ ZPdšd›„ ZQdòdœd„ZRdódždŸ„ZSdôd d¡„ZTdõd¢d£„ZUd¤d¥„ ZVd¦d§„ ZWd¨d©„ ZXdªd«„ ZYd¬d­„ ZZd®d¯„ Z[d°d±„ Z\d²d³„ Z]d´dµ„ Z^d¶d·„ Z_d¸d¹„ Z`dºd»„ Zad¼d½„ Zbd¾d¿„ ZcdÀdÁ„ ZddödÂdÃ„Zed÷dÄdÅ„ZfdÆdÇ„ ZgdÈdÉ„ ZhdÊdË„ ZidÌdÍ„ ZjdÎdÏ„ ZkdÐdÑ„ ZldÒdÓ„ ZmdÔdÕ„ ZndÖd×„ ZodS )ør;   z'Notebook Shell based on StyledTextCtrl.r&   rŠ   NTFc          
      s~  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ˆ j_dˆ _ˆ j ¡ ˆ _ dˆ _!d	ˆ _"dˆ _#ˆ j"r~ˆ  $d
t%j&¡ ˆ  $dt%j&¡ ˆ  $dt%j&¡ ˆ  'd
d¡ ˆ  'dd¡ ˆ  'dd¡ ˆ  (d
d	¡ ˆ  (dd	¡ ˆ  (dd	¡ ˆ  )dd¡ ˆ  )dd¡ ˆ  *dd¡ ˆ  +d
t,dt-> B ¡ ˆ  +dt.dt/> B dt0> B dt1> B ¡ ˆ  +dt%j2¡ ˆ  +dd¡ |rþˆ  'dd¡ |ˆ _3d}d}d}d}ˆ  4t-t%j5||¡ ˆ  4t/t%j5||¡ ˆ  4t6t%j7d|¡ ˆ  4t8t%j9d|¡ ˆ  4t:t%j;d|¡ ˆ  4t<t%j=d|¡ ˆ  4t0t%j5t> ?ddd¡t> ?ddd¡¡ ˆ  4t1t%j@tAdƒ |t> ?ddd¡¡ |rØdˆ _Bndˆ _Bdˆ _Cˆ jBdkr:ˆ  4tDt%j7d|¡ ˆ  4tEt%j9d|¡ ˆ  4tFt%j;d|¡ ˆ  4tGt%j=d|¡ nTˆ jBdkrŽˆ  4tDt%jH|d¡ ˆ  4tEt%j9d|¡ ˆ  4tFt%jI|d¡ ˆ  4tGt%jI|d¡ ˆ  4tJt%j7d|¡ ˆ  4tKt%j9d|¡ ˆ  4tLt%j;d|¡ ˆ  4tMt%j=d|¡ ˆ  4tNt%jOdt> ?ddd¡¡ ˆ  4t%jPt%j7dd¡ ˆ  4t%jQt%j9dd¡ ˆ  4t%jRt%j;dd¡ ˆ  4t%jSt%j=dd¡ ˆ  4t%jTt%jUdd¡ ˆ  4t%jVt%jWdd¡ ˆ  4t%jXt%jYdd¡ g ˆ _Zdˆ _[dˆ _\dˆ _]ˆ  ^t>j_ˆ j`¡ ˆ  ^t>jaˆ jb¡ ˆ  ^t>j%jcˆ jd¡ ˆ  ^t>jeˆ jf¡ ˆ  ^t>jgˆ jh¡ |r(t>jiˆ _it>jjˆ _jt>jkˆ _kt>jlˆ _lt>jmˆ _mt>jnˆ _nt>joˆ _onFt> p¡ ˆ _it> p¡ ˆ _jt> p¡ ˆ _kt> p¡ ˆ _lt> p¡ ˆ _mt> p¡ ˆ _nt> p¡ ˆ _oˆ j^t>jq‡ fd d!„ˆ jid" ˆ j^t>jq‡ fd#d!„ˆ jjd" ˆ j^t>jq‡ fd$d!„trjsd" ˆ j^t>jq‡ fd%d!„ˆ jkd" ˆ j^t>jq‡ fd&d!„trjtd" ˆ j^t>jq‡ fd'd!„ˆ jld" ˆ j^t>jq‡ fd(d!„ˆ jmd" ˆ j^t>jq‡ fd)d!„ˆ jnd" ˆ j^t>jq‡ fd*d!„ˆ jod" dˆ _uˆ  ^t>jvˆ jw¡ ˆ  x|¡ g g g g g g\}}}}}|ròˆ  ytzd+¡ d,}d-}||d g}|d |d g}|g}|d g}|d
 g}ˆ  {¡  ˆ  |¡  |
r*|	dkrt}j~ d.¡}	ˆ  €|	¡ nˆ  ¡  |dg7 }|ˆ  ‚¡ d
 g7 }|ˆ  ‚¡ d g7 }xötƒˆ  ‚¡ ƒD ]æ}ˆ  „|¡ ˆ  …|¡ ||krªˆ  †|t6¡ ˆ  †|tJ¡ n¨||krÎˆ  †|t<¡ ˆ  †|tM¡ n„||kròˆ  †|t6¡ ˆ  †|tD¡ n`||krˆ  †|t:¡ ˆ  †|tF¡ n<||kr:ˆ  †|t<¡ ˆ  †|tG¡ nˆ  †|t:¡ ˆ  †|tL¡ qnW dˆ _‡dˆ _ˆˆ  ‰¡  t> Šˆ j‹d¡ dS )/zCreate Shell instance.Nr   r   )ÚInterpreterrŠ   F)r,   ZrawinÚstdinÚstdoutÚstderrz
This shellTr   r   r   é   r    ZfoldÚ1ztab.timmy.whinge.levelÚ4z#E0E0E0ÚblackÚredZblueÚwhiteé¿   ú<Ú	ShellModeÚ
SlicesModeéò   éÿ   z#808080r&   c                s   ˆ   ¡ S )N)ÚCut)Úevt)rJ   rS   rT   ry   3  rz   z&SlicesShell.__init__.<locals>.<lambda>)r*   c                s   ˆ   ¡ S )N)ÚCopy)rÞ   )rJ   rS   rT   ry   4  rz   c                s   ˆ   ¡ S )N)ÚCopyWithPrompts)rÞ   )rJ   rS   rT   ry   5  rz   c                s   ˆ   ¡ S )N)ÚPaste)rÞ   )rJ   rS   rT   ry   6  rz   c                s   ˆ   ¡ S )N)ÚPasteAndRun)rÞ   )rJ   rS   rT   ry   7  rz   c                s   ˆ   ¡ S )N)Z	SelectAll)rÞ   )rJ   rS   rT   ry   8  rz   c                s   ˆ   ¡ S )N)ÚClear)rÞ   )rJ   rS   rT   ry   9  rz   c                s   ˆ   ¡ S )N)ÚUndo)rÞ   )rJ   rS   rT   ry   :  rz   c                s   ˆ   ¡ S )N)ÚRedo)rÞ   )rJ   rS   rT   ry   ;  rz   r«   r   r$   ZPYTHONSTARTUP)Œr	   Ú
EditWindowr5   rÈ   Ú__main__r¨   rX   rÎ   rÏ   rÐ   ZinterpreterrÍ   r   ÚreadlineÚ	readlinesÚreaderÚinputÚ	isreadingÚ	raw_inputr   ÚwriteOutr   ÚwriteErrÚinterpr   r>   ZGetIdr*   r|   r…   r   ZgetAutoCompleteKeysÚautoCompleteKeysÚmoreZmarginsÚ
lastUpdateZSetMarginTyper   ZSTC_MARGIN_SYMBOLÚSetMarginWidthZSetMarginSensitiveZSetPropertyZ
SetMarginsZSetMarginMaskÚGROUPING_MASKÚGROUPING_SELECTINGÚIO_MASKÚIO_SELECTINGÚREADLINE_BGÚINPUT_READLINEZSTC_MASK_FOLDERSr2   ÚMarkerDefineZSTC_MARK_FULLRECTÚGROUPING_STARTÚSTC_MARK_BOXMINUSÚGROUPING_START_FOLDEDÚSTC_MARK_BOXPLUSÚGROUPING_MIDDLEÚSTC_MARK_VLINEÚGROUPING_ENDÚSTC_MARK_LCORNERr7   ZColourZSTC_MARK_CHARACTERÚordÚmodeZexecOnNextReturnÚINPUT_STARTÚINPUT_START_FOLDEDÚINPUT_MIDDLEÚ	INPUT_ENDÚSTC_MARK_ARROWSÚSTC_MARK_DOTDOTDOTÚOUTPUT_STARTÚOUTPUT_START_FOLDEDÚOUTPUT_MIDDLEÚ
OUTPUT_ENDÚ	OUTPUT_BGZSTC_MARK_BACKGROUNDZSTC_MARKNUM_FOLDEROPENZSTC_MARKNUM_FOLDERZSTC_MARKNUM_FOLDERSUBZSTC_MARKNUM_FOLDERTAILZSTC_MARKNUM_FOLDERENDZSTC_MARK_BOXPLUSCONNECTEDZSTC_MARKNUM_FOLDEROPENMIDZSTC_MARK_BOXMINUSCONNECTEDZSTC_MARKNUM_FOLDERMIDTAILZSTC_MARK_TCORNERÚhistoryÚhistoryIndexÚnoteModeZ	searchTxtrG   ZEVT_CHARÚOnCharZEVT_KEY_DOWNÚ	OnKeyDownZEVT_STC_MARGINCLICKÚOnMarginClickZ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_PLUSÚwaitingrH   rI   Ú	showIntror­   ÚtutorialTextÚsetBuiltinKeywordsÚsetLocalShellrB   ÚenvironÚgetr/   rÁ   ÚGetLineCountÚrangeÚclearGroupingMarkersÚclearIOMarkersÚ	MarkerAddÚSliceSelectionÚrunningSliceÚEmptyUndoBufferÚ	CallAfterrŽ   )rJ   r)   r*   rL   rM   rN   r+   r,   r-   r.   r/   r0   r1   Z
useStockIdr2   rQ   rR   rç   rÍ   Z	sel_colorZgrouping_colorÚinput_colorZoutput_colorZoutStartZoutEndZinStartZinMiddleZinEndZtutStartZ	testStartÚirS   )rJ   rT   r5   Z  s~   *
$




















	



















zSlicesShell.__init__c             C   sì   |d kr,| j dkrd| _ q>| j dkr>d| _ n|r8d| _ nd| _ d}| j dkr–|  ttjd|¡ |  ttjd|¡ |  ttjd|¡ |  t	tj
d|¡ nR| j dkrè|  ttj|d¡ |  ttjd|¡ |  ttj|d¡ |  t	tj|d¡ d S )NrÙ   rÚ   rÕ   rÖ   )r  rû   r  r   rý   r  rÿ   r  r  r	  r  r
  r  )rJ   r1   r2  rS   rS   rT   rj   ‹  s6    
 
 










zSlicesShell.ToggleShellModec             C   s>   |d kr| j  | _ n|| _ | j r.|  dd¡ n|  dd¡ d S )Nr   r   r    )r2   rô   )rJ   r2   rS   rS   rT   rl   ¨  s    zSlicesShell.ToggleFoldingMarginc             C   s   g | _ d| _tjdd d S )Nr&   zSlicesShell.clearHistory)Úsignal)r  r  r   Úsend)rJ   rS   rS   rT   ÚclearHistory³  s    zSlicesShell.clearHistoryc             C   s   | ` d S )N)rð   )rJ   rS   rS   rT   ru   ¹  s    zSlicesShell.destroyc             C   s   |   ¡  dS )zSet focus to the slices shell.N)r@   )rJ   rS   rS   rT   r~   ¼  s    zSlicesShell.setFocusc             C   s   | j rt d¡ | ¡  dS )z Free the CPU to do other things.gš™™™™™©?N)r"  ÚtimeZsleeprn   )rJ   rV   rS   rS   rT   rI   À  s    
zSlicesShell.OnIdlec             C   sj   |r| j |dd y>| jjrN|r<| tj¡s<| j tjdd | j | jjdd W n tk
rd   Y nX dS )z.Display introductory text in the slices shell.r«   )r¬   N)r­   rð   r+   ÚendswithrB   Úlinesepr±   )rJ   ra   rS   rS   rT   r#  Æ  s    zSlicesShell.showIntroc             C   sT   ddl m} |rddl}nddl}|}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   )r   Nz3Click on the close button to leave the application.)Úsixr   ÚbuiltinsÚ__builtin__ÚcloseÚexitrÂ   r   r   r   r   )rJ   r   r;  r<  rS   rS   rT   r%  Ò  s    
zSlicesShell.setBuiltinKeywordsc             C   s   | j ddd dS )zQuit the application.z3Click on the close button to leave the application.r«   )r¬   N)r­   )rJ   rS   rS   rT   rÂ   å  s    zSlicesShell.quitc             C   s   t | d| jjd< dS )zAAdd 'slicesshell' to locals as reference to ShellFacade instance.)r¦   ZslicesshellN)r¥   rð   r,   )rJ   rS   rS   rT   r&  ð  s    zSlicesShell.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)rŠ   N)rB   rC   Úisfiler   Úpushrð   r.   )rJ   r.   ra   rS   rS   rT   r/   õ  s    

zSlicesShell.execStartupScriptc             C   s>   t tttj ¡ d tjttj	ƒtj
f }| j| ¡ dd dS )zDisplay information about Py.r   r«   )r¬   N)ÚDISPLAY_TEXTÚ
__author__r   rX   rZ   r[   r7   r\   Ústrr^   rY   r­   Ústrip)rJ   ra   rS   rS   rT   r¶     s
    
zSlicesShell.aboutc             C   sH  |   |¡}|  |¡}| tjd¡}| d¡}t|ƒ}t|ƒdkrLd|d fS t|ƒdkrd|\}}}}g }d}	xÌt|ƒD ]À\}
}| 	¡ }g }x"|D ]}| 
¡ r¨| |¡ qP qW d |¡}|
dkrÊd}d}n||
d  }||
d  }| ¡ dks||ks|d	ks|s|r"|	d7 }	|	|7 }	qv|	r2| |	¡ |}	qvW | |	¡ |S )
z4Turn a text block into multiple multi-line commands.r(   r   Nr   r   rŠ   r   F)ÚelseÚelifÚexceptÚfinally)ÚfixLineEndingsÚlstripPromptr:   rB   r9  r[   r   ÚlenÚ	enumerateÚlstripÚisalnumÚappendr]   rD  )rJ   ra   ÚlinesZcontinuationsZstringContinuationListZindentationBlockListZlineContinuationListZparentheticalContinuationListÚcommandsÚcommandÚjÚlinerM  Z
first_wordr3  Z
stringContÚlineContrS   rS   rT   ÚBreakTextIntoCommands  sD    








z!SlicesShell.BreakTextIntoCommandsc             C   sn   |   |¡}d}xZt|ƒD ]N}|d|> @ rB|d|> @ sB|  ||¡ q|d|> @ s|d|> @ r|  ||¡ qW dS )z*MarkerSet is the Set command for MarkerGetr"   r   N)Ú	MarkerGetr*  r-  ÚMarkerDelete)rJ   rT  ZmarkerBitsSetZ
markerBitsZ
numMarkersr3  rS   rS   rT   Ú	MarkerSetH  s    
zSlicesShell.MarkerSetc             C   s´   |dkr|   ¡ }|  ¡ }x0t|ddƒD ] }|  |¡dt> dt> B @ r&P q&W |}d}xPt||ƒD ]B}|  |¡dt> @ rxP q^||kr^|  |¡dt> dt> B @ r^d}P q^W || }||fS )zEGet the start/stop lines for the slice based on any line in the sliceNr&   r   r   )ÚGetCurrentLiner)  r*  rW  rü   rþ   r  )rJ   Úline_numÚ	num_linesr3  Ú
start_lineÚadditionÚ	stop_linerS   rS   rT   ÚGetGroupingSliceR  s"    zSlicesShell.GetGroupingSlicec             C   s˜   |dkr|   ¡ }|  ¡ }x$t|ddƒD ]}|  |¡t@ r&P q&W |}d}x@t||ƒD ]2}|  |¡t@ rhP qR||krR|  |¡t@ rRd}P qRW || }||fS )zEGet the start/stop lines for the slice based on any line in the sliceNr&   r   )rZ  r)  r*  rW  ÚIO_ANY_START_MASKÚIO_END_MASK)rJ   r[  r\  r3  r]  r^  r_  rS   rS   rT   Ú
GetIOSlicek  s     zSlicesShell.GetIOSlicec             C   s¬   |d kr|   ¡ }|  |¡\}}|  |d |¡ |  |¡}|  |¡ |  |t¡ |  |¡ |dt> dt	> B @ rz|  |t	¡ n.|dt
> dt> B @ r¨|  |t¡ |  |t¡ n d S )Nr   )rZ  r`  Ú	HideLinesrW  r+  r-  rþ   r,  r  r  r  r  r  )rJ   r[  ÚstartÚendÚmarkerrS   rS   rT   ÚFoldGroupingSliceƒ  s    


zSlicesShell.FoldGroupingSlicec             C   sØ   |d kr|   ¡ }|  |¡\}}|  |d |¡ |  |¡}|  |¡dt> dt> B @ rz|  |¡dt> @ rz|  |¡ |  |t¡ |  	|¡ |dt
> dt> B @ r¦|  |t¡ n.|dt> dt> B @ rÔ|  |t¡ |  |t¡ n d S )Nr   )rZ  rc  rd  rW  rü   rþ   r  r+  r-  r,  r  r  r  r  r  )rJ   r[  re  rf  rg  rS   rS   rT   ÚFoldIOSlice”  s"    


zSlicesShell.FoldIOSlicec             C   sÈ   |d kr|   ¡ }|  |¡\}}|  |d |¡ |  |¡ |  |t¡ x~t||ƒD ]p}|  |¡}|dt> dt	> B @ rŠ|  
|¡ |  |t¡ qP|dt> dt> B @ rP|  
|¡ |  |t¡ |  |t¡ qPW d S )Nr   )rZ  r`  Ú	ShowLinesr+  r-  rü   r*  rW  r  r  r,  r  r  r  )rJ   r[  re  rf  r3  rg  rS   rS   rT   ÚUnFoldGroupingSlice¨  s    



zSlicesShell.UnFoldGroupingSlicec             C   sÆ   |d kr|   ¡ }|  |¡\}}|  |d |¡ |  |¡}|  |¡dt> dt> B @ rz|  |¡dt> @ rz|  |¡ |  |t¡ |  	|¡ |dt
> @ rž|  |t¡ n$|dt> @ rÂ|  |t¡ |  |t¡ d S )Nr   )rZ  rc  rj  rW  rü   rþ   r  r+  r-  r,  r  r  r  r  r  )rJ   r[  re  rf  rg  rS   rS   rT   ÚUnFoldIOSliceº  s     


zSlicesShell.UnFoldIOSlicec             C   s    |dkr|   ¡ }|  ¡ }|  |¡t@ r*dS |  |¡\}}|  |¡\}}||k r||  |  |d ¡|  |d ¡¡ | jddd |  	|¡}|  
|¡ |  ||¡ dS )z!Delete all outputs after an inputNr   rŠ   T)ÚsliceDeletion)rZ  r)  rW  ÚOUTPUT_MASKrc  r`  ÚSetSelectionÚPositionFromLineÚReplaceSelectionÚGetLineEndPositionÚSetCurrentPos)rJ   r[  r\  ZstartInZendInÚstartGroupingÚendGroupingÚnew_posrS   rS   rT   ÚDeleteOutputSlicesAfterÍ  s    

z#SlicesShell.DeleteOutputSlicesAfterc             C   s~  |d kr|   ¡ }|  |¡\}}|  |¡t@ r>d}t}t}d}n|  |¡t@ r\d}t}t}d}||krhd S ||krÊ|  	|d ¡ |  
|d |¡ |dkr¦|  
|d t¡ |rÈ|  |d ¡ |  
|d t¡ n°|  	|¡ |  
||¡ |dkrô|  
|t¡ |r|  |¡ |  
|t¡ |d |krz|  	|d ¡ |  
|d |¡ |dkrV|  
|d t¡ |rz|  |d ¡ |  
|d t¡ d S )NÚInputTr«   Fr   )rZ  rc  rW  Ú
INPUT_MASKr  r	  rn  r  r  r,  r-  r  r+  rü   r  )rJ   r[  Z	start_numZend_numr¬   re  rf  ZsplitGroupingrS   rS   rT   Ú
SplitSliceä  sL     
 

 zSlicesShell.SplitSlicec             C   s|  |   |  ¡ d ¡}|   |  ¡ ¡}|dkr,dS |tdƒtdƒfkrx|  ¡ }|  |¡}|  |d ¡}|  |d ¡}|dt> @ r€dS |dt> dt> B @ r˜dS |dt> dt> B @ r¸|  |¡ n|dt> @ rÒ|  |d ¡ |dt	> @ rî|rî|  
|¡ nŠ|dt	> dt> B @ rdS |dt> dt> B @ r"dS |dt> dt> B dt> B dt> B @ rT|  
|¡ n$|dt	> dt> B @ rx|  
|d ¡ dS )Nr   r   Fr(   úT)Ú	GetCharAtÚGetCurrentPosr  rZ  rW  r  rü   rþ   r+  r	  r,  r  r  r  r  r  )rJ   rf   Úc_beforeÚc_afterr[  rg  Úmarker_beforeÚmarker_afterrS   rS   rT   ÚBackspaceWMarkers  s:    
$zSlicesShell.BackspaceWMarkersc             C   s^  |   |  ¡ d ¡}|   |  ¡ ¡}|dkr,dS |tdƒtdƒfkrZ|  ¡ }|  |¡}|  |d ¡}|  |d ¡}|dt> @ r€dS |dt> dt> B @ r˜dS |dt> dt> B @ r¼|  |d ¡ n|dt> @ rÒ|  |¡ |dt	> dt
> B @ rêdS |dt> dt> B @ rdS |dt> dt> B dt> B dt> B @ r:|  |d ¡ n |dt	> dt
> B @ rZ|  |¡ dS )Nr   r   Fr(   r{  T)r|  r}  r  rZ  rW  r  rü   rþ   r+  r	  r  r  r  r  r  r,  )rJ   r~  r  r[  rg  r€  r  rS   rS   rT   ÚForwardDeleteWMarkers5  s6    

$
z!SlicesShell.ForwardDeleteWMarkersc             C   sä   d}d}|   ¡ d }d }x´t|   ¡ ƒD ]¤}|  |¡dt> @ r¸|dkrp|}|  |¡t@ r\d}q²|  |¡t@ r²d}nB|  |¡t@ r’|dkr²|d }P n |  |¡t@ r²|dkr²|d }P d}q&|dkr&|d }P q&W |dkrÜd| _||fS )NFr   r   rë   ÚoutputT)r)  r*  rW  rø   ry  rn  r.  )rJ   Ústartedre  rf  r¬   r3  rS   rS   rT   ÚGetIOSelectionX  s6    zSlicesShell.GetIOSelectionc             C   s  d d}d}|   ¡ d }d }x"t|   ¡ ƒD ]}|  |¡dt> @ r,|dkrz|}|  |¡t@ rfd}n|  |¡t@ rxd}n¬|  |¡t@ rÊ|dkrœ|d }P n,|  |¡ |  |¡ |  |t	¡ |  |t
¡ n\|  |¡t@ r&|dkrî|d }P n8|  |¡ |  |¡ |  |t¡ |  |t¡ |  |t
¡ d}q,|dkr,|d }P q,W |r||kr|  |¡ |  |¡ |dkrÌ|  |t¡ |d |   ¡ k r¾|  |d ¡t@ r°|  |t
¡ n|  |t¡ n|  |t¡ nN|  |¡dt> @ rö|  |¡ |  |t
¡ |  |t¡ |  |t¡ |  |t¡ d S )NzYThis function merges all adjacent selected slices.
Right now, only IO Merging is allowed.Fr   r   rë   r„  T)r)  r*  rW  rø   ry  rn  r,  r+  r-  r  r   r  r  r	  r  r  )rJ   r…  re  rf  r¬   r3  rS   rS   rT   ÚMergeAdjacentSlicesy  sd    







zSlicesShell.MergeAdjacentSlicesc             C   s  | j s
dS g }d\}}x^t|  ¡ ƒD ]N}|  |¡dt> dt> B @ rT|dkrN|}|}q$|dkr$| ||g¡ d\}}q$W |dkrŒ| ||g¡ |  ¡  d| _ xttt|ƒd ddƒD ]Z}|  	|  
|| d ¡|  || d ¡d ¡ |  || d d ¡}| jddd	 |  ¡ }|  |d ¡dt> @ r\|  |¡dt> dt> B @ r\|  |¡ |  |t¡ nR|  |d ¡dt> @ r®|  |¡dt> dt> B @ r®|  |d ¡ |  |d t¡ |dt> @ rà|  |¡ |  |t¡ |  |t¡ q²|dt> @ r²|  |¡ |  |t¡ |  |t¡ q²W dS )
z;Deletion of any selected and possibly discontinuous slices.N)NNr   Fr&   r   rŠ   T)rm  )r.  r*  r)  rW  rö   rø   rO  ÚMarginUnselectAllrK  ro  rp  rr  rq  rZ  r  r   r+  r-  rü   rþ   r  r,  r  r  )rJ   ZselectedSlicesre  rf  r3  Z
markerNextÚcur_linerS   rS   rT   ÚSliceSelectionDelete¶  sP    


z SlicesShell.SliceSelectionDeletec             C   sÈ  | j r| ¡  dS |  ¡ sdS | ¡ }|  ¡ }|  |  ¡ ¡}|tjtj	gkrPnt|| j
krÒ|  ¡ rj|  ¡  |  ||¡t|ƒ }|  ¡ }t|ƒ}| jd|||t|ƒ dd | j|dd |  ¡  | jrÐ|  |¡ nò|tdƒkrr|  ¡ rð|  ¡  |  d¡ |  ||¡d }|  ¡ }d}| jd|||t|ƒ d	d d	| j| j d
< | j|dd |  ¡  |  ||  ¡ |  ¡ k¡ nR|  ¡ }y4t|ƒ}|  d|||t|ƒ ¡ | ¡  |  ¡  W n   | ¡  Y nX dS )z|Keypress event handler.

        Only receives an event if OnKeyDown calls event.Skip() for the
        corresponding event.NÚinsertF)ÚforceNewActionrx  )r¬   ú(rŠ   TÚallowsAppend)r  rn   ÚCanEditÚ
GetKeyCoder}  rp  rZ  r7   Ú
WXK_RETURNÚWXK_NUMPAD_ENTERrñ   ÚAutoCompActiveÚAutoCompCancelÚGetTextRangeÚchrÚUpdateUndoHistoryBeforerK  r­   ÚUpdateUndoHistoryAfterr¹   ÚautoCompleteShowr  rq  ÚundoHistoryÚ	undoIndexÚautoCallTipShowÚGetTextLength)rJ   rV   ÚkeyÚcurrposÚstopposrR  ÚcposÚsrS   rS   rT   r  î  sX    

zSlicesShell.OnCharc                s¼   ˆ  ¡ ˆj }|dkr.ˆ jd8  _ˆjd= nŠˆj}ˆj}|| d ‰ d ‡ ‡fdd„t|ƒD ƒ¡}| tjd¡ |ˆjˆj d	< ˆ | ˆjˆj d
< t	| 
d¡ƒˆjˆj d< ˆ ¡  d S )Nr   r   r&   ÚposStartrŠ   c                s   g | ]}t ˆ ˆ | ¡ƒ‘qS rS   )r–  r|  )Ú.0r3  )r¡  rJ   rS   rT   ú
<listcomp>?  s    z6SlicesShell.AutoCompActiveCallback.<locals>.<listcomp>r(   ÚcharListÚposEndÚnumLines)r  Ú$TotalLengthForAutoCompActiveCallbackr›  rš  r]   r*  r:   rB   r9  rK  r[   r˜  )rJ   ZnumCharsÚuHÚuIr¢  rS   )r¡  rJ   rT   ÚAutoCompActiveCallback6  s    
z"SlicesShell.AutoCompActiveCallbackc       &   	   C   sò  |  ¡ }|  ¡ r”|tjtjgkrn|  ¡ }| jdd||d dd d| j| j d< |  	¡ | _
| ¡  t | j¡ |tjtjgkrˆ|  ¡  n| ¡  dS | ¡ }| ¡ }| ¡ }|  ¡ }|  	¡ }|  ¡ |  ¡ k}	|tjkr*| jrþ|  d¡ |  d	¡ |  d
¡ n|  d¡ |  d¡ |  d¡ | j | _dS | jr>| ¡  dS d}
d}d}|s˜|s˜|s˜|tjgkr˜| jdkr~d}
qæ| jdkræ|  ¡ \}}|  |¡}|  |¡}|  ||¡}t |dd\}}}}| !d¡d }| "¡ dkrìd}n|d dkr d}nd}|d s,|d s,|d s,|d r2d}
nd|r^|  |¡}|  #|¡ |  $||¡ d}
n8|  %¡ |kr’|  |¡}|  #|¡ |  $||¡ d}nd}nN|tjgksÄ|s²|ræ|tjtjgkræ| jdkrÖd}n| jdkræd}
|rðnÄ|
sü|rª|  &¡ r|  '¡  n–| j(r€xŒt)|  *¡ ƒD ]T}|  +|¡d	t,> @ rR|  -|d||¡ P n&|  +|¡d	t.> @ r&|  -|d||¡ P q&W n&|
r|  /¡  n|r´|  0¡  |  1¡  n
|rÂ|rÂ| ¡  nò|tj2krä|  &¡ r´| ¡  nÐ|tjkr|r|r|  3¡  n¬|r2|t4dƒtj5fkr2t6j7dd n‚|r\|t4dƒtj8fkr\t6j7dd nX|r†|t4dƒtj9fkr†t6j7dd n.|r¢|t4dƒt4d ƒfks´|rÀ|tjkrÀ|  :¡  
nô|rò|sò|t4d!ƒt4d"ƒtj;fkrò|  <¡  
nÂ|r$|r$|t4d!ƒt4d"ƒtj;fkr$|  =¡  
n|rV|sV|t4d!ƒt4d"ƒtj;fkrV|  >¡  
n^|rà|tj?krà|  %¡ }|  |¡d }|  |¡}||kr´|dkr´|  |  |d	 ¡d ¡}|  #|¡ |	s´|s´|  @|¡ |  A¡  	nÔ|rr|tjBkrr|  %¡ }|  |¡d	 }|  |¡}||krF||  *¡ d	 k rF|  |  |d	 ¡d	 ¡}|  #|¡ |	s´|s´|  @|¡ |  A¡  	nB|r¾|tjCkr¾d}||kr´|  #|¡ |	s´|s´|  @|¡ |  A¡  nö|r|tjDkr|  |  *¡ d	 ¡}||k r´|  #|¡ |	s´|s´|  @|¡ |  A¡  nœ|	r6|tEkr6|  F¡ s6n~|rX|sX|t4d#ƒt4d$ƒfksp|r||s||tj;kr||  G¡  n8|r´|r´|t4d#ƒt4d$ƒfkr´|  F¡ r´|  H¡  n |rÌ|sÌ|tjIksò|r|t4d%ƒt4d&ƒfkr|  F¡ r| jJd	d' n²|r|s|tjKks@|rP|t4d(ƒt4d)ƒfkrP|  F¡ rP| jJdd' nd|r‚|r‚|tjIkr‚|  F¡ r‚| jLd	d' n2|r´|r´|tjKkr´|  F¡ r´| jLdd' n |rÔ|tjMkrÔ|  N|¡ nà|rü|rü|t4d*ƒgkrü|  O¡  n¸|tjPk	r|  Q¡  n |tjk	rü| j(	r>|  R¡  t | jS¡ nº|		rZ|  F¡ 	rZ|  Td¡ nž|  F¡ r´d}|  %¡ } | dk	s¦|  ¡ |  | ¡k	r¦|  +| d	 ¡tU@ 	r¦d}|	rì|  ¡ }tV|  W|d	 ¡ƒ}!|  d+|!|d	 |¡ |  X¡ 	rì| ¡  t | jS¡ n¸|tjk
rè| j(
r&|  R¡  t | jS¡ n¾|	
rB|  F¡ 
rB|  Td¡ n¢|  F¡ r´d}|  %¡ } | |  *¡ d	 k
s–|  ¡ |  | ¡k
r–|  +| d	 ¡tU@ 
r–d}|
rØ|  ¡ }tV|  W|¡ƒ}!|  d+|!||d	 ¡ |  Y¡ 
rØ| ¡  t | jS¡ nÌ|tjZkrP|  F¡ rP|  ¡ }| jdd||d dd d| j| j d< |  	¡ | _
| ¡  t | j¡ nd|tj;kr`nT|rˆ|t4d,ƒt4d-ƒfkrˆ|  [¡  n,|rÜ|t4d.ƒt4d/ƒfkrÜt \d0¡}"|"dkr´t]|"d1ƒ}#|  ^|#¡ W dQ R X nØ|rn|t4d2ƒt4d3ƒfkrn|  +|  %¡ ¡t_@ r´|  ¡ }t`| j|  a|  b|¡¡ƒ\}$}| jd4d|$|dd |  c¡  |  $||¡ |  Td¡ |  d¡  nF|rø|t4d5ƒt4d6ƒfkrø| j(r¢|  ¡ }|  e¡ }%| j(r´t`| j|%ƒ\}$}| jd4d|$|dd |  f¡  |  $||¡ |  Td¡ |  d¡  n¼| j(rZ|tjItjKtjgtjhgkrZ|tjIkr¬x€t)|  *¡ ƒD ]p}|  +|¡d	t,> @ rn|dkrj|  -|d	 d||¡ P n4|  +|¡d	t.> @ r4|dkr |  -|d	 d||¡ P q4W q´|tjKkrVx˜t)|  *¡ d	 ddƒD ]€}|  +|¡d	t,> @ r||  *¡ d	 k r|  -|d	 d||¡ P n<|  +|¡d	t.> @ rÎ||  *¡ d	 k rJ|  -|d	 d||¡ P qÎW q´|tjgkröxôt)|  *¡ ƒD ]€}|  +|¡d	t,> @ rœ|  -|d||¡ P nR|  +|¡d	t.> @ rp|  i¡  |  #|  |¡¡ |	sì|sì|  @|  |¡¡ |  A¡  P qpW nb|tjhkr´x°t)|  *¡ ƒD ]D}|  +|¡d	t,> @ r,P n&|  +|¡d	t.> @ r|  -|d||¡ P qW nZ|tEkrn| ¡  nF|  F¡ szn:|  ¡ |  ¡ kr¬|s¬|s¬|d7k r¬|  Td¡ | ¡  | j(rî|tjItjKtjgtjhtjjtjktjltjmgkrî|  i¡  dS )8zKey down event handler.r‹  Zdummyr   T)rŒ  rŽ  NrÔ   r   iô  rÕ   r   r   FrÚ   rÙ   )ÚignoreErrorsr(   r&   rŠ   ú r   r   ú]ZFontIncrease)r4  ú[ZFontDecreaseú=ZFontDefaultÚXrx   ÚCÚcÚVÚvÚPÚp)ÚstepÚNÚnÚHÚdeleteÚTÚtÚLÚlzLoad File As New Slicer‹   ÚDrª   rg  ÚMÚmé   )nr  r“  r7   r‘  r’  r}  r—  rš  r›  r  r©  rn   r1  r¬  Z
WXK_DELETEZWXK_BACKr”  ZControlDownZAltDownZ	ShiftDownÚGetSelectionStartÚGetSelectionEndZWXK_F12r  ZSetCaretForegroundZSetCaretWidthZSetCaretPeriodr  rc  rp  rr  r•  r   r[   rM  rs  ro  rZ  ÚCallTipActiveÚCallTipCancelr.  r*  r)  rW  rö   ÚDoMarginClickrø   ÚinsertLineBreakrw  ÚprocessLineZ
WXK_ESCAPEÚclearCommandr  ZWXK_NUMPAD_ADDr   r5  ZWXK_NUMPAD_SUBTRACTZWXK_NUMPAD_DIVIDErÝ   Z
WXK_INSERTrß   rà   ÚCopyWithPromptsPrefixedÚWXK_HOMEZ	SetAnchorÚEnsureCaretVisibleÚWXK_ENDÚ
WXK_PAGEUPÚWXK_PAGEDOWNÚNAVKEYSr  rá   râ   ÚWXK_UPÚOnHistoryReplaceÚWXK_DOWNÚOnHistoryInsertZ	WXK_SPACEÚOnCallTipAutoCompleteManuallyÚOnShowCompHistoryZWXK_F8ÚOnHistorySearchrŠ  ÚRestoreFirstMarkerrq  rn  r–  r|  r‚  rƒ  ZWXK_TABrj   rŒ   r}   ÚLoadPyFileAsSlicery  Úmapr`  ÚLineFromPositionrz  r˜  r†  r‡  Ú	WXK_RIGHTÚWXK_LEFTrˆ  ZWXK_ALTZWXK_COMMANDZWXK_CONTROLZ	WXK_SHIFT)&rJ   rV   rž  r¡  ÚcontrolDownZaltDownÚ	shiftDownrŸ  ÚendposZ	selectingZdoLineBreakZdoSubmitCommandZdoPassÚ	startLineZendLineÚstartposrR  ZstrContZindentBlockrU  Z	parenContZlastLineZstillIndentedrv  r3  ZcurLineZIOstartÚhomeZIOendrf  rL   ZdoDeleter‰  r¢  r   r   re  ZioSelrS   rS   rT   r  F  sn   


































" &&




















zSlicesShell.OnKeyDownc             C   s6   |   ¡ }x(t|ƒD ]}|  |t¡ |  |t¡ qW d S )N)r)  r*  r-  rö   rX  rø   )rJ   r\  r3  rS   rS   rT   ÚMarginSelectAll÷  s    zSlicesShell.MarginSelectAllc             C   s<   |   ¡ }x(t|ƒD ]}|  |t¡ |  |t¡ qW d| _d S )NF)r)  r*  rX  rø   rö   r.  )rJ   r\  r3  rS   rS   rT   rˆ  ý  s
    zSlicesShell.MarginUnselectAllc             C   sf  |   ¡ }|dkr|dkrÚd| _|  |¡\}}|  |¡}|  |¡ |  ||¡ |  |¡}	|  |¡dt> @ r¢| j}
|s¨|	dt	> @ rŠ|  
|¡ q¨|	dt> @ r¨|  |¡ n| j}
|s´|  ¡  x t||d ƒD ]}|
|tƒ qÄW n^|dkr¨d| _|  |¡\}}|  |¡}|  |¡ |  ||¡ |  |¡}	|  |¡dt> @ rn| j}
|st|	t@ rX|  |¡ n|	t@ rt|  |¡ n| j}
|s‚|  ¡  x´t||d ƒD ]}|
|tƒ q’W n|dkr0|rÖ|  |d¡ |  |ddd¡ nX|r$|  |¡r|  |d¡ |  |ddd¡ n|  |d¡ |  |ddd¡ n
|  |¡ n|  ¡  |d	krb|
| jkr\|s\d| _nd| _d S )
Nr   r   Tr   r   Fr   éd   )r   r   )r)  r.  r`  rp  rs  ro  rW  rö   rX  rü   rh  rþ   rk  r-  rˆ  r*  rc  rø   ÚIO_START_MASKri  ÚIO_START_FOLDED_MASKrl  ZSetFoldExpandedZExpandZGetFoldExpandedZ
ToggleFold)rJ   ÚlineClickedZmarginrã  râ  r\  re  rf  ZstartPosZstart_markerZtoggler3  rS   rS   rT   rÊ    sp    










zSlicesShell.DoMarginClickc             C   s6   |   | ¡ ¡}|  || ¡ | ¡ | ¡ ¡ | ¡  d S )N)rß  ZGetPositionrÊ  Z	GetMarginZGetShiftZ
GetControlrn   )rJ   rÞ   rì  rS   rS   rT   r  O  s    zSlicesShell.OnMarginClickc       	         sÞ   | j dd… }d |¡}ddl}| d|¡}g ‰ x"|D ]}t|ƒdkr6ˆ  |¡ q6W ‡ fdd„ttˆ ƒƒD ƒ}|jt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.Nr®  r   z[ \.\[\]=}(\)\,0-9"]r   c                s(   g | ] }ˆ | ˆ d |… krˆ | ‘qS )NrS   )r¤  r3  )ÚthlistrS   rT   r¥  k  s    z1SlicesShell.OnShowCompHistory.<locals>.<listcomp>c             S   s   t |  ¡ | ¡ ƒS )N)ZcmpÚlower)ÚaÚbrS   rS   rT   ry   n  rz   z/SlicesShell.OnShowCompHistory.<locals>.<lambda>)rž  T)r  r]   Úrer[   rK  rO  ZxrangerÊ   r   ÚAutoCompSetIgnoreCaser}  r–  r|  rN  ÚAutoCompShow)	rJ   ZhisZjoinedrñ  Znewlistr3  ZunlistZ
stringlistr¡  rS   )rí  rT   rÚ  V  s     



zSlicesShell.OnShowCompHistoryc             O   sR  |   ¡ \}}|  ¡ \}}|  |  ¡ ¡}	|  |  ¡ ¡}
|  ¡ }|  ¡ }|dkrh| jd|||t|ƒ dd tj	j
| df|ž|Ž |dkr’|s’|  ¡  |
|	 dkrú|sú|
|krÎ||  ¡ krÎ|  ¡  |  |  ¡ t¡ |
|krú||  ¡ krú|  ¡  |  |  ¡ t¡ |  ¡ }|}|dkr>| jd|||t|ƒ dd |  |¡ |  ¡  |  ¡  |  ¡  d S )NrŠ   r½  T)rŒ  r   r‹  )rc  r`  rß  rÆ  rÇ  ÚGetSelectedTextr—  rK  r	   ræ   rq  r˜  rZ  r,  r-  r	  r+  r  r­   ÚensureSingleGroupingMarkerÚensureSingleIOMarker)rJ   ra   rm  rQ   rR   ZstartIOZendIOrt  ru  ZstartSelZendSelr¡  r¢  rS   rS   rT   rq  €  s8    

zSlicesShell.ReplaceSelectionc             C   sL   |   ¡ sdS |  ¡ \}}|  |¡}|  |¡}|  ||¡ |  d¡ d| _dS )z'Delete the current, unexecuted command.NrŠ   F)r  rc  rp  rr  ro  rq  rò   )rJ   re  rf  ræ  rä  rS   rS   rT   rÍ  ¥  s    


zSlicesShell.clearCommandc             C   s"   |   ¡ sdS |  ¡  |  |¡ dS )z?Replace with the previous/next command from the history buffer.N)r  rÍ  ÚreplaceFromHistory)rJ   r¹  rS   rS   rT   rÖ  °  s    zSlicesShell.OnHistoryReplacec             C   sŽ   |   ¡ sdS |  d¡ | j| }d|  kr:t| jƒkrDn n|| _d|  krbt| jƒd krŠn n$| j| j }| dtj¡}|  |¡ dS )z7Replace selection with command from the history buffer.NrŠ   r&   r   r   r(   )r  rq  r  rK  r  r:   rB   r9  )rJ   r¹  ZnewindexrR  rS   rS   rT   r÷  ·  s    

"zSlicesShell.replaceFromHistoryc             C   s6   |   ¡ sdS |  ¡ }|  |¡ |  ¡ }|  ||¡ dS )z9Insert the previous/next command from the history buffer.N)r  r}  r÷  ro  )rJ   r¹  ræ  rä  rS   rS   rT   rØ  Ä  s    
zSlicesShell.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  rK  r  r*  rq  ro  )rJ   ræ  ZnumCharsAfterCursorZ
searchTextZsearchOrderr3  rR  rä  rS   rS   rT   rÛ  Î  s,    


zSlicesShell.OnHistorySearchc             C   s   t |ƒ dS )zDisplay status information.N)Úprint)rJ   ra   rS   rS   rT   r?   î  s    zSlicesShell.setStatusTextc             C   sj   |   ¡ sdS | jjr |  ¡  dS |  ¡ }tj}|  d|||d ¡ | j|dd |  	¡  d| _
|  ¡  dS )zInsert a new line break.Nr‹  r   rx  )r¬   T)r  rê   rì   rÌ  r}  rB   r9  r—  r­   r˜  rò   rÁ   )rJ   r¡  r¢  rS   rS   rT   rË  õ  s    zSlicesShell.insertLineBreakc             C   sþ  |   ¡ }|  ¡ }|  |¡}|t@ r$n|t@ r0dS |  |¡\}}|dkrLd}n
|  |¡}|  |¡}|  ¡ r |  	|¡ d| j
_|  ||¡}| tj¡}	dd„ |	D ƒ}	d |	¡}| jjrô|s¼d}|| j_|  tjd¡ |  |  ¡ t¡ |  |  ¡ t¡ n,||f| _| j|dd	 t d
| j¡ d| _| jdd}
|
r:|  ¡  |  ¡ |  ¡ d
 kr–| jtjdd |  ¡ }|  |d
 ¡t@ rŒ|   |d
 t!¡ |  "¡  n,|  ¡ }|  |d
 ¡}|  #||¡ |  	|¡ |  $¡  d| _%| j&rú|  | j'¡}|  	|¡ |  #||¡ dS )zEProcess the line of text at which the user hit Enter or Shift+RETURN.Nr   Fc             S   s   g | ]}|  ¡ ‘qS rS   )rø  )r¤  rT  rS   rS   rT   r¥  %	  s    z+SlicesShell.processLine.<locals>.<listcomp>r(   rx  T)ÚuseMultiCommandr   )rf   )r¬   )(r}  rZ  rW  ry  rn  rc  rp  rr  r  rs  rð   rò   r•  r[   rB   r9  r]   rê   rì   rë   r­   rY  rù   rú   r/  r@  r7   Z	CallLaterrÐ  r‚  Z
DeleteBackr)  r-  r  rz  ro  r0  r   ÚhasSyntaxErrorÚsyntaxErrorRealLine)rJ   Ztheposr‰  rg  Ú	startlineZendlineræ  rä  rR  rP  Úskipr¡  rv  rL   rS   rS   rT   rÌ  	  sb    









zSlicesShell.processLinec             C   sò   |   ¡ d }|  ¡ }x2|dkrF|dkrF|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   rŠ   r   r(   )	Ú
GetCurLinerZ  ZGotoLiner}  r•  r:   rB   r9  rø  )rJ   rø  ra   rT  ræ  r   rR  rS   rS   rT   ÚgetMultilineCommandO	  s0    


zSlicesShell.getMultilineCommandc             C   s*   |s|   ¡ d }|  |¡}|r&| ¡ }|S )z~Extract a command from text which may include a shell prompt.

        The command may not necessarily be valid Python syntax.r   )r   rJ  rø  )rJ   ra   rø  rR  rS   rS   rT   rù  q	  s    
zSlicesShell.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)rC  rX   Úps1rK  Úps2)rJ   ra   r  Zps1sizer  Zps2sizerS   rS   rT   rJ  €	  s    

zSlicesShell.lstripPromptc             C   sT  |s| j tjdd tr t|ƒ}d| _|r€|  |¡}|d dkrz|g}d| _|d d }|  ¡ |d  t| 	d¡ƒ | _
q†|}n|g}t ¡ }d| _d| _xh|D ]`}| jrî|}	d}
|   d	t|	ƒ d
 | 	d¡|	d   d d|
  d d¡ q | j |d ¡| _q W d| _|s$|  |  ¡ d t¡ d| _~| jsB|  | ¡ ¡ |sP|  ¡  dS )z.Send command to the interpreter for execution.r«   )r¬   Fr   NTr   r(   z  File "<input>", line z
    r®  z"    ^
SyntaxError: invalid syntax
ÚError)r­   rB   r9  Ú	USE_MAGICr   rü  rV  rZ  rK  r[   rý  r7   Z
BusyCursorr"  ró   rC  rð   r@  rò   r-  rc  r  Ú
addHistoryrø  rÁ   )rJ   rR  Úsilentrû  rœ   rQ  ZsyntaxErrorLineZbusyr3  ÚlinenoÚoffsetrS   rS   rT   r@  	  s@    
"
<zSlicesShell.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&   rŠ   r   zSlicesShell.addHistory)r4  rR  N)r  rK  r  r‹  r   r5  )rJ   rR  rS   rS   rT   r  À	  s    $zSlicesShell.addHistoryc             C   sD   |d kr|   ¡ }|  |t¡ |  |t¡ |  |t¡ |  |t¡ d S )N)rZ  rX  rü   rþ   r   r  )rJ   r[  rS   rS   rT   r+  Ê	  s    z SlicesShell.clearGroupingMarkersc             C   s˜   |d kr|   ¡ }|  |t¡ |  |t¡ |  |t¡ |  |t¡ |  |t¡ |  |t¡ |  |t¡ |  |t	¡ |  |t
¡ |  |t¡ |  |t¡ d S )N)rZ  rX  r  r  r  r	  r  r  r  r  r  rù   rú   )rJ   r[  rS   rS   rT   r,  Ñ	  s    zSlicesShell.clearIOMarkersc             C   s¢   |d kr|   ¡ }|  |¡}|dt> @ rL|  |t¡ |  |t¡ |  |t¡ nR|dt> @ rr|  |t¡ |  |t¡ n,|dt> @ rŒ|  |t¡ n|dt> @ ršndS dS )Nr   r   )rZ  rW  rü   rX  rþ   r   r  )rJ   r[  rg  rS   rS   rT   rõ  ß	  s     
z&SlicesShell.ensureSingleGroupingMarkerc             C   sX  |d kr|   ¡ }|  |¡}|t@ rx|  |t¡ |  |t¡ |  |t¡ |  |t¡ |  |t¡ t	t
g\}}ttg\}}nV|t@ rÊ|  |t	¡ |  |t
¡ |  |t¡ |  |t¡ ttg\}}ttg\}}ndS |d|> @ r|  ||¡ |  ||¡ |  ||¡ nR|d|> @ r*|  ||¡ |  ||¡ n*|d|> @ rF|  ||¡ n|d|> @ rTdS )Nr   r   )rZ  rW  ry  rX  r  r  r  r  r  r  r  r  r	  rn  )rJ   r[  rg  re  Ústart_foldedÚmiddlerf  rS   rS   rT   rö  ô	  s<    
z SlicesShell.ensureSingleIOMarkerc             C   sä   |   d¡}|  d¡ |  d¡ |dt> @ r8|  dt¡ n&|dt> @ rR|  dt¡ n|  dt¡ |dt> @ rx|  dt¡ nZ|dt> @ r’|  dt¡ n@|dt> @ r¬|  dt¡ n&|dt	> @ rÆ|  dt	¡ n|  dt¡ | j
rà|  ¡  d S )Nr   r   )rW  r+  r,  rü   r-  rþ   r  r  r  r  ÚdoHistUpdater˜  )rJ   Úfirst_markerrS   rS   rT   rÜ  
  s&    


zSlicesShell.RestoreFirstMarkerc             C   sh  dt > dt> B }dt> dt> B }dt> dt> B }dt> dt> dt>   }}}dt	> dt
> dt>   }	}
}||@ rH||@ rH||@ r||@ rdS ||@ r¤||@ r¤dS ||	@ r¸||@ r¸dS ||	@ rÌ||@ rÌdS ||@ rà||@ ràdS ||@  rø||@  rødS ||@ r||@ rdS ||@ r(||@ r(dS ||
@ r@||@ r@dS dS n||@ r¬||@ r¬||@ rt||@ rtdS ||	@ rŒ||@ rŒdS ||	@ r¤||@ r¤dS dS n¸||	@ rø||@ rø||@ rØ||@ rØdS ||@ rð||@ rðdS dS nl||	@ rD||@ rD||@ r$||@ r$dS ||@ r<||@ r<dS dS n ||@ r8||@ r8||@ rp||@ rpdS ||@ rˆ||@ rˆdS ||	@ r ||@ r dS ||	@ r¸||@ r¸dS ||@ rÐ||@ rÐdS ||@ rè||@ rèdS ||@ r ||@ r dS ||@ r||@ rdS ||
@ r0||@ r0dS dS n,||@ r‚||@ r‚||@ rd||@ rddS ||
@ r|||@ r|dS dS nâ||@ rÌ||@ rÌ||@ r®||@ r®dS ||@ rÆ||@ rÆdS dS n˜||@ r||@ r||@ rø||@ rødS ||
@ r||@ rdS dS nN||
@ r`||@ r`||@ rB||@ rBdS ||@ rZ||@ rZdS dS ndS dS )zAThis testing function ensures that two adjacent markers are validr   TFN)r  r  r  r  rü   rþ   r  r  r   r	  r  r  )rJ   Zm1Zm2Zi_sZo_sZg_sZi_mZo_mZg_mZi_eZo_eZg_erS   rS   rT   ÚIsAllowedPair5
  s´                                     zSlicesShell.IsAllowedPairc             C   sn   |   ¡  |  d¡}|  ¡ d }xJtd|ƒD ]<}|  |¡ |  |¡ |  |d ¡}|  |¡}|  ||¡s*q*W d S )Nr   r   )rÜ  rW  r)  r*  rõ  rö  r  )rJ   r  Úlast_line_numr3  Úprevious_markerrg  rS   rS   rT   ÚCleanAllMarkerst
  s    



zSlicesShell.CleanAllMarkersrx  c             C   s  |   |¡}| tj¡}|  |¡ |  ¡ d }|  ¡ }| tj¡}|| d }|dkrZd}	n|d }	||krpd}
n|d }
|dkr²t}t	}t
}t}dt> }dt> }dt> }dt> }n8|dkrêt}t}t}t}dt> }dt	> }dt
> }dt> }|dkr@d}d}|	dkrJ|  |¡ |  |t¡ |  |¡ |  ||¡ |dkrb|  |t¡ n|  |	¡}||@ rbd}|
dkr |  |t¡ |  ||¡ |dkrš|  |t¡ d}n |  |
¡}d}|||B @ rÀd}|s0|	dkrXd}|pâ|  |	¡}|pò|  |	¡}|rú|dt> @ r6|t@ r|dkrn|  |	t¡ |  |	t¡ |d|> @ rt|  |	|¡ |  |	|¡ |dkrŽ|  |	t¡ n||@ rŽ|dkrŽ|sŽ|||B |B @ r|dkrÐ|  |¡ |  |t¡ ||krÞd}n||krÞd}|  |¡ |  ||¡ |dkrX|  |t¡ nL|
dkrX|  |¡ |  |¡ |  |t¡ |  ||¡ |dkrX|  |t¡ xVt||ƒD ]H}|  |¡ |  |t¡ |  |¡ |  ||¡ |dkrd|  |t¡ qdW |r@d}|pÈ|  |
¡}|pØ|  |
¡}|rð|dkrð|sð|  |¡ |r
|  |¡ |dt> dt> B @ r.|  |t¡ n"|dt> dt> B @ rP|  |t¡ |r@|d|> d|> B @ r|  ||¡ |dkr.|  |t¡ nž|d|> d|> B @ rÊ|  ||¡ |dkr.|  |t¡ nd|||B @ rü|  ||¡ |dkr.|  |t¡ n2|  ||¡ |dkr|  |t¡ |dkr@|s@n|dkr@|s@|  ¡  | jrŒ| j dkrft! !¡ | _ t! !¡ | j  t"krŒ|  #¡  t! !¡ | _ dS )zYDisplay text in the slices shell.

        Replace line endings with OS-specific endings.r   r   Nrx  )r«   r  FT)$rI  r[   rB   r9  ZAddTextr)  rZ  Úcountr  r  r  r	  r  r  r  r  r+  r-  rü   r,  r  rW  r  rõ  rö  rn  rX  r   r*  rþ   rÐ  r"  ró   r7  ÚPRINT_UPDATE_MAX_TIMEZUpdate)rJ   ra   r¬   r  r[   r  Zend_line_numZnum_new_linesZstart_line_numZprevious_line_numZnext_line_numre  r
  r  rf  Zopposite_start_maskZopposite_start_folded_maskZopposite_middle_maskZopposite_end_maskZ
badMarkersZfixIOEndr  ZfixEndMarkersZnext_markerZblankr3  rS   rS   rT   r­   „
  s   







 



 


 







 



 


 


 
 

 
 
zSlicesShell.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*  rK  rB   r9  r]   )rJ   ra   rP  rÁ  Zchunksr´  rS   rS   rT   rI  U  s    
zSlicesShell.fixLineEndingsc             C   sd  | j j}d}|rttjƒ}n| jr.ttjƒ}n
ttjƒ}|  ¡ d }|dkrf|rVd}n| j	t
jdd | jsl|s~| j	|dd | jsŒ|  ¡  | jrN|  ¡ }|  |¡}|  |d ¡}| ¡ }| ¡ }	|dkrÞ| d¡ d¡}
n6|d	t|ƒt|	ƒ … }
t|dd
d d r|
d7 }
|  ¡ }|
}|  d|||t|ƒ ¡ | j	|dd |  ¡  |  ¡  |  d¡ d	S )zyDisplay proper prompt for the context: ps1, ps2 or ps3.

        If this is a continuation line, autoindent as necessary.Tr   r   rx  )r¬   rŠ   r(   r{  N)r­  z    r‹  )rê   rì   rC  rX   Úps3rò   r  r  r   r­   rB   r9  r0  rZ  ÚGetLinerD  rM  rK  r   r}  r—  r˜  rÐ  ZScrollToColumn)rJ   rì   rÿ  rÁ   rL   r[  ZcurrentLineZpreviousLineZpstriprM  Úindentr¡  r¢  rS   rS   rT   rÁ   `  sF    

zSlicesShell.promptc             C   s>  d}| j }d|_|  ¡  |  ¡ }|  |¡ |  |t¡ |  |t¡ |  |t¡ z&x|j	sjt
 ¡ jdd qRW |j	}W d|  ¡ \}}| jd d }x’t||d ƒD ]€}|  |¡ |  |¡ |  |t¡ ||krÚ|  |t¡ n"||krð|  |t¡ n|  |t¡ ||kr|  |t¡ q |  |t¡ q W d|_	d|_X t|ƒ}|S )z!Replacement for stdin.readline().rŠ   T)ZonlyIfNeededNr   F)rê   rì   rÁ   rZ  r,  r-  r  rù   rú   rë   r7   ZGetAppZYieldrc  r/  r*  r+  r  r  r  r  r  r   rC  )rJ   rë   rê   ZcLinere  rf  r3  rS   rS   rT   rè   ž  s>    



  
 zSlicesShell.readlinec             C   s.   g }x$|dd… dgkr(|  |  ¡ ¡ qW |S )z"Replacement for stdin.readlines().r&   Nr(   )rO  rè   )rJ   rP  rS   rS   rT   ré   Ã  s    zSlicesShell.readlinesc             C   s   |r| j |dd |  ¡ S )z"Return string based on user input.r«   )r¬   )r­   rè   )rJ   rÁ   rS   rS   rT   rí   Ê  s    zSlicesShell.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)rŠ   )r7   ZTextEntryDialogr_   ZID_OKZGetValuer`   )rJ   rÁ   rb   ra   rS   rS   rT   r·   Ð  s    
zSlicesShell.askc             C   s   |   d¡ dS )z0Halt execution pending a response from the user.zPress enter to continue:N)r·   )rJ   rS   rS   rT   rÀ   Ü  s    zSlicesShell.pausec             C   s$   |   ¡  |  dt¡ |  dt¡ dS )z&Delete all text from the slices shell.r   N)ÚClearAllr-  rü   r  )rJ   rS   rS   rT   r€   à  s    zSlicesShell.clearc             C   sF   |   ¡ }|  |¡ | ¡ }|r&|  ¡  |r8| j|dd |  |¡ dS )z’Execute command as if it was typed in directly.
        >>> shell.run('print("this")')
        >>> print("this")
        this
        >>>
        rx  )r¬   N)r  rs  rø  rÁ   r­   r@  )rJ   rR  rÁ   Úverboserä  rS   rS   rT   rÆ   æ  s    
  zSlicesShell.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 )zBExecute all commands in file as if they were typed into the shell.Nr   zshell.F)rÁ   r  T)rÁ   r}   rÆ   )rJ   rP   Zfile_rR  rS   rS   rT   rÇ   ö  s    

zSlicesShell.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AutoCompSetAutoHiderº   rò  r»   rð   ZgetAutoCompleteListr½   r¾   r¼   r]   ró  )rJ   rR  r	  rË   ZoptionsrS   rS   rT   r™    s    

zSlicesShell.autoCompleteShowc             C   sè   |   ¡ r|  ¡  | j |¡\}}}|r6tjd| |d | jsD|sDdS |  ¡ }|r¬|r¬| jr¬|  ¡ }|d }	|  	d|	||t
|	ƒ ¡ | j|	dd |  ¡  |  ¡ }
|  ||
¡ |rä|t
|ƒd  }||  |¡ }t||ƒ}|  ||¡ dS )	z6Display argument spec and docstring in a popup window.zSlicesShell.calltip)r4  ZsenderZcalltipNú)r‹  rx  )r¬   r   )rÈ  rÉ  rð   Z
getCallTipr   r5  r¸   r}  r¿   r—  rK  r­   r˜  ro  Z	GetColumnÚmaxZCallTipShow)rJ   rR  ZinsertcalltipZforceCallTipr…   ZargspecZtipræ  r¡  r¢  rä  ZtipposZfallbackrS   rS   rT   rœ    s*    

zSlicesShell.autoCallTipShowc             C   sd  |   ¡ r|  ¡  |  ¡ }|  |  ¡ d ¡}|}d}x,||kr^|  |¡tdƒkrT|}P |d8 }q4W |dkr`|  |d |¡}|d7 }|s¶|  |  ¡ d ¡}|  ||¡}|  |t	|ƒ¡ nª|}d}x,||krêt
|  |¡ƒ ¡ rà|}P |d8 }qÀW |dkrø|}|  ||¡}	|	 d¡}
|
dkr`|  ¡ s`|  |	d|
d … |  |d ¡tdƒkoZ|  ¡ |  ¡ kd¡ dS )z#AutoComplete and Calltips manually.r   r&   Ú.r   r  NT)r“  r”  r}  rp  rc  r|  r  r•  r™  rK  r–  ÚisspaceÚfindrÈ  rœ  r  )rJ   rã  rŸ  r   r¡  ZpointavailposZ
textbehindZ
textbeforeZbegposZctipsZctindexrS   rS   rT   rÙ  )  sD    



z)SlicesShell.OnCallTipAutoCompleteManuallyc             C   s   | j |dd dS )zReplacement for stdout.r«   )r¬   N)r­   )rJ   ra   rS   rS   rT   rî   Y  s    zSlicesShell.writeOutc             C   s   | j |dd dS )zReplacement for stderr.r  )r¬   N)r­   )rJ   ra   rS   rS   rT   rï   ^  s    zSlicesShell.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ê   rX   rÎ   )rJ   ÚredirectrS   rS   rT   rÄ   b  s    
zSlicesShell.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î   rX   rÏ   )rJ   r  rS   rS   rT   rÅ   i  s    zSlicesShell.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ï   rX   rÐ   )rJ   r  rS   rS   rT   rÃ   p  s    zSlicesShell.redirectStderrc                s~  ˆ j }ˆ j}| tjd¡}ˆ  |¡}|dkr<ˆ  |¡| }	n
| d¡}	|}
|rVd}
nfˆ jdkrhd}
nT|| d s|d}
n@||| d kr”d}
n(|dkrð||| d kr²d}
n<|| d	 | || d	< ||| d< || d
 |	 || d
< nÌ|dkr¬||| d krJ|| d	 | || d	< ||| d< || d
 |	 || d
< n`||| d kr¦||| d	  || d	< ||| d< ||| d< || d
 |	 || d
< nd}
n|dkr¼d}
n |
rtˆ j |d d …= | || |||||	d d d d dœ¡ ˆ  jd7  _|}|dkr|}n||	 }ˆ  |¡d }ˆ  |¡d }‡ fdd„t	||d ƒD ƒˆ j ˆ j d< |ˆ j ˆ j d< dˆ _
d S )Nr(   rg  Tr&   rŽ  Ú
actionTyper‹  r§  r¦  r¨  r½  r£  rå  r   )r   rŽ  r¦  r£  r§  rå  r¨  ÚmBStartÚmAStartÚmarkersBeforeÚmarkersAfterr   c                s   g | ]}ˆ   |¡‘qS rS   )rW  )r¤  r3  )rJ   rS   rT   r¥  É  s    z7SlicesShell.UpdateUndoHistoryBefore.<locals>.<listcomp>r#  r!  )rš  r›  r:   rB   r9  rß  r  rO  r`  r*  r  )rJ   r   r¢  r£  r§  rŒ  rª  r«  rå  r¨  ZmakeNewActionre  rf  ÚnewStartÚnewEndrS   )rJ   rT   r—  y  sv    






(z#SlicesShell.UpdateUndoHistoryBeforec                s¸   ˆ j ˆ j d }ˆ j ˆ j d dkr*|}n|ˆ j ˆ j d  }tˆ  |¡d d dƒ}tˆ  |¡d d ˆ  ¡ d ƒ}‡ fdd„t||d ƒD ƒˆ j ˆ j d	< |ˆ j ˆ j d
< dˆ _d S )Nrå  r   r½  r¨  r   r   c                s   g | ]}ˆ   |¡‘qS rS   )rW  )r¤  r3  )rJ   rS   rT   r¥  Ø  s    z6SlicesShell.UpdateUndoHistoryAfter.<locals>.<listcomp>r$  r"  F)rš  r›  Úminr`  r  r)  r*  r  )rJ   re  rf  r%  r&  rS   )rJ   rT   r˜  Î  s     (z"SlicesShell.UpdateUndoHistoryAfterc             C   s’   | j dkrd S | j| j  }|d dkr4tj | ¡ n|d dkrBnd S t|d ƒ}x,t|ƒD ] }|  |d | |d | ¡ q\W |  j d8  _ d S )Nr&   r   )r‹  r½  rg  r#  r!  r   )r›  rš  r	   ræ   rä   rK  r*  rY  )rJ   ÚuHIr¨  r3  rS   rS   rT   rä   Ý  s    
 zSlicesShell.Undoc             C   sœ   | j t| jƒd krd S |  j d7  _ | j| j  }|d dkrLtj | ¡ n|d dkrZnd S t|d ƒ}x,t|ƒD ] }|  |d | |d | ¡ qtW d S )Nr   r   )r‹  r½  rg  r$  r"  )r›  rK  rš  r	   ræ   rå   r*  rY  )rJ   r(  r¨  r3  rS   rS   rT   rå   ô  s    zSlicesShell.Redoc             C   s"   t j | ¡ d| _g | _d| _d S )Nr&   F)r	   ræ   r0  r›  rš  r  )rJ   rS   rS   rT   r0  
  s    zSlicesShell.EmptyUndoBufferc             C   s   |   ¡ o|  ¡ |  ¡ kS )N)r  rÆ  rÇ  )rJ   rS   rS   rT   ÚCanCut  s    zSlicesShell.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)rJ   rS   rS   rT   r*    s    zSlicesShell.CanPastec             C   sÀ   |   |  ¡ ¡}|t@ rdS |t@ r¼| jjrD|   |  ¡ ¡dt> @ sDdS |  ¡ \}}|  |¡}|  	|¡}|  
¡ |  ¡ krxdS |  
¡ |  ¡ kr¼|  
¡ |kr¼|  ¡ |kr¼|  
¡ |kr¼|  ¡ |kr¼dS dS )z&Return true if editing should succeed.Fr   T)rW  rZ  rn  ry  rê   rì   rú   rc  rp  rr  rÆ  rÇ  )rJ   rg  re  rf  ZsliceStartPosZsliceEndPosrS   rS   rT   r    s&    

zSlicesShell.CanEditc             C   sF   |   ¡ rB|  ¡ rB|  ¡ r |  ¡  |  ¡ r0|  ¡  |  ¡  |  d¡ dS )z/Remove selection and place it on the clipboard.rŠ   N)r)  ÚCanCopyr“  r”  rÈ  rÉ  rß   rq  )rJ   rS   rS   rT   rÝ   3  s    zSlicesShell.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)r+  rC  rX   r  r  rô  r:   rB   r9  rJ  r7   ÚTextDataObjectÚ_clip)rJ   r  r  rR  ÚdatarS   rS   rT   rß   =  s    


zSlicesShell.Copyc             C   s(   |   ¡ r$|  ¡ }t |¡}|  |¡ dS )zACopy selection, including prompts, and place it on the clipboard.N)r+  rô  r7   r,  r-  )rJ   rR  r.  rS   rS   rT   rà   I  s    
zSlicesShell.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)r+  rô  r:   rB   r9  r7   r,  r-  )rJ   rR  Zspacesr.  rS   rS   rT   rÎ  P  s    

z#SlicesShell.CopyWithPromptsPrefixedc             C   s:   t j ¡ r6t j d¡ t j |¡ t j ¡  t j ¡  d S )NF)r7   ÚTheClipboardÚOpenZUsePrimarySelectionZSetDatarg   ÚClose)rJ   r.  rS   rS   rT   r-  [  s
    

zSlicesShell._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¡}|  ¡ }|}| jd|||t|ƒ dd | j|dd |  ¡  |  d¡ tj ¡  d	S )
z*Replace selection with clipboard contents.rŠ   )ra   r(   r‹  T)rŒ  rx  )r¬   N)r*  r7   r/  r0  rC  rX   r  ÚIsSupportedÚ
DataFormatÚDF_TEXTr,  ÚGetDatarq  ÚGetTextrø  rI  rJ  r:   rB   r9  r}  r—  rK  r­   r˜  r1  )rJ   r  r.  rR  r¡  r¢  rS   rS   rT   rá   b  s*    




zSlicesShell.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.rŠ   N)r7   r/  r0  r2  r3  r4  r,  r5  r6  r1  ÚExecute)rJ   ra   r.  rS   rS   rT   râ   ‚  s    

zSlicesShell.PasteAndRunc       
      C   sœ   |   ¡ \}}|  |¡}|  |¡}|  |¡ |  ||¡ |  d¡ d}|  |¡}|d dkrf|g}	d}n|}	x,|	D ]$}| dtj	¡}|  
|¡ |  ¡  qpW dS )z-Replace selection with text and run commands.rŠ   Fr   NTr(   )rc  rp  rr  rs  ro  rq  rV  r:   rB   r9  r­   rÌ  )
rJ   ra   re  rf  ræ  rä  rü  rR  rœ   rQ  rS   rS   rT   r7    s     






zSlicesShell.Executec             C   s(   y|   |¡ W n tk
r"   dS X dS )z"Sets whether text is word wrapped.z*Wrapping is not available in this version.N)ÚSetWrapModer±   )rJ   rÈ   rS   rS   rT   rÈ   ¦  s    zSlicesShell.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)rJ   ZpointsrS   rS   rT   rÉ   ­  s    zSlicesShell.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¹   r½   r¾   r¼   r¸   r¿   r8  ÚlineNumbersZsetDisplayLineNumbersZReadIntr9  )rJ   rO   rÉ   rS   rS   rT   rA   ´  s    zSlicesShell.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¹   r½   r¾   r¼   r¸   r¿   ZGetWrapModer:  ZWriteIntZGetZoom)rJ   rO   rS   rS   rT   re   Í  s    zSlicesShell.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 slices shell.
            This is used instead of the scintilla default menu
            in order to correctly respect our immutable buffer.
        rä   rå   rÝ   rß   zCopy With Promptsrá   zPaste And Runrã   z
Select All)r7   ZMenuZAppendr  r  ZAppendSeparatorr  r  r   r   r  r!  r  r  )rJ   ÚmenurS   rS   rT   ÚGetContextMenuÛ  s    zSlicesShell.GetContextMenuc             C   s   |   ¡ }|  |¡ d S )N)r<  Z	PopupMenu)rJ   rÞ   r;  rS   rS   rT   r  ó  s    zSlicesShell.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Enabler)  r  r   r   r+  r  r!  r*  r  ZCanUndor  ZCanRedo)rJ   rÞ   r*   rS   rS   rT   r  ÷  s    

zSlicesShell.OnUpdateUIc             C   s’  d}d}dg}dg}g }d}|  ¡ }|tkr4|  ¡ }|tkrHt|ƒ d S |  ¡ }|tkrdt|ƒ d S |  ¡ }|tkr„| d¡ d}n$|tkrœ| d¡ d}nt|ƒ d S |  ¡  xª|D ]¢}	|	tkrÎ| |¡ q¶|	tkrð| |¡ | d¡ d}q¶|	tkr| |¡ | d¡ d}q¶|r2|	dd …  	t
jd¡}
n|	 	t
jd¡}
| j|
d	dd
 |d7 }q¶W |
d dkrr|d7 }xt|d ƒD ]þ}	|  |	¡ |  |	¡ d}d}|g krî|	|d krÐ|  |	t¡ |d= n|	d |d krèd}nd}n|	|d krd}nd}|r|  |	t¡ n|r,|  |	t¡ d}d}|g krÊ|	|d kr¬|	dkr\|d= |d dkrx|  |	t¡ n,|d dkr |  |	t¡ |  |	t¡ nd S |d= n|	d |d krÄd}nd}n|	|d krÞd}nd}|r2|d dkr|  |	t¡ n,|d dkr,|  |	t¡ |  |	t¡ nd S nN|r‚|d dkrT|  |	t¡ n,|d dkr||  |	t¡ |  |	t¡ nd S q‚W |  ¡  d S )NzNot a valid input formatr   Frë   r„  Tr   r(   rx  )r  r&   )rè   ÚusrBinEnvPythonTextÚpyslicesFormatHeaderTextrú  ÚgroupingStartTextÚinputStartTextrO  ÚoutputStartTextr  r:   rB   r9  r­   r*  r+  r,  r-  rü   r   r  r  r  r  r  r  r	  r  r0  )rJ   r   ZinvalidFileStringZ	lineCountZgroupingStartLinesZioStartLinesZioStartTypesZremoveCommentrT  r3  ÚwZdoMiddleZdoEndrS   rS   rT   r     sÂ         
  
  





 




 
zSlicesShell.LoadPySlicesFilec                s¾   d}‡ fdd„}|t ƒ |td ƒ x”t|  ¡ ƒD ]„}|  |¡}|dt> dt> B @ r\|tƒ |dt> dt	> B @ r||t
ƒ d}|dt> dt> B @ rœ|tƒ d}|r¨|dƒ ||  |¡ƒ q2W d S )NFc                s&   ˆ   |  dd¡ dtj¡ d¡¡ d S )Nz
r(   zutf-8)r­   r:   rB   r9  Úencode)r¢  )r   rS   rT   Ú	fid_write}  s    
z/SlicesShell.SavePySlicesFile.<locals>.fid_writer&   r   Tú#)r=  r>  r*  r)  rW  rü   rþ   r?  r  r  r@  r  r  rA  r  )rJ   r   Z
addCommentrD  r3  ZmarkersrS   )r   rT   r•   z  s"    
zSlicesShell.SavePySlicesFilec             C   sv   |   ¡ }|  ¡ \}}|  |¡}|  |¡ |  ||¡ d| ¡  }|  |d¡ |   ¡ }|  |¡ |  ||¡ |  ¡  d S )Nr(   rx  )r}  r`  rr  rs  ro  Úreadr­   rz  )rJ   r   Zcurposre  rf  rä  ra   ZnewposrS   rS   rT   rÝ  ”  s    


zSlicesShell.LoadPyFileAsSlicec             C   s   |   ¡ p| jS )z%Return True if contents have changed.)Z	GetModifyr   )rJ   rS   rS   rT   rs   ¦  s    zSlicesShell.hasChanged)N)N)rŠ   )N)N)N)N)N)N)N)N)F)F)T)NT)FF)N)N)N)N)rx  F)rŠ   )r  )TT)r   )TF)T)T)T)F)T)r   )pr    r¡   r¢   r£   r…   r7   r¤   r8   ZCLIP_CHILDRENr5   rj   rl   r6  ru   r~   rI   r#  r%  rÂ   r&  r/   r¶   rV  rY  r`  rc  rh  ri  rk  rl  rw  rz  r‚  rƒ  r†  r‡  rŠ  r  r¬  r  rè  rˆ  rÊ  r  rÚ  rq  rÍ  rÖ  r÷  rØ  rÛ  r?   rË  rÌ  r  rù  rJ  r@  r  r+  r,  rõ  rö  rÜ  r  r  r­   rI  rÁ   rè   ré   rí   r·   rÀ   r€   rÆ   rÇ   r™  rœ  rÙ  rî   rï   rÄ   rÅ   rÃ   r—  r˜  rä   rå   r0  r)  r*  r  rÝ   rß   rà   rÎ  r-  rá   râ   r7  rÈ   rÉ   rA   re   r<  r  r  r   r•   rÝ  rs   rS   rS   rS   rT   r;   U  sê     -


<








)
(#!=8H   4K*
%
 G
"

3




%?
 R>%




0




T
 

vr;   )Vr£   rB  r7   r   r:  r   ÚkeywordrB   rX   r7  Ú	functoolsr   r>   r   rŠ   r   r   r	   r
   r   Zpseudor   r   r   rZ   r   r   Úparser   rC   r   r   r   r   r  r  r  rÏ  rÑ  rá  rà  rÕ  r×  rÒ  rÓ  rÔ  rö   rø   rü   rþ   r   r  r  r  r  r	  r  r  r  r  r  rù   rú   rõ   ry  rn  r÷   rê  rë  ra  ZIO_MIDDLE_MASKrb  r=  r>  r?  r@  rA  r$  r4   r6   r%   r©   r¥   rA  ræ   r;   rS   rS   rS   rT   Ú<module>   sŠ   
    .   B