
    Je>O                         d Z ddlZddlZddlmZmZmZmZ ddlm	Z	m
Z
 ddlmZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ dZdZ G d dee      Zy)zCompletion widget class.    N)QPointQtSignalSlot)QFontMetricsQFocusEvent)QListWidgetQListWidgetItemQToolTip)SpyderConfigurationAccessor)ima)CompletionItemKind)to_text_string)keyevent_to_keysequence_str)HTMLDelegate      c                       e Zd ZdZi ej
                  dej                  dej                  dej                  dej                  dej                  dej                  dej                  d	ej                  d
ej                  dej                  dej                   dej"                  dej$                  dej&                  dej(                  dej*                  dej,                  diZi Z ee      Z eeee      Z fdZd Z d Z!d Z"d Z#d+dZ$d Z%d Z&ddde'e(fdZ)d+dZ*d  Z+d,d!Z,d" Z-d# Z.d-d$Z/d% Z0d,d&Z1d' Z2d,d(Z3d) Z4 e5e6      d*        Z7 xZ8S ).CompletionWidgetzCompletion list widget.textmethodfunctionconstructorfieldvariableclass	interfacemodulepropertyunitvalueenumkeywordsnippetcolorfile	referencec                    t         t        |   |       || _        d | _        | j                  t        j                  t        j                  z         | j                          | j                  j                  | j                         | j                  j                  | j                         d| _        d | _        d | _        d| _        d | _        d | _        g | _        | j-                  t/        | d             | j1                  t2               t5        | j                  j7                               }|j9                         | _        | j=                         | _        y )NF   )margin) superr   __init__textedit	_languagesetWindowFlagsr   	SubWindowFramelessWindowHinthideitemActivatedconnectitem_selectedcurrentRowChangedrow_changedis_internal_consolecompletion_listcompletion_position	automaticcurrent_selected_item_labelcurrent_selected_item_pointdisplay_indexsetItemDelegater   setMinimumWidthDEFAULT_COMPLETION_ITEM_WIDTHr   fontheightitem_heightwidth
item_width)selfparentancestorfm	__class__s       J/usr/lib/python3/dist-packages/spyder/plugins/editor/widgets/completion.pyr,   zCompletionWidget.__init__?   s   .x8BLL2+A+AAB		""4#5#56&&t'7'78#( ##' +/(+/( 	\$q9::; $--,,./99;**,    c                 D     | j                   |  | j                  |       y)z-Setup size and font of the completion widget.N)resizesetFont)rG   sizerB   s      rL   setup_appearancez!CompletionWidget.setup_appearanceX   s    TTrM   c                 ,    | j                         dk(  ryy)zCheck if widget is empty.r   TF)count)rG   s    rL   is_emptyzCompletionWidget.is_empty]   s    ::<1rM   c                 >   d| _         d| _        |s| j                          y|| _        |.| j                  j                         j                         | _        nC| j                  j                         j                         |k  r| j                          y|| _        t        |d   t              sd| _
        || _        | j                  d       | j                  sy| j                         dk(  }|rH| j                  s<| j                  | j                  d             | j                   j#                  |       y| j%                          | j'                          | j)                          | j                  j+                  |        | j                  sQ| j-                         j/                         }| j1                  |      }| j                  | j                  D ]  }||d<   	 | j3                  d       | j5                  d       | j                   j#                  |       y)z$Show list corresponding to position.Nr   Tnew   point)r<   r=   r2   r;   r-   
