B
    nôb\9ã  ã               @   sj  d 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	m
Z
mZmZmZmZ ddlmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZm Z m!Z! ddl"m#Z# dd	l$m%Z% dd
l&m'Z'm(Z(m)Z) ddl*m+Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 dd„ Z3G dd„ deƒZ4G dd„ dee0ƒZ5G dd„ de2ƒZ6dd„ Z7G dd„ de8ƒZ9G dd„ de5ƒZ:dS )zQPlainTextEdit base classé    N)ÚOrderedDict)Úto_qvariant)ÚQEventÚ
QEventLoopÚQPointÚQtÚSignalÚSlot)	Ú
QClipboardÚQColorÚQFontÚQMouseEventÚQPaletteÚQTextCharFormatÚQTextFormatÚQTextOptionÚQTextCursor)ÚQAbstractItemViewÚQApplicationÚQListWidgetÚQListWidgetItemÚQMainWindowÚQPlainTextEditÚ	QTextEditÚQToolTip)Úget_font)ÚCONF)ÚPY3Ú	str_lowerÚto_text_string)Úicon_manager)ÚCallTipWidget)ÚBaseEditMixin)ÚANSIEscapeCodeHandlerc             C   sf   xT|  tdƒ¡}|dkrP |  |d|… |¡ |  ¡ dkrB|  ¡  ||d d… }qW |  ||¡ dS )z4Helper to print text, taking into account backspacesé   éÿÿÿÿNr   é   )ÚfindÚchrÚ
insertTextZpositionInBlockÚdeletePreviousChar)ÚcursorÚtextZfmtÚindex© r.   ú=lib/python3.7/site-packages/spyder/widgets/sourcecode/base.pyÚinsert_text_to'   s    r0   c               @   s\   e Zd ZdZeeƒ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d„ZdS )ÚCompletionWidgetzCompletion list widgetc             C   sP   t  | |¡ |  tjtjB ¡ || _d | _d| _d | _	|  
¡  | j | j¡ d S )NF)r   Ú__init__ZsetWindowFlagsr   Z	SubWindowZFramelessWindowHintÚtexteditÚcompletion_listÚcase_sensitiveÚenter_selectÚhideZitemActivatedÚconnectÚitem_selected)ÚselfÚparentÚancestorr.   r.   r/   r2   9   s    zCompletionWidget.__init__c             C   s   | j |Ž  |  |¡ d S )N)ZresizeÚsetFont)r:   ÚsizeÚfontr.   r.   r/   Úsetup_appearanceC   s    
z!CompletionWidget.setup_appearanceTc             C   sl  dd„ |D ƒ}dd„ |D ƒ}t |ƒdkr@|s@| j |d ¡ d S || _|  ¡  ddddd	d
dœ}|| _t|ƒrªxDt||ƒD ]*\}}| |d¡}|  	t
t |¡|ƒ¡ qzW n
|  |¡ |  d¡ t tj¡ |  ¡  |  ¡  |  ¡  t ¡ }| | | ¡¡}	|	 ¡ }
|	 ¡ }| j ¡  ¡ }| | ¡ | j ¡  ¡ | j  |¡}| ¡ |  !¡  }|  "¡ }|d krd|
}nt#| ¡ | !¡  |
gƒ}||krœ| | ¡ |  !¡  ¡ | $¡ |  %¡  }|  "¡ }|d krÄ|}nt#| $¡ | %¡  |gƒ}| ¡ }||kr(| j ¡  &¡ }| j  |¡}| |¡ | '| $¡ |  %¡  ¡ |d k	r<| (|¡}|  )|¡ t*| jj+ƒr\|  ,¡  | j- .|¡ d S )Nc             S   s   g | ]}|d  ‘qS )r&   r.   )Ú.0Úcr.   r.   r/   ú
<listcomp>H   s    z.CompletionWidget.show_list.<locals>.<listcomp>c             S   s   g | ]}|d  ‘qS )r   r.   )rA   rB   r.   r.   r/   rC   I   s    r&   r   Z	attributeÚmethodÚfunctionÚclassÚmodule)ÚinstanceZ	statementrD   rE   rF   rG   Zno_match)/Úlenr3   Úinsert_completionr4   ÚclearZ	type_listÚanyÚzipÚgetZaddItemr   ÚimaÚiconZaddItemsÚsetCurrentRowr   ZprocessEventsr   ZExcludeUserInputEventsZshowÚsetFocusZraise_ÚdesktopZavailableGeometryZscreenNumberÚrightZbottomZ
cursorRectZbottomRightZsetXÚxZget_linenumberarea_widthZmapToGlobalÚwidthr;   ÚminÚyÚheightZtopRightZsetYZmapFromGlobalZmover   Úcompletion_textÚupdate_currentÚsig_show_completionsÚemit)r:   r4   Ú	automaticÚtypesZ	icons_maprB   ÚtrP   rS   ZsrectZscreen_rightZscreen_bottomZpointZ
comp_rightr<   Z	anc_rightZcomp_bottomZ
anc_bottomZ
x_positionr.   r.   r/   Ú	show_listG   sn    









zCompletionWidget.show_listc             C   s   t  | ¡ | j ¡  d S )N)r   r7   r3   rR   )r:   r.   r.   r/   r7   ›   s    
zCompletionWidget.hidec             C   s4  |  ¡ | ¡  }}| ¡ tj@ }| ¡ tj@ }| ¡ tj@ }|pF|pF|}|tjtjfkr^| j	sh|tj
krr|  ¡  n¾|tjtjtjtjfks’|dkr¨|  ¡  | j |¡ nˆ|tjtjtjtjtjtjtjfkrÞ|sÞt | |¡ nRt|ƒsò|tjkr| j |¡ |  ¡  n(|r| j |¡ n|  ¡  t | |¡ d S )N)Ú.ú:)r,   ÚkeyÚ	modifiersr   ZAltModifierZShiftModifierÚControlModifierZ
Key_ReturnZ	Key_Enterr6   ÚKey_Tabr9   ZKey_LeftZ	Key_Rightr7   r3   ÚkeyPressEventZKey_UpZKey_DownZ
Key_PageUpZKey_PageDownZKey_HomeZKey_EndZKey_CapsLockr   rI   ZKey_Backspacer[   )r:   Úeventr,   rd   ZaltÚshiftÚctrlZmodifierr.   r.   r/   rh   Ÿ   s.    



