a
    äIþfÅ  ã                   @   sð  d dl Zd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlT 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 d dlmZ d dl m!Z! d dl"m#Z# d dlm$Z$ dZ%de &¡  Z'ejdkZ(dd„ Z)G dd„ dƒZ*dd„ Z+e ,d¡Z-dd „ Z.G d!d"„ d"ƒZ/d#d$„ Z0d%d&d'd(œZ1d)d*„ Z2d+d,„ Z3d-d.„ Z4e5d/krìd d0l6m7Z7 e7d1d2d3d4 d d5l8m9Z9 e9e4ƒ dS )6é    N)Ú*)ÚFont)Ú	Scrollbar)Úsimpledialog)Ú
messagebox)ÚidleConf)Úconfigdialog)Úgrep)Úhelp)Ú
help_about)Úmacosx)ÚMultiCallCreator)Úpyparse)Úquery)Úreplace)Úsearch)Úwheel_event)Úpy_extensions)Úwindowé   z (%s)Údarwinc                  C   sb   t j\} }}}}d| |f }|d|f 7 }|dkrB|d|f 7 }n|dkr^|d|d |f 7 }|S )zYFormat sys.version_info to produce the Sphinx version string used to install the chm docsz%s%sz%sÚ	candidatezrc%sÚfinalr   )ÚsysÚversion_info)ÚmajorÚminorÚmicroÚlevelÚserialÚrelease© r!   úlib/python3.9/idlelib/editor.pyÚ_sphinx_version&   s    r#   c                   @   s<  e Zd ZddlmZ ddlmZmZ ddlm	Z	 ddl
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lmZmZmZmZ ddl m!Z! ddl"m#Z# ddl$m%Z% e& '¡ Z(dZ)dZ*dZ+dÙdd„Z,dÚdd„Z-dd„ Z.dd„ Z/dd„ Z0dd„ Z1dÛdd „Z2g d!¢Z3d"d#„ Z4d$d%„ Z5d&d'„ Z6d(d)„ Z7d*d+„ Z8dZ9d,d-„ Z:d.gZ;d/d0„ Z<d1d2„ Z=d3d4„ Z>d5d6„ Z?dÜd7d8„Z@dÝd9d:„ZAdÞd;d<„ZBdßd=d>„ZCd?d@„ ZDdAdB„ ZEdCdD„ ZFdàdEdF„ZGdádGdH„ZHdIdJ„ ZIdKdL„ ZJdMdN„ ZKdOdP„ ZLdQdR„ ZMdSdT„ ZNdUdV„ ZOdWdX„ ZPdYdZ„ ZQd[d\„ ZRd]d^„ ZSdâd_d`„ZTdãdadb„ZUdädcdd„ZVdedf„ ZWdgdh„ ZXdidj„ ZYdkdl„ ZZdmdn„ Z[dodp„ Z\dqdr„ Z]dsdt„ Z^e_j`e_ja du Zbdvdw„ Zcdxdy„ Zddzd{„ Zed|d}„ Zfd~d„ Zgd€d„ Zhd‚dƒ„ Zid„d…„ Zjdåd†d‡„Zkdˆd‰„ ZldŠd‹„ ZmdŒd„ ZndŽd„ Zodd‘„ Zpd’d“„ Zqd”d•„ Zrd–d—„ Zsdæd™dš„Ztd›dœ„ Zudçddž„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²iZ€d³d´„ Zdèdµd¶„Z‚déd·d¸„Zƒ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Ì„ ZdÍdÎ„ ZŽdÏdÐ„ ZdÑdÒ„ ZdÓdÔ„ Z‘dÕdÖ„ Z’díd×dØ„Z“dS )îÚEditorWindowr   )Ú
Percolator)ÚColorDelegatorÚcolor_config)ÚUndoDelegator)Ú	IOBindingÚencoding)Úmainmenu)ÚMultiStatusBar)ÚAutoComplete)Ú
AutoExpand)ÚCalltip)ÚCodeContext)ÚLineNumbers)ÚFormatParagraphÚFormatRegionÚIndentsÚRstrip)Ú
ParenMatch)ÚSqueezer)Ú
ZoomHeightNTc                 C   sL	  ddl m} tjd u rtj tjdd¡}tj	 
d¡rvddtjd d…   }tj d	¡r^d
}qÌd}tj ||dd¡}nVtj	d d… dkr²tj tjddtƒ  ¡}	tj |	¡rÌ|	}ntj	dkrÌtj tjd¡}tj |¡}tj |¡r|t_tj	dkrdtj t_ndtjd d…  t_|| _|p*|j}|| _t|ƒ| _tj|| jd | _}
|rl|j| _|j| j_ni | _i | j_tjotj tjd¡| _d| _t|
ƒ | _ }t!|dd | _"}tj#ddddd}dddd|d tj#ddd!ddd"œ}t$t%ƒ|fi |¤Ž | _&}| j&| j_'|  (¡  |  )¡  | j *d#| j+¡ | j ,d$| j-¡ t. /¡ rx| ,d$| j-¡ | ,d%| j0¡ | ,d&| j0¡ n| ,d'| j0¡ | ,d(t1¡ | ,d)t1¡ | ,d*t1¡ | ,d+| j2¡ | ,d,| j3¡ | ,d-| j4¡ | ,d.| j5¡ | ,d/| j6¡ | ,d0| j7¡ | ,d1| j8¡ | ,d2| j9¡ | ,d3| j:¡ | ,d4| j;¡ | ,d5d6d7„ ¡ | ,d8| j<¡ | ,d9| j=¡ | ,d:| j>¡ | ,d;| j?¡ | ,d<| j@¡ | ,d=| jA¡ | ,d>| jB¡ | ,d?| jC¡ | ,d@| jD¡ | ,dA| jE¡ | ,dB| jF¡ |  G| ¡ | _H}| ,dC|jI¡ | ,dD|jJ¡ | ,dE|jK¡ | ,dF|jL¡ | ,dG|jM¡ | ,dH|jN¡ |  O| ¡}| ,dI|jP¡ | ,dJ|jQ¡ | ,dK|  Rd¡¡ | ,dL|  RdM¡¡ | ,dN| jS¡ | ,dO| jT¡ | ,dP| jU¡ |r ||j| < |rØ| |jV|< | ,dQ| jW¡ | ,dR| jjX¡ | ,dS| jY¡ | ,dT| jZ¡ | ,dU| j[¡ |  \¡  |j]t^t_dMdV |j`dMdMdW |jadMdMdW | jb|dX< |jcdMdtddY |je|dZ< t f| jdd¡|d[< |jcdMdMtddY | g¡  |  h¡  tj#dd\d]d^d}| | _id_| _j| jj| _k|  l¡  tmtd`ƒsô| j&da t_n|  o¡  db| _p|  q|¡ | _r}|  s¡  | _t}| u|¡ |jv|_v|jw|_w| x| jy¡ |  z| ¡ | _{}| || j}¡ dc| _~|  dc¡ d | _€d | _d | _‚|rÞtj ƒ|¡rÎtj |¡sÎ| „|¡rÞdd| _~|  …|¡}|  |¡ n| †|¡ dd| _~|  ‡¡  |  y¡  |  ˆ¡  |  ‰¡  | jŠ ‹de¡}|rT| Œdf¡}|d u r(dg}|dkrB| ¡  |dM }|| _Žt | j¡ t‘j’| _’t“j”| _”t“j•| _•| –dhdi¡ | –djdkdldm¡ | –dndo¡ | –dpdq¡ | –drdqdsdt¡ |  —| ¡}| ,dh|j˜¡ | ,dj|j™¡ | ,du|jš¡ | ,dv|  ›| ¡jœ¡ | ,dw|  | ¡jž¡ |  Ÿ| ¡}| ,dx|j ¡ | ,dr|j¡¡ || ƒ}| ,dy|j¢¡ | ,dz|j£¡ | ,d{|j¤¡ | ,d||  ¥| ¡j¦¡ |  §| ¡ | _¨}| ,dn|j©¡ | ,dp|jª¡ | ,d}|j«¡ | ,d~|  ¬| ¡j­¡ | j®rì|  ¯| ¡| _| ,d| jj°¡ n|  ±d€dd‚¡ | j²	r:|  ³| ¡| _‚tj#dddƒd^d	r*|  ´¡  | ,d„| j´¡ n|  ±d€d…d‚¡ d S )†Nr   )ÚScriptBindingZDocz
index.htmlZlinuxzpython-docs-z%s.%s.%sé   z/var/www/html/python/z/var/www/html/python/index.htmlz/usr/share/doc/ÚwinzPython%s.chmr   z0Resources/English.lproj/Documentation/index.htmlzfile://zhttps://docs.python.org/%d.%d/é   )Úmenuzrecent-files.lstÚ Úvbar)ÚnameÚmainr$   ÚwidthÚint©ÚtypeÚtexté   ZnoneZwordprocessorÚheight)r@   ÚpadxZwrapZhighlightthicknessrB   ZtabstylerH   ZWM_DELETE_WINDOWú<<close-window>>z<Control-Button-1>z<2>z<3>z<MouseWheel>z
<Button-4>z
<Button-5>z<Configure>z<<cut>>z<<copy>>z	<<paste>>z<<center-insert>>z<<help>>z<<python-docs>>z<<about-idle>>z<<open-config-dialog>>ú<<open-module>>z<<do-nothing>>c                 S   s   dS ©NÚbreakr!   ©Úeventr!   r!   r"   Ú<lambda>ª   ó    z'EditorWindow.__init__.<locals>.<lambda>z<<select-all>>z<<remove-selection>>z<<find>>z<<find-again>>z<<find-in-files>>z<<find-selection>>z<<replace>>ú<<goto-line>>z<<smart-backspace>>z<<newline-and-indent>>z<<smart-indent>>z<<indent-region>>z<<dedent-region>>z<<comment-region>>z<<uncomment-region>>z<<tabify-region>>z<<untabify-region>>z<<toggle-tabs>>ú<<change-indentwidth>>z<Left>z<Right>é   z<<del-word-left>>z<<del-word-right>>z<<beginning-of-line>>z<<open-new-window>>z<<close-all-windows>>z<<open-class-browser>>z<<open-path-browser>>z<<open-turtle-demo>>)ÚsideÚfillÚexpand)ZweightÚcommand)ÚrowÚcolumnZstickyZyscrollcommandÚfontÚIndentz
use-spacesÚboolr   Úblink_off_timeÚinsertofftime)é2   iô  i@KL FTr   Úendéÿÿÿÿz<<autocomplete>>z	<Key-Tab>z<<try-open-completions>>z<KeyRelease-period>z<KeyRelease-slash>z<KeyRelease-backslash>z<<try-open-calltip>>z<KeyRelease-parenleft>z<<refresh-calltip>>z<KeyRelease-parenright>z<<paren-closed>>z<KeyRelease-bracketright>z<KeyRelease-braceright>z<<force-open-completions>>z<<expand-word>>z<<format-paragraph>>z<<flash-paren>>z<<check-module>>z<<run-module>>z<<run-custom>>z<<do-rstrip>>z<<force-open-calltip>>z<<zoom-height>>z<<toggle-code-context>>Úoptionsz*ode*ontextÚdisabledzline-numbers-defaultz<<toggle-line-numbers>>ú*ine*umbers)µZidlelib.runscriptr9   r$   Úhelp_urlÚosÚpathÚjoinr   Úbase_prefixÚplatformÚcountr   Úisdirr#   ÚisfileÚnormpathÚflistÚrootÚMenuÚmenubarr   ZListedToplevelÚtopÚvarsÚtkinter_varsZinversedictÚinstance_dictr   ZuserdirÚrecent_files_pathÚprompt_last_lineÚFrameÚ
text_framer   r?   Ú	GetOptionr   ÚTextrF   Zfocused_widgetÚcreatemenubarÚapply_bindingsZprotocolÚcloseÚbindÚclose_eventr   ZisAquaTkÚright_menu_eventr   Úhandle_winconfigÚcutÚcopyÚpasteÚcenter_insert_eventÚhelp_dialogÚpython_docsÚabout_dialogÚconfig_dialogÚopen_module_eventÚ
select_allÚremove_selectionÚ
find_eventÚfind_again_eventÚfind_in_files_eventÚfind_selection_eventÚreplace_eventÚgoto_line_eventÚsmart_backspace_eventÚnewline_and_indent_eventÚsmart_indent_eventr3   ÚfregionÚindent_region_eventZdedent_region_eventZcomment_region_eventZuncomment_region_eventZtabify_region_eventZuntabify_region_eventr4   Ztoggle_tabs_eventZchange_indentwidth_eventÚmove_at_edge_if_selectionÚdel_word_leftÚdel_word_rightÚhome_callbackÚdictÚnew_callbackZclose_all_callbackÚopen_module_browserÚopen_path_browserÚopen_turtle_demoÚset_status_barÚpackZLEFTZBOTHZrowconfigureZcolumnconfigureÚhandle_yviewZgridZNSEWÚsetÚGetFontZ	focus_setÚ	set_widthÚusetabsÚtabwidthÚindentwidthÚset_notabs_indentwidthÚhasattrr^   Úupdate_cursor_blinkÚnum_context_linesr%   Úperr(   ÚundoÚinsertfilterÚundo_block_startÚundo_block_stopZset_saved_change_hookÚsaved_change_hookr)   ÚioZset_filename_change_hookÚfilename_change_hookZ	good_loadÚset_indentation_paramsÚcolorÚcode_contextÚline_numbersÚexistsÚloadfileÚispythonsourceZset_filenameÚResetColorizerÚupdate_recent_files_listÚload_extensionsÚmenudictÚgetÚindexÚadd_separatorÚ	wmenu_endZregister_callbackÚpostwindowsmenur   Z
askintegerr   ZaskyesnoÚ	showerrorÚ	event_addr-   Zautocomplete_eventZtry_open_completions_eventZforce_open_completions_eventr.   Zexpand_word_eventr2   Zformat_paragraph_eventr6   Zflash_paren_eventZparen_closed_eventZcheck_module_eventZrun_module_eventZrun_custom_eventr5   Z	do_rstripr/   ÚctipZtry_open_calltip_eventZrefresh_calltip_eventZforce_open_calltip_eventr8   Zzoom_height_eventÚallow_code_contextr0   Ztoggle_code_context_eventÚupdate_menu_stateÚallow_line_numbersr1   Útoggle_line_numbers_event)Úselfrp   ÚfilenameÚkeyrq   r9   ZdochomeZpyverZbasepathZchmfilert   r{   r?   rB   Ztext_optionsrF   r™   ÚindentsZ	usespacesr±   r²   r·   Ú	is_py_srcr=   ra   ZautocompleteZ
parenmatchZscriptbindingrË   r!   r!   r"   Ú__init__I   sÀ   
ÿÿ

ÿÿ
ÿÿù







ÿ






ÿÿ
ÿÿ
ÿ
ÿÿzEditorWindow.__init__c                 C   s   |   ¡  d S ©N)r©   ©rÐ   rO   r!   r!   r"   r„   a  s    zEditorWindow.handle_winconfigc                 C   s^   | j }tt|jj| d¡| d¡gƒƒ}| ¡ d|  }t|| d¡d d¡}|| | _	d S )NZborderrI   r<   r[   )r[   Ú0)
rF   ÚsumÚmapÚtkZgetintZcgetZwinfo_widthr   ÚmeasurerB   )rÐ   rF   Zinner_paddingZpixel_widthZzero_char_widthr!   r!   r"   r©   d  s    ÿÿzEditorWindow.set_widthc                 C   s   | j  ¡ \}}| j |¡ dS rL   )r·   Zdefaultfilenamerp   Únew)rÐ   rO   ÚdirnameÚbasenamer!   r!   r"   r    q  s    zEditorWindow.new_callbackc                 C   sÂ  |j d@ dkr|jdkrd S | j d¡rd| j ddd¡rd| j ddd¡rdt| j d¡ d¡d	 ƒ}n8| j dd¡}tt	|ƒƒD ]}|| d
vr~ qœq~t	|ƒ}t| j d¡ d¡d	 ƒ}||krÂd}dt
|ƒ d }|j d	@ dkrò| j ddd¡ n²| j d¡s| j dd¡ n@| j | j d¡d| j d¡¡rB| j dd¡ n| j dd¡ | j |¡}| j d¡}| j |d|¡r„|| }}| j ddd¡ | j d||¡ | j d|¡ | j d¡ dS )Né   r   ZHomeZiomarkú<=zinsert lineendúinsert linestartÚ.rT   )ú ú	Úinsertzinsert linestart+ÚcÚselú1.0ra   ú	sel.firstZ	my_anchorú<úsel.lastú>rM   )ÚstateZkeysymrF   rÅ   ÚcomparerC   ÚsplitrÄ   ÚrangeÚlenÚstrÚ
tag_removeÚmark_setÚtag_addÚsee)rÐ   rO   ZinsertptÚlineZlineatÚdestÚfirstÚlastr!   r!   r"   rž   v  sF    ÿþ
ÿ
zEditorWindow.home_callbackc                 C   s°   |   | j¡| _t| jdddd}tjdkr<| jjddtd | jjdd	td | jjd
dtd | jjt	t
d |jt	t
d | j d| j¡ | j ddd¡ | j | j¡ d S )NrT   Zgrey75)rH   ZborderwidthZ
backgroundr   Z	_padding1z    )rU   rZ   zCol: ?rø   zLn: ?)rU   rV   z<<set-line-and-column>>z<KeyRelease>z<ButtonRelease>)r,   rt   Ú
status_barrz   r   rk   Ú	set_labelZRIGHTr¥   ZBOTTOMÚXrF   r   Úset_line_and_columnrÊ   Z
after_idle)rÐ   Úsepr!   r!   r"   r¤   ¡  s    
ÿzEditorWindow.set_status_barc                 C   s>   | j  t¡ d¡\}}| j dd| ¡ | j dd| ¡ d S )Nrã   rZ   zCol: %srø   zLn: %s)rF   rÅ   ZINSERTrð   rü   rý   )rÐ   rO   rø   rZ   r!   r!   r"   rÿ   ±  s    z EditorWindow.set_line_and_column))ÚfileZ_File)ÚeditZ_Edit)ÚformatZF_ormat)ÚrunZ_Run)rc   Z_Options)r   Z_Window)r
   Z_Helpc                 C   sâ   | j }i  | _}| jD ]N\}}t|ƒ\}}t| |› dd ƒ}t||d|d ||< }|j|||d qt ¡ r’t|ddd |d< }|jd|d	 |  	¡  t| j dd
