o
    ^ùhQ ã                   @   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 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   sd   t j\} }}}}d| |f }|d|f 7 }|dkr"|d|f 7 }|S |dkr0|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.10/idlelib/editor.pyÚ_sphinx_version&   s   þr#   c                   @   s4  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# e$ %¡ Z&dZ'dZ(dZ)dZ*dØdd„Z+dÙdd„Z,dd„ Z-dd„ Z.dd„ Z/dd„ Z0dÙdd„Z1g d ¢Z2d!d"„ Z3d#d$„ Z4d%d&„ Z5d'd(„ Z6d)d*„ Z7dZ8d+d,„ Z9d-gZ:d.d/„ Z;d0d1„ Z<d2d3„ Z=d4d5„ Z>dÙd6d7„Z?dÙd8d9„Z@dÙd:d;„ZAdÙd<d=„ZBd>d?„ ZCd@dA„ ZDdBdC„ ZEdÙdDdE„ZFdÙdFdG„ZGdHdI„ ZHdJdK„ ZIdLdM„ ZJdNdO„ ZKdPdQ„ ZLdRdS„ ZMdTdU„ ZNdVdW„ ZOdXdY„ ZPdZd[„ ZQd\d]„ ZRdÙd^d_„ZSdÙd`da„ZTdÙdbdc„ZUddde„ ZVdfdg„ ZWdhdi„ ZXdjdk„ ZYdldm„ ZZdndo„ Z[dpdq„ Z\drds„ Z]e^j_e^j` dt Zadudv„ Zbdwdx„ Zcdydz„ Zdd{d|„ Zed}d~„ Zfdd€„ Zgdd‚„ Zhdƒd„„ ZidÙd…d†„Zjd‡dˆ„ Zkd‰dŠ„ Zld‹dŒ„ ZmddŽ„ Zndd„ Zod‘d’„ Zpd“d”„ Zqd•d–„ ZrdÚd˜d™„Zsdšd›„ ZtdÚdœd„ZudždŸ„ Zvd d¡„ Zwd¢d£„ Zxd¤d¥„ Zyd¦d§„ Zzd¨d©„ Z{dªd«„ Z|d¬d­„ Z}d®d¯„ Z~d°d±iZd²d³„ Z€dÙd´dµ„ZdÛ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Ë„ ZŒdÌdÍ„ ZdÎdÏ„ ZŽdÐdÑ„ ZdÒdÓ„ ZdÔ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)Ú