zCompletionWidget.keyPressEventc             C   s„   t | jjƒ}|rxxnt| jƒD ]N\}}| jsBt|ƒ | ¡ }| ¡ }| |¡r|  	|¡ |  
|  ¡ tj¡ P qW |  ¡  n|  ¡  d S )N)r   r3   rZ   Ú	enumerater4   r5   ÚprintÚlowerÚ
startswithrQ   ZscrollToZcurrentIndexr   ZPositionAtTopr7   )r:   rZ   ÚrowZ
completionr.   r.   r/   r[   ¹   s    



zCompletionWidget.update_currentc             C   s6   |  ¡  tjdkr*| ¡ tjkr2|  ¡  n|  ¡  d S )NÚdarwin)ÚignoreÚsysÚplatformÚreasonr   ZActiveWindowFocusReasonr7   )r:   ri   r.   r.   r/   ÚfocusOutEventÍ   s
    

zCompletionWidget.focusOutEventNc             C   s0   |d kr|   ¡ }| j t| ¡ ƒ¡ |  ¡  d S )N)ZcurrentItemr3   rJ   r   r,   r7   )r:   Úitemr.   r.   r/   r9   Ø   s    zCompletionWidget.item_selected)T)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úobjectr\   r2   r@   ra   r7   rh   r[   rv   r9   r.   r.   r.   r/   r1   4   s   

Tr1   c                   sª  e Zd ZdZdZdZeƒ Zeƒ Zeƒ Z	eƒ Z
eƒ ZeeƒZd™dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zdšd'd(„Zd)d*„ Z d+d,„ Z!d-d.„ Z"d/d0„ Z#d1d2„ Z$d›d3d4„Z%e&ƒ d5d6„ ƒZ'‡ fd7d8„Z(‡ fd9d:„Z)d;d<„ Z*d=d>„ Z+d?d@„ Z,dAdB„ Z-dœdCdD„Z.dEdF„ Z/dGdH„ Z0dIdJ„ Z1dKdL„ Z2dMdN„ Z3dOdP„ Z4dQdR„ Z5ddTdU„Z6dVdW„ Z7dXdY„ Z8dždZd[„Z9d\d]„ Z:d^d_„ Z;d`da„ Z<dbdc„ Z=ddde„ Z>dfdg„ Z?dhdi„ Z@djdk„ ZAdldm„ ZBdŸdndo„ZCdpdq„ ZDd dsdt„ZEdudv„ ZFdwdx„ ZGdydz„ ZHd{d|„ ZId}d~„ ZJdd€„ ZKdd‚„ ZLdƒd„„ ZMd…d†„ ZNd¡d‡dˆ„ZOd‰dŠ„ ZPd‹dŒ„ ZQddŽ„ ZRdd„ ZSd‘d’„ ZTd“d”„ ZUd•d–„ ZVd—d˜„ ZW‡  ZXS )¢ÚTextEditBaseWidgetzText edit base widget)ÚsofÚeofNc             C   s*  t  | |¡ t | ¡ |  tj¡ tƒ | _| j 	| j
¡ | j 	| j¡ d| _d| _|d k	rŒ|}x t|tƒs~| ¡ }|d kr`P q`W |d k	rŒ|}t| |ƒ| _d| _d| _d| _d| _|  ¡  t| dd| _d| _d | _d| _d| _ttj ƒ !d¡| _"ttj ƒ !d¡| _#d | _$ttj%ƒ| _&ttj ƒ| _'d | _(d S )	Nz    é   FTÚ )Zhide_timer_oné¾   éÂ   ))r   r2   r"   ZsetAttributer   ZWA_DeleteOnCloser   Úextra_selections_dictZtextChangedr8   ÚchangedZcursorPositionChangedÚcursor_position_changedÚindent_charsÚtab_stop_width_spacesÚ
isinstancer   r;   r1   Úcompletion_widgetÚcodecompletion_autoÚcodecompletion_caseÚcodecompletion_enterrZ   Úsetup_completionr!   Úcalltip_widgetÚcalltipsÚcalltip_positionÚhas_cell_separatorsÚhighlight_current_cell_enabledr   ZredZlighterÚcurrentline_colorÚcurrentcell_colorÚbraceposZgreenÚmatched_p_colorÚunmatched_p_colorÚlast_cursor_cell)r:   r;   Zmainwinr.   r.   r/   r2   ê   sB    
zTextEditBaseWidget.__init__c             C   s$   t  dd¡}tƒ }| j ||¡ d S )NÚmainzcompletion/size)r   rN   r   rŠ   r@   )r:   r>   r?   r.   r.   r/   rŽ     s    z#TextEditBaseWidget.setup_completionc             C   s
   || _ d S )N)r‡   )r:   r‡   r.   r.   r/   Úset_indent_chars   s    z#TextEditBaseWidget.set_indent_charsc             C   s   || _ |  ¡  d S )N)rˆ   Úupdate_tab_stop_width_spaces)r:   rˆ   r.   r.   r/   Úset_tab_stop_width_spaces#  s    z,TextEditBaseWidget.set_tab_stop_width_spacesc             C   s   |   |  ¡  d| j ¡¡ d S )Nú )ZsetTabStopWidthZfontMetricsrV   rˆ   )r:   r.   r.   r/   rœ   '  s    z/TextEditBaseWidget.update_tab_stop_width_spacesc             C   sf   t ƒ }| t j|¡ | t j|¡ |  |¡ tjdkrb|  ¡ rbd|  ¡ | ¡ | ¡ f }|  	|¡ dS )zh
        Set text editor palette colors:
        background color and caret (text cursor) color
        rq   z.QPlainTextEdit#%s {background: %s; color: %s;}N)
r   ZsetColorZBaseZTextZ
setPaletters   rt   Z
objectNameÚnameZsetStyleSheet)r:   Ú
backgroundÚ
foregroundZpaletteÚstyler.   r.   r/   Úset_palette+  s    

zTextEditBaseWidget.set_palettec             C   s:   |   |¡}|r2| j| d j}| ¡ | ¡  }|S dS d S )Nr   )Úget_extra_selectionsr„   r+   ÚselectionEndÚselectionStart)r:   rd   Ú	selectionr+   Zselection_lengthr.   r.   r/   Úextra_selection_length@  s    
z)TextEditBaseWidget.extra_selection_lengthc             C   s   | j  |g ¡S )N)r„   rN   )r:   rd   r.   r.   r/   r¤   I  s    z'TextEditBaseWidget.get_extra_selectionsc                s0   |ˆ j |< ttˆ j  ¡ ‡ fdd„ddƒˆ _ d S )Nc                s   ˆ   | d ¡S )Nr   )r¨   )Ús)r:   r.   r/   Ú<lambda>P  s    z9TextEditBaseWidget.set_extra_selections.<locals>.<lambda>T)rd   Úreverse)r„   r   ÚsortedÚitems)r:   rd   Úextra_selectionsr.   )r:   r/   Úset_extra_selectionsL  s    

z'TextEditBaseWidget.set_extra_selectionsc             C   s|   g }d| j kr| | j d ¡ d| j kr8| | j d ¡ x4t| j  ¡ ƒD ]"\}}|dksH|dksH| |¡ qHW |  |¡ d S )NÚcurrent_cellÚcurrent_line)r„   ÚextendÚlistr­   ZsetExtraSelections)r:   r®   rd   Zextrar.   r.   r/   Úupdate_extra_selectionsS  s    

z*TextEditBaseWidget.update_extra_selectionsc             C   s   g | j |< |  ¡  d S )N)r„   r´   )r:   rd   r.   r.   r/   Úclear_extra_selectionsb  s    
z)TextEditBaseWidget.clear_extra_selectionsc             C   s   | j  |  ¡  ¡ ¡ dS )zEmit changed signalN)ZmodificationChangedr]   ZdocumentZ
isModified)r:   r.   r.   r/   r…   f  s    zTextEditBaseWidget.changedc             C   sX   t  ¡ }|j tjtdƒ¡ |j | j¡ |  	¡ |_
|j
 ¡  |  d|g¡ |  ¡  dS )zHighlight current lineTr±   N)r   ÚExtraSelectionÚformatÚsetPropertyr   ÚFullWidthSelectionr   ÚsetBackgroundr”   Ú
textCursorr+   ÚclearSelectionr¯   r´   )r:   r§   r.   r.   r/   Úhighlight_current_linel  s    



z)TextEditBaseWidget.highlight_current_linec             C   s   |   d¡ dS )zUnhighlight current liner±   N)rµ   )r:   r.   r.   r/   Úunhighlight_current_linew  s    z+TextEditBaseWidget.unhighlight_current_linec             C   s¦   | j dks| jsdS t ¡ }|j tjtdƒ¡ |j 	| j
¡ |  ¡ \|_}}|r^|  d¡ nD|rŒ| jr€|  d|g¡ |  ¡  q¢|  d¡ n|  d|g¡ |  ¡  dS )zHighlight current cellNTr°   )Úcell_separatorsr“   r   r¶   r·   r¸   r   r¹   r   rº   r•   Ú&select_current_cell_in_visible_portionr+   rµ   r’   r¯   r´   )r:   r§   Úwhole_file_selectedZwhole_screen_selectedr.   r.   r/   Úhighlight_current_cell|  s"    



z)TextEditBaseWidget.highlight_current_cellc             C   s   |   d¡ dS )zUnhighlight current cellr°   N)rµ   )r:   r.   r.   r/   Úunhighlight_current_cell“  s    z+TextEditBaseWidget.unhighlight_current_cellc             C   s  | j \}}|r0ddddœ}|  ||¡}d}d}	n0dddd	œ}|  ||¡}t|ƒd }t|ƒd }	x²|rx| || |	¡}
n| || d
|	d ¡}
|
dkr|r´|
d }	| |||
¡}n|
d }	| ||
|d ¡}|dkrî|rä|d }n|d }n|rú||
 S |t|ƒ|
  S qbd S qbW d S )Nú)ú]Ú})ú(ú[Ú{r&   rÇ   rÈ   rÉ   )rÄ   rÅ   rÆ   r   r%   )ÚBRACE_MATCHING_SCOPEÚget_textrI   r'   Úrfind)r:   ÚpositionZbraceÚforwardÚ	start_posÚend_posZbracemapr,   Zi_start_openZi_start_closeZi_closeZi_openr.   r.   r/   Úfind_brace_match˜  s8    



z#TextEditBaseWidget.find_brace_matchFc             C   sž   |r|   d¡ d S g }xn|D ]f}||  d¡kr2d S t ¡ }|j |¡ |  ¡ |_|j ¡  |j 	|¡ |j 
tjtj¡ | |¡ qW |  d|¡ |  ¡  d S )NZbrace_matchingr   )rµ   Úget_positionr   r¶   r·   rº   r»   r+   r¼   ÚsetPositionÚmovePositionr   ÚNextCharacterÚ
KeepAnchorÚappendr¯   r´   )r:   Z	positionsÚcolorÚcancelr®   rÍ   r§   r.   r.   r/   Z__highlightÀ  s"    




zTextEditBaseWidget.__highlightc             C   sØ   | j dk	r | j| j dd d| _ |  ¡ }| ¡ dkr8dS | tjtj¡ t| 	¡ ƒ}| ¡ }|dkrv| j
||dd}n|dkr| j
||dd}ndS |dk	rº||f| _ | j| j | jd	 n|f| _ | j| j | jd	 dS )
zBrace matchingNT)rÙ   r   )rÄ   rÅ   rÆ   F)rÎ   )rÇ   rÈ   rÉ   )rØ   )r–   Ú_TextEditBaseWidget__highlightr»   rÍ   rÔ   r   ÚPreviousCharacterrÖ   r   ÚselectedTextrÑ   r—   r˜   )r:   r+   r,   Zpos1Zpos2r.   r.   r/   r†   Ó  s(    

z*TextEditBaseWidget.cursor_position_changedc             C   s
   || _ dS )zSet code completion stateN)r‹   )r:   Ústater.   r.   r/   Úset_codecompletion_autoî  s    z*TextEditBaseWidget.set_codecompletion_autoc             C   s   || _ || j_dS )zCase sensitive completionN)rŒ   rŠ   r5   )r:   rÝ   r.   r.   r/   Úset_codecompletion_caseò  s    z*TextEditBaseWidget.set_codecompletion_casec             C   s   || _ || j_dS )z%Enable Enter key to select completionN)r   rŠ   r6   )r:   rÝ   r.   r.   r/   Úset_codecompletion_enter÷  s    z+TextEditBaseWidget.set_codecompletion_enterc             C   s
   || _ dS )zSet calltips stateN)r   )r:   rÝ   r.   r.   r/   Úset_calltipsü  s    zTextEditBaseWidget.set_calltipsc             C   s4   |dkrt j}n|dkr t j}nt j}|  |¡ dS )zV
        Set wrap mode
        Valid *mode* values: None, 'word', 'character'
        ÚwordÚ	characterN)r   ZWrapAtWordBoundaryOrAnywhereZWrapAnywhereZNoWrapZsetWordWrapMode)r:   ÚmodeZ	wrap_moder.   r.   r/   Úset_wrap_mode   s    z TextEditBaseWidget.set_wrap_modec             C   s   |   ¡ rt ¡  |   ¡ ¡ dS )z]
        Reimplement Qt method
        Copy text to clipboard with correct EOL chars
        N)Úget_selected_textr   Ú	clipboardÚsetText)r:   r.   r.   r/   Úcopy  s    zTextEditBaseWidget.copyc                sH   t jdkr6tr6|  dd¡}| dd¡ dd¡ dd¡S tt| ƒ ¡ S dS )	zU
        Reimplement Qt method
        Fix PyQt4 bug on Windows and Python 3
        Úntr~   r   u   â€¨Ú
u   â€©õ   Â…N)ÚosrŸ   r   rË   ÚreplaceÚsuperr}   ÚtoPlainText)r:   r,   )Ú	__class__r.   r/   rð     s
    
zTextEditBaseWidget.toPlainTextc                s^   |  ¡ | ¡  }}| ¡ tj@ }| ¡ tj@ }|s6|rJ|tjkrJ|  ¡  ntt	| ƒ 
|¡ d S )N)r,   rd   re   r   rf   ZMetaModifierZKey_Cré   rï   r}   rh   )r:   ri   r,   rd   rk   Úmeta)rñ   r.   r/   rh   )  s    
z TextEditBaseWidget.keyPressEventc                s  |   ¡ }dd„ }|  ¡ \}}|  ¡ }|s,dS | |¡}t|ƒdkrh||  |¡ƒ}d|||d ƒ  | }d‰ d}| |¡}xLtt|ƒd ddƒD ]4}	||	 }
|
 ¡ r¸||
ƒ}t|ˆ ƒ‰ qd| ||	< qW ˆ rÞ‡ fd	d
„|D ƒ}x<|r|d  	¡ }|dks
|d dkr| 
d¡ qàP qàW t d¡}d}d}x–t|ƒD ]Š\}}
||
ƒs8| |
¡ ¡ }|r€||kr€||d   |7  < d}|r8|dkršd}d}n&|dkr®d}d}n|dkr8d}d}q8W |rú|d  ¡ dkrð|d  |7  < n
| |¡ | |¡S )zbReturn selected text as a processed text,
        to be executable in a Python/IPython interpreterc             S   s   t | ƒt |  ¡ ƒ S )N)rI   Úlstrip)Úliner.   r.   r/   rª   :  s    zETextEditBaseWidget.get_selection_as_executable_code.<locals>.<lambda>Nr&   rž   r   iç  r%   c                s   g | ]}|ˆ d … ‘qS )Nr.   )rA   rô   )Ú
min_indentr.   r/   rC   V  s    zGTextEditBaseWidget.get_selection_as_executable_code.<locals>.<listcomp>r   ú#z[a-zA-Z0-9_]*Fr.   )ÚdefÚforÚwhileÚwithrF   TÚif)ÚelifÚelseÚtry)ÚexceptÚfinally)Úget_line_separatorZget_selection_boundsræ   ÚsplitrI   Zget_text_lineÚrangeÚstriprW   ró   ÚpopÚreÚcompilerl   ÚmatchÚgroupr×   Újoin)r:   ZlsZ_indentZ	line_fromZline_tor,   ÚlinesZoriginal_indentZcurrent_indentÚirô   Z
first_lineZvarnameÚmaybeZ
nextexceptÚnrâ   r.   )rõ   r/   Ú get_selection_as_executable_code5  sd    








z3TextEditBaseWidget.get_selection_as_executable_codec             C   s`   t |  ¡ ƒ}|  ¡ \}}|  ¡ \}}|s2|  |¡ |  ¡ }|| _|  ||¡ |d k	r\| ¡ }|S )N)	r   r»   Ú#_TextEditBaseWidget__save_selectionÚselect_current_cellÚsetTextCursorr  r™   Ú&_TextEditBaseWidget__restore_selectionÚrstrip)r:   Zinit_cursorrÏ   rÐ   r+   rÁ   r,   r.   r.   r/   Z__exec_cell  s    
zTextEditBaseWidget.__exec_cellc             C   s   |   ¡ S )z'Return cell contents as executable code)Ú_TextEditBaseWidget__exec_cell)r:   r.   r.   r/   Úget_cell_as_executable_codeŒ  s    z.TextEditBaseWidget.get_cell_as_executable_codec             C   s*   d }| j r&|  | j ¡ |  ¡  |  ¡ }|S )N)r™   r  rÂ   r  )r:   r,   r.   r.   r/   Ú get_last_cell_as_executable_code  s    z3TextEditBaseWidget.get_last_cell_as_executable_codec             C   sl   |dk	s|dk	st ‚|dk	r>t|ƒ}| tj¡ t| ¡ ƒ}nt| ¡ ƒ}| jdkrXdS | ¡  	| j¡S dS )z=Return True if cursor (or text block) is on a block separatorNF)
ÚAssertionErrorr   ZselectZBlockUnderCursorr   rÜ   r,   r¿   ró   ro   )r:   r+   ÚblockZcursor0r,   r.   r.   r/   Úis_cell_separator˜  s    
z$TextEditBaseWidget.is_cell_separatorc             C   s  |   ¡ }| tj¡ | ¡  }}x6|  |¡rV| tj¡ |}| ¡ }||kr"|dfS q"W |}xB|  |¡sž| tj¡ |}| ¡ }||kr^|  |¡rš|dfS P q^W | |¡ | 	¡ }xD|  |¡sö| tjtj
¡ | ¡ }||krð| tjtj
¡ P |}q´W | ¡ }||o
|fS )z²Select cell under cursor
        cell = group of lines separated by CELL_SEPARATORS
        returns the textCursor and a boolean indicating if the
        entire file is selectedF)r»   rÔ   r   ÚStartOfBlockrÍ   r  Ú	NextBlockÚPreviousBlockrÓ   ÚatStartrÖ   Ú