textCursorpositionr:   
isinstancedictr8   r9   update_currentrT   r5   itemsig_show_completionsemitshowsetFocusraise_position_widget_at_cursorrecttopRightmapToGlobalsetCurrentRowr7   )rG   r9   r\   r;   single_matchtooltip_point
completions          rL   	show_listzCompletionWidget.show_listc   s   +/(+/(IIK" (,}}'?'?'A'J'J'LD$]]%%'002X=IIK (0D$ /!,d3'+D$. 	% ## zz|q(tyy|,%%**?;		//5'' IIK002M ,,];M##/"&"6"6 8J*7Jw'8 	1 	!!&&7rM   c                 .    |j                         | _        y)zSet the completion language.N)lowerr.   )rG   languages     rL   set_languagezCompletionWidget.set_language   s    !)rM   c                    | j                          g | _        | j                  }| j                  }t	        | j
                        D ]  \  }}| j                  s|sd|v r|d   }n|d   }| j                  ||      s7t               }| j                  s6| j                  ||||       |j                  t        j                  |       nF| j                  |d||      }	|j                  t        j                  |       |j                  |	       | j                  |       | j                  j!                  |        | j#                         dk(  r| j%                          yy)a  
        Update the displayed list by filtering self.completion_list based on
        the current_word under the cursor (see check_can_complete).

        If we're not updating the list with new completions, we filter out
        textEdit completions, since it's difficult to apply them correctly
        after the user makes edits.

        If no items are left on the list the autocompletion should stop
        textEdit
filterTextr   )rC   rE    N)clearr>   rD   rF   	enumerater9   r8   check_can_completer
   set_item_displaysetDatar   UserRoleget_html_item_representationsetTextaddItemappendrT   r2   )
rG   current_wordrX   rC   rE   irm   completion_labelr`   completion_texts
             rL   update_listzCompletionWidget.update_list   sC    	

!!&t';';< 	)MAz++zZ7#-l#; #-a= **+;\J"$D++%%*V5 & BR[[*5"&"C"C$bu #D #FR[[*:;_-LL%%a(/	)2 ::<1IIK rM   c                     || j                   vr"t        j                  |      | j                   |<   | j                   |   S N)ICON_MAPr   icon)rG   names     rL   _get_cached_iconz!CompletionWidget._get_cached_icon   s3    t}}$"%((4.DMM$}}T""rM   c           	         | j                   j                  |d   d      }|d   }d}|dz
  }|dz  }	|j                  dd      \  }}
|3|}|
|z  }t        j                  |      }t        j                  |||      }| j                  |||||	||
      }|j                  |       |j                  | j                  |             |j                  t        j                  | d|        y	)z/Set item text & icons using the info available.kindno_matchlabelz\iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=   g?r   )NrY   N)icon_provider
img_height	img_widthrC   rE    )ITEM_TYPE_MAPgetr   r   base64_from_icon_objr}   r~   setIconr   r{   r   AccessibleTextRole)rG   item_widget	item_inforC   rE   	item_type
item_labelr   r   r   
icon_scaleicon_height
icon_width	item_texts                 rL   rz   z!CompletionWidget.set_item_display   s   &&**9V+<jI	w'
EaZ
$	$-MM&)$D!z$$K#k1JHH]3M44z;8M 55	!Yv 6 	
 	I&D11)<=
 	B11j\9+3NOrM   Nr   c                    t        |      }t        |      }d|d|dddt        j                  z   dz   t        j                  |      j                  dd      dd	t        j                  d|dg}|2t        |      }t        |      }|j                  d
|dd|d|d|ddg       |j                  ddg       dj                  |      S )z$Get HTML representation of and item.z<table width="z
" height="z">z<tr>z!<td valign="middle" style="color:r   z&nbsp;z</td>z=<td valign="middle" align="right" float="right" style="color:z4<td valign="top" align="right" float="right" width="z!<img src="data:image/png;base64, z	" width="z"/>z</tr>z</table>rv   )r   r   MAIN_FG_COLORhtmlescapereplaceextendjoin)	rG   item_completionr   r   r   r   rC   rE   partss	            rL   r}   z-CompletionWidget.get_html_item_representation   s      'u% e\64/#2C2CCdJKK(00h?Kt
 $'
3J&y1ILLF43]j+y%  	Z
 	 wwu~rM   c                    d| _         d| _        | j                          |r| j                  j	                          t        | j                  dd      }|r|j                          t        j                  |        t        j                          y)Override Qt method.Ntooltip_widget)
r:   r9   rw   r-   rd   getattrr2   r	   r   hideText)rG   focus_to_parenttooltips      rL   r2   zCompletionWidget.hide&  si    #' #


 MM""$$--)94@LLNrM   c                 z   |j                         |j                         }}|j                         t        j                  z  }|j                         t        j
                  z  }|j                         t        j                  z  }|j                         xr |t        j                  k(  }|dk(  }|xs |xs
 |xs |xs |}	|t        j                  t        j                  t        j                  fv rt| j                         }
|
| j                  d      }
| j                  |
      r| j                  |
       y| j                          | j                   j#                  |       y|t        j$                  k(  r| j                          y|t        j&                  t        j(                  fv s|dv r,| j                          | j                   j#                  |       y|t        j*                  t        j,                  t        j.                  t        j0                  fv r|	sd| j                   _        |t        j*                  k(  r6| j5                         dk(  r#| j7                  | j9                         dz
         y|t        j,                  k(  r6| j5                         | j9                         dz
  k(  r| j7                  d       yt;        j"                  | |       y|t        j<                  t        j>                  fv r,| j                          | j                   j#                  |       y|t        j@                  k(  r.| j                   j#                  |       | jC                  d       ytE        |      r|	rWtG        |      }| jI                  d	d
      }||k(  r4| j                   jJ                  jM                          | j                          | j                   j#                  |       | jC                  d       y|	r| j                   j#                  |       y| j                          t;        j"                  | |       y)z'Override Qt method to process keypress.r   N)r`   ).:TrY   FrW   zeditor/save file	shortcuts)section)'r   key	modifiersr   AltModifierShiftModifierControlModifier	Key_AltGr
