a
    ao|                     @   s  d 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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mZ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 e#D Z*dd e#D Z+e,e#dZ-e.e#Z/e/0e-d g d\Z1Z2Z3dddddgdddd e/D ddddd d!d"gdd#d$ddd%d&d'gdd(d$dd%d)d*gdd+d$d,d-d$d.d/d0d/d1d2d/d3d4d5d6Z4dCd7d8Z5G d9d: d:Z6G d;d< d<eZ7G d=d> d>eZ8G d?d@ d@Z9G dAdB dBeZ:dS )Dz&
Text snippets configuration widgets.
    N)ValidationErrorvalidate)to_qvariant)QtSlotQAbstractTableModelQModelIndexQSize)QAbstractItemView	QCheckBox	QComboBoxQDialogQDialogButtonBox	QGroupBoxQGridLayoutQLabel	QLineEdit
QTableViewQVBoxLayout)_)CONF)get_font)SUPPORTED_LANGUAGES)build_snippet_ast)ItemDelegate)SimpleCodeEditorc                 C   s   i | ]}|  |qS  lower.0xr   r   blib/python3.9/site-packages/spyder/plugins/completion/providers/snippets/widgets/snippetsconfig.py
<dictcomp>#       r$   c                 C   s   h | ]}|  qS r   r   r!   Zlangr   r   r#   	<setcomp>$   r%   r'   Python)r         ZarrayZSnippetsobjectlanguagetriggersstringzProgramming languagec                 C   s   g | ]}|  qS r   r   r&   r   r   r#   
<listcomp>6   r%   r/   )typedescriptionenumz2List of snippet triggers defined for this language triggerdescriptionsz#Text that triggers a snippet family)r0   r1   zSnippet informationr1   snippetzDescription of the snippettextremove_triggerzSnippet to insertZbooleanz<If true, the snippet should remove the text that triggers itr7   r8   )r0   r1   required
propertiesr1   r6   )r0   itemsr4   r5   )r0   r1   r=   r,   r-   )r0   r:   r;   )r0   titler=   c                 C   s   g }|d u }|r ||   i d}|D ]n}|| }|D ]\}|rXt| ||||d}	|	  n.|| }
|
d }|
d }t| ||||||d}	||	 q4q$|S )Ndefault)r,   trigger_textr1   
get_option
set_optionr7   r8   r,   rC   r1   snippet_textr8   rD   rE   )r   Snippetloadappend)r,   rD   rE   snippetslanguage_snippetsload_snippetsr4   trigger_descriptionsr1   Zthis_snippetZcurrent_snippetr7   r8   r   r   r#   iter_snippetsp   s6    
rO   c                   @   sJ   e Zd Z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S )rH   z)Convenience class to store user snippets.Nr3   Fc                 C   sV   d| _ || _| jtv r"t| j | _|| _|| _|| _|| _|| _|| _|| _	|| _
d S Nr   )indexr,   LANGUAGE_NAMESrC   rG   r1   r8   initial_trigger_textinitial_descriptionrE   rD   )selfr,   rC   r1   rG   r8   rD   rE   r   r   r#   __init__   s    
zSnippet.__init__c                 C   s   d | j| j| jt| jS )Nz[{0}] {1} ({2}): {3})formatr,   rC   r1   reprrG   rU   r   r   r#   __repr__   s    zSnippet.__repr__c                 C   s   |   S N)rZ   rY   r   r   r#   __str__   s    zSnippet.__str__c                 C   s   || _ || _|| _|| _d S r[   )rC   r1   rG   r8   rU   rC   description_textrG   r8   r   r   r#   update   s    zSnippet.updatec                 C   sP   | j d urL| jdkrL| | j  }|| j }|| j }|d | _|d | _d S )Nr3   r7   r8   )r,   rC   rD   r   r1   rG   r8   )rU   statetrigger_infosnippet_infor   r   r#   rI      s    


zSnippet.loadc                 C   s   | j d ur| j  }| j|i d}| j| jd}| j| jksH| j| jkr| j|v r|| j }|	| j t
|dkr|	| j || ji }||| j< ||| j< | j||dd d S )NrA   r9   r   FZrecursive_notification)r,   r   rD   rG   r8   rS   rC   rT   r1   poplengetrE   )rU   r,   current_stateZ	new_stater4   ra   r   r   r#   save   s(    