| _
| jd jddd| j
d | jd  t¡| _|  ¡  d S )NZ_menu_postcommandr   )r@   ÚtearoffÚpostcommand)Úlabelr=   Ú	underlineZapple)r@   r  ZapplicationZIDLE)r  r=   ©r  r  r:   zRecent Files)r  r  r=   r
   )rs   rÃ   Ú
menu_specsÚprepstrÚgetattrrr   Zadd_cascader   Z
isCarbonTkÚ
fill_menusÚrecent_files_menuZinsert_cascaderÅ   ÚENDÚbase_helpmenu_lengthÚreset_help_menu_entries)rÐ   ZmbarrÃ   r@   r  r  r  r=   r!   r!   r"   r~   Á  s,    
ÿÿþzEditorWindow.createmenubarc                 C   sJ   | j d }| d¡}|d u r d}|| jkr<| | jd |¡ t |¡ d S )Nr   ra   rb   rT   )rÃ   rÅ   rÇ   Údeleter   Zadd_windows_to_menu)rÐ   r=   ra   r!   r!   r"   rÈ   ×  s    


zEditorWindow.postwindowsmenuc                 C   s   | j | }|j||d dS )z$Update label for menu item at index.)r  N©rÃ   Úentryconfig)rÐ   r=   rÅ   r  Úmenuitemr!   r!   r"   Úupdate_menu_labelá  s    
zEditorWindow.update_menu_labelc                 C   s   | j | }|j||d dS )z$Update state for menu item at index.©rî   Nr  )rÐ   r=   rÅ   rî   r  r!   r!   r"   rÍ   æ  s    
zEditorWindow.update_menu_statec                 G   sT   |dkr<t |d ƒ}t|  d¡| ƒ|  d¡ }d}|df}| jj|g|¢R Ž  dS )zHandle scrollbar.Zmovetor   ra   ú@0,0ZscrollZunitsrM   )ÚfloatÚroundÚ	getlinenorF   Úyview)rÐ   rO   ÚargsZfractionÚlinesr!   r!   r"   r¦   ë  s    ÿzEditorWindow.handle_yviewc              	   C   s0  | j }| d|j› d|j› ¡}z | dd|¡o<| |dd¡}W n tyV   d}Y n0 |sv| ddd	¡ | d
|¡ | js„|  	¡  | j}|| _
tjd d… dk}|r²|jdd | jD ]N}z|\}}	}
W n tyà   Y q¸Y n0 |
d u rìq¸t| |
ƒƒ }|j||d q¸| |j|j¡ |r,| j jdd dS )Nú@ú,rê   rá   rì   Frè   ré   ra   ræ   r:   r;   Zarrow)Zcursorr  ZibeamrM   )rF   rÅ   ÚxÚyrï   ÚTclErrorrô   rõ   ÚrmenuÚ
make_rmenurO   r   rk   ZconfigÚrmenu_specsÚ
ValueErrorr  ZentryconfigureZtk_popupZx_rootZy_root)rÐ   rO   rF   ZnewdexZin_selectionr$  ZiswinÚitemr  Ú	eventnameZverify_staterî   r!   r!   r"   rƒ   ø  s>    ÿ