EndOfBlockÚatEnd)r:   r+   Úcur_posÚprev_posÚcell_at_file_startÚcell_at_file_endr.   r.   r/   r  ¦  s>    

z&TextEditBaseWidget.select_current_cellc             C   s¸  |   ¡ }| tj¡ | ¡  }}|  tddƒ¡ ¡ }t|  ¡  ¡ d |  ¡  	¡ d ƒ}|  |¡ ¡ }x8|  
|¡rœ| tj¡ |}| ¡ }||krf|ddfS qfW |}xP|  
|¡sò| ¡ |krò| tj¡ |}| ¡ }||kr¤|  
|¡rî|ddfS P q¤W | ¡ |k}| |¡ | ¡ }|s4| tj¡ | tjtj¡ xX|  
|¡sŒ| ¡ |krŒ| tjtj¡ | ¡ }||kr„| tjtj¡ P |}q6W | ¡ }	| ¡ |k}
||o¬|	|o´|
fS )a3  Select cell under cursor in the visible portion of the file
        cell = group of lines separated by CELL_SEPARATORS
        returns 
         -the textCursor
         -a boolean indicating if the entire file is selected
         -a boolean indicating if the entire visible portion of the file is selectedr   r&   F)r»   rÔ   r   r  rÍ   ZcursorForPositionr   ZviewportrV   rY   r  r  r  rÓ   r  rÖ   r  r   )r:   r+   r!  r"  Zbeg_posZbottom_rightrÐ   Zcell_at_screen_startr#  r$  Zcell_at_screen_endr.   r.   r/   rÀ   Ó  sZ    