zSnippet.savec                 C   sd   | j d ur`| j  }| j|i d}|| j }|| j t|dkrP|| j | j||dd d S )NrA   r   Frc   )r,   r   rD   rC   rd   r1   re   rE   )rU   r,   rg   r4   r   r   r#   delete   s    


zSnippet.delete)Nr3   r3   r3   FNN)__name__
__module____qualname____doc__rV   rZ   r\   r_   rI   rh   ri   r   r   r   r#   rH      s      
rH   c                	       sp   e Zd ZedZedZdZdZdZdZ	e
ddZd	d
d
d
dg g d	d	f	 fdd	Ze dd Zdd Z  ZS )SnippetEditorzValid snippetzInvalid snippetz"QComboBox {border: 1px solid red;}z$QComboBox {border: 1px solid green;}z"QLineEdit {border: 1px solid red;}z$QLineEdit {border: 1px solid green;}iR  iX  Nr3   Fc              	      st  t t | td}| _| _| _| _| _| _	t
||||||	|
d _t| _ jd ttd _t  _ jd ttd _t  _ttd  _ jtd  j j ttd	 _t j  _td  _ttj tj!B  _" j"#tj  _$ j"#tj! _% &td
  j'd  jtd  j(|  jdkr|) j} j*|  j+ j  jj,- fdd  j j jf}t.dd |D }|rވ j$/d  jj0||	dddddt1 d  j2|  jtd  j3| t4 }|5 j t6td}t7 }|5 jdd |5 jdd |5 jdd |5 jdd t4 }|8| |5 j |9| |5| t4 }|5 j |5 j |5 j |8| |5 j"  9|  jj:- j;  jj,- j;  jj,- j;  j"j<- j=  j"j>- j? |dksh|dkrp ;  d S )NzTo add a new text snippet, you need to define the text that triggers it, a short description (two words maximum) of the snippet and if it should delete the trigger text when inserted. Finally, you need to define the snippet body to insert.)r,   rC   rG   r1   r8   rD   rE   i  zTrigger text:TzDescription:z Remove trigger text on insertionzPCheck if the text that triggers this snippet should be removed when inserting itz<b>Snippet text:</b>zSnippet editorz$Trigger text for the current snippetr3   c                    s      S r[   r   )Z_xrY   r   r#   <lambda>(  r%   z(SnippetEditor.__init__.<locals>.<lambda>c                 S   s   g | ]}|d kqS )r3   r   r    r   r   r#   r/   +  r%   z*SnippetEditor.__init__.<locals>.<listcomp>ZselectedZ
appearance)sectionF)r,   Zcolor_schemeZwrapZhighlight_current_lineZfontz!Snippet text completion to insertzTrigger informationr   r)   )@superrn   rV   r   parentrC   r1   r8   rG   r5   rH   base_snippetr   Zsnippet_settings_descriptionZsetFixedWidthZtrigger_text_labelr   trigger_text_cbZsetEditableZdescription_labelr   description_inputr   remove_trigger_cbZ
setToolTipZ
setCheckedZsnippet_labelSNIPPET_INVALIDsnippet_valid_labelr   snippet_inputr   ZOkZCancelZbboxZbutton	button_okZbutton_cancelZsetWindowTitleZsetWordWrapZaddItemsrQ   ZsetCurrentIndexsetTextZtextChangedconnectall
setEnabledZsetup_editorr   Zset_languageZset_textr   Z	addWidgetr   r   Z	addLayoutZ	setLayoutZeditTextChangedr   ZacceptedZacceptZrejectedZreject)rU   rr   r,   rC   r1   rG   r8   trigger_textsr5   rD   rE   Zsnippet_descriptionidxZtext_inputsZnon_empty_textZgeneral_layoutZsnippet_settings_groupZsettings_layoutZall_settings_layoutZtext_layout	__class__rY   r#   rV      s    









zSnippetEditor.__init__c                 C   s4  | j  }| j }| j }d}zt| | j| j	 W n$ t
y`   d}| j| j Y n0 |dkr~d}| j | j n| j | j || jv r"| j|kr|| j| v rd}| j| j n| j| j nN|| jkr|| j| v rd}| j| j n| j| j n| j| j | j|  d S )NFTr3   )rt   currentTextru   r7   ry   toPlainTextr   rx   r{   SNIPPET_VALIDSyntaxErrorrw   ZsetStyleSheetINVALID_CB_CSSVALID_CB_CSSr5   rC   INVALID_LINE_CSSVALID_LINE_CSSr1   rz   r~   )rU   rC   r^   rG   Zinvalidr   r   r#   r   _  sJ    