zEditorWindow.right_menu_event)ZCloserJ   Nc                 C   sf   t | jdd}| jD ]F}|d |d  }}|d urR| j|fdd„}|j||d q| ¡  q|| _d S )Nr   r	  rT   c                 S   s   |   |¡ d S rÖ   ©Úevent_generate©rF   r)  r!   r!   r"   rX   %  s    z(EditorWindow.make_rmenu.<locals>.command©r  rX   )rr   rF   r&  Úadd_commandrÆ   r$  )rÐ   r$  r(  r  r)  rX   r!   r!   r"   r%     s    

zEditorWindow.make_rmenuc                 C   s   |   ¡ S rÖ   )Úrmenu_check_copy©rÐ   r!   r!   r"   Úrmenu_check_cut,  s    zEditorWindow.rmenu_check_cutc                 C   s6   z| j  d¡}W n ty$   Y dS 0 |r.dS dS d S )Nrê   rd   Únormal©rF   rÅ   r#  )rÐ   Zindxr!   r!   r"   r/  /  s
    zEditorWindow.rmenu_check_copyc                 C   s6   z| j j d| j d¡ W n ty,   Y dS 0 dS d S )Nztk::GetSelectionZ	CLIPBOARDrd   r2  )rF   rÛ   Úcallr#  r0  r!   r!   r"   Úrmenu_check_paste7  s
    zEditorWindow.rmenu_check_pastec                 C   s   t  | j¡ dS )zHandle Help 'About IDLE' event.rM   )r   ZAboutDialogrt   r×   r!   r!   r"   r‹   ?  s    zEditorWindow.about_dialogc                 C   s   t  | jd¡ dS )z&Handle Options 'Configure IDLE' event.ZSettingsrM   )r   ZConfigDialogrt   r×   r!   r!   r"   rŒ   E  s    zEditorWindow.config_dialogc                 C   s"   | j r| j }n| j}t |¡ dS )zHandle Help 'IDLE Help' event.rM   )rq   rt   r
   Zshow_idlehelp)rÐ   rO   Úparentr!   r!   r"   r‰   K  s
    
