o
   ƒ‘å[2xy
ã                   @   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!   ú4/app/.heroku/python/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@   Ú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   Ú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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)Úselfrp   ÚfilenameÚkeyrq   r8   ZdochomeZpyverZbasepathZchmfilert   r{   r?   rB   Ztext_optionsrF   r™   ÚindentsZ	usespacesr±   r²   r¶   Ú	is_py_srcr=   ra   ZautocompleteZ
parenmatchZscriptbindingrË   r!   r!   r"   Ú__init__I   sÆ  

ÿÿ€

ÿ
€ÿ

ÿÿù







ÿ



€



ÿÿÿÿ
ÿ
ÿÿzEditorWindow.__init__c                 C   s   |   ¡  d S ©N)r©   ©rÐ   rP   r!   r!   r"   r„   a  ó   zEditorWindow.handle_winconfigc                 C   s^   | j }tt|jj| d¡| d¡gƒƒ}| ¡ d|  }t|| d¡d d¡}|| | _	d S )NZborderrI   r<   r[   )r[   Ú0)
rF   ÚsumÚmapÚtkZgetintZcgetZwinfo_widthr   ÚmeasurerB   )rÐ   rF   Zinner_paddingZpixel_widthZzero_char_widthr!   r!   r"   r©   d  s   ÿÿzEditorWindow.set_widthc                 C   s   | j  ¡ \}}| j |¡ dS rM   )r¶   Zdefaultfilenamerp   Únew)rÐ   rP   ÚdirnameÚbasenamer!   r!   r"   r    q  s   zEditorWindow.new_callbackc                 C   s¼  |j d@ dkr|jdkrd S | j d¡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ž   v  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,   rt   Ú
status_barrz   r   rk   Ú	set_labelZRIGHTr¥   ZBOTTOMÚXrF   r   Úset_line_and_columnrÉ   Z
after_idle)rÐ   Úsepr!   r!   r"   r¤   ¡  s   
ÿzEditorWindow.set_status_barc                 C   s>   | j  t¡ d¡\}}| j dd| ¡ | j dd| ¡ d S )Nrä   rZ   zCol: %srù   zLn: %s)rF   rÄ   ZINSERTrñ   rý   rþ   )rÐ   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
   )rs   rÂ   Ú
menu_specsÚprepstrÚgetattrrr   Zadd_cascader   Z
isCarbonTkÚ
fill_menusÚrecent_files_menuZinsert_cascaderÄ   ÚENDÚbase_helpmenu_lengthÚreset_help_menu_entries)rÐ   ZmbarrÂ   r@   r  r	  r  r=   r!   r!   r"   r}   Á  s,   
ÿÿþzEditorWindow.createmenubarc                 C   sJ   | j d }| d¡}|d u rd}|| jkr| | jd |¡ t |¡ d S )Nr   ra   rb   rT   )rÂ   rÄ   rÆ   Údeleter   Zadd_windows_to_menu)rÐ   r=   ra   r!   r!   r"   rÇ   ×  s   


zEditorWindow.postwindowsmenuc                 C   ó   | 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   r,  r!   r!   r"   rX   %  ó   z(EditorWindow.make_rmenu.<locals>.command©r  rX   )rr   rF   r)  Úadd_commandrÅ   r'  )rÐ   r'  r+  r  r,  rX   r!   r!   r"   r(     s   


zEditorWindow.make_rmenuc                 C   s   |   ¡ S rÖ   )Úrmenu_check_copy©rÐ   r!   r!   r"   Úrmenu_check_cut,  s   zEditorWindow.rmenu_check_cutc                 C   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"   r5  /  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   r8  )rF   rÜ   Úcallr&  r6  r!   r!   r"   Úrmenu_check_paste7  s   ýÿzEditorWindow.rmenu_check_pastec                 C   ó   t  | j¡ dS )zHandle Help 'About IDLE' event.rN   )r   ZAboutDialogrt   r×   r!   r!   r"   r‹   ?  s   zEditorWindow.about_dialogc                 C   s   t  | jd¡ dS )z&Handle Options 'Configure IDLE' event.ZSettingsrN   )r   ZConfigDialogrt   r×   r!   r!   r"   rŒ   E  s   zEditorWindow.config_dialogc                 C   s"   | j r| j }n| j}t |¡ dS )zHandle Help 'IDLE Help' event.rN   )rq   rt   r
   Zshow_idlehelp)rÐ   rP   Úparentr!   r!   r"   r‰   K  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Úmessager=  rN   )r   rk   rg   Ú	startfilerf   ÚOSErrorr   rÈ   rô   rF   Ú