z9TextEditBaseWidget.select_current_cell_in_visible_portionc             C   sb   |   ¡ }| tj¡ | ¡  }}x2|  |¡sR| tj¡ |}| ¡ }||kr"dS q"W |  |¡ dS )zGo to the next cell of linesN)r»   rÔ   r   r  rÍ   r  r  )r:   r+   r!  r"  r.   r.   r/   Úgo_to_next_cell  s    z"TextEditBaseWidget.go_to_next_cellc             C   sx   |   ¡ }| ¡  }}|  |¡r6| tj¡ | ¡  }}x2|  |¡sh| tj¡ |}| ¡ }||kr8dS q8W |  |¡ dS )z Go to the previous cell of linesN)r»   rÍ   r  rÔ   r   r  r  )r:   r+   r!  r"  r.   r.   r/   Úgo_to_previous_cell   s    
z&TextEditBaseWidget.go_to_previous_cellc             C   s   |   ¡ S )z!Return document total line number)Z
blockCount)r:   r.   r.   r/   Úget_line_count4  s    z!TextEditBaseWidget.get_line_countc             C   s   |   ¡ }| ¡ | ¡ fS )z8Save current cursor selection and return position bounds)r»   r¦   r¥   )r:   r+   r.   r.   r/   Z__save_selection8  s    z#TextEditBaseWidget.__save_selectionc             C   s.   |   ¡ }| |¡ | |tj¡ |  |¡ dS )z-Restore cursor selection from position boundsN)r»   rÓ   r   rÖ   r  )r:   rÏ   rÐ   r+   r.   r.   r/   Z__restore_selection=  s    
z&TextEditBaseWidget.__restore_selectionTc             C   sB  |   ¡ }| ¡  |  ¡ \}}t| ¡ ƒrb| |¡ | tjtj	¡ t| ¡ ƒsb| tj
¡ | ¡ }| |¡ | tj¡ xX| ¡ |krÐ| tjtj	¡ | ¡ r¾t|ƒ}| ¡  | |  ¡ ¡ P | tjtj	¡ qzW | ¡ }| ¡  |s| |¡ | tj¡ |t|ƒ7 }|t|ƒ7 }| |¡ | ¡  |  |¡ |  ||¡ dS )z'Duplicate current line or selected textN)r»   ÚbeginEditBlockr  r   rÜ   rÓ   rÔ   r   r  rÖ   r  rÍ   r  r   r¼   r)   r  r  rI   ÚendEditBlockr  r  )r:   Úafter_current_liner+   rÏ   rÐ   Zcursor_tempr,   r.   r.   r/   Z__duplicate_line_or_selectionD  s>    




