o
    ¯ó®gT ã                   @   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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#„ Z.d$d%d&d'œZ/d(d)„ Z0d*d+„ Z1d,d-„ Z2e3d.krñd d/l4m5Z5 e5d0d1d2d3 d d4l6m7Z7 e7e2ƒ dS dS )5é    N)Ú*)ÚFont)Ú	Scrollbar)Úsimpledialog)Ú
messagebox)ÚidleConf)Úconfigdialog)Úgrep)Úhelp)Ú
help_about)Úmacosx)ÚMultiCallCreator)Úpyparse)Úquery)Úreplace)Úsearch)Úwheel_event)Ú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   N)ÚsysÚversion_info)ÚmajorÚminorÚmicroÚlevelÚserialÚrelease© r    úD/Users/admin/.pyenv/versions/3.10.0/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   sF	  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
}n7d}tj ||dd¡}n+tj	d d… dkrXtj tjddtƒ  ¡}	tj |	¡rW|	}ntj	dkret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#| j+¡ | j ,d$| j-¡ t. /¡ r6| ,d$| j-¡ | ,d%| j0¡ | ,d&| j0¡ n| ,d'| j0¡ | ,d(t1¡ | ,d)t1¡ | ,d*t1¡ | ,d+| j2¡ | ,d,| j3¡ | ,d-| j4¡ | ,d.| j5¡ | ,d/| j6¡ | ,d0| j7¡ | ,d1| j8¡ | ,d2| j9¡ | ,d3| j:¡ | ,d4| j;¡ | ,d5d6d7„ ¡ | ,d8| j<¡ | ,d9| j=¡ | ,d:| j>¡ | ,d;| j?¡ | ,d<| j@¡ | ,d=| jA¡ | ,d>| jB¡ | ,d?| jC¡ | ,d@| jD¡ | ,dA| jE¡ | ,dB| jF¡ |  G| ¡ | _H}| ,dC|jI¡ | ,dD|jJ¡ | ,dE|jK¡ | ,dF|jL¡ | ,dG|jM¡ | ,dH|jN¡ |  O| ¡}| ,dI|jP¡ | ,dJ|jQ¡ | ,dK|  Rd¡¡ | ,dL|  RdM¡¡ | ,dN| jS¡ | ,dO| jT¡ | ,dP| jU¡ |rŠ||j| < |rf| |jV|< | ,dQ| jW¡ | ,dR| jjX¡ | ,dS| jY¡ | ,dT| jZ¡ | ,dU| j[¡ |  \¡  |j]t^t_dMdV |j`dMdMdW |jadMdMdW | jb|dX< |jcdMdtddY |je|dZ< t f| jdd¡|d[< |jcdMdMtddY | g¡  |  h¡  tj#dd\d]d^d}| | _id_| _j| jj| _k|  l¡  tmtd`ƒsô| j&da t_n|  o¡  db| _p|  q|¡ | _r}|  s¡  | _t}| u|¡ |jv|_v|jw|_w| x| jy¡ |  z| ¡ | _{}| || j}¡ dc| _~|  dc¡ d | _€d | _d | _‚|ritj ƒ|¡ratj |¡sa| „|¡r`dd| _~|  …|¡}|  |¡ n| †|¡ dd| _~|  ‡¡  |  y¡  |  ˆ¡  |  ‰¡  | jŠ ‹de¡}|r¤| Œdf¡}|d u rŽdg}|dkr›| ¡  |dM }|| _Žt | j¡ t‘j’| _’t“j”| _”t“j•| _•| –dhdi¡ | –djdkdldm¡ | –dndo¡ | –dpdq¡ | –drdqdsdt¡ |  —| | j˜¡}| ,dh|j™¡ | ,dj|jš¡ | ,du|j›¡ | ,dv|  œ| ¡j¡ | ,dw|  ž| ¡jŸ¡ |   | ¡}| ,dx|j¡¡ | ,dr|j¢¡ || ƒ}| ,dy|j£¡ | ,dz|j¤¡ | ,d{|j¥¡ | ,d||  ¦| ¡j§¡ |  ¨| ¡ | _©}| ,dn|jª¡ | ,dp|j«¡ | ,d}|j¬¡ | ,d~|  ­| ¡j®¡ | j¯rr|  °| ¡| _| ,d| jj±¡ n|  ²d€dd‚¡ | j³rš|  ´| ¡| _‚tj#dddƒd^dr‘|  µ¡  | ,d„| jµ¡ d S |  ²d€d…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/ÚwinzPython%s.chmr   z0Resources/English.lproj/Documentation/index.htmlzfile://zhttps://docs.python.org/%d.%d/é   )Úmenuzrecent-files.lstÚ Úvbar)ÚnameÚmainr#   ÚwidthÚint©ÚtypeÚtexté   ZnoneZwordprocessorÚheight)r?   ÚpadxZwrapZ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.runscriptr7   r#   Úhelp_urlÚosÚpathÚjoinr   Úbase_prefixÚplatformÚcountr   Úisdirr"   ÚisfileÚnormpathÚflistÚrootÚMenuÚmenubarr   ZListedToplevelÚtopÚvarsÚtkinter_varsZinversedictÚinstance_dictr   ZuserdirÚrecent_files_pathÚprompt_last_lineÚFrameÚ
text_framer   r>   Ú	GetOptionr   ZTextrE   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_eventr2   ÚfregionÚindent_region_eventZdedent_region_eventZcomment_region_eventZuncomment_region_eventZtabify_region_eventZuntabify_region_eventr3   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_eventr1   Zformat_paragraph_eventr5   Zflash_paren_eventZparen_closed_eventZcheck_module_eventZrun_module_eventZrun_custom_eventr4   Z	do_rstripr.   ÚctipZtry_open_calltip_eventZrefresh_calltip_eventZforce_open_calltip_eventr6   Zzoom_height_eventÚallow_code_contextr/   Ztoggle_code_context_eventÚupdate_menu_stateÚallow_line_numbersr0   Útoggle_line_numbers_event)Úselfrn   ÚfilenameÚkeyro   r7   ZdochomeZpyverZbasepathZchmfilerr   ry   r>   rA   Ztext_optionsrE   r—   ÚindentsZ	usespacesr¯   r°   r´   Ú	is_py_srcr<   r_   ZautocompleteZ
parenmatchZscriptbindingrÉ   r    r    r!   Ú__init__H   sÆ  