ZoomHeightNTc                 C   s”	  ddl m} tjd u r±tj tjdd¡}tj	 
d¡r:ddtjd d…   }tj d	¡r.d
}n^d}tj ||dd¡}nRtj	d d… dkrdd l}	d}
dtj› d}z	|	 |	j|¡}
W n tyu   z	|	 |	j|¡}
W n	 tyr   Y nw Y nw 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 | _}|rØ|j| _|j| j_ni | _i | j_t j!oét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$| j0¡ | j 1d%| j2¡ t3 4¡ r]| 1d%| j2¡ | 1d&| j5¡ | 1d'| j5¡ n| 1d(| j5¡ | 1d)t6¡ | 1d*t6¡ | 1d+t6¡ | 1d,| j7¡ | 1d-| j8¡ | 1d.| j9¡ | 1d/| j:¡ | 1d0| j;¡ | 1d1| j<¡ | 1d2| j=¡ | 1d3| j>¡ | 1d4| j?¡ | 1d5| j@¡ | 1d6d7d8„ ¡ | 1d9| jA¡ | 1d:| jB¡ | 1d;| jC¡ | 1d<| jD¡ | 1d=| jE¡ | 1d>| jF¡ | 1d?| jG¡ | 1d@| jH¡ | 1dA| jI¡ | 1dB| jJ¡ | 1dC| jK¡ |  L| ¡ | _M}| 1dD|jN¡ | 1dE|jO¡ | 1dF|jP¡ | 1dG|jQ¡ | 1dH|jR¡ | 1dI|jS¡ |  T| ¡}| 1dJ|jU¡ | 1dK|jV¡ | 1dL|  Wd¡¡ | 1dM|  WdN¡¡ | 1dO| jX¡ | 1dP| jY¡ | 1dQ| jZ¡ |r±||j| < |r| |j[|< | 1dR| j\¡ | 1dS| jj]¡ | 1dT| j^¡ | 1dU| j_¡ | 1dV| j`¡ |  a¡  |jbtctddNdW |jedNdNdX |jfdNdNdX | jg|dY< |jhdNdtidZ |jj|d[< t  k| jdd¡|d\< |jhdNdNtidZ | l¡  |  m¡  t j(dd]d^d_d}| | _nd`| _o| jo| _p|  q¡  trt daƒs| j+db t _s|  t¡  dc| _u|  v|¡ | _w}|  x¡  | _y}| z|¡ |j{|_{|j||_|| }| j~¡ |  | ¡ | _€}| | j‚¡ dd| _ƒ|  „dd¡ d | _…d | _†d | _‡|rtj ˆ|¡rˆtj |¡sˆ| ‰|¡r‡de| _ƒ|  Š|¡}|  „|¡ n| ‹|¡ de| _ƒ|  Œ¡  |  ~¡  |  ¡  |  Ž¡  | j df¡}|rË| ‘dg¡}|d u rµdh}|dkrÂ| ’¡  |dN }|| _“t ”| j•¡ t–j—| _—t˜j™| _™t˜jš| _š| ›didj¡ | ›dkdldmdn¡ | ›dodp¡ | ›dqdr¡ | ›dsdrdtdu¡ |  œ| | j¡}| 1di|jž¡ | 1dk|jŸ¡ | 1dv|j ¡ | 1dw|  ¡| ¡j¢¡ | 1dx|  £| ¡j¤¡ |  ¥| ¡}| 1dy|j¦¡ | 1ds|j§¡ || ƒ}| 1dz|j¨¡ | 1d{|j©¡ | 1d||jª¡ | 1d}|  «| ¡j¬¡ |  ­| ¡ | _®}| 1do|j¯¡ | 1dq|j°¡ | 1d~|j±¡ | 1d|  ²| ¡j³¡ | j´r™|  µ| ¡| _†| 1d€| j†j¶¡ n|  ·dd‚dƒ¡ | j¸rÁ|  ¹| ¡| _‡t j(ddd„d_dr¸|  º¡  | 1d…| jº¡ d S |  ·dd†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/ÚwinÚ zSoftware\Python\PythonCore\z\Help\Main Python Documentationr   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?   ÚpadxÚwrapZhighlightthicknessrA   ZtabstylerG   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>´   s    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.runscriptr8   r$   Úhelp_urlÚosÚpathÚjoinr   Úbase_prefixÚplatformÚcountr   ÚisdirÚwinregÚwinverÚ
QueryValueÚHKEY_CURRENT_USERÚFileNotFoundErrorÚHKEY_LOCAL_MACHINEÚ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   ZTextrE   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(   ÚundoZ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-   Úuser_input_insert_tagsZ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_eventr7   Zzoom_height_eventÚallow_code_contextr0   Ztoggle_code_context_eventÚupdate_menu_stateÚallow_line_numbersr1   Útoggle_line_numbers_event)Úselfru   ÚfilenameÚkeyrv   r8   ZdochomeZpyverZbasepathrm   ZdocfileZKEYry   r€   r>   rA   Ztext_optionsrE   r   ÚindentsZ	usespacesrµ   r¶   rº   Ú	is_py_srcr=   r`   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ˆ   k  ó   zEditorWindow.handle_winconfigc                 C   s^   | j }tt|jj| d¡| d¡gƒƒ}| ¡ d|  }t|| d¡d d¡}|| | _	d S )NZborderrH   r<   rZ   )rZ   Ú0)
rE   ÚsumÚmapÚtkZgetintZcgetZwinfo_widthr   ÚmeasurerA   )rÔ   rE   Zinner_paddingZpixel_widthZzero_char_widthr!   r!   r"   r­   n  s   ÿÿzEditorWindow.set_widthc                 C   s   | j  ¡ \}}| j |¡ dS rL   )rº   Zdefaultfilenameru   Únew)rÔ   rO   ÚdirnameÚbasenamer!   r!   r"   r¤   {  s   zEditorWindow.new_callbackc                 C   s¼  |j d@ dkr|jdkrd S | j d¡r2| j ddd¡r2| j ddd¡r2t| j d¡ d¡d	 ƒ}n| j dd¡}tt	|ƒƒD ]
}|| d
vrI nq?t	|ƒ}t| j d¡ d¡d	 ƒ}||krad}dt
|ƒ d }|j d	@ dkry| j ddd¡ nV| j d¡s‡| j dd¡ n| j | j d¡d| j d¡¡rŸ| 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Ú.rS   )ú ú	Úinsertzinsert linestart+ÚcÚselú1.0r`   ú	sel.firstZ	my_anchorú<úsel.lastú>rM   )ÚstateZkeysymrE   rÈ   ÚcomparerB   ÚsplitrÇ   ÚrangeÚlenÚstrÚ
tag_removeÚmark_setÚtag_addÚsee)rÔ   rO   ZinsertptÚlineZlineatÚdestÚfirstÚlastr!   r!   r"   r¢   €  sH   ÿþÿ
ÿ
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 )NrS   Zgrey75)rG   ZborderwidthZ
backgroundr   Z	_padding1z    )rT   rY   zCol: ?rý   zLn: ?)rT   rU   z<<set-line-and-column>>z<KeyRelease>z<ButtonRelease>)r,   ry   Ú
status_barr   r   rj   Ú	set_labelZRIGHTr©   ZBOTTOMÚXrE   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è   rY   zCol: %srý   zLn: %s)rE   rÈ   ZINSERTrõ   r  r  )rÔ   rO   rý   rY   r!   r!   r"   r  »  s   z EditorWindow.set_line_and_column))ÚfileZ_File)ÚeditZ_Edit)ÚformatZF_ormat)ÚrunZ_Run)rb   Z_Options)r   Z_Window)r
   Z_Helpc                 C   sâ   | j }i  | _}| jD ]'\}}t|ƒ\}}t| |› dd ƒ}t||d|d ||< }|j|||d qt ¡ rIt|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  r9   zRecent Files)r  r  r=   r
   )rx   rÆ   Ú
menu_specsÚprepstrÚgetattrrw   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   r`   ra   rS   )rÆ   rÈ   rÊ   Údeleter   Zadd_windows_to_menu)rÔ   r=   r`   r!   r!   r"   rË   á  s   