z0TextEditBaseWidget.__duplicate_line_or_selectionc             C   s   | j dd dS )z‚
        Duplicate current line or selected text
        Paste the duplicated text *after* the current line/selected text
        T)r*  N)Ú0_TextEditBaseWidget__duplicate_line_or_selection)r:   r.   r.   r/   Úduplicate_linel  s    z!TextEditBaseWidget.duplicate_linec             C   s   | j dd dS )z~
        Copy current line or selected text
        Paste the duplicated text *before* the current line/selected text
        F)r*  N)r+  )r:   r.   r.   r/   Ú	copy_lines  s    zTextEditBaseWidget.copy_linec             C   s  |   ¡ }| ¡  |  ¡ \}}d}| |¡ | tj¡ | ¡ }| |¡ | ¡ rX||krp| tj	¡ | tj
¡ | ¡ }| ¡ r”| ¡ r||kr”d}| |¡ | ¡ rÌ|sÌ| ¡  |  |¡ |  ||¡ dS | |tj¡ |r|r| ¡  |  |¡ |  ||¡ dS t| ¡ ƒ}| ¡  |r€t| ¡  ¡ ƒ}tj|dd…  }| tj	¡ |t|ƒd 7 }|t|ƒ7 }| ¡ sê|d7 }nj|r®| ¡  |tj }| tj¡ |d7 }n| tj¡ t| ¡  ¡ ƒ}|t|ƒd 8 }|t|ƒd 8 }| |¡ | ¡  |  |¡ |  ||¡ dS )z"Move current line or selected textFTNr   r%   r&   )r»   r(  r  rÓ   rÔ   r   r  rÍ   ÚatBlockStartr  r  r   r  r)  r  r  rÖ   r   rÜ   ÚremoveSelectedTextr  r,   rí   ÚlineseprI   r*   r  r)   )r:   r*  r+   rÏ   rÐ   Ú	last_lineZsel_textr,   r.   r.   r/   Z__move_line_or_selectionz  sd    