Key_Return	Key_EnterKey_TabcurrentItemr`   is_up_to_dater5   r2   r-   keyPressEvent
Key_EscapeKey_Left	Key_RightKey_UpKey_Down
Key_PageUpKey_PageDown_completions_hint_idle
currentRowrj   rT   r	   Key_HomeKey_EndKey_Backspacer_   lenr   get_confsig_save_requestedrb   )rG   eventr   r   altshiftctrlaltgrneo2_level4modifierr`   key_sequencesave_shortcuts                rL   r   zCompletionWidget.keyPressEvent9  s   JJL%))+coo"..0!B$4$44 2#5#55!;sbll': ax?D?C?5?K2==",,

;; ##%D|yy|!!t!,"""-		++E2BMM!IIKR[[",,//4:3EIIKMM''.BIIr{{BMM2??KK37DMM0biiDOO$5$:""4::<!#34#(9TZZ\!^(K""1%))$6R[["**-- IIKMM''.B$$$MM''.E*Y :5A !%& !. !==0MM4499; IIKMM''.E*MM''.IIK%%dE2rM   c                 4   | j                         ry| j                         sy|| j                         }| j                  j	                  d      }|j                  t        j                        }t        |t              r|d   }n|}| j                  ||      S )z7
        Check if the selection is up to date.
        FTrm   ru   )rU   is_position_correctr   r-   get_current_worddatar   r|   r]   r^   ry   )rG   r`   r   rm   filter_texts        rL   r   zCompletionWidget.is_up_to_date  s     ==?'')<##%D}}555FYYr{{+
j$'$\2K$K&&{LAArM   c                     |sy|syt        |      j                         j                  t        |      j                               S )z*Check if current_word matches filter_text.T)r   rp   
startswith)rG   r   r   s      rL   ry   z#CompletionWidget.check_can_complete  s@    k*002==|,2246 	6rM   c                 T   | j                   y| j                  j                         j                         }|| j                   k  ry| j                  j	                  d      }|| j                   |k(  ryy|\  }}t        |      }|| j                   cxk  r|t        |      z   k  sy yy)z!Check if the position is correct.FTr   )r:   r-   r[   r\   get_current_word_and_positionr   r   )rG   cursor_positionr   text_positions       rL   r   z$CompletionWidget.is_position_correct  s     ##+--224==? T555--EE F  "''?:)8&(9  8 8 6O 4466rM   c                     | j                         s| j                          y| j                  j                  d      }| j	                  ||       y)z,
        Update the displayed list.
        NTr   rW   )r   r2   r-   r   r   )rG   rX   r   s      rL   r_   zCompletionWidget.update_current  sF     '')IIK}}555F3/rM   c                    t        |      t        ury|j                          t        j                  dk(  r3|j                         t        j                  k7  r| j                          yy	 | j                          y# t        $ r Y yw xY w)r   Ndarwin)
typer   ignoresysplatformreasonr   ActiveWindowFocusReasonr2   RuntimeError)rG   r   s     rL   focusOutEventzCompletionWidget.focusOutEvent  sl    
 ;k) <<8#||~!;!;;		 <
		 s   *A; ;	BBc                     || j                         }|O| j                  C| j                  j                  |j	                  t
        j                        | j                         | j                          y)z!Perform the item selected action.N)r   r:   r-   insert_completionr   r   r|   r2   )rG   r`   s     rL   r5   zCompletionWidget.item_selected  sZ    <##%D 8 8 DMM++DIIbkk,B,0,D,DF		rM   c                     d|v r