ÿÿ€

ÿ
€ÿ

ÿÿù







ÿ



€



ÿÿÿÿ
ÿ
ÿÿzEditorWindow.__init__c                 C   s   |   ¡  d S ©N)r§   ©rÎ   rN   r    r    r!   r‚   `  ó   zEditorWindow.handle_winconfigc                 C   s^   | j }tt|jj| d¡| d¡gƒƒ}| ¡ d|  }t|| d¡d d¡}|| | _	d S )NZborderrH   r;   rY   )rY   Ú0)
rE   ÚsumÚmapÚtkZgetintZcgetZwinfo_widthr   ÚmeasurerA   )rÎ   rE   Zinner_paddingZpixel_widthZzero_char_widthr    r    r!   r§   c  s   ÿÿzEditorWindow.set_widthc                 C   s   | j  ¡ \}}| j |¡ dS rK   )r´   Zdefaultfilenamern   Únew)rÎ   rN   ÚdirnameÚbasenamer    r    r!   rž   p  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 qNq?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Ú.rR   )ú ú	Úinsertzinsert linestart+ÚcÚselú1.0r_   ú	sel.firstZ	my_anchorú<úsel.lastú>rL   )ÚstateZkeysymrE   rÂ   ÚcomparerB   ÚsplitrÁ   ÚrangeÚlenÚstrÚ
tag_removeÚmark_setÚtag_addÚsee)rÎ   rN   ZinsertptÚlineZlineatÚdestÚfirstÚlastr    r    r!   rœ   u  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 )NrR   Zgrey75)rG   ZborderwidthZ
backgroundr   Z	_padding1z    )rS   rX   zCol: ?r÷   zLn: ?)rS   rT   z<<set-line-and-column>>z<KeyRelease>z<ButtonRelease>)r+   rr   Ú
status_barrx   r   ri   Ú	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â   rX   zCol: %sr÷   zLn: %s)rE   rÂ   ZINSERTrï   rû   rü   )rÎ   rN   r÷   rX   r    r    r!   rþ   °  s   z EditorWindow.set_line_and_column))ÚfileZ_File)ÚeditZ_Edit)ÚformatZF_ormat)ÚrunZ_Run)ra   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
   )rq   rÀ   Ú
menu_specsÚprepstrÚgetattrrp   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_   r`   rR   )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unitsrL   N)ÚfloatÚroundÚ	getlinenorE   Úyview)rÎ   rN   Ú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ibeamrL   )rE   rÂ   ÚxÚyrî   ÚTclErrorró   rô   ÚrmenuÚ
make_rmenurN   r   ri   ZconfigÚrmenu_specsÚ
ValueErrorr  ZentryconfigureZtk_popupZx_rootZy_root)rÎ   rN   rE   ZnewdexZin_selectionr%  ZiswinÚitemr  Ú	eventnameZverify_staterí   r    r    r!   r   ÷  sB   ÿÿ
ÿzEditorWindow.right_menu_event)ÚCloserI   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  rR   c                 S   ó   |   |¡ d S rÔ   ©Úevent_generate©rE   r*  r    r    r!   rV   $  ó   z(EditorWindow.make_rmenu.<locals>.command©r  rV   )rp   rE   r'  Úadd_commandrÃ   r%  )rÎ   r%  r)  r  r*  rV   r    r    r!   r&    s   