z+TextEditBaseWidget.__move_line_or_selectionc             C   s   | j dd dS )z%Move up current line or selected textF)r*  N)Ú+_TextEditBaseWidget__move_line_or_selection)r:   r.   r.   r/   Úmove_line_upÉ  s    zTextEditBaseWidget.move_line_upc             C   s   | j dd dS )z'Move down current line or selected textT)r*  N)r2  )r:   r.   r.   r/   Úmove_line_downÍ  s    z!TextEditBaseWidget.move_line_downc             C   s   |   dd¡ |  |  ¡ ¡ dS )z7Go to the end of the current line and create a new lineFN)Ú
stdkey_endÚinsert_textr  )r:   r.   r.   r/   Úgo_to_new_lineÑ  s    z!TextEditBaseWidget.go_to_new_linec             C   sh   |   ¡ }| ¡ | ¡  }}| |¡ | |tj¡ | ¡ rZ| tjtj¡ | tj	tj¡ |  
|¡ dS )z*Extend current selection to complete linesN)r»   r¦   r¥   rÓ   r   rÖ   r.  rÔ   r  r  r  )r:   r+   rÏ   rÐ   r.   r.   r/   Ú"extend_selection_to_complete_linesÖ  s    
z5TextEditBaseWidget.extend_selection_to_complete_linesc             C   s¸   |   ¡ }|  ¡ r6|  ¡  | ¡ | ¡  }}| |¡ n| ¡  }}| ¡  | |¡ | t	j
¡ x:| ¡ |krš| t	jt	j¡ | ¡ rˆP | t	jt	j¡ qbW | ¡  | ¡  |  ¡  dS )zDelete current lineN)r»   Úhas_selected_textr8  r¦   r¥   rÓ   rÍ   r(  rÔ   r   r  r  rÖ   r   r  r/  r)  ZensureCursorVisible)r:   r+   rÏ   rÐ   r.   r.   r/   Údelete_lineã  s"    
zTextEditBaseWidget.delete_linec             C   s.   |   ¡ }| |¡ | |tj¡ |  |¡ d S )N)r»   rÓ   r   rÖ   r  )r:   ÚstartÚendr+   r.   r.   r/   Úset_selectionø  s    
z TextEditBaseWidget.set_selectionc             C   sV   |   |¡}|  ¡ }| ¡ | ¡  }}||k r:t||gƒ}nt||gƒ}|  ||¡ dS )z.Unselect read-only parts in shell, like promptN)rÒ   r»   r¦   r¥   Úmaxr=  )r:   Úposition_fromr+   r;  r<  r.   r.   r/   Útruncate_selectionþ  s    
z%TextEditBaseWidget.truncate_selectionc             C   sB   |   |¡}|   |¡}|  ¡ }| ¡ }||k s4||kr>|  |¡ dS )z:In shell, avoid editing text except between prompt and EOFN)rÒ   r»   rÍ   Úset_cursor_position)r:   r?  Zposition_tor+   Zcursor_positionr.   r.   r/   Úrestrict_cursor_position	  s    

z+TextEditBaseWidget.restrict_cursor_positionc          	   C   sr   yL|   | j¡}| j| jdd}|tjtjtjfk}|dksB|sB|rJt ¡  W n  t	t
fk
rl   t ¡  Y nX dS )zHide calltip when necessaryr&   )Zchar_offset)ú?rÇ   N)Zget_characterr‘   Zis_cursor_beforer   ZKey_ParenRightZ
Key_Periodrg   r   ZhideTextÚ
IndexErrorÚ	TypeError)r:   rd   Zcalltip_charZbeforeÚotherr.   r.   r/   Úhide_tooltip_if_necessary  s    z,TextEditBaseWidget.hide_tooltip_if_necessaryc             C   s   | j j||d dS )zShow completion widget)r^   N)rŠ   ra   )r:   Ztextlistr^   r.   r.   r/   Úshow_completion_widget  s    z)TextEditBaseWidget.show_completion_widgetc             C   s   | j  ¡  dS )zHide completion widgetN)rŠ   r7   )r:   r.   r.   r/   Úhide_completion_widget#  s    z)TextEditBaseWidget.hide_completion_widgetr   c             C   sš   |sdS t |d tƒs$dd„ |D ƒ}t|ƒdkrD|d d |krDdS || _tdd„ |D ƒƒ}tt|ƒ| dd„ d	}|t|d
d„ d	7 }| j||d dS )z Display the possible completionsNr   c             S   s   g | ]}|d f‘qS )r   r.   )rA   rB   r.   r.   r/   rC   -  s    z;TextEditBaseWidget.show_completion_list.<locals>.<listcomp>r&   c             S   s"   g | ]\}}|  d ¡r||f‘qS )Ú_)ro   )rA   Úcompr`   r.   r.   r/   rC   3  s    c             S   s   t | d ƒS )Nr   )r   )rU   r.   r.   r/   rª   7  s    z9TextEditBaseWidget.show_completion_list.<locals>.<lambda>)rd   c             S   s   t | d ƒS )Nr   )r   )rU   r.   r.   r/   rª   8  s    )r^   )r‰   ÚtuplerI   rZ   Úsetr¬   rH  )r:   ZcompletionsrZ   r^   Z
underscorer.   r.   r/   Úshow_completion_list'  s    z'TextEditBaseWidget.show_completion_listc             C   s   | j  ¡  dS )z1Completion list is active, Enter was just pressedN)rŠ   r9   )r:   r.   r.   r/   Úselect_completion_list;  s    z)TextEditBaseWidget.select_completion_listc             C   s:   |r6|   ¡ }| tjtjt| jƒ¡ | ¡  |  |¡ d S )N)	r»   rÔ   r   rÛ   rÖ   rI   rZ   r/  r6  )r:   r,   r+   r.   r.   r/   rJ   ?  s    z$TextEditBaseWidget.insert_completionc             C   s
   | j  ¡ S )z0Return True is completion list widget is visible)rŠ   Z	isVisible)r:   r.   r.   r/   Úis_completion_widget_visibleH  s    z/TextEditBaseWidget.is_completion_widget_visiblec             C   s$   |   ¡ s|  tjtj¡ |  ¡  d S )N)r9  Ú
moveCursorr   rÕ   rÖ   Úremove_selected_text)r:   r.   r.   r/   Ústdkey_clearN  s    zTextEditBaseWidget.stdkey_clearc             C   s$   |   ¡ s|  tjtj¡ |  ¡  d S )N)r9  rQ  r   rÛ   rÖ   rR  )r:   r.   r.   r/   Ústdkey_backspaceS  s    z#TextEditBaseWidget.stdkey_backspacec             C   s   |r
t jS t jS )N)r   rÖ   Z
MoveAnchor)r:   rj   r.   r.   r/   Z__get_move_modeY  s    z"TextEditBaseWidget.__get_move_modec             C   s   |   tj|  |¡¡ d S )N)rQ  r   ZUpÚ"_TextEditBaseWidget__get_move_mode)r:   rj   r.   r.   r/   Ú	stdkey_up\  s    zTextEditBaseWidget.stdkey_upc             C   s   |   tj|  |¡¡ d S )N)rQ  r   ZDownrU  )r:   rj   r.   r.   r/   Ústdkey_down_  s    zTextEditBaseWidget.stdkey_downc             C   s   |   | j¡ d S )N)r6  r‡   )r:   r.   r.   r/   Ú
stdkey_tabb  s    zTextEditBaseWidget.stdkey_tabc       	      C   sœ   |   |¡}|r|  tj|¡ nz|  ¡ }|dkr:|  d¡}n
|  |¡}|  |d¡}|t|ƒ t| ¡ ƒ }| 	¡ |kr‚| 
||¡ n| 
||¡ |  |¡ dS )ziSmart HOME feature: cursor is first moved at 
        indentation position, then at the start of the lineNÚsolÚeol)rU  rQ  r   ZStartr»   rÒ   rË   rI   ró   rÍ   rÓ   r  )	r:   rj   rk   Z