webbrowserÚopen)rÐ   rP   Úwhyr!   r!   r"   rŠ   U  s   û
ÿ€ûzEditorWindow.python_docsc                 C   ó   | j  d¡ dS )Nz<<Cut>>rN   ©rF   r0  r×   r!   r!   r"   r…   `  ó   zEditorWindow.cutc                 C   s    | j  d¡sd S | j  d¡ dS )Nré   z<<Copy>>rN   )rF   Z
tag_rangesr0  r×   r!   r!   r"   r†   d  s   zEditorWindow.copyc                 C   s   | j  d¡ | j  d¡ dS )Nz	<<Paste>>rç   rN   )rF   r0  rø   r×   r!   r!   r"   r‡   k  ó   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Ž   p  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   v  s   zEditorWindow.remove_selectionc                    s*   | j j‰| j j‰d‰‡ ‡‡‡fdd„}|S )zèCursor move begins at start or end of selection

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

        )zsel.first+1czsel.last-1cc                    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Ð   rL  rM  r!   rK  r"   r›   {  s
   z&EditorWindow.move_at_edge_if_selectionc                 C   rG  )Nz<Meta-Delete>rN   rH  r×   r!   r!   r"   rœ     rI  zEditorWindow.del_word_leftc                 C   rG  )Nz<Meta-d>rN   rH  r×   r!   r!   r"   r   “  rI  zEditorWindow.del_word_rightc                 C   r<  rM   )r   ÚfindrF   r×   r!   r!   r"   r   —  rI  zEditorWindow.find_eventc                 C   r<  rM   )r   Z
find_againrF   r×   r!   r!   r"   r‘   ›  rI  zEditorWindow.find_again_eventc                 C   r<  rM   )r   Zfind_selectionrF   r×   r!   r!   r"   r“   Ÿ  rI  z!EditorWindow.find_selection_eventc                 C   s   t   | j| j| j¡ dS rM   )r	   rF   r¶   rp   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”   §  rI  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
ModuleNamerP  rp   rE  r¶   r½   )rÐ   r@   Ú	file_pathr!   r!   r"   Úopen_module¹  s$   ÿüüÿzEditorWindow.open_modulec                 C   ó   |   ¡  dS rM   )rT  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__rT  ÚidlelibrW  ZModuleBrowserrq   )rÐ   rP   rÑ   rW  r!   r!   r"   r¡   Õ  s   ÿz EditorWindow.open_module_browserc                 C   s   ddl m} | | j¡ dS )Nr   )ÚpathbrowserrN   )rZ  r[  ZPathBrowserrq   )rÐ   rP   r[  r!   r!   r"   r¢   à  rJ  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   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ê   ra   z
insert +1l)rF   rö   rõ   r÷   Úcenter)rÐ   rQ  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Ö   )rp   Zunregister_maybe_terminater6  r!   r!   r"   Ú
close_hookþ  s   
þzEditorWindow.close_hookc                 C   s
   || _ d S rÖ   )rh  )rÐ   rh  r!   r!   r"   Úset_close_hook  ó   