zEditorWindow.postwindowsmenuc                 C   ó   | 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ë  ó   
zEditorWindow.update_menu_labelc                 C   r  )z$Update state for menu item at index.©ró   Nr  )rÔ   r=   rÈ   ró   r  r!   r!   r"   rÑ   ð  r  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   r`   ú@0,0ZscrollZunitsrM   )ÚfloatÚroundÚ	getlinenorE   Úyview)rÔ   rO   ÚargsZfractionÚlinesr!   r!   r"   rª   õ  s   ÿzEditorWindow.handle_yviewc              	   C   s*  | j }| d|j› d|j› ¡}z| dd|¡o| |dd¡}W n ty+   d}Y nw |s;| ddd	¡ | d
|¡ | jsB|  	¡  | j}|| _
tjd d… dk}|rY|jdd | jD ]%}z|\}}	}
W n	 tyn   Y q\w |
d u rtq\t| |
ƒƒ }|j||d q\| |j|j¡ |r“| j jdd dS )Nú@ú,rï   ræ   rñ   Frí   rî   r`   rë   r9   r:   Zarrow)Zcursorr  ZibeamrM   )rE   rÈ   ÚxÚyrô   ÚTclErrorrù   rú   ÚrmenuÚ
make_rmenurO   r   rj   ZconfigÚrmenu_specsÚ
ValueErrorr  ZentryconfigureZtk_popupZx_rootZy_root)rÔ   rO   rE   ZnewdexZin_selectionr+  ZiswinÚitemr  Ú	eventnameZverify_stateró   r!   r!   r"   r‡     sB   ÿÿ
ÿzEditorWindow.right_menu_event)ZCloserJ   Nc                 C   sf   t | jdd}| jD ]#}|d |d }}|d ur)| j|fdd„}|j||d q
| ¡  q
|| _d S )Nr   r  rS   c                 S   ó   |   |¡ d S rÚ   ©Úevent_generate©rE   r0  r!   r!   r"   rW   /  ó   z(EditorWindow.make_rmenu.<locals>.command©r  rW   )rw   rE   r-  Úadd_commandrÉ   r+  )rÔ   r+  r/  r  r0  rW   r!   r!   r"   r,  *  s   


zEditorWindow.make_rmenuc                 C   s   |   ¡ S rÚ   )Úrmenu_check_copy©rÔ   r!   r!   r"   Úrmenu_check_cut6  s   zEditorWindow.rmenu_check_cutc                 C   s2   z| j  d¡}W n
 ty   Y dS w |rdS dS )Nrï   rc   Únormal©rE   rÈ   r*  )rÔ   Zindxr!   r!   r"   r8  9  s   ÿzEditorWindow.rmenu_check_copyc                 C   s0   z| j j d| j d¡ W dS  ty   Y dS w )Nztk::GetSelectionZ	CLIPBOARDrc   r;  )rE   rà   Úcallr*  r9  r!   r!   r"   Úrmenu_check_pasteA  s   ýÿzEditorWindow.rmenu_check_pastec                 C   ó   t  | j¡ dS )zHandle Help 'About IDLE' event.rM   )r   ZAboutDialogry   rÛ   r!   r!   r"   r   I  s   zEditorWindow.about_dialogc                 C   s   t  | jd¡ dS )z&Handle Options 'Configure IDLE' event.ZSettingsrM   )r   ZConfigDialogry   rÛ   r!   r!   r"   r   O  s   zEditorWindow.config_dialogc                 C   s"   | j r| j }n| j}t |¡ dS )zHandle Help 'IDLE Help' event.rM   )rv   ry   r
   Zshow_idlehelp)rÔ   rO   Úparentr!   r!   r"   r   U  s
   
zEditorWindow.help_dialogc              
   C   sr   t jd d… dkr1z	t | j¡ W dS  ty0 } ztjdt|ƒ| j	d W Y d }~dS d }~ww t
 | j¡ dS )Nr9   r:   úDocument Start Failure©ÚtitleÚmessager@  rM   )r   rj   rf   Ú	startfilere   ÚOSErrorr   rÌ   rø   rE   Ú
webbrowserÚopen)rÔ   rO   Úwhyr!   r!   r"   rŽ   _  s   û
ÿ€ûzEditorWindow.python_docsc                 C   ó   | j  d¡ dS )Nz<<Cut>>rM   ©rE   r3  rÛ   r!   r!   r"   r‰   j  ó   zEditorWindow.cutc                 C   s    | j  d¡sd S | j  d¡ dS )Nrí   z<<Copy>>rM   )rE   Z
tag_rangesr3  rÛ   r!   r!   r"   rŠ   n  s   zEditorWindow.copyc                 C   s   | j  d¡ | j  d¡ dS )Nz	<<Paste>>rë   rM   )rE   r3  rü   rÛ   r!   r!   r"   r‹   u  ó   zEditorWindow.pastec                 C   s.   | j  ddd¡ | j  dd¡ | j  d¡ dS )Nrí   rî   zend-1crë   rM   )rE   rû   rú   rü   rÛ   r!   r!   r"   r’   z  s   zEditorWindow.select_allc                 C   s    | j  ddd¡ | j  d¡ dS )Nrí   rî   r`   rë   rM   )rE   rù   rü   rÛ   r!   r!   r"   r“   €  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                    sD   | j d@ dkr zˆdƒ ˆdˆˆ  ƒ W d S  ty   Y d S w d S )NrF   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)rE   rÈ   rú   )rÔ   rO  rP  r!   rN  r"   rŸ   …  s
   z&EditorWindow.move_at_edge_if_selectionc                 C   rJ  )Nz<Meta-Delete>rM   rK  rÛ   r!   r!   r"   r    ™  rL  zEditorWindow.del_word_leftc                 C   rJ  )Nz<Meta-d>rM   rK  rÛ   r!   r!   r"   r¡     rL  zEditorWindow.del_word_rightc                 C   r?  rL   )r   ÚfindrE   rÛ   r!   r!   r"   r”   ¡  rL  zEditorWindow.find_eventc                 C   r?  rL   )r   Z