zEditorWindow.make_rmenuc                 C   s   |   ¡ S rÔ   )Úrmenu_check_copy©rÎ   r    r    r!   Úrmenu_check_cut+  s   zEditorWindow.rmenu_check_cutc                 C   s2   z| j  d¡}W n
 ty   Y dS w |rdS dS )Nré   rb   Únormal©rE   rÂ   r$  )rÎ   Zindxr    r    r!   r3  .  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	CLIPBOARDrb   r6  )rE   rÚ   Úcallr$  r4  r    r    r!   Úrmenu_check_paste6  s   ýÿzEditorWindow.rmenu_check_pastec                 C   ó   t  | j¡ dS )zHandle Help 'About IDLE' event.rL   N)r   ZAboutDialogrr   rÕ   r    r    r!   r‰   >  s   zEditorWindow.about_dialogc                 C   s   t  | jd¡ dS )z&Handle Options 'Configure IDLE' event.ZSettingsrL   N)r   ZConfigDialogrr   rÕ   r    r    r!   rŠ   D  s   zEditorWindow.config_dialogc                 C   s"   | j r| j }n| j}t |¡ dS )zHandle Help 'IDLE Help' event.rL   N)ro   rr   r
   Zshow_idlehelp)rÎ   rN   Úparentr    r    r!   r‡   J  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;  rL   )r   ri   re   Ú	startfilerd   ÚOSErrorr   rÆ   rò   rE   Ú