zEditorWindow.set_close_hookc                 C   s2   | j r	| j  | ¡ |  ¡  | j | ¡ |  ¡  d S rÖ   )rp   Zfilename_changed_editrµ   rt   Zupdate_windowlist_registryr¿   r6  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²   r6  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removefilterr6  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)	rm  rl  r$   r'   rF   rº   Zupdate_highlight_colorsr»   Zupdate_colorsr6  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_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.rA   r$   zcursor-blinkr]   rD   r   r_   N)r   r|   rF   r^   )rÐ   Zcursorblinkr!   r!   r"   r¯   7  s   ÿz EditorWindow.update_cursor_blinkc                 C   sN   | j dur
| j  ¡  | jdur| j ¡  t | jdd¡}|| jd< |  ¡  dS )z.Update the text widgets' font if it is changedNrA   r$   r[   )rº   Zupdate_fontr»   r   r¨   rq   rF   r©   )rÐ   Znew_fontr!   r!   r"   Ú	ResetFontA  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"   ÚRemoveKeybindingsR  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   rv  r+   rw  r~   ry  rz  Úmenudefsr  rÂ   rÄ   r  rò   rE   Z	entrycgetÚget_acceleratorr  )rÐ   r{  r}  r~  ZmenuEventDictr=   r+  ZmenubarItemra   rÄ   ZaccelZitemNamerP   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 windowrA   r\   z
num-spacesrC   rD   N)rª   r   r|   r¬   r6  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   r3  N)
r   ZGetAllExtraHelpSourcesListrÂ   rÄ   r  r  r  rÅ   Ú"_EditorWindow__extra_help_callbackr4  )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Úhttpr:   r;   r>  r?  )re  rg   rh   ro   r   rk   rB  rC  r   rÈ   rô   rF   rD  rE  )ÚhelpfilerF  r6  r!   r"   Údisplay_extra_helpœ  s   

ÿ€ÿz>EditorWindow.__extra_help_callback.<locals>.display_extra_helpr!   )rÐ   rˆ  r‰  r!   r6  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*   ÚerrorsNrp  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.r?  rå   )r  rX   r	  )rx   rg   rh   r¼   rE  Ú	readlinesÚabspathÚremoverç   Úappendró   Ú
writelinesrC  r  rq   r’  r   ÚshowwarningrF   rt   rw   r  r  r  Ú	enumerateÚrstripÚ#_EditorWindow__recent_file_callbackr4  )rÐ   Únew_fileZrf_listrS  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¶   rE  )Z
fn_closurer6  r!   r"   Úopen_recent_fileØ  s   z=EditorWindow.__recent_file_callback.<locals>.open_recent_filer!   )rÐ   r   r¢  r!   r6  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_savedrt   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§  r6  r!   r!   r"   r§  î  rj  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_undor6  r!   r!   r"   r«  ô  r2  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Ñ   r6  r!   r!   r"   r¥  û  rØ   zEditorWindow.long_titlec                 C   rU  rM   )ra  r×   r!   r!   r"   rˆ   þ  rV  z EditorWindow.center_insert_eventrç   c                 C   sH   | j }|  ¡ \}}|  |¡}|| }td||d  ƒ}| t|ƒ¡ d S )NrT   r<   )rF   Úgetwindowlinesr  Úmaxr  r  )rÐ   ÚmarkrF   rt   ÚbotrQ  rH   Znewtopr!   r!   r"   ra    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   rt   r¯  rH   r!   r!   r"   r¬  
  s   

zEditorWindow.getwindowlinesc                 C   s   | j }tt| |¡ƒƒS rÖ   )rF   rC   r  rÄ   )rÐ   r®  rF   r!   r!   r"   r    s   zEditorWindow.getlinenoc                 C   s(   | j  ¡ }t d|¡}ttt| ¡ ƒƒS )zReturn (width, height, x, y)z(\d+)x(\d+)\+(-?\d+)\+(-?\d+))rt   Zwm_geometryÚreÚmatchÚlistrÛ   rC   Úgroups)rÐ   ZgeomÚmr!   r!   r"   Úget_geometry  s   
zEditorWindow.get_geometryc                 C   rU  rM   )r€   r×   r!   r!   r"   r‚     rV  zEditorWindow.close_eventc                 C   sH   | j r"|  ¡ s| j ¡ dkr| j ¡  | j ¡  | j ¡  | j  ¡ S d S )Nr8  )r¶   r§  rt   rï   Z	deiconifyÚlowerZliftÚ	maybesaver6  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¹   rF   rv   r±   rt   Zdestroyrh  r6  r!   r!   r"   r¹  4  s$   