find_againrE   rÛ   r!   r!   r"   r•   ¥  rL  zEditorWindow.find_again_eventc                 C   r?  rL   )r   Zfind_selectionrE   rÛ   r!   r!   r"   r—   ©  rL  z!EditorWindow.find_selection_eventc                 C   s   t   | j| j| j¡ dS rL   )r	   rE   rº   ru   rÛ   r!   r!   r"   r–   ­  s   z EditorWindow.find_in_files_eventc                 C   s   t   | j¡ dS rL   )r   rE   rÛ   r!   r!   r"   r˜   ±  rL  zEditorWindow.replace_eventc                 C   sT   | j }t |dd¡j}|d ur(| ddd¡ | d|› d¡ | d¡ |  ¡  dS )	Nz
Go To Linez/Enter a positive integer
('big' = end of file):rí   rî   r`   rë   ú.0rM   )rE   r   ZGotoÚresultrù   rú   rü   r  )rÔ   rO   rE   Úlinenor!   r!   r"   r™   µ  s   þü
zEditorWindow.goto_line_eventc                 C   sp   z| j  dd¡ ¡ }W n ty   d}Y nw t | j dd|¡j}|dur6| jr0| j |¡ |S | 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)rE   rÇ   Ústripr*  r   Z
ModuleNamerS  ru   rH  rº   rÁ   )rÔ   r?   Ú	file_pathr!   r!   r"   Úopen_moduleÃ  s$   ÿüüÿzEditorWindow.open_modulec                 C   ó   |   ¡  dS rL   )rW  rÛ   r!   r!   r"   r‘   Û  ó   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__rW  ÚidlelibrZ  ZModuleBrowserrv   )rÔ   rO   rÕ   rZ  r!   r!   r"   r¥   ß  s   ÿz EditorWindow.open_module_browserc                 C   s   ddl m} | | j¡ dS )Nr   )ÚpathbrowserrM   )r]  r^  ZPathBrowserrv   )rÔ   rO   r^  r!   r!   r"   r¦   ê  rM  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   r`  Úcmdr!   r!   r"   r§   ï  s   þzEditorWindow.open_turtle_democ                 C   sV   |d ur'|dkr)| j  dd| ¡ | j  ddd¡ | j  ddd¡ |  ¡  d S d S d S )Nr   rë   z%d.0rí   rî   r`   z
insert +1l)rE   rú   rù   rû   Úcenter)rÔ   rT  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)
rf   rg   rl   Úsplitexträ   Únormcaser   rE   rÇ   Ú
startswith)rÔ   rÕ   ÚbaseÚextrý   r!   r!   r"   rÂ   ÿ  s   zEditorWindow.ispythonsourcec                 C   s    | j r| j  | ¡ d | _ d S d S rÚ   )ru   Zunregister_maybe_terminater9  r!   r!   r"   Ú
close_hook  s   
þzEditorWindow.close_hookc                 C   s
   || _ d S rÚ   )rk  )rÔ   rk  r!   r!   r"   Úset_close_hook  ó   
zEditorWindow.set_close_hookc                 C   s2   | j r	| j  | ¡ |  ¡  | j | ¡ |  ¡  d S rÚ   )ru   Zfilename_changed_editr¹   ry   Zupdate_windowlist_registryrÃ   r9  r!   r!   r"   r»     s
   z!EditorWindow.filename_change_hookc                 C   sD   | j rd S |  | jj¡r|  ¡ | _ | j r | jj| j | jd d S d S )N)ÚfilterZafter)r½   rÂ   rº   rÕ   r&   rµ   Zinsertfilterafterr¶   r9  r!   r!   r"   Ú_addcolorizer  s   
ÿzEditorWindow._addcolorizerc                 C   s,   | j sd S | j  ¡  | j | j ¡ d | _ d S rÚ   )r½   Zremovecolorsrµ   Zremovefilterr9  r!   r!   r"   Ú_rmcolorizer   s
   

zEditorWindow._rmcolorizerc                 C   sL   |   ¡  |  ¡  t | j¡ | jdur| j ¡  | jdur$| j ¡  dS dS )zUpdate the color themeN)	rp  ro  r$   r'   rE   r¾   Zupdate_highlight_colorsr¿   Zupdate_colorsr9  r!   r!   r"   rÃ   '  s   


ÿzEditorWindow.ResetColorizerÚ_c                 C   sp   |  d|¡ | |¡}|r|| jv r|  d|d |¡ d| |¡kr)| d|¡ n| d|d ¡ | |¡ d S )NZERRORz
 wordstartÚ
rë   z+1c)rû   rÇ   Ú
IDENTCHARSrú   rü   )rÔ   rE   ÚposÚcharr!   r!   r"   Úcolorize_syntax_error6  s   
z"EditorWindow.colorize_syntax_errorc                 C   s4   t jddddd}|sd| jd< dS t j| jd< dS )	z&Update the cursor blink configuration.r@   r$   zcursor-blinkr\   rC   r   r^   N)r   r   rE   r]   )rÔ   Zcursorblinkr!   r!   r"   r³   A  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 changedNr@   r$   rZ   )r¾   Zupdate_fontr¿   r   r¬   rv   rE   r­   )rÔ   Znew_fontr!   r!   r"   Ú	ResetFontK  s   