|d   d   }|S |d   }dg}| j                   dk(  r|j                  d       |D ]  }|j                  |      d   } |S )Nrt   newText
insertText$python(r   )r.   r   split)rG   r`   insert_textcharschs        rL   _get_insert_textz!CompletionWidget._get_insert_text  sx    z*95K  |,K EE~~)S! 7)//3A67rM   c                 x   d | _         d | _        | j                  sy || j                         }|dk  st	        | j                        |k  ry | j                  |   }d|vry |d   | _         |d   | _        | j                  |      }t        | j                  d      r_|j                  dd      rM|j                         }|j                  d       |j                  d       | j                  j                  |       t        |d   t              r|d   d   |d<   | j                  j                  ||d   |d          y )	Nr   rZ   r   resolve_completion_itemresolveFdocumentationr!   )r<   r=   r9   r   r   r   hasattrr-   r   copypopr   r]   r^   sig_completion_hintrb   )rG   rowr`   r   
to_resolves        rL   trigger_completion_hintz(CompletionWidget.trigger_completion_hint  s)   +/(+/(##;//#C7c$../36##C($+/=(+/=(++D14==";<xx	5)!YY[
w'y)55jAd?+T2$($9'$BD!  %%!M	rM   c                     | j                   |d   k(  rZ| j                  |      }t        |d   t              r|d   d   |d<   | j                  j                  ||d   | j                         y y )Nr   r  r!   )r<   r   r]   r^   r  rb   r=   )rG   r`   r   s      rL   augment_completion_infoz(CompletionWidget.augment_completion_info"  st    ++tG}<//5K$/6(,_(=g(F_%$$))_%002 =rM   c                 &    | j                  |       y)z%Set completion hint info and show it.N)r	  )rG   r  s     rL   r7   zCompletionWidget.row_changed.  s     	$$S)rM   )Tr   )F)9__name__
__module____qualname____doc__r   TEXTMETHODFUNCTIONCONSTRUCTORFIELDVARIABLECLASS	INTERFACEMODULEPROPERTYUNITVALUEENUMKEYWORDSNIPPETCOLORFILE	REFERENCEr   r   r   objectra   strr   r  r,   rR   rU   rn   rr   r   r   rz   DEFAULT_COMPLETION_ITEM_HEIGHTrA   r}   r2   r   r   ry   r   r_   r   r5   r   r	  r  r   intr7   __classcell__)rK   s   @rL   r   r      s   !!!8 	##Z 	&&	
 	  ' 	##Z 	  ' 	$$k 	!!8 	##Z 	 	  ' 	 	""I 	""I  	  '!" 	#$ 	$$k%M( H!&> !c62'2
@8D*+Z#
P> 4801/0,J+H+Z&L3\B$	6@	0.!F
2 
#Y* *rM   r   )r  r   r   qtpy.QtCorer   r   r   r   
qtpy.QtGuir   r   qtpy.QtWidgetsr	   r
   r   spyder.api.config.mixinsr   spyder.utils.icon_managerr   spyder.plugins.completion.apir   spyder.py3compatr   spyder.utils.qthelpersr   spyder.widgets.helperwidgetsr   r%  rA   r    rM   rL   <module>r2     sW      
 1 0 0 A A A ) < + > 5 "$  # R*{$? R*rM   