zEditorWindow.help_dialogc              
   C   sp   t jd d… dkr`zt | j¡ W ql ty\ } z"tjdt|ƒ| j	d W Y d }~qld }~0 0 nt
 | j¡ dS )Nr:   r;   úDocument Start Failure©ÚtitleÚmessager6  rM   )r   rk   rg   Ú	startfilerf   ÚOSErrorr   rÉ   ró   rF   Ú
webbrowserÚopen)rÐ   rO   Úwhyr!   r!   r"   rŠ   U  s    
ÿzEditorWindow.python_docsc                 C   s   | j  d¡ dS )Nz<<Cut>>rM   ©rF   r+  r×   r!   r!   r"   r…   `  s    zEditorWindow.cutc                 C   s    | j  d¡sd S | j  d¡ dS )Nrè   z<<Copy>>rM   )rF   Z
tag_rangesr+  r×   r!   r!   r"   r†   d  s    zEditorWindow.copyc                 C   s   | j  d¡ | j  d¡ dS )Nz	<<Paste>>ræ   rM   )rF   r+  r÷   r×   r!   r!   r"   r‡   k  s    zEditorWindow.pastec                 C   s.   | j  ddd¡ | j  dd¡ | j  d¡ dS )Nrè   ré   zend-1cræ   rM   )rF   rö   rõ   r÷   r×   r!   r!   r"   rŽ   p  s    zEditorWindow.select_allc                 C   s    | j  ddd¡ | j  d¡ dS )Nrè   ré   ra   ræ   rM   )rF   rô   r÷   r×   r!   r!   r"   r   v  s    zEditorWindow.remove_selectionc                    s*   | j j‰| j j‰d‰‡ ‡‡‡fdd„}|S )zèCursor move begins at start or end of selection

        When a left/right cursor key is pressed create and return to Tkinter a
        function which causes a cursor move from the associated edge of the
        selection.

        )zsel.first+1czsel.last-1cc                    s@   | j d@ dkr<zˆdƒ ˆdˆˆ  ƒ W n ty:   Y n0 d S )NrG   r   rê   ræ   )rî   r#  rN   ©Ú
edge_indexZedges_tableZself_text_indexZself_text_mark_setr!   r"   Úmove_at_edge†  s    z<EditorWindow.move_at_edge_if_selection.<locals>.move_at_edge)rF   rÅ   rõ   )rÐ   rB  rC  r!   rA  r"   r›   {  s
    z&EditorWindow.move_at_edge_if_selectionc                 C   s   | j  d¡ dS )Nz<Meta-Delete>rM   r@  r×   r!   r!   r"   rœ     s    zEditorWindow.del_word_leftc                 C   s   | j  d¡ dS )Nz<Meta-d>rM   r@  r×   r!   r!   r"   r   “  s    zEditorWindow.del_word_rightc                 C   s   t  | j¡ dS rL   )r   ÚfindrF   r×   r!   r!   r"   r   —  s    zEditorWindow.find_eventc                 C   s   t  | j¡ dS rL   )r   Z
find_againrF   r×   r!   r!   r"   r‘   ›  s    zEditorWindow.find_again_eventc                 C   s   t  | j¡ dS rL   )r   Zfind_selectionrF   r×   r!   r!   r"   r“   Ÿ  s    z!EditorWindow.find_selection_eventc                 C   s   t   | j| j| j¡ dS rL   )r	   rF   r·   rp   r×   r!   r!   r"   r’   £  s    z EditorWindow.find_in_files_eventc                 C   s   t   | j¡ dS rL   )r   rF   r×   r!   r!   r"   r”   §  s    zEditorWindow.replace_eventc                 C   sT   | j }t |dd¡j}|d urP| ddd¡ | d|› d¡ | d¡ |  ¡  dS )	Nz
Go To Linez/Enter a positive integer
('big' = end of file):rè   ré   ra   ræ   ú.0rM   )rF   r   ZGotoÚresultrô   rõ   r÷   rÿ   )rÐ   rO   rF   Úlinenor!   r!   r"   r•   «  s    þ
zEditorWindow.goto_line_eventc                 C   sn   z| j  dd¡ ¡ }W n ty,   d}Y n0 t | j dd|¡j}|durj| jr^| j |¡ n| j	 
|¡ |S )z¯Get module name from user and open it.

        Return module path or None for calls by open_module_browser
        when latter is not invoked in named editor window.
        rê   rì   r>   zOpen ModulezAEnter the name of a Python module