zEditorWindow.ResetFontc                 C   s|   t  ¡  | j_}| ¡ D ]\}}| jj|g|¢R Ž  q|  ¡ D ]}t  |¡}|r;| ¡ D ]\}}| jj|g|¢R Ž  q,qdS )z/Remove the keybindings before they are changed.N)	r   ÚGetCurrentKeySetr+   Údefault_keydefsÚitemsrE   Zevent_deleteÚget_standard_extension_namesÚGetExtensionBindings)rÔ   ÚkeydefsrO   ÚkeylistÚextensionNameÚxkeydefsr!   r!   r"   ÚRemoveKeybindings\  s   
€üzEditorWindow.RemoveKeybindingsc                 C   s>  t  ¡  | j_}|  ¡  |  ¡ D ]}t  |¡}|r|  |¡ qi }| jjD ]!}i ||d < |d D ]}|rE|d ||d  t|d ƒd < q1q%| j	D ]R}| j	| }| 
t¡}|du r[qJ|d7 }td|ƒD ]7}	| |	¡dkr›| |	d¡}
|
r›| |	d¡}d}||v r||| v r|| | }|r›t||ƒ}
|j|	|
d qdqJdS )	z-Update the keybindings after they are changedr   rS   NrW   Úacceleratorr  r;   )r‚  )r   rx  r+   ry  rƒ   r{  r|  Úmenudefsr  rÆ   rÈ   r  rö   rD   Z	entrycgetÚget_acceleratorr  )rÔ   r}  r  r€  ZmenuEventDictr=   r/  ZmenubarItemr`   rÈ   ZaccelZitemNamerO   r!   r!   r"   ÚApplyKeybindingsh  sH   

€ €þ



€õùzEditorWindow.ApplyKeybindingsc                 C   s"   | j stjddddd| _dS dS )zCUpdate the indentwidth if changed and not using tabs in this windowr@   r[   z
num-spacesrB   rC   N)r®   r   r   r°   r9  r!   r!   r"   r±   Œ  s
   
ÿÿz#EditorWindow.set_notabs_indentwidthc                 C   s|   t  ¡ }| jd }| t¡}|| jkr| | jd |¡ |r7| ¡  |D ]}|  |d ¡}|j	|d |d q$|| jd< dS )z3Update the additional help entries on the Help menur
   rS   r   r6  N)
r   ZGetAllExtraHelpSourcesListrÆ   rÈ   r  r  r  rÉ   Ú"_EditorWindow__extra_help_callbackr7  )rÔ   Z	help_listZhelpmenuZhelpmenu_lengthÚentryrc  r!   r!   r"   r  “  s   


z$EditorWindow.reset_help_menu_entriesc                    ó   |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r;zt | ¡ W d S  ty: } ztj	dt
|ƒˆ jd W Y d }~d S d }~ww t | ¡ d S )N)ZwwwZhttpr9   r:   rA  rB  )rh  rf   rg   rt   r   rj   rE  rF  r   rÌ   rø   rE   rG  rH  )ÚhelpfilerI  r9  r!   r"   Údisplay_extra_help¦  s   

ÿ€ÿz>EditorWindow.__extra_help_callback.<locals>.display_extra_helpr!   )rÔ   r‰  rŠ  r!   r9  r"   Z__extra_help_callback¤  s   z"EditorWindow.__extra_help_callbackc              
      sÚ  g }| j }|r)tj |¡r)t|dddd}| ¡ }W d  ƒ n1 s$w   Y  |rBtj |¡d }||v r<| |¡ | d|¡ g ‰ |D ]}d|v sVtj |dd	… ¡s[ˆ  	|¡ qF‡ fd
d„|D ƒ}d}|dt
|ƒ… }|r»zt|dddd}| |¡ W d  ƒ n1 sŠw   Y  W n* tyº } zt| jddƒs°d| j_tjdd|› d| jd W Y d}~nd}~ww | jjD ]+}	|	j}
|
 dt¡ t|ƒD ]\}}| ¡ }|	 |¡}|
j|| d | |dd qÎq¿dS )z/Load and update the recent files list and menusÚrÚutf_8r   )r*   ÚerrorsNrr  r   ú ra   c                    s   g | ]}|ˆ vr|‘qS r!   r!   )Ú.0rg   ©Z	bad_pathsr!   r"   Ú
<listcomp>Æ  s    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.rB  ré   )r  rW   r  )r}   rf   rg   rÀ   rH  Ú	readlinesÚabspathÚremoverë   Úappendr÷   Ú
writelinesrF  r  rv   r“  r   ÚshowwarningrE   ry   r|   r  r  r  Ú	enumerateÚrstripÚ#_EditorWindow__recent_file_callbackr7  )rÔ   Únew_fileZrf_listrV  Zrf_list_filerg   ZulcharsZrf_fileÚerrÚinstancer=   ÚiÚ	file_nameÚcallbackr!   r  r"   rÄ   ³  sl   ÿ
þ

€ÿþ€ÿü€ý	
þýýz%EditorWindow.update_recent_files_listc                    rˆ  )Nc                    s   ˆ j j| d d S )N)ZeditFile)rº   rH  )Z
fn_closurer9  r!   r"   Úopen_recent_fileâ  s   z=EditorWindow.__recent_file_callback.<locals>.open_recent_filer!   )rÔ   r¡  r£  r!   r9  r"   Z__recent_file_callbacká  s   z#EditorWindow.__recent_file_callbackc                 C   s‚   |   ¡ }|  ¡ }|r|r|d | t }n|r|}n|r|}nd}|p&|p&|}|  ¡ s3d| }d| }| j |¡ | j |¡ d S )Nz - Úuntitledz*%s*z*%s)Úshort_titleÚ
long_titleÚ_py_versionÚ	get_savedry   Zwm_titleZwm_iconname)rÔ   ZshortZlongrC  Ziconr!   r!   r"   r¹   æ  s   zEditorWindow.saved_change_hookc                 C   s
   | j  ¡ S rÚ   )r¶   r¨  r9  r!   r!   r"   r¨  ø  rm  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_undor9  r!   r!   r"   r«  þ  r5  zEditorWindow.reset_undoc                 C   s   | j j}|rtj |¡S dS )Nr¤  )rº   rÕ   rf   rg   rä   )rÔ   rÕ   r!   r!   r"   r¥    s   zEditorWindow.short_titlec                 C   s   | j jpdS )Nr;   )rº   rÕ   r9  r!   r!   r"   r¦    rÜ   zEditorWindow.long_titlec                 C   rX  rL   )rd  rÛ   r!   r!   r"   rŒ     rY  z EditorWindow.center_insert_eventrë   c                 C   sH   | j }|  ¡ \}}|  |¡}|| }td||d  ƒ}| t|ƒ¡ d S )NrS   r<   )rE   Úgetwindowlinesr"  Úmaxr#  r   )rÔ   ÚmarkrE   ry   ÚbotrT  rG   Znewtopr!   r!   r"   rd    s   
zEditorWindow.centerc                 C   sN   | j }|  d¡}|  d¡}||kr#| ¡ dkr#t|d ƒ}|| d }||fS )Nr  z@0,65535rS   rG   )rE   r"  Zwinfo_heightrB   )rÔ   rE   ry   r¯  rG   r!   r!   r"   r¬    s   

zEditorWindow.getwindowlinesc                 C   s   | j }tt| |¡ƒƒS rÚ   )rE   rB   r   rÈ   )rÔ   r®  rE   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+))ry   Zwm_geometryÚreÚmatchÚlistrß   rB   Úgroups)rÔ   ZgeomÚmr!   r!   r"   Úget_geometry"  s   
zEditorWindow.get_geometryc                 C   rX  rL   )r„   rÛ   r!   r!   r"   r†   (  rY  zEditorWindow.close_eventc                 C   sH   | j r"|  ¡ s| j ¡ dkr| j ¡  | j ¡  | j ¡  | j  ¡ S d S )Nr;  )rº   r¨  ry   ró   Z	deiconifyÚlowerZliftÚ	maybesaver9  r!   r!   r"   r·  ,  s   



úzEditorWindow.maybesavec                 C   s8   z|   ¡ }t|ƒdkr|  ¡  |W S  ty   Y d S w )NZcancel)r·  rø   Ú_closeÚAttributeError)rÔ   Zreplyr!   r!   r"   r„   5  s   ÿzEditorWindow.closec                 C   s”   | j jr| j| j jd t | j¡ |  ¡  | j  ¡  d | _ d | _| j	r,| j	 ¡  d | _	d | _
d | _| j ¡  d | _| j ¡  | jrH|  ¡  d S d S )N)r  )rº   rÕ   rÄ   r   Zunregister_callbackrË   Úunload_extensionsr„   r¶   r½   rE   r{   rµ   ry   Zdestroyrk  r9  r!   r!   r"   r¸  >  s$   



þzEditorWindow._closec                 C   s   i | _ |  ¡  d S rÚ   )Ú
extensionsÚload_standard_extensionsr9  r!   r!   r"   rÅ   R  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º  V  s
   
€
zEditorWindow.unload_extensionsc                 C   s@   |   ¡ D ]}z|  |¡ W q   tdt|ƒƒ t ¡  Y qd S )NzFailed to load extension)r{  Úload_extensionÚprintÚreprÚ	tracebackÚ	print_exc)rÔ   r?   r!   r!   r"   r¼  \  s   ûz%EditorWindow.load_standard_extensionsc                 C   s   t jddS )NT)Zeditor_only)r   ZGetExtensionsr9  r!   r!   r"   r{  d  rÜ   z)EditorWindow.get_standard_extension_namesZZzDummyZzzdummyc           	   	   C   sN  | j  ||¡}zztjd| td}W n ttfy#   t |¡}Y nw W n ty2   td|ƒ ‚ w t||ƒ}t	 
|¡}t|dƒrI|  |j|¡ || ƒ}|| j|< |r£|  |¡ |D ]I}| dd¡}|d d… dkry|dd … }|d d… dksk|d	d … d
kr|d d	… }|d	d … d
ks|d }t||ƒr¢| j |t||ƒ¡ q[d S d S )Nrè   )Úpackagez
Failed to import extension: rƒ  ú-rq  rS   rð   ra   rò   Z_event)ÚextfilesrÇ   Ú	importlibÚimport_moduleÚ__package__ÚImportErrorÚ	TypeErrorrÀ  r  r   r|  r²   r  rƒ  r»  rƒ   r   rE   r…   )	rÔ   r?   ÚfnameÚmodÚclsr}  r¾  ZveventZ
methodnamer!   r!   r"   r¿  k  sD   ÿ€
þ




ÿÿ
€özEditorWindow.load_extensionc                 C   sH   |d u r| j j}| j}||_| ¡ D ]\}}|r!|j|g|¢R Ž  qd S rÚ   )r+   ry  rE   r}  rz  rÍ   )rÔ   r}  rE   rO   r~  r!   r!   r"   rƒ   ‡  s   €þzEditorWindow.apply_bindingsc              	   C   sê   |du r| j j}|du r| j j}| j}| j}|D ]Z\}}| |¡}|s$q|D ]K}|s/| ¡  q&|\}	}
|	dd… dk}|rC|	dd… }	t|	ƒ\}}	t||
ƒ}||
fdd„}|rh|  	|
t
¡}|j|	||||d q&|j|	|||d q&qdS )zAdd appropriate entries to the menus and submenus

        Menus that are absent or None in self.menudict are ignored.
        NrS   ú!c                 S   r1  rÚ   r2  r4  r!   r!   r"   rW   ©  r5  z(EditorWindow.fill_menus.<locals>.command)r  r  rW   r‚  Úvariable)r  r  rW   r‚  )r+   rƒ  ry  rÆ   rE   rÇ   rÉ   r  r„  Úget_var_objZ
BooleanVarZadd_checkbuttonr7  )rÔ   rƒ  r}  rÆ   rE   ZmnameZ	entrylistr=   r‡  r  r0  Zcheckbuttonr  r‚  rW   Úvarr!   r!   r"   r    s@   


þþîüzEditorWindow.fill_menusc                 C   s"   |   |¡}|r| ¡ }|S t|ƒ‚rÚ   )rÑ  rÇ   Ú	NameError)rÔ   r?   rÒ  Úvaluer!   r!   r"   Úgetvarµ  s
   
zEditorWindow.getvarc                 C   s&   |   ||¡}|r| |¡ d S t|ƒ‚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Ú   )r{   rÇ   rE   )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 )NZTODOÚSTRINGrS   )r½   rE   Útag_prevrangeZ	tag_names)rÔ   Z
text_indexr!   r!   r"   Úis_char_in_stringÔ  s
   ÿzEditorWindow.is_char_in_stringc                 C   s8   z| j  d¡}| j  d¡}||fW S  ty   Y dS w )Nrï   rñ   ©NNr<  )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)rE   ÚTK_TABWIDTH_DEFAULTrB   )rÔ   Zcurrentr!   r!   r"   Úget_tk_tabwidthë  s   zEditorWindow.get_tk_tabwidthc              	   C   sF   | j }|  ¡ |kr!|j dd|d d|jd| ¡}|j|d d S d S )NrZ   rá   z
-displayofÚn)rÝ  )rE   rß  rà   r=  ZmasterZ	configure)rÔ   ZnewtabwidthrE   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   sD  | j }|  ¡ \}}|r|r| ||¡ | d|¡ dS | dd¡}|dkr9| ddd¡r3| d¡ dS | ¡  dS |d d	vrF| d¡ dS | j}t| 	|¡ƒ}|d
ksVJ ‚|d | j
 | j
 }d
}		 |d d… }|	d }	t| 	|¡ƒ}||ks~|d d	vrnqc| ¡  | d|	 d¡ ||k rœ| dd||  | j¡ | ¡  dS )Nrë   rM   rç   r;   rò   rî   z	insert-1cra   ú 	r   rS   Tz
insert-%dcré   )rE   rÜ  r  rú   rÇ   rô   Zbellr¯   r÷   Ú
expandtabsr°   r·   rë   rÎ   r¸   )
rÔ   rO   rE   rÿ   r   Úcharsr¯   ZhaveZwantZncharsdeletedr!   r!   r"   rš     sH   
ÿ
ûÿz"EditorWindow.smart_backspace_eventc           
      C   s   | j }|  ¡ \}}| ¡  zm|r1|r1t|ƒt|ƒkr%| j |¡W | ¡  S | ||¡ | d|¡ | 	dd¡}t
|| jƒ\}}|t|ƒkrN|  || j ¡ n!| jrTd}nt| | j¡ƒ}| j}	d|	||	   }| d|| j¡ | d¡ W | ¡  dS | ¡  w )Nrë   rç   rê   ré   rM   )rE   rÜ  r·   Ú
index2liner   rž   r¸   r  rú   rÇ   Úget_line_indentr¯   r÷   Úreindent_tor°   r®   rä  rë   rÎ   rü   )
rÔ   rO   rE   rÿ   r   ÚprefixÚrawZ	effectiveZpadrà  r!   r!   r"   rœ   0  s.   
í
zEditorWindow.smart_indent_eventc              	   C   sJ  | j }|  ¡ \}}| ¡  zŒ|r|r| ||¡ | d|¡ | dd¡}dt|ƒ}}||k rD|| dv rD|d7 }||k rD|| dv s6||kr\| dd| j¡ W | 	d¡ | 
¡  dS |d|… }d}|r~|d	 dv r~|dd	… }|d7 }|r~|d	 dv sl|rˆ| d
| d¡ | d¡dv r›| d¡ | d¡dv s| dd| j¡ t| d¡ƒ}	t | j| j¡}
| jsí| jD ],}t|	| dƒ}t|ƒd }| |d¡}|
 |¡ |
 |  |¡¡}|dusâ|dkrä nq¸|
 |pêd¡ n| dd¡}|rú|d }nd}| |d¡}|
 |¡ |
 d¡ |
 ¡ }|tjkrk|tjkrnB|tjkr,| d|| j¡ n3|tjkr:|  |
  ¡ ¡ n%|tj!krX|
 "¡ dkrP| d|| j¡ n|  |
 #¡ ¡ nJ d|f ƒ‚W | 	d¡ | 
¡  dS |
 $¡ }| d|| j¡ |
 %¡ r‚|  &|¡ n|r|
 '¡ r|  (|¡ W | 	d¡ | 
¡  dS | 	d¡ | 
¡  w )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ã  rS   rr  rM   Nra   zinsert - %d charsrR  Zconsolerî   zbogus continuation type %r))rE   rÜ  r·   r  rú   rÇ   r÷   rë   rÎ   rü   r¸   ræ  rÈ   r   ZParserr°   r¯   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   rE   rÿ   r   rý   r   rà  ÚindentÚlnor)  ÚcontextZstartatZstartatindexZrawtextZbodr‹  rì   r!   r!   r"   r›   S  s¤   	ÿÿ
U«þ
ÿ

ÿÿ


ÿ
÷



ÿ
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   s.   | j rt|| jƒ\}}d| d|  S d| S )Nrê   ré   )r®   Údivmodr¯   )rÔ   rà  ZntabsZnspacesr!   r!   r"   Ú_make_blanksÛ  s   zEditorWindow._make_blanksc                 C   sN   | j }| ¡  | ddd¡r| dd¡ |r!| d|  |¡| j¡ | ¡  d S )Nrç   z!=rë   )rE   r·   rô   r  rë   rò  rÎ   r¸   )rÔ   rY   rE   r!   r!   r"   rè  å  s   ÿzEditorWindow.reindent_toc                 C   sV   t | j| jƒ ¡ \}}|r#|r#t|| jƒ\}}t|| jƒ\}}|| S d }}|| S ©Nr   )ÚIndentSearcherrE   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Hiderb   rd   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)NNNNrÚ   )rë   rÛ  )T)“r\  Ú
__module__Ú__qualname__Zidlelib.percolatorr%   Zidlelib.colorizerr&   r'   Zidlelib.undor(   Zidlelib.iomenur)   r*   r]  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.zoomheightr7   r   ÚgetfilesystemencodingZfilesystemencodingre   rÐ   rÒ   rÎ   rÙ   rˆ   r­   r¤   r¢   r¨   r  r  r‚   rË   r  rÑ   rª   r+  r‡   r-  r,  r:  r8  r>  r   r   r   rŽ   r‰   rŠ   r‹   r’   r“   rŸ   r    r¡   r”   r•   r—   r–   r˜   r™   rW  r‘   r¥   r¦   r§   re  rÂ   rk  rl  r»   ro  rp  rÃ   ÚstringZascii_lettersÚdigitsrs  rv  r³   rw  r  r…  r±   r  r†  rÄ   rœ  r¹   r¨  r©  r«  r¥  r¦  rŒ   rd  r¬  r"  rµ  r†   r·  r„   r¸  rÅ   rº  r¼  r{  rÆ  r¿  rƒ   r  rÕ  r×  rÑ  rÚ  rÜ  rß  rá  r¼   rš   rœ   r›   rë  rò  rè  râ  rÓ   r!   r!   r!   r"   r$   2   sú    
  
$+

%þ




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

		ÿ

	%


	+#x
	r$   c                 C   s   t t| ƒƒS rÚ   )rB   r   )rÈ   r!   r!   r"   ræ    rÜ   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±  r`   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ó  )rE   r¯   r   ÚfinishedÚblkopenlineÚindentedline)rÔ   rE   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;   rS   rR  z>=r`   z lineend+1c)rü  r   rÁ  rE   rô   rÇ   )rÔ   r   r®  r!   r!   r"   Úreadline'  s   zIndentSearcher.readline)ÚclassÚdefÚforÚifÚtryÚwhilec	           	      C   sJ   | j rd S ||kr||v r|| _d S ||kr!| jr#|| _d| _ d S d S d S )NrS   )rü  rý  rþ  )	rÔ   rD   ÚtokenÚstartr`   rý   ÚINDENTÚNAMEZOPENERSr!   r!   r"   Ú