webbrowserÚopen)rÎ   rN   Úwhyr    r    r!   rˆ   T  s   û
ÿ€ûzEditorWindow.python_docsc                 C   ó   | j  d¡ dS )Nz<<Cut>>rL   ©rE   r.  rÕ   r    r    r!   rƒ   _  ó   zEditorWindow.cutc                 C   s    | j  d¡sd S | j  d¡ dS )Nrç   z<<Copy>>rL   )rE   Z
tag_rangesr.  rÕ   r    r    r!   r„   c  s   zEditorWindow.copyc                 C   s   | j  d¡ | j  d¡ dS )Nz	<<Paste>>rå   rL   )rE   r.  rö   rÕ   r    r    r!   r…   j  ó   zEditorWindow.pastec                 C   s.   | j  ddd¡ | j  dd¡ | j  d¡ dS )Nrç   rè   zend-1crå   rL   )rE   rõ   rô   rö   rÕ   r    r    r!   rŒ   o  s   zEditorWindow.select_allc                 C   s    | j  ddd¡ | j  d¡ dS )Nrç   rè   r_   rå   rL   )rE   ró   rö   rÕ   r    r    r!   r   u  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$  rM   ©Ú
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_edgeN)rE   rÂ   rô   )rÎ   rJ  rK  r    rI  r!   r™   z  s
   z&EditorWindow.move_at_edge_if_selectionc                 C   rE  )Nz<Meta-Delete>rL   rF  rÕ   r    r    r!   rš   Ž  rG  zEditorWindow.del_word_leftc                 C   rE  )Nz<Meta-d>rL   rF  rÕ   r    r    r!   r›   ’  rG  zEditorWindow.del_word_rightc                 C   r:  rK   )r   ÚfindrE   rÕ   r    r    r!   rŽ   –  rG  zEditorWindow.find_eventc                 C   r:  rK   )r   Z
