o
     JAfQ ã                   @   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!   ú%/usr/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.htmlÚ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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>´   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TextrF   Zfocused_widgetÚcreatemenubarÚapply_bindingsÚ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)Úselfrv   ÚfilenameÚkeyrw   r8   ZdochomeZpyverZbasepathrn   ZdocfileZKEYrz   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Ö   rP   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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¯   n  s   ÿÿzEditorWindow.set_widthc                 C   s   | j  ¡ \}}| j |¡ dS rM   )r¼   Zdefaultfilenamerv   Únew)rÖ   rP   Ú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Ú.rT   )ú ú	Úinsertzinsert linestart+ÚcÚselú1.0ra   ú	sel.firstZ	my_anchorú<úsel.lastú>rN   )ÚstateZkeysymrF   rÊ   ÚcomparerC   ÚsplitrÉ   ÚrangeÚlenÚstrÚ
tag_removeÚmark_setÚtag_addÚsee)rÖ   rP   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 )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,   rz   Ú
status_barr€   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Ö   rP   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 ]'\}}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  r:   zRecent Files)r  r  r>   r
   )ry   rÈ   Ú
menu_specsÚprepstrÚgetattrrx   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   ó   | 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   ra   ú@0,0ZscrollZunitsrN   )ÚfloatÚroundÚ	getlinenorF   Úyview)rÖ   rP   Ú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ð   ra   rí   r:   r;   Zarrow)Zcursorr   ZibeamrN   )rF   rÊ   ÚxÚyrö   ÚTclErrorrû   rü   ÚrmenuÚ
make_rmenurP   r   rk   ZconfigÚrmenu_specsÚ
ValueErrorr  ZentryconfigureZtk_popupZx_rootZy_root)rÖ   rP   rF   ZnewdexZin_selectionr-  ZiswinÚitemr  Ú	eventnameZverify_staterõ   r!   r!   r"   r‰     sB   ÿÿ
ÿzEditorWindow.right_menu_event)ÚCloserK   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  rT   c                 S   ó   |   |¡ d S rÜ   ©Úevent_generate©rF   r2  r!   r!   r"   rX   /  ó   z(EditorWindow.make_rmenu.<locals>.command©r  rX   )rx   rF   r/  Úadd_commandrË   r-  )rÖ   r-  r1  r  r2  rX   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ñ   rd   Únormal©rF   rÊ   r,  )rÖ   Zindxr!   r!   r"   r;  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	CLIPBOARDrd   r>  )rF   râ   Úcallr,  r<  r!   r!   r"   Úrmenu_check_pasteA  s   ýÿzEditorWindow.rmenu_check_pastec                 C   ó   t  | j¡ dS )zHandle Help 'About IDLE' event.rN   )r   ZAboutDialogrz   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SettingsrN   )r   ZConfigDialogrz   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.rN   )rw   rz   r
   Zshow_idlehelp)rÖ   rP   Ú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 )Nr:   r;   úDocument Start Failure©ÚtitleÚmessagerC  rN   )r   rk   rg   Ú	startfilerf   ÚOSErrorr   rÎ   rú   rF   Ú
webbrowserÚopen)rÖ   rP   Úwhyr!   r!   r"   r   _  s   û
ÿ€ûzEditorWindow.python_docsc                 C   ó   | j  d¡ dS )Nz<<Cut>>rN   ©rF   r6  rÝ   r!   r!   r"   r‹   j  ó   zEditorWindow.cutc                 C   s    | j  d¡sd S | j  d¡ dS )Nrï   z<<Copy>>rN   )rF   Z
tag_rangesr6  rÝ   r!   r!   r"   rŒ   n  s   zEditorWindow.copyc                 C   s   | j  d¡ | j  d¡ dS )Nz	<<Paste>>rí   rN   )rF   r6  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í   rN   )rF   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ð   ra   rí   rN   )rF   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 )NrG   r   rñ   rí   )rõ   r,  rO   ©Ú
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Ö   rR  rS  r!   rQ  r"   r¡   …  s
   z&EditorWindow.move_at_edge_if_selectionc                 C   rM  )Nz<Meta-Delete>rN   rN  rÝ   r!   r!   r"   r¢   ™  rO  zEditorWindow.del_word_leftc                 C   rM  )Nz<Meta-d>rN   rN  rÝ   r!   r!   r"   r£     rO  zEditorWindow.del_word_rightc                 C   rB  rM   )r   ÚfindrF   rÝ   r!   r!   r"   r–   ¡  rO  zEditorWindow.find_eventc                 C   rB  rM   )r   Z