zSnippetEditor.validatec                 C   s@   | j  }| j }| j }| j }| j	|||| | jS r[   )
rt   r   ru   r7   ry   r   rv   Z	isCheckedrs   r_   r]   r   r   r#   get_options  s    



zSnippetEditor.get_options)rj   rk   rl   r   r   rw   r   r   r   r   r
   ZMIN_SIZErV   r   r   r   __classcell__r   r   r   r#   rn      s   
|
+rn   c                       s~   e Zd ZdZdZd fdd	Zdd Zdd	 Zej	fd
dZ
ej	fddZe fddZe fddZdd Zdd Z  ZS )SnippetsModelr   r)   Nc                    s   t t|   || _g | _g | _i | _g | _g | _d| _	t
 | _g | _| }|d u rj|   | _n|| _|d u r|   | _n|| _d S )Nr3   )rq   r   rV   rr   rK   delete_queuesnippet_mapZ	rich_textZnormal_textZlettersr   ZlabelZwidthspaletter7   Zcolorname
text_colorZhighlightedTexttext_color_highlight)rU   rr   r   r   r   r   r   r#   rV     s$    zSnippetsModel.__init__c                 C   s    t | jdd d| _|   d S )Nc                 S   s   | j S r[   )rC   )r"   r   r   r#   ro     r%   z*SnippetsModel.sortByName.<locals>.<lambda>)key)sortedrK   resetrY   r   r   r#   
sortByName  s    zSnippetsModel.sortByNamec                 C   s    |  stjS tt| |S r[   )isValidr   ZItemIsEnabledZ	ItemFlagsr   flagsrU   rQ   r   r   r#   r     s    zSnippetsModel.flagsc                 C   s   |  }| r,d|  kr*t| jk s2n t S | j| }| }|tjkrx|| jkrbt|j	S || j
krt|jS n4|tjkrtttjtjB S |tjkrttdS t S )Nr   zDouble-click to view or edit)rowr   re   rK   r   columnr   DisplayRoleTRIGGERrC   DESCRIPTIONr1   TextAlignmentRoleintAlignHCenterAlignVCenterZToolTipRoler   )rU   rQ   roler   r6   r   r   r   r#   data  s    $






zSnippetsModel.datac                 C   s   |t jkr<|t jkr(ttt jt jB S ttt jt jB S |t jkrLt S |t jkr|| j	krltt
dS || jkrtt
dS t S )NzTrigger textZDescription)r   r   Z
Horizontalr   r   r   r   Z
AlignRightr   r   r   r   )rU   rp   Zorientationr   r   r   r#   
headerData  s    





zSnippetsModel.headerDatac                 C   s
   t | jS r[   )re   rK   r   r   r   r#   rowCount  s    zSnippetsModel.rowCountc                 C   s   dS )Nr*   r   r   r   r   r#   columnCount  s    zSnippetsModel.columnCountc                 C   s
   | j | S r[   rK   )rU   Zrow_numr   r   r#   r     s    zSnippetsModel.rowc                 C   s   |    |   d S r[   )ZbeginResetModelZendResetModelrY   r   r   r#   r     s    zSnippetsModel.reset)NN)rj   rk   rl   r   r   rV   r   r   r   r   r   r   r	   r   r   r   r   r   r   r   r   r#   r     s   r   c                   @   sT   e Zd Zdd ZdddZdd Zdg fdd	Zd
d Zdd Zdd Z	dd Z
dS )SnippetModelsProxyc                 C   s   i | _ i | _|| _d S r[   )modelsawaiting_queuerr   )rU   rr   r   r   r#   rV     s    zSnippetModelsProxy.__init__Nc                 C   sL   || j vr>t||d}| j|g }| j|||d || j |< | j | }|S )Nr   )to_add)r   r   r   rd   rM   )rU   tabler,   r   language_modelr   r   r   r#   	get_model  s    


zSnippetModelsProxy.get_modelc                 C   s2   || j v r.| j | }t|j|_| ||| d S r[   )r   listrK   r   rM   )rU   r,   defaultsmodelr   r   r#   reload_model  s    

zSnippetModelsProxy.reload_modelc           
      C   s   t || jj| jj|d}t|D ]\}}||_q dd |D }|D ]D}|j|jf}||v rt|| }	|	j|_|||< qBt||_|||< qBt	|
 |_||_d S )Nr   c                 S   s   i | ]}|j |jf|qS r   )rC   r1   r    r   r   r#   r$     s   z4SnippetModelsProxy.load_snippets.<locals>.<dictcomp>)rO   rr   rD   rE   	enumeraterQ   rC   r1   re   r   valuesrK   r   )