prompt_posÚ	move_moder+   Zstart_positionr,   Z
indent_posr.   r.   r/   Ústdkey_homee  s    

zTextEditBaseWidget.stdkey_homec             C   s0   |   |¡}|r|  tj|¡ n|  tj|¡ d S )N)rU  rQ  r   ÚEndr  )r:   rj   rk   r[  r.   r.   r/   r5  y  s    
zTextEditBaseWidget.stdkey_endc             C   s   d S )Nr.   )r:   r.   r.   r/   Ústdkey_pageup€  s    z TextEditBaseWidget.stdkey_pageupc             C   s   d S )Nr.   )r:   r.   r.   r/   Ústdkey_pagedownƒ  s    z"TextEditBaseWidget.stdkey_pagedownc             C   s   d S )Nr.   )r:   r.   r.   r/   Ústdkey_escape†  s    z TextEditBaseWidget.stdkey_escapec             C   sÔ   t j d¡rº| ¡ tjkrº| j ¡  |  ¡  t	t
j| ¡ tjtjtjƒ}t | |¡ t | |¡ tj}tj}t ¡ j|d}t ¡ j|d}t ¡ j||d |  ¡  t ¡ j||d n| j ¡  t | |¡ dS )zReimplement Qt methodZlinux)rä   N)rs   rt   ro   Zbuttonr   Z	MidButtonr   r7   rR   r   r   ZMouseButtonPressÚposZ
LeftButtonZ
NoModifierr   ÚmousePressEventZmouseReleaseEventr
   Z	ClipboardZ	Selectionr   rç   r,   rè   Úpaste)r:   ri   Z	mode_clipZmode_selZ	text_clipZtext_selr.   r.   r/   rb  ‹  s     

z"TextEditBaseWidget.mousePressEventc             C   s,   | j  ¡  | j ¡  |  ¡  t | |¡ dS )zReimplemented to handle focusN)Úfocus_changedr]   Úfocus_inrÂ   r   ÚfocusInEvent)r:   ri   r.   r.   r/   rf  £  s    

zTextEditBaseWidget.focusInEventc             C   s   | j  ¡  t | |¡ dS )zReimplemented to handle focusN)rd  r]   r   rv   )r:   ri   r.   r.   r/   rv   ª  s    
z TextEditBaseWidget.focusOutEventc             C   s®   t jdkr–| ¡ tj@ r–t|dƒrZ| ¡  ¡ dk r>| j 	¡  q’| ¡  ¡ dkr’| j
 	¡  n8t|dƒr’| ¡ dk r|| j 	¡  n| ¡ dkr’| j
 	¡  dS t | |¡ |  ¡  dS )z>Reimplemented to emit zoom in/out signals when Ctrl is pressedrq   Ú
angleDeltar   ÚdeltaN)rs   rt   re   r   rf   Úhasattrrg  rX   Úzoom_outr]   Úzoom_inrh  r   Ú
wheelEventrÂ   )r:   ri   r.   r.   r/   rl  ¯  s    



zTextEditBaseWidget.wheelEvent)N)NF)N)NN)T)T)T)r   T)N)Yrx   ry   rz   r{   rÊ   r¿   r   re  rk  rj  Z
zoom_resetrd  ÚstrZsig_eol_chars_changedr2   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ð   rh   r  r  r  r  r  r  rÀ   r%  r&  r'  r  r  r+  r,  r-  r2  r3  r4  r7  r8  r:  r=  r@  rB  rG  rH  rI  rN  rO  rJ   rP  rS  rT  rU  rV  rW  rX  r\  r5  r^  r_  r`  rb  rf  rv   rl  Ú__classcell__r.   r.   )rñ   r/   r}   ß   s¦   
1	(

	J
-?
(
O

 
	
r}   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚQtANSIEscapeCodeHandlerc             C   s   t  | ¡ d | _d | _d S )N)r#   r2   Úbase_formatÚcurrent_format)r:   r.   r.   r/   r2   Ä  s    
z QtANSIEscapeCodeHandler.__init__c             C   s"   |rd| _ d| _nd| _ d| _d S )Né   é/   é%   é(   )Zdefault_foreground_colorZdefault_background_color)r:   rÝ   r.   r.   r/   Úset_light_backgroundÉ  s
    z,QtANSIEscapeCodeHandler.set_light_backgroundc             C   s
   || _ d S )N)rp  )r:   rp  r.   r.   r/   Úset_base_formatÑ  s    z'QtANSIEscapeCodeHandler.set_base_formatc             C   s   | j S )N)rq  )r:   r.   r.   r/   Ú
get_formatÔ  s    z"QtANSIEscapeCodeHandler.get_formatc             C   s:  | j dkr$| jdk	st‚t| jƒ| _ | jdkr:| j ¡ }n| j| jd  | j }t|ƒ}| j  	|¡ | j
dkrz| j ¡ }n| j| j
d  | j }t|ƒ}| j  |¡ | j  ¡ }| jdkrÄ| j ¡ }n| j}| |¡ | jdkrî| j ¡  ¡ }n| j}| |¡ | jdkr| j ¡  ¡ }n| j}| |¡ | j  |¡ dS )z˜
        Set font style with the following attributes:
        'foreground_color', 'background_color', 'italic',
        'bold' and 'underline'
        Nrr  ru  )rq  rp  r  r   Zforeground_colorr¡   ZANSI_COLORSZ	intensityr   ÚsetForegroundZbackground_colorr    rº   r?   ÚitalicZ
fontItalicÚ	setItalicÚboldÚsetBoldÚ	underlineÚsetUnderliner=   )r:   ZqcolorZcstrr?   rz  r|  r~  r.   r.   r/   Ú	set_style×  s6    








z!QtANSIEscapeCodeHandler.set_styleN)rx   ry   rz   r2   rv  rw  rx  r€  r.   r.   r.   r/   ro  Ã  s
   ro  c             C   s"   |   |  ¡ |  ¡ d|  ¡  ¡ d S )Néÿ   )ZsetHsvZhueZ