to search on sys.path and open:N)rF   rÄ   Ústripr#  r   Z
ModuleNamerF  rp   r>  r·   r¾   )rÐ   r@   Ú	file_pathr!   r!   r"   Úopen_module¹  s    
üzEditorWindow.open_modulec                 C   s   |   ¡  dS rL   )rJ  r×   r!   r!   r"   r   Ñ  s    zEditorWindow.open_module_eventc                 C   sJ   | j j}| jjdkr|s,|  ¡ }|d u r,dS ddlm} | | j|¡ dS )NZPyShellEditorWindowrM   r   )Úbrowser)	r·   rÑ   Ú	__class__Ú__name__rJ  ÚidlelibrK  ZModuleBrowserrq   )rÐ   rO   rÑ   rK  r!   r!   r"   r¡   Õ  s    ÿz EditorWindow.open_module_browserc                 C   s   ddl m} | | j¡ dS )Nr   )ÚpathbrowserrM   )rN  rO  ZPathBrowserrq   )rÐ   rO   rO  r!   r!   r"   r¢   à  s    zEditorWindow.open_path_browserc                 C   s&   dd l }tjddg}|j|dd dS )Nr   z-cz,from turtledemo.__main__ import main; main()F)ÚshellrM   )Ú
subprocessr   Ú
executableÚPopen)rÐ   rO   rQ  Úcmdr!   r!   r"   r£   å  s    þzEditorWindow.open_turtle_democ                 C   sN   |d urJ|dkrJ| j  dd| ¡ | j  ddd¡ | j  ddd¡ |  ¡  d S )Nr   ræ   z%d.0rè   ré   ra   z
insert +1l)rF   rõ   rô   rö   Úcenter)rÐ   rG  r!   r!   r"   Úgotolineî  s
    zEditorWindow.gotolinec                 C   s`   |rt j |¡rdS t j t j |¡¡\}}t j |¡tv r@dS | j dd¡}| 	d¡o^d|v S )NTré   z1.0 lineendz#!Zpython)
rg   rh   rm   Úsplitextrß   Únormcaser   rF   rÄ   Ú
startswith)rÐ   rÑ   ÚbaseZextrø   r!   r!   r"   r¿   õ  s    zEditorWindow.ispythonsourcec                 C   s   | j r| j  | ¡ d | _ d S rÖ   )rp   Zunregister_maybe_terminater0  r!   r!   r"   Ú
close_hookþ  s    zEditorWindow.close_hookc                 C   s
   || _ d S rÖ   )r[  )rÐ   r[  r!   r!   r"   Úset_close_hook  s    zEditorWindow.set_close_hookc                 C   s2   | j r| j  | ¡ |  ¡  | j | ¡ |  ¡  d S rÖ   )rp   Zfilename_changed_editr¶   rt   Zupdate_windowlist_registryrÀ   r0  r!   r!   r"   r¸     s
    z!EditorWindow.filename_change_hookc                 C   sV   | j r
d S |  | jj¡r"|  ¡ | _ | j rR| j | j¡ | j | j ¡ | j | j¡ d S rÖ   )	rº   r¿   r·   rÑ   r&   r±   Úremovefilterr²   r³   r0  r!   r!   r"   Ú_addcolorizer  s    
zEditorWindow._addcolorizerc                 C   s,   | j s
d S | j  ¡  | j | j ¡ d | _ d S rÖ   )rº   Zremovecolorsr±   r]  r0  r!   r!   r"   Ú_rmcolorizer  s
    
zEditorWindow._rmcolorizerc                 C   sH   |   ¡  |  ¡  t | j¡ | jdur0| j ¡  | jdurD| j ¡  dS )zUpdate the color themeN)	r_  r^  r$   r'   rF   r»   Zupdate_highlight_colorsr¼   Zupdate_colorsr0  r!   r!   r"   rÀ     s    


zEditorWindow.ResetColorizerÚ_c                 C   sp   |  d|¡ | |¡}|r6|| jv r6|  d|d |¡ d| |¡krR| d|¡ n| d|d ¡ | |¡ d S )NZERRORz
 wordstartÚ
ræ   z+1c)rö   rÄ   Ú
IDENTCHARSrõ   r÷   )rÐ   rF   ÚposÚcharr!   r!   r"   Úcolorize_syntax_error.  s    
z"EditorWindow.colorize_syntax_errorc                 C   s2   t jddddd}|s"d| jd< nt j| jd< dS )	z&Update the cursor blink configuration.rA   r$   zcursor-blinkr]   rD   r   r_   N)r   r|   rF   r^   )rÐ   Zcursorblinkr!   r!   r"   r¯   9  s    ÿz EditorWindow.update_cursor_blinkc                 C   sN   | j dur| j  ¡  | jdur(| j ¡  t | jdd¡}|| jd< |  ¡  dS )z.Update the text widgets' font if it is changedNrA   r$   r[   )r»   Zupdate_fontr¼   r   r¨   rq   rF   r©   )rÐ   Znew_fontr!   r!   r"   Ú	ResetFontC  s    




zEditorWindow.ResetFontc                 C   s|   t  ¡  | j_}| ¡ D ]\}}| jj|g|¢R Ž  q|  ¡ D ]8}t  |¡}|r>| ¡ D ]\}}| jj|g|¢R Ž  qXq>dS )z/Remove the keybindings before they are changed.N)	r   ÚGetCurrentKeySetr+   Údefault_keydefsÚitemsrF   Zevent_deleteÚget_standard_extension_namesÚGetExtensionBindings)rÐ   ÚkeydefsrO   ÚkeylistÚextensionNameÚxkeydefsr!   r!   r"   ÚRemoveKeybindingsT  s    
zEditorWindow.RemoveKeybindingsc                 C   sB  t  ¡  | j_}|  ¡  |  ¡ D ]}t  |¡}|r |  |¡ q i }| jjD ]B}i ||d < |d D ](}|rb|d ||d  t|d ƒd < qbqJ| j	D ]¨}| j	| }| 
t¡}|du r¶q”|d7 }td|ƒD ]r}	| |	¡dkrÈ| |	d¡}
|
rÈ| |	d¡}d}||v r||| v r|| | }|rÈt||ƒ}
|j|	|
d qÈq”dS )	z-Update the keybindings after they are changedr   rT   NrX   Úacceleratorr  r>   )rq  )r   rg  r+   rh  r   rj  rk  Úmenudefsr  rÃ   rÅ   r  rñ   rE   Z	entrycgetÚget_acceleratorr  )rÐ   rl  rn  ro  ZmenuEventDictr=   r(  ZmenubarItemra   rÅ   ZaccelZitemNamerO   r!   r!   r"   ÚApplyKeybindings`  s<    
$




zEditorWindow.ApplyKeybindingsc                 C   s   | j stjddddd| _dS )zCUpdate the indentwidth if changed and not using tabs in this windowrA   r\   z
num-spacesrC   rD   N)rª   r   r|   r¬   r0  r!   r!   r"   r­   „  s    
ÿz#EditorWindow.set_notabs_indentwidthc                 C   s|   t  ¡ }| jd }| t¡}|| jkr8| | jd |¡ |rn| ¡  |D ]$}|  |d ¡}|j	|d |d qH|| jd< dS )z3Update the additional help entries on the Help menur
   rT   r   r-  N)
r   ZGetAllExtraHelpSourcesListrÃ   rÅ   r  r  r  rÆ   Ú"_EditorWindow__extra_help_callbackr.  )rÐ   Z	help_listZhelpmenuZhelpmenu_lengthÚentryrT  r!   r!   r"   r  ‹  s    


z$EditorWindow.reset_help_menu_entriesc                    s   |f‡ fdd„	}|S )zCCreate a callback with the helpfile value frozen at definition timec              
      s‚   |   d¡stj | ¡} tjd d… dkrtzt | ¡ W q~ typ } z"tj	dt
|ƒˆ jd W Y d }~q~d }~0 0 n
t | ¡ d S )N)ZwwwZhttpr:   r;   r7  r8  )rY  rg   rh   ro   r   rk   r;  r<  r   rÉ   ró   rF   r=  r>  )Úhelpfiler?  r0  r!   r"   Údisplay_extra_helpž  s    

ÿz>EditorWindow.__extra_help_callback.<locals>.display_extra_helpr!   )rÐ   rw  rx  r!   r0  r"   Z__extra_help_callbackœ  s    z"EditorWindow.__extra_help_callbackc              
      sæ  g }| j }|rRtj |¡rRt|dddd}| ¡ }W d  ƒ n1 sH0    Y  |r„tj |¡d }||v rx| |¡ | d|¡ g ‰ |D ]*}d|v s¬tj |dd	… ¡sŒˆ  	|¡ qŒ‡ fd
d„|D ƒ}d}|dt
|ƒ… }|r~z@t|dddd}| |¡ W d  ƒ n1 s0    Y  W nX ty| } z>t| jddƒshd| j_tjdd|› d| jd W Y d}~n
d}~0 0 | jjD ]Z}	|	j}
|
 dt¡ t|ƒD ]8\}}| ¡ }|	 |¡}|
j|| d | |dd q¤q†dS )z/Load and update the recent files list and menusÚrÚutf_8r   )r*   ÚerrorsNra  r   ú rb   c                    s   g | ]}|ˆ vr|‘qS r!   r!   )Ú.0rh   ©Z	bad_pathsr!   r"   Ú
<listcomp>¾  rQ   z9EditorWindow.update_recent_files_list.<locals>.<listcomp>Z1234567890ABCDEFGHIJKÚwÚrecentfiles_messageFTzIDLE Warningz)Cannot save Recent Files list to disk.
  z