find_againrF   rÝ   r!   r!   r"   r—   ¥  rO  zEditorWindow.find_again_eventc                 C   rB  rM   )r   Zfind_selectionrF   rÝ   r!   r!   r"   r™   ©  rO  z!EditorWindow.find_selection_eventc                 C   s   t   | j| j| j¡ dS rM   )r	   rF   r¼   rv   rÝ   r!   r!   r"   r˜   ­  s   z EditorWindow.find_in_files_eventc                 C   s   t   | j¡ dS rM   )r   rF   rÝ   r!   r!   r"   rš   ±  rO  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ð   ra   rí   ú.0rN   )rF   r   ZGotoÚresultrû   rü   rþ   r  )rÖ   rP   rF   Ú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)rF   rÉ   Ústripr,  r   Z
ModuleNamerV  rv   rK  r¼   rÃ   )rÖ   r@   Ú	file_pathr!   r!   r"   Úopen_moduleÃ  s$   ÿüüÿzEditorWindow.open_modulec                 C   ó   |   ¡  dS rM   )rZ  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PyShellEditorWindowrN   r   )Úbrowser)	r¼   r×   Ú	__class__Ú__name__rZ  Úidlelibr]  ZModuleBrowserrw   )rÖ   rP   r×   r]  r!   r!   r"   r§   ß  s   ÿz EditorWindow.open_module_browserc                 C   s   ddl m} | | j¡ dS )Nr   )ÚpathbrowserrN   )r`  ra  ZPathBrowserrw   )rÖ   rP   ra  r!   r!   r"   r¨   ê  rP  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)ÚshellrN   )Ú
subprocessr   Ú
executableÚPopen)rÖ   rP   rc  Ú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ð   ra   z
insert +1l)rF   rü   rû   rý   Úcenter)rÖ   rW  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×   ÚbaseÚextrÿ   r!   r!   r"   rÄ   ÿ  s   zEditorWindow.ispythonsourcec                 C   s    | j r| j  | ¡ d | _ d S d S rÜ   )rv   Zunregister_maybe_terminater<  r!   r!   r"   Ú
close_hook  s   
þzEditorWindow.close_hookc                 C   s
   || _ d S rÜ   )rn  )rÖ   rn  r!   r!   r"   Úset_close_hook  ó   
zEditorWindow.set_close_hookc                 C   s2   | j r	| j  | ¡ |  ¡  | j | ¡ |  ¡  d S rÜ   )rv   Zfilename_changed_editr»   rz   Zupdate_windowlist_registryrÅ   r<  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¸   r<  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removefilterr<  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)	rs  rr  r$   r'   rF   rÀ   Zupdate_highlight_colorsrÁ   Zupdate_colorsr<  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 )NÚERRORz
 wordstartÚ
rí   z+1c)rý   rÉ   Ú
IDENTCHARSrü   rþ   )rÖ   rF   Ú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.rA   r$   zcursor-blinkr]   rD   r   r_   N)r   r‚   rF   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 changedNrA   r$   r[   )rÀ   Zupdate_fontrÁ   r   r®   rw   rF   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ÚitemsrF   Zevent_deleteÚget_standard_extension_namesÚGetExtensionBindings)rÖ   ÚkeydefsrP   Ú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   rT   NrX   Úacceleratorr  r<   )r†  )r   r|  r+   r}  r„   r  r€  Úmenudefsr  rÈ   rÊ   r  rø   rE   Z	entrycgetÚget_acceleratorr  )rÖ   r  rƒ  r„  ZmenuEventDictr>   r1  ZmenubarItemra   rÊ   ZaccelZitemNamerP   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 windowrA   r\   z
num-spacesrC   rD   N)r°   r   r‚   r²   r<  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
   rT   r   r9  N)
r   ZGetAllExtraHelpSourcesListrÈ   rÊ   r  r  r  rË   Ú"_EditorWindow__extra_help_callbackr:  )rÖ   Z	help_listZhelpmenuZhelpmenu_lengthÚentryrf  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wwwÚhttpr:   r;   rD  rE  )rk  rg   rh   ru   r   rk   rH  rI  r   rÎ   rú   rF   rJ  rK  )ÚhelpfilerL  r<  r!   r"   Údisplay_extra_help¦  s   

ÿ€ÿz>EditorWindow.__extra_help_callback.<locals>.display_extra_helpr!   )rÖ   rŽ  r  r!   r<  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*   ÚerrorsNrv  r   ú rb   c                    s   g | ]}|ˆ vr|‘qS r!   r!   )Ú.0rh   ©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.rE  rë   )r  rX   r  )r~   rg   rh   rÂ   rK  Ú	readlinesÚabspathÚremoverí   Úappendrù   Ú
writelinesrI  r  rw   r˜  r   ÚshowwarningrF   rz   r}   r  r  r  Ú	enumerateÚrstripÚ#_EditorWindow__recent_file_callbackr:  )rÖ   Únew_fileZrf_listrY  Zrf_list_filerh   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¼   rK  )Z
fn_closurer<  r!   r"   Úopen_recent_fileâ  s   z=EditorWindow.__recent_file_callback.<locals>.open_recent_filer!   )rÖ   r¦  r¨  r!   r<  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_savedrz   Zwm_titleZwm_iconname)rÖ   ZshortÚlongrF  Ziconr!   r!   r"   r»   æ  s   zEditorWindow.saved_change_hookc                 C   s
   | j  ¡ S rÜ   )r¸   r­  r<  r!   r!   r"   r­  ø  rp  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_undor<  r!   r!   r"   r±  þ  r8  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×   r<  r!   r!   r"   r«    rÞ   zEditorWindow.long_titlec                 C   r[  rM   )rg  rÝ   r!   r!   r"   rŽ     r\  z EditorWindow.center_insert_eventrí   c                 C   sH   | j }|  ¡ \}}|  |¡}|| }td||d  ƒ}| t|ƒ¡ d S )NrT   r=   )rF   Úgetwindowlinesr$  Úmaxr%  r"  )rÖ   ÚmarkrF   rz   ÚbotrW  rH   Znewtopr!   r!   r"   rg    s   
zEditorWindow.centerc                 C   sN   | j }|  d¡}|  d¡}||kr#| ¡ dkr#t|d ƒ}|| d }||fS )Nr!  z@0,65535rT   rH   )rF   r$  Zwinfo_heightrC   )rÖ   rF   rz   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+))rz   Zwm_geometryÚreÚmatchÚlistrá   rC   Úgroups)rÖ   ZgeomÚmr!   r!   r"   Úget_geometry"  s   
zEditorWindow.get_geometryc                 C   r[  rM   )r†   rÝ   r!   r!   r"   rˆ   (  r\  zEditorWindow.close_eventc                 C   sH   | j r"|  ¡ s| j ¡ dkr| j ¡  | j ¡  | j ¡  | j  ¡ S d S )Nr>  )r¼   r­  rz   rõ   Z	deiconifyÚlowerZliftÚ	maybesaver<  r!   r!   r"   r½  ,  s   



úzEditorWindow.maybesavec                 C   s8   z|   ¡ }t|ƒdkr|  ¡  |W S  ty   Y d S w )NÚ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¿   rF   r|   r·   rz   Zdestroyrn  r<  r!   r!   r"   r¿  >  s$   



þzEditorWindow._closec                 C   s   i | _ |  ¡  d S rÜ   )Ú
extensionsÚload_standard_extensionsr<  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GetExtensionsr<  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‡  ú-rt  rT   rò   rb   rô   Z_event)ÚextfilesrÉ   Ú	importlibÚimport_moduleÚ__package__ÚImportErrorÚ	TypeErrorrÇ  r  r   r€  r´   r  r‡  rÂ  r„   r   rF   r‡   )	rÖ   r@   Z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+   r}  rF   r  r~  rÏ   )rÖ   r  rF   rP   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.
        NrT   ú!c                 S   r4  rÜ   r5  r7  r!   r!   r"   rX   ©  r8  z(EditorWindow.fill_menus.<locals>.command)r  r  rX   r†  Úvariable)r  r  rX   r†  )r+   r‡  r}  rÈ   rF   rÉ   rË   r  rˆ  Úget_var_objZ
BooleanVarZadd_checkbuttonr:  )rÖ   r‡  r  rÈ   rF   ZmnameZ	entrylistr>   r‹  r  r2  Zcheckbuttonr  r†  rX   Ú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É   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 )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   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)rF   ÚTK_TABWIDTH_DEFAULTrC   )rÖ   Ú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 )Nr[   rã   z
-displayofÚn)rã  )rF   ræ  râ   r@  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   s8  | 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
 | j
 | j
 }d}		 |d d… }|	d
 }	t| 	|¡ƒ}||ksx|d d	vrynq]| ¡  | d|	 d¡ ||k r–| dd||  | j¡ | ¡  dS )Nrí   rN   ré   r<   rô   rð   z	insert-1crb   ú 	rT   r   Tz
insert-%dcrë   )rF   râ  r  rü   rÉ   rö   Zbellr±   rù   Ú
expandtabsr²   r¹   rí   rÐ   rº   )
rÖ   rP   rF   r  r  Úcharsr±   ZhaveZwantZncharsdeletedr!   r!   r"   rœ     sF   
ÿ
ûÿ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ë   rN   )rF   râ  r¹   Ú
index2linerŸ   r    rº   r  rü   rÉ   Úget_line_indentr±   rù   Úreindent_tor²   r°   rë  rí   rÐ   rþ   )
rÖ   rP   rF   r  r  ÚprefixÚrawZ	effectiveZpadrç  r!   r!   r"   rž   0  s.   
í
zEditorWindow.smart_indent_eventc              	   C   s:  | 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rc|tjkrn:|tjkr,| d|| j¡ n+|tjkr:|  |
  ¡ ¡ n|tj!krW|
 "¡ dkrP| d|| j¡ n|  |
 #¡ ¡ W | 	d¡ | 
¡  dS |
 $¡ }| d|| j¡ |
 %¡ rz|  &|¡ 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ê  rT   rv  rN   Nrb   zinsert - %d charsrU  Zconsolerð   ))rF   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Ö   rP   rF   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í   )rF   r¹   rö   r  rí   rù  rÐ   rº   )rÖ   rZ   rF   r!   r!   r"   rï  å  s   ÿzEditorWindow.reindent_toc                 C   sV   t | j| jƒ ¡ \}}|r#|r#t|| jƒ\}}t|| jƒ\}}|| S d }}|| S ©Nr   )ÚIndentSearcherrF   r±   r  rî  )rÖ   Ú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Ö   rP   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filesystemencodingrf   rÒ   rÔ   rÐ   rÛ   rŠ   r¯   r¦   r¤   rª   r  r  rƒ   rÍ   r  rÓ   r¬   r-  r‰   r/  r.  r=  r;  rA  r‘   r’   r   r   r‹   rŒ   r   r”   r•   r¡   r¢   r£   r–   r—   r™   r˜   rš   r›   rZ  r“   r§   r¨   r©   rh  rÄ   rn  ro  r½   rr  rs  rÅ   ÚstringÚascii_lettersÚdigitsrw  rz  rµ   r{  r…  r‰  r³   r  rŠ  rÆ   r¡  r»   r­  r¯  r±  rª  r«  rŽ   rg  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Ü   )rC   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·  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   rU  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   sJ   | j rd S ||kr||v r|| _d S ||kr!| jr#|| _d| _ d S d S d S )NrT   )r  r  r  )	rÖ   rE   ÚtokenÚstartra   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 )Nrt  r   rT   )rT  )Ú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>   rL   rR   rS   r<   r   z-[a-z]\bc                 S   s   |   ¡  ¡ S rÜ   )r  Úupper©rº  r!   r!   r"   rQ   g  s    z!get_accelerator.<locals>.<lambda>z\b\w+\bc                 S   s   t  |  ¡ |  ¡ ¡S rÜ   )ÚkeynamesrÉ   r  r  r!   r!   r"   rQ   h  s    zKey-ZCancelz
Ctrl-BreakzControl-zCtrl-rÌ  ú+z><rë   rò   rô   )rÉ   r   Z	isCocoaTkr¶  Úsub)r  r2  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@  )rw   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 )	NrT   )rw   r×   é
   rH   é   rí   z  rv  )
r#  r   Úargvr   ZsetupAppr$   rF   rø   rí   rú   )rC  rw   r×   r	  rF   r¥  r!   r!   r"   Ú_editor_window|  s   ÿr'  Ú__main__)rA   zidlelib.idle_test.test_editorr=   F)Ú	verbosityÚexit)r  ):Zimportlib.abcrÎ  Úimportlib.utilrg   rk   r¶  r   r   r  rÉ  rJ  Ú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unittestrA   Zidlelib.idle_test.htestr  r!   r!   r!   r"   Ú<module>   s~    
           d

4
ý	û