saturationÚvalue)rØ   r.   r.   r/   Úinverse_color  s    rƒ  c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚConsoleFontStylec             C   s(   || _ || _|| _|| _|| _d | _d S )N)ÚforegroundcolorÚbackgroundcolorr|  rz  r~  r·   )r:   r…  r†  r|  rz  r~  r.   r.   r/   r2   
  s    zConsoleFontStyle.__init__c             C   sš   t ƒ | _| j |¡ t| jƒ}|s.|r.t|ƒ | j |¡ t| jƒ}|sPt|ƒ | j |¡ | j 	¡ }| 
| j¡ | | j¡ | | j¡ | j |¡ d S )N)r   r·   r=   r   r…  rƒ  ry  r†  rº   r?   r}  r|  r{  rz  r  r~  )r:   r?   Úlight_backgroundÚ
is_defaultr¡   r    r.   r.   r/   Úapply_style  s    


zConsoleFontStyle.apply_styleN)rx   ry   rz   r2   r‰  r.   r.   r.   r/   r„  	  s   	r„  c               @   sn   e Zd ZdZdZe d¡Zee	e
ƒZeee	ƒZee	ƒZddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Zddd„ZdS )ÚConsoleBaseWidgetzConsole base widget)rY  rZ  z\x01?\x1b\[(.*?)m\x02?Nc                s¾   t  ˆ |¡ dˆ _ˆ  d¡ tƒ ˆ _ˆ  d¡ ˆ j ‡ fdd„¡ t	ddddddˆ _
t	d	dddddˆ _t	d
dddddˆ _t	ddddddˆ _ˆ j
ˆ jˆ jˆ jfˆ _ˆ  ¡  ˆ  d¡ d S )NTi,  Fc                s   ˆ j  |¡S )N)Úcompletion_widget_activatedr]   )Zuser_idr,   )r:   r.   r/   rª   :  s    z,ConsoleBaseWidget.__init__.<locals>.<lambda>r   iÿÿÿ )r…  r†  r|  rz  r~  i  ÿ r  i ª  )r}   r2   r‡  ZsetMaximumBlockCountro  Úansi_handlerZsetUndoRedoEnabledÚuserListActivatedr8   r„  Údefault_styleÚerror_styleÚtraceback_link_styleÚprompt_styleÚfont_stylesÚset_pythonshell_fontZsetMouseTracking)r:   r;   r.   )r:   r/   r2   -  s,    

zConsoleBaseWidget.__init__c             C   sX   || _ |r&| jttjƒttjƒd n| jttjƒttjƒd | j 	|¡ |  
¡  d S )N)r    r¡   )r‡  r£   r   r   ZwhiteZdarkGrayZblackZ	lightGrayrŒ  rv  r“  )r:   rÝ   r.   r.   r/   rv  N  s    z&ConsoleBaseWidget.set_light_backgroundc             C   s   |   ¡  || jj¡ dS )z%Reimplement TextEditBaseWidget methodN)r»   r)   rŽ  r·   )r:   r,   r.   r.   r/   r6  Z  s    zConsoleBaseWidget.insert_textc             C   s&   |   ¡ r|  ¡  |  t ¡  ¡ ¡ dS )zReimplement Qt methodN)r9  rR  r6  r   rç   r,   )r:   r.   r.   r/   rc  `  s    zConsoleBaseWidget.pastec       
   	   C   sÎ  |   ¡ }| tj¡ d|kr4| dd¡}| dd¡}x4| tdƒ¡}|dkrNP ||d d… }|  ¡  q6W |rèd}xd| d	¡D ]V}| 	d
¡rÄ| 	d¡sÄd	}| 
d| jj¡ | 
|dd… | jj¡ q~| 
|| jj¡ q~W | j ||¡ nÊ|rþt||| jjƒ n´d}x–| j |¡D ]†}t|||| ¡ … | jjƒ | ¡ }y6x0dd„ | d¡ d¡D ƒD ]}	| j |	¡ qVW W n tk
r„   Y nX | j ¡ | j_qW t|||d… | jjƒ |  d¡ |  | jj¡ dS )aK  
        Append text to Python shell
        In a way, this method overrides the method 'insert_text' when text is 
        inserted at the end of the text widget for a Python shell
        
        Handles error messages and show blue underlined links
        Handles ANSI color sequences
        Handles ANSI FF sequence
        úz
rë   é   r%   r&   NFTz  Filez	  File "<z  é   r   c             S   s   g | ]}t |ƒ‘qS r.   )Úint)rA   Z_cr.   r.   r/   rC   ”  s    z:ConsoleBaseWidget.append_text_to_shell.<locals>.<listcomp>ú;r   )r»   rÔ   r   r]  rî   r'   r(   rK   Ú
splitlinesro   r)   rŽ  r·   r  r  Úexception_occurredr]   r0   r‘  ÚCOLOR_PATTERNÚfinditerr;  r<  r	  r  rŒ  Zset_codeÚ
ValueErrorrx  rA  ZsetCurrentCharFormat)
r:   r,   ÚerrorÚpromptr+   r-   Zis_tracebackZlast_endr  Úcoder.   r.   r/   Úappend_text_to_shellf  sL    



 

z&ConsoleBaseWidget.append_text_to_shellc             C   sJ   |dkrt ƒ }x&| jD ]}|j|| j|| jkd qW | j | jj¡ dS )zPython Shell onlyN)r?   r‡  rˆ  )r   r’  r‰  r‡  rŽ  rŒ  rw  r·   )r:   r?   r¢   r.   r.   r/   r“  ¦  s    z&ConsoleBaseWidget.set_pythonshell_font)N)N)rx   ry   rz   r{   rÊ   r  r  r›  r   rm  Úboolrš  r—  r  r‹  r2   rv  r6  rc  r¡  r“  r.   r.   r.   r/   rŠ  %  s   



!@rŠ  );r{   rí   r  rs   Úcollectionsr   Zqtpy.compatr   Zqtpy.QtCorer   r   r   r   r   r	   Z
qtpy.QtGuir
   r   r   r   r   r   r   r   r   Zqtpy.QtWidgetsr   r   r   r   r   r   r   r   Zspyder.config.guir   Zspyder.config.mainr   Zspyder.py3compatr   r   r   Zspyder.utilsr    rO   Zspyder.widgets.calltipr!   Zspyder.widgets.mixinsr"   Z"spyder.widgets.sourcecode.terminalr#   r0   r1   r}   ro  rƒ  r|   r„  rŠ  r.   r.   r.   r/   Ú<module>   s<    ,( ,       kB