Select OK to continue.r8  rä   )r  rX   r  )rx   rg   rh   r½   r>  Ú	readlinesÚabspathÚremoveræ   Úappendrò   Ú
writelinesr<  r  rq   r  r   ÚshowwarningrF   rt   rw   r  r  r  Ú	enumerateÚrstripÚ#_EditorWindow__recent_file_callbackr.  )rÐ   Únew_fileZrf_listrI  Zrf_list_filerh   ZulcharsZrf_fileÚerrÚinstancer=   ÚiÚ	file_nameÚcallbackr!   r~  r"   rÁ   «  s\    ÿ&
ÿ.ÿü
þz%EditorWindow.update_recent_files_listc                    s   |f‡ fdd„	}|S )Nc                    s   ˆ j j| d d S )N)ZeditFile)r·   r>  )Z
fn_closurer0  r!   r"   Úopen_recent_fileÚ  s    z=EditorWindow.__recent_file_callback.<locals>.open_recent_filer!   )rÐ   r  r‘  r!   r0  r"   Z__recent_file_callbackÙ  s    z#EditorWindow.__recent_file_callbackc                 C   s‚   |   ¡ }|  ¡ }|r*|r*|d | t }n|r4|}n|r>|}nd}|pL|pL|}|  ¡ sfd| }d| }| j |¡ | j |¡ d S )Nz - Úuntitledz*%s*z*%s)Úshort_titleÚ
long_titleÚ_py_versionÚ	get_savedrt   Zwm_titleZwm_iconname)rÐ   ZshortZlongr9  Ziconr!   r!   r"   r¶   Þ  s    zEditorWindow.saved_change_hookc                 C   s
   | j  ¡ S rÖ   )r²   r–  r0  r!   r!   r"   r–  ð  s    zEditorWindow.get_savedc                 C   s   | j  |¡ d S rÖ   )r²   Ú	set_saved)rÐ   Úflagr!   r!   r"   r—  ó  s    zEditorWindow.set_savedc                 C   s   | j  ¡  d S rÖ   )r²   Ú
reset_undor0  r!   r!   r"   r™  ö  s    zEditorWindow.reset_undoc                 C   s   | j j}|rtj |¡S dS )Nr’  )r·   rÑ   rg   rh   rß   )rÐ   rÑ   r!   r!   r"   r“  ù  s    zEditorWindow.short_titlec                 C   s   | j jp
dS )Nr>   )r·   rÑ   r0  r!   r!   r"   r”  ý  s    zEditorWindow.long_titlec                 C   s   |   ¡  dS rL   )rU  r×   r!   r!   r"   rˆ      s    z EditorWindow.center_insert_eventræ   c                 C   sH   | j }|  ¡ \}}|  |¡}|| }td||d  ƒ}| t|ƒ¡ d S )NrT   r<   )rF   Úgetwindowlinesr  Úmaxr  r  )rÐ   ÚmarkrF   rt   ÚbotrG  rH   Znewtopr!   r!   r"   rU    s    
zEditorWindow.centerc                 C   sN   | j }|  d¡}|  d¡}||krF| ¡ dkrFt|d ƒ}|| d }||fS )Nr  z@0,65535rT   rH   )rF   r  Zwinfo_heightrC   )rÐ   rF   rt   r  rH   r!   r!   r"   rš    s    

zEditorWindow.getwindowlinesc                 C   s   | j }tt| |¡ƒƒS rÖ   )rF   rC   r  rÅ   )rÐ   rœ  rF   r!   r!   r"   r    s    zEditorWindow.getlinenoc                 C   s(   | j  ¡ }t d|¡}ttt| ¡ ƒƒS )zReturn (width, height, x, y)z(\d+)x(\d+)\+(-?\d+)\+(-?\d+))rt   Zwm_geometryÚreÚmatchÚlistrÚ   rC   Úgroups)rÐ   ZgeomÚmr!   r!   r"   Úget_geometry  s    
zEditorWindow.get_geometryc                 C   s   |   ¡  dS rL   )r€   r×   r!   r!   r"   r‚      s    zEditorWindow.close_eventc                 C   sH   | j rD|  ¡ s:| j ¡ dkr&| j ¡  | j ¡  | j ¡  | j  ¡ S d S )Nr2  )r·   r–  rt   rî   Z	deiconifyÚlowerZliftÚ	maybesaver0  r!   r!   r"   r¥  $  s    


zEditorWindow.maybesavec                 C   s:   z"|   ¡ }t|ƒdkr|  ¡  |W S  ty4   Y n0 d S )NZcancel)r¥  ró   Ú_closeÚAttributeError)rÐ   Zreplyr!   r!   r"   r€   -  s    zEditorWindow.closec                 C   s   | j jr| j| j jd t | j¡ |  ¡  | j  ¡  d | _ d | _| j	rX| j	 ¡  d | _	d | _
d | _| j ¡  d | _| j ¡  | jrŒ|  ¡  d S )N)r‹  )r·   rÑ   rÁ   r   Zunregister_callbackrÈ   Úunload_extensionsr€   r²   rº   rF   rv   r±   rt   Zdestroyr[  r0  r!   r!   r"   r¦  6  s"    



zEditorWindow._closec                 C   s   i | _ |  ¡  d S rÖ   )Ú
extensionsÚload_standard_extensionsr0  r!   r!   r"   rÂ   J  s    zEditorWindow.load_extensionsc                 C   s0   t | j ¡ ƒD ]}t|dƒr| ¡  qi | _d S )Nr€   )r   r©  Úvaluesr®   r€   )rÐ   Úinsr!   r!   r"   r¨  N  s    