rU   r,   r   rK   r   ir6   r   r   Z
to_replacer   r   r#   rM      s&    



z SnippetModelsProxy.load_snippetsc                 C   s   t i }| jD ]P}||hO }| j| }t|jdkrJ|jd}|  q&|jD ]}|  qPqt| j	
 D ],}||hO }| j	|}|D ]}|  qqn|S rP   )setr   re   r   rd   ri   rK   rh   r   r   keys)rU   Zlanguage_changesr,   r   r6   language_queuer   r   r#   save_snippets  s    





z SnippetModelsProxy.save_snippetsc              	   C   s   t ||||d |d | jj| jjd}|| jv r| j| }|j}||f}||v rj|| }	|	j|_|||< nt||_|||< t|	 |_
||_|  n"| j|g }
|
| |
| j|< d S )Nr7   r8   rF   )rH   rr   rD   rE   r   r   rQ   re   r   r   rK   r   r   rf   rJ   )rU   r,   r4   r1   r6   new_snippetr   r   r   Zold_snippetr   r   r   r#   update_or_enqueue,  s.    





z$SnippetModelsProxy.update_or_enqueuec                 C   s   g }| j D ]}| j | }|g d}i }|jD ]H}|jg d}||j|}	|	d |j|j|jdd |	||j< q,t|	 |d< || q
t
|d}
t||
 W d    n1 s0    Y  d S )Nr?   r>   r5   r9   r<   r-   w)r   rK   rC   rf   rJ   r1   rG   r8   r   r   openjsondump)rU   filenamerK   r,   r   rL   r-   r6   Zdefault_triggerrb   fr   r   r#   export_snippetsH  s2    


z"SnippetModelsProxy.export_snippetsc                 C   s  i }d}d}t |dN}zt|}W n. tyT } z|j|d< W Y d }~n
d }~0 0 W d    n1 sj0    Y  t|dkrzt|td W nf ty } zNdg}|j	D ]}	|
d|	 qd|jd||j}
|
|d	< W Y d }~n
d }~0 0 t|dkr|D ]}|d
 }|d }|D ]}|d }|d }|D ]}|d }|d }|d }|d7 }z$t| | |||| |d7 }W nR ty } z8|di }d|||}|j||< ||d< W Y d }~n
d }~0 0 q:q"q
|||fS )Nr   rZloading)instanceZschemarK   z[{0}]z{0} on instance {1}:<br>{2}r3   Z
validationr,   r-   r4   r5   r1   r6   r7   r)   Zsyntaxz{0}/{1}/{2})r   r   rI   
ValueErrormsgre   json_validateSNIPPETS_SCHEMAr   Zabsolute_pathrJ   rW   messagejoinr   r   r   r   rf   )rU   r   errorsZtotal_snippetsZvalid_snippetsr   rK   eZ
index_pathpartZfull_messageZlanguage_infor,   r-   ra   r4   r5   Zdescription_infor1   r6   rG   Zsyntax_errorsr   r   r   r#   import_snippetsf  sZ    >

*z"SnippetModelsProxy.import_snippets)N)rj   rk   rl   rV   r   r   rM   r   r   r   r   r   r   r   r#   r     s   
	r   c                       s   e Zd Zd fdd	Z fddZ f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 fddZdd Z  ZS )SnippetTableNc                    s   t t|   || _|| _|| _|j| | |d| _| 	| j | 
tt|  | tj | tj | d | tj |  j| j |    |   d S )Nr   T)rq   r   rV   _parentr,   proxyr   r   source_modelsetModelZsetItemDelegateForColumnCMDr   ZsetSelectionBehaviorr   Z
SelectRowsZsetSelectionModeZSingleSelectionZsetSortingEnabledZsetEditTriggersZAllEditTriggersselectionModelselectionChangedr|   	selectionZverticalHeaderZhidereset_plain)rU   rr   r   r,   r   r   r   r#   rV     s     