þzEditorWindow._closec                 C   s   i | _ |  ¡  d S rÖ   )Ú
extensionsÚload_standard_extensionsr6  r!   r!   r"   rÁ   H  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»  L  s
   
€
zEditorWindow.unload_extensionsc                 C   s@   |   ¡ D ]}z|  |¡ W q   tdt|ƒƒ t ¡  Y qd S )NzFailed to load extension)ry  Úload_extensionÚprintÚreprÚ	tracebackÚ	print_exc)rÐ   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GetExtensionsr6  r!   r!   r"   ry  Z  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  ú-rn  rT   rì   rb   rî   Z_event)ÚextfilesrÃ   Ú	importlibÚimport_moduleÚ__package__ÚImportErrorÚ	TypeErrorrÁ  r  r   rz  r®   r  r  r¼  r~   r   rF   r   )	rÐ   r@   ÚfnameÚmodÚclsr{  r¿  ZveventZ
methodnamer!   r!   r"   rÀ  a  sD   ÿ€
þ




ÿÿ
€özEditorWindow.load_extensionc                 C   sH   |d u r| j j}| j}||_| ¡ D ]\}}|r!|j|g|¢R Ž  qd S rÖ   )r+   rw  rF   r{  rx  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   r.  rÖ   r/  r1  r!   r!   r"   rX   Ÿ  r2  z(EditorWindow.fill_menus.<locals>.command)r  r	  rX   r€  Úvariable)r  r	  rX   r€  )r+   r  rw  rÂ   rF   rÃ   rÅ   r  r‚  Úget_var_objZ
BooleanVarZadd_checkbuttonr4  )rÐ   r  r{  rÂ   rF   ZmnameZ	entrylistr=   r…  r  r,  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Ö   )rv   rÃ   rF   )rÐ   r@   r×  rÓ  r!   r!   r"   rÒ  º  s   zEditorWindow.get_var_objc                 C   s(   | j r| j d|¡pd| j |¡v S dS )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í   ©NNr9  )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   sD  | j }|  ¡ \}}|r|r| ||¡ | d|¡ dS | dd¡}|dkr9| ddd¡r3| d¡ dS | ¡  dS |d d	vrF| d¡ dS | j}t| 	|¡ƒ}|d
ksVJ ‚|d | j
 | j
 }d
}		 |d d… }|	d }	t| 	|¡ƒ}||ks~|d d	vrnqc| ¡  | d|	 d¡ ||k rœ| dd||  | j¡ | ¡  dS )Nrç   rN   rã   r>   rî   rê   z	insert-1crb   ú 	r   rT   z
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–   û  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å   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˜   &  s.   
í
zEditorWindow.smart_indent_eventc              	   C   sJ  | j }|  ¡ \}}| ¡  zŒ|r|r| ||¡ | d|¡ | dd¡}dt|ƒ}}||k rD|| dv rD|d7 }||k rD|| dv s6||kr\| dd| j¡ W | 	d¡ | 
¡  dS |d|… }d}|r~|d	 dv r~|dd	… }|d7 }|r~|d	 dv sl|rˆ| d
| d¡ | d¡dv r›| d¡ | d¡dv s| dd| j¡ t| d¡ƒ}	t | j| j¡}
| jsí| jD ],}t|	| dƒ}t|ƒd }| |d¡}|
 |¡ |
 |  |¡¡}|dusâ|dkrä nq¸|
 |pêd¡ n| dd¡}|rú|d }nd}| |d¡}|
 |¡ |
 d¡ |
 ¡ }|tjkrk|tjkrnB|tjkr,| d|| j¡ n3|tjkr:|  |
  ¡ ¡ n%|tj!krX|
 "¡ dkrP| d|| j¡ n|  |
 #¡ ¡ nJ d|f ƒ‚W | 	d¡ | 