zEditorWindow.unload_extensionsc                 C   sD   |   ¡ D ]6}z|  |¡ W q   tdt|ƒƒ t ¡  Y q0 qd S )NzFailed to load extension)rj  Úload_extensionÚprintÚreprÚ	tracebackÚ	print_exc)rÐ   r@   r!   r!   r"   rª  T  s    z%EditorWindow.load_standard_extensionsc                 C   s   t jddS )NT)Zeditor_only)r   ZGetExtensionsr0  r!   r!   r"   rj  \  s    z)EditorWindow.get_standard_extension_namesZZzDummyZzzdummyc           	   	   C   s6  | j  ||¡}z<ztjd| td}W n  ttfyF   t |¡}Y n0 W n tyh   td|ƒ ‚ Y n0 t||ƒ}t	 
|¡}t|dƒr–|  |j|¡ || ƒ}|| j|< |r2|  |¡ |D ]t}| dd¡}|d d… dkrê|dd … }qÌ|d	d … d
kr
|d d	… }qê|d }t||ƒr¼| j |t||ƒ¡ q¼d S )Nrã   )Úpackagez
Failed to import extension: rr  ú-r`  rT   rë   rb   rí   Z_event)ÚextfilesrÄ   Ú	importlibÚimport_moduleÚ__package__ÚImportErrorÚ	TypeErrorr®  r  r   rk  r®   r  rr  r©  r   r   rF   r   )	rÐ   r@   ÚfnameÚmodÚclsrl  r¬  ZveventZ
methodnamer!   r!   r"   r­  c  s4    






zEditorWindow.load_extensionc                 C   sH   |d u r| j j}| j}||_| ¡ D ]\}}|r$|j|g|¢R Ž  q$d S rÖ   )r+   rh  rF   rl  ri  rÊ   )rÐ   rl  rF   rO   rm  r!   r!   r"   r     s    zEditorWindow.apply_bindingsc              	   C   sê   |du r| j j}|du r | j j}| j}| j}|D ]´\}}| |¡}|sHq0|D ]–}|s^| ¡  qL|\}	}
|	dd… dk}|r†|	dd… }	t|	ƒ\}}	t||
ƒ}||
fdd„}|rÐ|  	|
t
¡}|j|	||||d qL|j|	|||d qLq0dS )zAdd appropriate entries to the menus and submenus

        Menus that are absent or None in self.menudict are ignored.
        NrT   ú!c                 S   s   |   |¡ d S rÖ   r*  r,  r!   r!   r"   rX   ¡  s    z(EditorWindow.fill_menus.<locals>.command)r  r  rX   rq  Zvariable)r  r  rX   rq  )r+   rr  rh  rÃ   rF   rÄ   rÆ   r  rs  Úget_var_objZ
BooleanVarZadd_checkbuttonr.  )rÐ   rr  rl  rÃ   rF   ZmnameZ	entrylistr=   rv  r  r)  Zcheckbuttonr  rq  rX   Úvarr!   r!   r"   r  ˆ  s<    


þþzEditorWindow.fill_menusc                 C   s&   |   |¡}|r| ¡ }|S t|ƒ‚d S rÖ   )r¾  rÄ   Ú	NameError)rÐ   r@   r¿  Úvaluer!   r!   r"   Úgetvar­  s
    
zEditorWindow.getvarc                 C   s(   |   ||¡}|r| |¡ nt|ƒ‚d S rÖ   )r¾  r§   rÀ  )rÐ   r@   rÁ  Úvartyper¿  r!   r!   r"   Úsetvarµ  s    zEditorWindow.setvarc                 C   s,   | j  |¡}|s(|r(|| jƒ | j |< }|S rÖ   )rv   rÄ   rF   )rÐ   r@   rÃ  r¿  r!   r!   r"   r¾  ¼  s    zEditorWindow.get_var_objc                 C   s,   | j r$| j d|¡p"d| j |¡v S dS d S )NZTODOÚSTRINGrT   )rº   rF   Útag_prevrangeZ	tag_names)rÐ   Z
text_indexr!   r!   r"   Úis_char_in_stringÌ  s
    ÿzEditorWindow.is_char_in_stringc                 C   s<   z"| j  d¡}| j  d¡}||fW S  ty6   Y dS 0 d S )Nrê   rì   )NNr3  )rÐ   rú   rû   r!   r!   r"   Úget_selection_indicesØ  s    
z"EditorWindow.get_selection_indicesc                 C   s   | j d pt}t|ƒS )NÚtabs)rF   ÚTK_TABWIDTH_DEFAULTrC   )rÐ   Zcurrentr!   r!   r"   Úget_tk_tabwidthã  s    zEditorWindow.get_tk_tabwidthc              	   C   sB   | j }|  ¡ |kr>|j dd|d d|jd| ¡}|j|d d S )Nr[   rÜ   z
-displayofÚn)rÉ  )rF   rË  rÛ   r4  ZmasterZ	configure)rÐ   ZnewtabwidthrF   Zpixelsr!   r!   r"   Úset_tk_tabwidthé  s    þzEditorWindow.set_tk_tabwidthc                 C   sP   |r@|r@|   ¡ }d|  kr$dkr.n n|| _| j| jkr@d| _|  | j¡ d S )Nr<   r   F)Úguess_indentr¬   r«   rª   rÍ  )rÐ   rÔ   ZguessrŽ  r!   r!   r"   r¹   ô  s    z#EditorWindow.set_indentation_paramsc           
      C   sP  | j }|  ¡ \}}|r6|r6| ||¡ | d|¡ dS | dd¡}|dkrp| ddd¡rd| d¡ n| ¡  dS |d d	vrŠ| d¡ dS | j}t| 	|¡ƒ}|d
ksªJ ‚|d | j
 | j
 }d
}	|| jkrÐq|d d… }|	d }	t| 	|¡ƒ}||ks|d d	vrÂqqÂ| ¡  | d|	 d¡ ||k rD| dd||  ¡ | ¡  dS )Nræ   rM   râ   r>   rí   ré   z	insert-1crb   ú 	r   rT   z
insert-%dcrä   )rF   rÈ  r  rõ   rÄ   rï   Zbellr«   rò   Ú
expandtabsr¬   ry   r´   ræ   rµ   )
rÐ   rO   rF   rú   rû   Úcharsr«   ZhaveZwantZncharsdeletedr!   r!   r"   r–   ý  sB    


z"EditorWindow.smart_backspace_eventc           
      C   s   | j }|  ¡ \}}| ¡  zÖ|rb|rbt|ƒt|ƒkrJ| j |¡W | ¡  S | ||¡ | d|¡ | 	dd¡}t
|| jƒ\}}|t|ƒkrœ|  || j ¡ n>| jr¨d}n&t| | j¡ƒ}| j}	d|	||	   }| d|¡ | d¡ W | ¡  dS | ¡  0 d S )Nræ   râ   rå   rä   rM   )rF   rÈ  r´   Ú
index2liner™   rš   rµ   r  rõ   rÄ   Úget_line_indentr«   rò   Úreindent_tor¬   rª   rÐ  ræ   r÷   )
rÐ   rO   rF   rú   rû   ÚprefixÚrawZ	effectiveZpadrÌ  r!   r!   r"   r˜   )  s4    ì
þzEditorWindow.smart_indent_eventc              	   C   s.  | j }|  ¡ \}}| ¡  zø|r>|r>| ||¡ | d|¡ | dd¡}dt|ƒ }}||k rv|| dv rv|d7 }qX||kr¢| dd¡ W | d¡ | 	¡  dS |d|… }d}|râ|d	 dv râ|| j
krâ|dd	… }|d7 }q²|rö| d
| d¡ | d¡dv r| d¡ qö| dd¡ t| d¡ƒ}	t | j| j¡}
| j
s¾| jD ]`}t|	| dƒ}t|ƒd }| |d¡}|
 |¡ |
 |  |¡¡}|dus¢|dkrJ q¬qJ|
 |p¸d¡ n@| dd¡}|rÚ|d }nd}| |d¡}|
 |¡ |
 d¡ |
 ¡ }|tjkrº|tjkr n‚|tjkr:| d|¡ nh|tjkrV|  |
 ¡ ¡ nL|tj krŽ|
 !¡ dkr~| d|¡ n|  |
 "¡ ¡ nds¢J d|f ƒ‚W | d¡ | 	¡  dS |
 #¡ }| d|¡ |
 $¡ rä|  %|¡ n|rþ|
 &¡ rþ|  '|¡ W | d¡ | 	¡  dS | d¡ | 	¡  0 dS )a…  Insert a newline and indentation after Enter keypress event.

        Properly position the cursor on the new line based on information
        from the current line.  This takes into account if the current line
        is a shell prompt, is empty, has selected text, contains a block
        opener, contains a block closer, is a continuation line, or
        is inside a string.
        ræ   râ   r   rÏ  rT   ra  rM   Nrb   zinsert - %d charsrE  Zconsoleré   zbogus continuation type %r)(rF   rÈ  r´   r  rõ   rÄ   rò   ræ   r÷   rµ   ry   rÒ  rÅ   r   ZParserr¬   r«   r°   r›  r¯  Zset_codeZfind_good_parse_startÚ_build_char_in_string_funcZset_lorÆ  Zget_continuation_typeZC_NONEZC_STRING_FIRST_LINEZC_STRING_NEXT_LINESZ	C_BRACKETrÔ  Zcompute_bracket_indentZC_BACKSLASHZget_num_lines_in_stmtZcompute_backslash_indentZget_base_indent_stringZis_block_openerr˜   Zis_block_closerr–   )rÐ   rO   rF   rú   rû   rø   rŽ  rÌ  ÚindentÚlnor"  ÚcontextZstartatZstartatindexZrawtextZbodry  rç   r!   r!   r"   r—   L  sž    	
T
«


ÿ




ò