zSnippetTable.__init__c                    s   t t| | dS zQt Override.N)rq   r   focusOutEventrU   r   r   r   r#   r     s    zSnippetTable.focusOutEventc                    s&   t t| | | |    dS r   )rq   r   focusInEvent	selectRowcurrentIndexr   r   r   r   r#   r     s    zSnippetTable.focusInEventc                 C   s"   |    |   | jjd d S )NT)r_   ZisActiveWindowr   delete_snippet_btnr~   r   r   r   r#   r     s    zSnippetTable.selectionc                    sP   |    |     fdd| jjD }|r>| tt| |  d dS )z%Adjust column size based on contents.c                    s   g | ]}  |jqS r   )widthr1   )r!   sZfmr   r#   r/     r%   z-SnippetTable.adjust_cells.<locals>.<listcomp>TN)	ZresizeColumnsToContentsZhorizontalHeaderZfontMetricsr   rK   ZsetColumnWidthr   maxZsetStretchLastSection)rU   namesr   r   r#   adjust_cells  s    zSnippetTable.adjust_cellsc                 C   s:   | j   |   | | j jtj |  j	| j
 d S r[   )r   r   r   sortByColumnr   r   AscendingOrderr   r   r|   r   rY   r   r   r#   r     s    
zSnippetTable.reset_plainc                 C   sD   |  | _| j| |  | _| | j | jjd | 	  d S )NF)
r   r,   r   r   r   r   r   r   r~   r   )rU   r,   r   r   r#   update_language_model  s
    
z"SnippetTable.update_language_modelc                 C   sZ   | j j|}| j j| | j j|j|jf | j   | 	  | 
| j jtj d S r[   )r   rK   rd   r   rJ   r   rC   r1   r   r   r   r   r   r   )rU   r   r6   r   r   r#   delete_snippet  s    

zSnippetTable.delete_snippetFc                 C   s&  t | jj| jjd}|s0|   }| j|}t| jj	 }tdd |D }i }|D ]*\}}|
|ti }	|	|hO }	|	||< qZt| | j |j|j|j|j||| jj| jjd
}
|
 r"|
 }|j|jf}|| jj|< t| jj | j_| j  |   | ttj | jd d S )N)rD   rE   c                 S   s   h | ]}|d  qS )r   r   r    r   r   r#   r'     r%   z+SnippetTable.show_editor.<locals>.<setcomp>)	r,   rC   r1   r8   rG   r   r5   rD   rE   T)rH   r   rD   rE   r   r   r   r   r   r   rf   r   rn   r,   r   rC   r1   r8   rG   Zexec_r   r   rK   r   r   r   LANGUAGEr   r   Zset_modified)rU   r   r6   r   Zsnippets_keysr   r5   r4   r1   rN   Zdialogr   r   r   r#   show_editor  sD    

	


zSnippetTable.show_editorc                 C   s8   |    }| j }|d |kr&d}| |d  dS )z-Move to next row from currently selected row.r)   Nr   r   r   r   r   rU   r   Zrowsr   r   r#   next_row  s
    
zSnippetTable.next_rowc                 C   s4   |    }| j }|dkr"|}| |d  dS )z1Move to previous row from currently selected row.r   r)   Nr   r   r   r   r#   previous_row  s
    
zSnippetTable.previous_rowc                    s|   |  }|tjtjfv r"|   nV|tjfv r>|  j  n:|tj	tj
tjtjfv rhtt| | ntt| | dS r   )r   r   Z	Key_EnterZ
Key_Returnr   ZKey_Backtabrr   Z	reset_btnZsetFocusZKey_UpZKey_DownZKey_LeftZ	Key_Rightrq   r   keyPressEvent)rU   eventr   r   r   r#   r     s    
zSnippetTable.keyPressEventc                 C   s   |    dS r   )r   )rU   r   r   r   r#   mouseDoubleClickEvent  s    z"SnippetTable.mouseDoubleClickEvent)NN)F)rj   rk   rl   rV   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r     s   		
#r   )N);rm   Zbisectr   Zjsonschema.exceptionsr   Z
jsonschemar   r   Zqtpy.compatr   Zqtpy.QtCorer   r   r   r	   r
   Zqtpy.QtWidgetsr   r   r   r   r   r   r   r   r   r   r   Zspyder.config.baser   Zspyder.config.managerr   Zspyder.config.guir   Zspyder.plugins.completion.apir   Zspyder.utils.snippets.astr   Zspyder.widgets.helperwidgetsr   Zspyder.widgets.simplecodeeditorr   rR   ZLANGUAGE_SETZbisect_leftZ
PYTHON_POSr   ZSUPPORTED_LANGUAGES_PYinsertr   ZADDRr   r   rO   rH   rn   r   r   r   r   r   r   r#   <module>   s   4D
M <V -