find_againrE   rÕ   r    r    r!   r   š  rG  zEditorWindow.find_again_eventc                 C   r:  rK   )r   Zfind_selectionrE   rÕ   r    r    r!   r‘   ž  rG  z!EditorWindow.find_selection_eventc                 C   s   t   | j| j| j¡ dS rK   )r	   rE   r´   rn   rÕ   r    r    r!   r   ¢  s   z EditorWindow.find_in_files_eventc                 C   s   t   | j¡ dS rK   )r   rE   rÕ   r    r    r!   r’   ¦  rG  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å   ú.0rL   )rE   r   ZGotoÚresultró   rô   rö   rþ   )rÎ   rN   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
ModuleNamerN  rn   rC  r´   r»   )rÎ   r?   Ú	file_pathr    r    r!   Úopen_module¸  s$   ÿüüÿzEditorWindow.open_modulec                 C   ó   |   ¡  dS rK   )rR  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PyShellEditorWindowrL   r   )Úbrowser)	r´   rÏ   Ú	__class__Ú__name__rR  ÚidlelibrU  ZModuleBrowserro   )rÎ   rN   rÏ   rU  r    r    r!   rŸ   Ô  s   ÿz EditorWindow.open_module_browserc                 C   s   ddl m} | | j¡ dS )Nr   )ÚpathbrowserrL   )rX  rY  ZPathBrowserro   )rÎ   rN   rY  r    r    r!   r    ß  rH  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)ÚshellrL   )Ú
subprocessr   Ú
executableÚPopen)rÎ   rN   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Î   rO  r    r    r!   Úgotolineí  s   üzEditorWindow.gotolinec                 C   s`   |rt j |¡r
dS t j t j |¡¡\}}t j |¡dv r dS | j dd¡}| d¡o/d|v S )NT)z.pyz.pywrè   z1.0 lineendz#!Zpython)	re   rf   rk   ÚsplitextrÞ   ÚnormcaserE   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Ô   )rn   Zunregister_maybe_terminater4  r    r    r!   Ú
close_hooký  s   
þzEditorWindow.close_hookc                 C   s
   || _ d S rÔ   )rf  )rÎ   rf  r    r    r!   Úset_close_hook  ó   
zEditorWindow.set_close_hookc                 C   s2   | j r	| j  | ¡ |  ¡  | j | ¡ |  ¡  d S rÔ   )rn   Zfilename_changed_editr³   rr   Zupdate_windowlist_registryr½   r4  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°   r4  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removefilterr4  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)	rk  rj  r#   r&   rE   r¸   Zupdate_highlight_colorsr¹   Zupdate_colorsr4  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Î   rE   ÚposÚcharr    r    r!   Úcolorize_syntax_error+  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   rz   rE   r\   )rÎ   Zcursorblinkr    r    r!   r­   6  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#   rY   )r¸   Zupdate_fontr¹   r   r¦   ro   rE   r§   )rÎ   Znew_fontr    r    r!   Ú	ResetFont@  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Î   ÚkeydefsrN   ÚkeylistÚextensionNameÚxkeydefsr    r    r!   ÚRemoveKeybindingsQ  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   rR   NrV   Úacceleratorr  r=   )r~  )r   rt  r*   ru  r|   rw  rx  Úmenudefsr
  rÀ   rÂ   r  rð   rD   Z	entrycgetÚget_acceleratorr  )rÎ   ry  r{  r|  ZmenuEventDictr<   r)  ZmenubarItemr_   rÂ   ZaccelZitemNamerN   r    r    r!   ÚApplyKeybindings]  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@   rZ   z
num-spacesrB   rC   N)r¨   r   rz   rª   r4  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
   rR   r   r1  N)
r   ZGetAllExtraHelpSourcesListrÀ   rÂ   r  r  r  rÃ   Ú"_EditorWindow__extra_help_callbackr2  )rÎ   Z	help_listZhelpmenuZhelpmenu_lengthÚentryr^  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Úhttpr9   r:   r<  r=  )rc  re   rf   rm   r   ri   r@  rA  r   rÆ   rò   rE   rB  rC  )ÚhelpfilerD  r4  r    r!   Údisplay_extra_help›  s   

ÿ€ÿz>EditorWindow.__extra_help_callback.<locals>.display_extra_helpNr    )rÎ   r†  r‡  r    r4  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)   ÚerrorsNrn  r   ú r`   c                    s   g | ]}|ˆ vr|‘qS r    r    )Ú.0rf   ©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.r=  rã   )r  rV   r  )rv   re   rf   rº   rC  Ú	readlinesÚabspathÚremoverå   Úappendrñ   Ú
writelinesrA  r  ro   r  r   ÚshowwarningrE   rr   ru   r  r  r  Ú	enumerateÚrstripÚ#_EditorWindow__recent_file_callbackr2  )rÎ   Únew_fileZrf_listrQ  Zrf_list_filerf   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´   rC  )Z
fn_closurer4  r    r!   Úopen_recent_file×  s   z=EditorWindow.__recent_file_callback.<locals>.open_recent_filer    )rÎ   rž  r   r    r4  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_savedrr   Zwm_titleZwm_iconname)rÎ   ZshortÚlongr>  Ziconr    r    r!   r³   Û  s   zEditorWindow.saved_change_hookc                 C   s
   | j  ¡ S rÔ   )r°   r¥  r4  r    r    r!   r¥  í  rh  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_undor4  r    r    r!   r©  ó  r0  zEditorWindow.reset_undoc                 C   s   | j j}|rtj |¡S dS )Nr¡  )r´   rÏ   re   rf   rÞ   )rÎ   rÏ   r    r    r!   r¢  ö  s   zEditorWindow.short_titlec                 C   s   | j jpdS )Nr=   )r´   rÏ   r4  r    r    r!   r£  ú  rÖ   zEditorWindow.long_titlec                 C   rS  rK   )r_  rÕ   r    r    r!   r†   ý  rT  z EditorWindow.center_insert_eventrå   c                 C   sH   | j }|  ¡ \}}|  |¡}|| }td||d  ƒ}| t|ƒ¡ d S )NrR   r;   )rE   Úgetwindowlinesr  Úmaxr  r  )rÎ   ÚmarkrE   rr   ÚbotrO  rG   Znewtopr    r    r!   r_    s   