tokeneater0  s   

þzIndentSearcher.tokeneaterc              	   C   sl   t j}| jt _z$zt  | j¡}|D ]}| j|Ž  qW n t jtfy&   Y nw W |t _n|t _w | j| j	fS rÚ   )
ÚtokenizeÚtabsizer¯   Úgenerate_tokensrÿ  r
  Ú
TokenErrorÚSyntaxErrorrý  rþ  )rÔ   Zsave_tabsizeÚtokensr  r!   r!   r"   r	  <  s   ÿý€zIndentSearcher.runN)
r\  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 )Nrq  r   rS   )rQ  )Úsr   r!   r!   r"   r  N  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>   rR   rQ   rK   r;   r   z-[a-z]\bc                 S   s   |   ¡  ¡ S rÚ   )rû  Úupper©r´  r!   r!   r"   rP   g  s    z!get_accelerator.<locals>.<lambda>z\b\w+\bc                 S   s   t  |  ¡ |  ¡ ¡S rÚ   )ÚkeynamesrÇ   rû  r  r!   r!   r"   rP   h  s    zKey-ZCancelz
Ctrl-BreakzControl-zCtrl-rÅ  ú+z><ré   rð   rò   )rÇ   r   Z	isCocoaTkr°  Úsub)r}  r0  r~  r  r!   r!   r"   r„  ]  s   
r„  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à   r=  )rv   rà   r!   r!   r"   Úfixwordbreakss  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 ¡ q,d S )	NrS   )rv   rÕ   é
   rG   é   rë   z  rr  )
r  r   Úargvr   ZsetupAppr$   rE   rö   rë   rø   )r@  rv   rÕ   r  rE   r   r!   r!   r"   Ú_editor_window|  s   ÿr  Ú__main__)r@   zidlelib.idle_test.test_editorr<   F)Ú	verbosityÚexit)r	  ):Zimportlib.abcrÇ  Úimportlib.utilrf   rj   r°  rø  r   r  rÂ  rG  ZtkinterZtkinter.fontr   Ztkinter.ttkr   r   r   Zidlelib.configr   r]  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  r„  r  r  r\  Zunittestr@   Zidlelib.idle_test.htestr	  r!   r!   r!   r"   Ú<module>   s~    
           d

4
ý	û