ý  ÿ
z%EditorWindow.newline_and_indent_eventc                 C   s   || j fdd„}|S )Nc                 S   s   ||d|   ƒS )Nz+%dcr!   )ÚoffsetZ_startindexZ_icisr!   r!   r"   ÚinnerÃ  s    z6EditorWindow._build_char_in_string_func.<locals>.inner)rÇ  )rÐ   Z
startindexrÜ  r!   r!   r"   r×  Â  s    ÿ
z'EditorWindow._build_char_in_string_funcc                 C   s2   | j r&t|| jƒ\}}d| d|  S d| S d S )Nrå   rä   )rª   Údivmodr«   )rÐ   rÌ  ZntabsZnspacesr!   r!   r"   Ú_make_blanksÒ  s    zEditorWindow._make_blanksc                 C   sJ   | j }| ¡  | ddd¡r(| dd¡ |r>| d|  |¡¡ | ¡  d S )Nrâ   z!=ræ   )rF   r´   rï   r  ræ   rÞ  rµ   )rÐ   rZ   rF   r!   r!   r"   rÔ  Ü  s    zEditorWindow.reindent_toc                 C   sP   t | j| jƒ ¡ \}}|r@|r@t|| jƒ\}}t|| jƒ\}}nd }}|| S ©Nr   )ÚIndentSearcherrF   r«   r  rÓ  )rÐ   ZopenerZindentedrÖ  ZindentsmallZindentlarger!   r!   r"   rÎ  ê  s    zEditorWindow.guess_indentc                 C   sN   | j d u rd S | j jr&| j  ¡  d}n| j  ¡  d}| jdd|› dd d S )NZShowZHiderc   re   z Line Numbers)r=   rÅ   r  )r¼   Zis_shownZhide_sidebarZshow_sidebarr  )rÐ   rO   Z
menu_labelr!   r!   r"   rÏ   ó  s    


ÿz&EditorWindow.toggle_line_numbers_event)NNNN)N)N)N)N)N)N)N)N)N)N)N)N)ræ   )ræ   )N)NN)N)N)T)N)”rM  Ú
__module__Ú__qualname__Zidlelib.percolatorr%   Zidlelib.colorizerr&   r'   Zidlelib.undor(   Zidlelib.iomenur)   r*   rN  r+   Zidlelib.statusbarr,   Zidlelib.autocompleter-   Zidlelib.autoexpandr.   Zidlelib.calltipr/   Zidlelib.codecontextr0   Zidlelib.sidebarr1   Zidlelib.formatr2   r3   r4   r5   Zidlelib.parenmatchr6   Zidlelib.squeezerr7   Zidlelib.zoomheightr8   r   ÚgetfilesystemencodingZfilesystemencodingrf   rÌ   rÎ   rÕ   r„   r©   r    rž   r¤   rÿ   r
  r~   rÈ   r  rÍ   r¦   r$  rƒ   r&  r%  r1  r/  r5  r‹   rŒ   r‰   rŠ   r…   r†   r‡   rŽ   r   r›   rœ   r   r   r‘   r“   r’   r”   r•   rJ  r   r¡   r¢   r£   rV  r¿   r[  r\  r¸   r^  r_  rÀ   ÚstringZascii_lettersZdigitsrb  re  r¯   rf  rp  rt  r­   r  ru  rÁ   rŠ  r¶   r–  r—  r™  r“  r”  rˆ   rU  rš  r  r£  r‚   r¥  r€   r¦  rÂ   r¨  rª  rj  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$   2   sø   
  
+

%þ









		
$
.


		ÿ
	
%


	,#v
	r$   c                 C   s   t t| ƒƒS rÖ   )rC   r  )rÅ   r!   r!   r"   rÒ    s    rÒ  z[ \t]*c                 C   s$   t  | ¡}| ¡ t| ¡  |¡ƒfS )zÌReturn a line's indentation as (# chars, effective # of spaces).

    The effective # of spaces is the length after properly "expanding"
    the tabs into spaces, as done by str.expandtabs(tabwidth).
    )Ú_line_indent_rerŸ  ra   rò   ÚgrouprÐ  )rø   r«   r¢  r!   r!   r"   rÓ    s    
rÓ  c                   @   s8   e Zd Zdd„ Zdd„ Zejejdfdd„Zdd	„ Z	d
S )rà  c                 C   s(   || _ || _d | _| _d  | _| _d S rß  )rF   r«   rŽ  ÚfinishedÚblkopenlineÚindentedline)rÐ   rF   r«   r!   r!   r"   rÕ     s    zIndentSearcher.__init__c                 C   sL   | j r
dS | jd  }| _t|ƒd }| j |dd¡r:dS | j ||d ¡S )Nr>   rT   rE  z>=ra   z lineend+1c)rç  rŽ  r¯  rF   rï   rÄ   )rÐ   rŽ  rœ  r!   r!   r"   Úreadline  s    zIndentSearcher.readline)ÚclassÚdefÚforÚifÚtryÚwhilec	           	      C   s>   | j rn2||kr ||v r || _n||kr:| jr:|| _d| _ d S )NrT   )rç  rè  ré  )	rÐ   rE   ÚtokenÚstartra   rø   ÚINDENTÚNAMEZOPENERSr!   r!   r"   Ú
tokeneater&  s    zIndentSearcher.tokeneaterc              	   C   sl   t j}| jt _zHz$t  | j¡}|D ]}| j|Ž  q"W n t jtfyL   Y n0 W |t _n|t _0 | j| j	fS rÖ   )
ÚtokenizeÚtabsizer«   Úgenerate_tokensrê  rõ  Ú
TokenErrorÚSyntaxErrorrè  ré  )rÐ   Zsave_tabsizeÚtokensrñ  r!   r!   r"   r  2  s    zIndentSearcher.runN)
rM  rá  râ  rÕ   rê  rö  ró  rô  rõ  r  r!   r!   r!   r"   rà    s   
ý
rà  c                 C   s6   |   d¡}|dkr.| d |… | |d d …  } || fS )Nr`  r   rT   )rD  )ÚsrŽ  r!   r!   r"   r  D  s    
r  ú[ú]ú/)ZbracketleftZbracketrightZslashc                 C   s´   |   |¡}|rt ¡ r"|dv r"dS |d }t ddd„ |¡}t ddd„ |¡}t d	d|¡}t d
d|¡}t dd|¡}t dd|¡}t dd|¡}t dd|¡}t dd|¡}|S )N>   rS   rR   rK   r>   r   z-[a-z]\bc                 S   s   |   ¡  ¡ S rÖ   )ræ  Úupper©r¢  r!   r!   r"   rP   ]  rQ   z!get_accelerator.<locals>.<lambda>z\b\w+\bc                 S   s   t  |  ¡ |  ¡ ¡S rÖ   )ÚkeynamesrÄ   ræ  r  r!   r!   r"   rP   ^  rQ   zKey-ZCancelz
Ctrl-BreakzControl-zCtrl-r³  ú+z><rä   rë   rí   )rÄ   r   Z	isCocoaTkrž  Úsub)rl  r)  rm  rü  r!   r!   r"   rs  S  s    
rs  c                 C   s4   | j }| ddd¡ | ddd¡ | ddd¡ d S )	NZtcl_wordBreakAfterza br   r§   Ztcl_wordcharsz\wZtcl_nonwordcharsz\W)rÛ   r4  )rq   rÛ   r!   r!   r"   Úfixwordbreaksi  s    r  c                 C   s~   | }t |ƒ tjdd … r&tjd }nd }t |d ¡ t||d}|j}d|d< tdƒD ] }| dd| t	|ƒ d ¡ qXd S )	NrT   )rq   rÑ   é
   rH   é   ræ   z  ra  )
r  r   Úargvr   ZsetupAppr$   rF   rñ   ræ   ró   )r6  rq   rÑ   r  rF   rŽ  r!   r!   r"   Ú_editor_windowr  s    r	  Ú__main__)rA   zidlelib.idle_test.test_editorr<   F)Ú	verbosityÚexit)r  ):Úimportlib.abcrµ  Úimportlib.utilrg   rk   rž  rä  r   rö  r°  r=  ZtkinterZtkinter.fontr   Ztkinter.ttkr   r   r   Zidlelib.configr   rN  r   r	   r
   r   r   Zidlelib.multicallr   r   r   r   r   Zidlelib.treer   Zidlelib.utilr   r   rÊ  Zpython_versionr•  r   r#   r$   rÒ  Úcompilerå  rÓ  rà  r  r  rs  r  r	  rM  ZunittestrA   Zidlelib.idle_test.htestr  r!   r!   r!   r"   Ú<module>   sz   
           Z

4
ý	