zEditorWindow.centerc                 C   sN   | j }|  d¡}|  d¡}||kr#| ¡ dkr#t|d ƒ}|| d }||fS )Nr  z@0,65535rR   rG   )rE   r  Zwinfo_heightrB   )rÎ   rE   rr   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+)N)rr   Zwm_geometryÚreÚmatchÚlistrÙ   rB   Úgroups)rÎ   ZgeomÚmr    r    r!   Úget_geometry  s   
zEditorWindow.get_geometryc                 C   rS  rK   )r~   rÕ   r    r    r!   r€     rT  zEditorWindow.close_eventc                 C   sH   | j r"|  ¡ s| j ¡ dkr| j ¡  | j ¡  | j ¡  | j  ¡ S d S )Nr6  )r´   r¥  rr   rí   Z	deiconifyÚlowerZliftÚ	maybesaver4  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~   *  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   rt   r¯   rr   Zdestroyrf  r4  r    r    r!   r·  3  s$   



þzEditorWindow._closec                 C   s   i | _ |  ¡  d S rÔ   )Ú
extensionsÚload_standard_extensionsr4  r    r    r!   r¿   G  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¹  K  s
   
€
zEditorWindow.unload_extensionsc                 C   s@   |   ¡ D ]}z|  |¡ W q   tdt|ƒƒ t ¡  Y qd S )NzFailed to load extension)rw  Úload_extensionÚprintÚreprÚ	tracebackÚ	print_exc)rÎ   r?   r    r    r!   r»  Q  s   ûz%EditorWindow.load_standard_extensionsc                 C   s   t jddS )NT)Zeditor_only)r   ZGetExtensionsr4  r    r    r!   rw  Y  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  ú-rl  rR   rê   r`   rì   Z_event)ÚextfilesrÁ   Ú	importlibÚimport_moduleÚ__package__ÚImportErrorÚ	TypeErrorr¿  r  r   rx  r¬   r  r  rº  r|   r   rE   r   )	rÎ   r?   ÚfnameÚmodÚclsry  r½  ZveventZ
methodnamer    r    r!   r¾  `  sD   ÿ€
þ




ÿÿ
€özEditorWindow.load_extensionc                 C   sH   |d u r| j j}| j}||_| ¡ D ]\}}|r!|j|g|¢R Ž  qd S rÔ   )r*   ru  rE   ry  rv  rÇ   )rÎ   ry  rE   rN   rz  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.
        NrR   ú!c                 S   r,  rÔ   r-  r/  r    r    r!   rV   ž  r0  z(EditorWindow.fill_menus.<locals>.command)r  r  rV   r~  Zvariable)r  r  rV   r~  )r*   r  ru  rÀ   rE   rÁ   rÃ   r
  r€  Úget_var_objZ
BooleanVarZadd_checkbuttonr2  )rÎ   r  ry  rÀ   rE   ZmnameZ	entrylistr<   rƒ  r  r*  Zcheckbuttonr  r~  rV   Ú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Ô   )rt   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ÚSTRINGrR   )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ë   ©NNr7  )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Î   Ú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 )NrY   rÛ   z
-displayofÚn)rÛ  )rE   rÞ  rÚ   r8  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q€qc| ¡  | d|	 d¡ ||k rœ| dd||  | j¡ | ¡  dS )Nrå   rL   rá   r=   rì   rè   z	insert-1cr`   ú 	r   rR   z
insert-%dcrã   )rE   rÚ  r  rô   rÁ   rî   Zbellr©   rñ   Ú
expandtabsrª   r±   rå   rÈ   r²   )
rÎ   rN   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ã   rL   )rE   rÚ  r±   Ú
index2liner—   r˜   r²   r  rô   rÁ   Úget_line_indentr©   rñ   Úreindent_torª   r¨   rã  rå   rÈ   rö   )
rÎ   rN   rE   rù   rú   ÚprefixÚrawZ	effectiveZpadrß  r    r    r!   r–   %  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ä qå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â  rR   rn  rL   Nr`   zinsert - %d charsrM  Zconsolerè   zbogus continuation type %r))rE   rÚ  r±   r  rô   rÁ   rñ   rå   rÈ   rö   r²   rå  rÂ   r   ZParserrª   r©   rw   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Î   rN   rE   rù   rú   r÷   r  rß  ÚindentÚlnor#  ÚcontextZstartatZstartatindexZrawtextZbodrˆ  ræ   r    r    r!   r•   H  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Î   rX   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Î   Ú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Hidera   rc   z Line Numbers)r<   rÂ   r  )r¹   Zis_shownZhide_sidebarZshow_sidebarr  )rÎ   rN   Z
menu_labelr    r    r!   rÍ   ò  s   