¡  dS |
 $¡ }| d|| j¡ |
 %¡ r‚|  &|¡ n|r|
 '¡ r|  (|¡ W | 	d¡ | 
¡  dS | 	d¡ | 
¡  w )a…  Insert a newline and indentation after Enter keypress event.

        Properly position the cursor on the new line based on information
        from the current line.  This takes into account if the current line
        is a shell prompt, is empty, has selected text, contains a block
        opener, contains a block closer, is a continuation line, or
        is inside a string.
        rç   rã   r   rå  rT   rp  rN   Nrb   zinsert - %d charsrO  Zconsolerê   zbogus continuation type %r))rF   rÝ  r³   r  rö   rÃ   ró   rç   rÊ   rø   r´   rè  rÄ   r   ZParserr¬   r«   ry   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—   I  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)“rY  Ú
__module__Ú__qualname__Zidlelib.percolatorr%   Zidlelib.colorizerr&   r'   Zidlelib.undor(   Zidlelib.iomenur)   r*   rZ  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(  r7  r5  r;  r‹   rŒ   r‰   rŠ   r…   r†   r‡   rŽ   r   r›   rœ   r   r   r‘   r“   r’   r”   r•   rT  r   r¡   r¢   r£   rb  r¾   rh  ri  r·   rl  rm  r¿   ÚstringÚascii_lettersÚdigitsrq  rt  r¯   ru  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½  ry  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   rO  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"   Ú
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  2  s   ÿý€zIndentSearcher.runN)
rY  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 )Nrn  r   rT   )rN  )ÚsrŸ  r!   r!   r"   r  D  s   
r  ú[ú]ú/)ZbracketleftZbracketrightZslashc                 C   s´   |   |¡}|rt ¡ r|dv rdS |d }t ddd„ |¡}t ddd„ |¡}t d	d|¡}t d
d|¡}t dd|¡}t dd|¡}t dd|¡}t dd|¡}t dd|¡}|S )N>   rL   rR   rS   r>   r   z-[a-z]\bc                 S   s   |   ¡  ¡ S rÖ   )rÿ  Úupper©r´  r!   r!   r"   rQ   ]  s    z!get_accelerator.<locals>.<lambda>z\b\w+\bc                 S   s   t  |  ¡ |  ¡ ¡S rÖ   )ÚkeynamesrÃ   rÿ  r  r!   r!   r"   rQ   ^  s    zKey-ZCancelz
Ctrl-BreakzControl-zCtrl-rÆ  ú+z><rå   rì   rî   )rÃ   r   Z	isCocoaTkr°  Úsub)r{  r,  r|  r  r!   r!   r"   r‚  S  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:  )rq   rÜ   r!   r!   r"   Úfixwordbreaksi  s   r  c                 C   s~   | }t |ƒ tjdd … rtjd }nd }t |d ¡ t||d}|j}d|d< tdƒD ]}| dd| t	|ƒ d ¡ q,d S )	NrT   )rq   rÑ   é
   rH   é   rç   z  rp  )
r  r   Úargvr   ZsetupAppr$   rF   rò   rç   rô   )r=  rq   rÑ   r  rF   rŸ  r!   r!   r"   Ú_editor_windowr  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Ã  rD  ÚtkinterZtkinter.fontr   Ztkinter.ttkr   r   r   Zidlelib.configr   rZ  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"  rY  ZunittestrA   Zidlelib.idle_test.htestr  r!   r!   r!   r"   Ú<module>   s~    
           Z

4
ý	û