ÿz&EditorWindow.toggle_line_numbers_event)NNNNrÔ   )rå   rÙ  )T)“rW  Ú
__module__Ú__qualname__Zidlelib.percolatorr$   Zidlelib.colorizerr%   r&   Zidlelib.undor'   Zidlelib.iomenur(   r)   rX  r*   Zidlelib.statusbarr+   Zidlelib.autocompleter,   Zidlelib.autoexpandr-   Zidlelib.calltipr.   Zidlelib.codecontextr/   Zidlelib.sidebarr0   Zidlelib.formatr1   r2   r3   r4   Zidlelib.parenmatchr5   Zidlelib.zoomheightr6   r   ÚgetfilesystemencodingZfilesystemencodingrd   rÊ   rÌ   rÈ   rÓ   r‚   r§   rž   rœ   r¢   rþ   r	  r{   rÅ   r  rË   r¤   r%  r   r'  r&  r5  r3  r9  r‰   rŠ   r‡   rˆ   rƒ   r„   r…   rŒ   r   r™   rš   r›   rŽ   r   r‘   r   r’   r“   rR  r‹   rŸ   r    r¡   r`  r¼   rf  rg  rµ   rj  rk  r½   ÚstringÚascii_lettersÚdigitsro  rr  r­   rs  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»  rw  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#   1   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).
    N)Ú_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=   rR   rM  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 )NrR   )rý  rþ  rÿ  )	rÎ   rD   ÚtokenÚstartr_   r÷   ÚINDENTÚNAMEZOPENERSr    r    r!   Ú
tokeneater%  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  1  s   ÿý€zIndentSearcher.runN)
rW  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 )Nrl  r   rR   )rL  )Úsr  r    r    r!   r
  C  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>   rJ   rQ   rP   r=   r   z-[a-z]\bc                 S   s   |   ¡  ¡ S rÔ   )rü  Úupper©r²  r    r    r!   rO   \  s    z!get_accelerator.<locals>.<lambda>z\b\w+\bc                 S   s   t  |  ¡ |  ¡ ¡S rÔ   )ÚkeynamesrÁ   rü  r  r    r    r!   rO   ]  s    zKey-ZCancelz
Ctrl-BreakzControl-zCtrl-rÄ  ú+z><rã   rê   rì   )rÁ   r   Z	isCocoaTkr®  Úsub)ry  r*  rz  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Ú   r8  )ro   rÚ   r    r    r!   Úfixwordbreaksh  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 )	NrR   )ro   rÏ   é
   rG   é   rå   z  rn  )
r  r   Úargvr   ZsetupAppr#   rE   rð   rå   rò   )r;  ro   rÏ   r  rE   r  r    r    r!   Ú_editor_windowq  s   ÿr  Ú__main__)r@   zidlelib.idle_test.test_editorr;   F)Ú	verbosityÚexit)r  )8Zimportlib.abcrÆ  Úimportlib.utilre   ri   r®  rø  r   r  rÁ  rB  ÚtkinterZtkinter.fontr   Ztkinter.ttkr   r   r   Zidlelib.configr   rX  r   r	   r
   r   r   Zidlelib.multicallr   r   r   r   r   Zidlelib.treer   r   rÜ  Zpython_versionr¤  r   r"   r#   rå  Úcompilerû  ræ  ró  r
  r  r€  r  r  rW  Zunittestr@   Zidlelib.idle_test.htestr  r    r    r    r!   Ú<module>   s|    
           Z

4
ý	û