a
    	¼3j   ã                   @   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 )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   sb   t j\} }}}}d| |f }|d|f 7 }|dkrB|d|f 7 }n|dkr^|d|d |f 7 }|S )zYFormat sys.version_info to produce the Sphinx version string used to install the chm docsz%s%sz%sÚ	candidatezrc%sÚfinalr   )ÚsysÚversion_info)ÚmajorÚminorÚmicroÚlevelÚserialÚrelease© r    úJ/www/server/python_manager/versions/3.9.10/lib/python3.9/idlelib/editor.pyÚ_sphinx_version%   s    r"   c                   @   s<  e Zd ZddlmZ ddlmZmZ ddlm	Z	 ddl
mZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZmZmZ ddl m!Z! ddl"m#Z# ddl$m%Z% e& '¡ Z(dZ)dZ*dZ+dÙdd„Z,dÚdd„Z-dd„ Z.dd„ Z/dd„ Z0dd„ Z1dÛdd „Z2g d!¢Z3d"d#„ Z4d$d%„ Z5d&d'„ Z6d(d)„ Z7d*d+„ Z8dZ9d,d-„ Z:d.gZ;d/d0„ Z<d1d2„ Z=d3d4„ Z>d5d6„ Z?dÜd7d8„Z@dÝd9d:„ZAdÞd;d<„ZBdßd=d>„ZCd?d@„ ZDdAdB„ ZEdCdD„ ZFdàdEdF„ZGdádGdH„ZHdIdJ„ ZIdKdL„ ZJdMdN„ ZKdOdP„ ZLdQdR„ ZMdSdT„ ZNdUdV„ ZOdWdX„ ZPdYdZ„ ZQd[d\„ ZRd]d^„ ZSdâd_d`„ZTdãdadb„ZUdädcdd„ZVdedf„ ZWdgdh„ ZXdidj„ ZYdkdl„ ZZdmdn„ Z[dodp„ Z\dqdr„ Z]dsdt„ Z^e_j`e_ja du Zbdvdw„ Zcdxdy„ Zddzd{„ Zed|d}„ Zfd~d„ Zgd€d„ Zhd‚dƒ„ Zid„d…„ Zjdåd†d‡„Zkdˆd‰„ ZldŠd‹„ ZmdŒd„ ZndŽd„ Zodd‘„ Zpd’d“„ Zqd”d•„ Zrd–d—„ Zsdæd™dš„Ztd›dœ„ Zudçddž„ZvdŸd „ Zwd¡d¢„ Zxd£d¤„ Zyd¥d¦„ Zzd§d¨„ Z{d©dª„ Z|d«d¬„ Z}d­d®„ Z~d¯d°„ Zd±d²iZ€d³d´„ Zdèdµd¶„Z‚déd·d¸„Zƒd¹dº„ Z„dêd»d¼„Z…dëd½d¾„Z†d¿dÀ„ Z‡dÁdÂ„ ZˆdÃdÄ„ Z‰dÅdÆ„ ZŠdìdÇdÈ„Z‹dÉdÊ„ ZŒdËdÌ„ ZdÍdÎ„ ZŽdÏdÐ„ ZdÑdÒ„ ZdÓdÔ„ Z‘dÕdÖ„ Z’díd×dØ„Z“dS )îÚEditorWindowr   )Ú
Percolator)ÚColorDelegatorÚcolor_config)ÚUndoDelegator)Ú	IOBindingÚencoding)Úmainmenu)ÚMultiStatusBar)ÚAutoComplete)Ú
AutoExpand)ÚCalltip)ÚCodeContext)ÚLineNumbers)ÚFormatParagraphÚFormatRegionÚIndentsÚRstrip)Ú
ParenMatch)ÚSqueezer)Ú
ZoomHeightNTc                 C   sL	  ddl m} tjd u rtj tjdd¡}tj	 
d¡rvddtjd d…   }tj d	¡r^d
}qÌd}tj ||dd¡}nVtj	d d… dkr²tj tjddtƒ  ¡}	tj |	¡rÌ|	}ntj	dkrÌtj tjd¡}tj |¡}tj |¡r|t_tj	dkrdtj t_ndtjd d…  t_|| _|p*|j}|| _t|ƒ| _tj|| jd | _}
|rl|j| _|j| j_ni | _i | j_tjotj tjd¡| _d| _t|
ƒ | _ }t!|dd | _"}tj#ddddd}dddd|d tj#ddd!ddd"œ}t$t%ƒ|fi |¤Ž | _&}| j&| j_'|  (¡  |  )¡  | j *d#| j+¡ | j ,d$| j-¡ t. /¡ rx| ,d$| j-¡ | ,d%| j0¡ | ,d&| j0¡ n| ,d'| j0¡ | ,d(t1¡ | ,d)t1¡ | ,d*t1¡ | ,d+| j2¡ | ,d,| j3¡ | ,d-| j4¡ | ,d.| j5¡ | ,d/| j6¡ | ,d0| j7¡ | ,d1| j8¡ | ,d2| j9¡ | ,d3| j:¡ | ,d4| j;¡ | ,d5d6d7„ ¡ | ,d8| j<¡ | ,d9| j=¡ | ,d:| j>¡ | ,d;| j?¡ | ,d<| j@¡ | ,d=| jA¡ | ,d>| jB¡ | ,d?| jC¡ | ,d@| jD¡ | ,dA| jE¡ | ,dB| jF¡ |  G| ¡ | _H}| ,dC|jI¡ | ,dD|jJ¡ | ,dE|jK¡ | ,dF|jL¡ | ,dG|jM¡ | ,dH|jN¡ |  O| ¡}| ,dI|jP¡ | ,dJ|jQ¡ | ,dK|  Rd¡¡ | ,dL|  RdM¡¡ | ,dN| jS¡ | ,dO| jT¡ | ,dP| jU¡ |r ||j| < |rØ| |jV|< | ,dQ| jW¡ | ,dR| jjX¡ | ,dS| jY¡ | ,dT| jZ¡ | ,dU| j[¡ |  \¡  |j]t^t_dMdV |j`dMdMdW |jadMdMdW | jb|dX< |jcdMdtddY |je|dZ< t f| jdd¡|d[< |jcdMdMtddY | g¡  |  h¡  tj#dd\d]d^d}| | _id_| _j| jj| _k|  l¡  tmtd`ƒsô| j&da t_n|  o¡  db| _p|  q|¡ | _r}|  s¡  | _t}| u|¡ |jv|_v|jw|_w| x| jy¡ |  z| ¡ | _{}| || j}¡ dc| _~|  dc¡ d | _€d | _d | _‚|rÞtj ƒ|¡rÎtj |¡sÎ| „|¡rÞdd| _~|  …|¡}|  |¡ n| †|¡ dd| _~|  ‡¡  |  y¡  |  ˆ¡  |  ‰¡  | jŠ ‹de¡}|rT| Œdf¡}|d u r(dg}|dkrB| ¡  |dM }|| _Žt | j¡ t‘j’| _’t“j”| _”t“j•| _•| –dhdi¡ | –djdkdldm¡ | –dndo¡ | –dpdq¡ | –drdqdsdt¡ |  —| ¡}| ,dh|j˜¡ | ,dj|j™¡ | ,du|jš¡ | ,dv|  ›| ¡jœ¡ | ,dw|  | ¡jž¡ |  Ÿ| ¡}| ,dx|j ¡ | ,dr|j¡¡ || ƒ}| ,dy|j¢¡ | ,dz|j£¡ | ,d{|j¤¡ | ,d||  ¥| ¡j¦¡ |  §| ¡ | _¨}| ,dn|j©¡ | ,dp|jª¡ | ,d}|j«¡ | ,d~|  ¬| ¡j­¡ | j®rì|  ¯| ¡| _| ,d| jj°¡ n|  ±d€dd‚¡ | j²	r:|  ³| ¡| _‚tj#dddƒd^d	r*|  ´¡  | ,d„| j´¡ n|  ±d€d…d‚¡ d S )†Nr   )ÚScriptBindingZDocz
index.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>©   ó    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   Ú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_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'   ÚundoÚinsertfilterÚundo_block_startÚundo_block_stopZset_saved_change_hookÚsaved_change_hookr(   ÚioZset_filename_change_hookÚfilename_change_hookZ	good_loadÚset_indentation_paramsÚcolorÚcode_contextÚline_numbersÚexistsÚloadfileÚispythonsourceZset_filenameÚResetColorizerÚupdate_recent_files_listÚload_extensionsÚmenudictÚgetÚindexÚadd_separatorÚ	wmenu_endZregister_callbackÚpostwindowsmenur   Z
askintegerr   ZaskyesnoÚ	showerrorÚ	event_addr,   Zautocomplete_eventZtry_open_completions_eventZforce_open_completions_eventr-   Zexpand_word_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_eventr7   Zzoom_height_eventÚallow_code_contextr/   Ztoggle_code_context_eventÚupdate_menu_stateÚallow_line_numbersr0   Útoggle_line_numbers_event)Úselfrq   ÚfilenameÚkeyrr   r8   ZdochomeZpyverZbasepathZchmfileru   r|   r?   rB   Ztext_optionsrF   r›   ÚindentsZ	usespacesr³   r´   r¹   Ú	is_py_srcr=   rb   ZautocompleteZ
parenmatchZscriptbindingrÍ   r    r    r!   Ú__init__H   sÀ   
ÿÿ

ÿÿ
ÿÿù







ÿ






ÿÿ
ÿÿ
ÿ
ÿÿzEditorWindow.__init__c                 C   s   |   ¡  d S ©N)r«   ©rÒ   rP   r    r    r!   r†   `  s    zEditorWindow.handle_winconfigc                 C   s^   | j }tt|jj| d¡| d¡gƒƒ}| ¡ d|  }t|| d¡d d¡}|| | _	d S )NZborderrI   r<   r\   )r\   Ú0)
rF   ÚsumÚmapÚtkZgetintZcgetZwinfo_widthr   ÚmeasurerB   )rÒ   rF   Zinner_paddingZpixel_widthZzero_char_widthr    r    r!   r«   c  s    ÿÿzEditorWindow.set_widthc                 C   s   | j  ¡ \}}| j |¡ dS rM   )r¹   Zdefaultfilenamerq   Únew)rÒ   rP   Ú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¡rd| j ddd¡rd| j ddd¡rdt| j d¡ d¡d	 ƒ}n8| j dd¡}tt	|ƒƒD ]}|| d
vr~ qœq~t	|ƒ}t| j d¡ d¡d	 ƒ}||krÂd}dt
|ƒ d }|j d	@ dkrò| j ddd¡ n²| j d¡s| j dd¡ n@| j | j d¡d| j d¡¡rB| j dd¡ n| j dd¡ | j |¡}| j d¡}| j |d|¡r„|| }}| j ddd¡ | j d||¡ | j d|¡ | j d¡ dS )Né   r   ZHomeZiomarkú<=zinsert lineendúinsert linestartÚ.rU   )ú ú	Úinsertzinsert linestart+ÚcÚselú1.0rb   ú	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    u  sF    ÿþ
ÿ
zEditorWindow.home_callbackc                 C   s°   |   | j¡| _t| jdddd}tjdkr<| jjddtd | jjdd	td | jjd
dtd | jjt	t
d |jt	t
d | j d| j¡ | j ddd¡ | j | j¡ d S )NrU   Zgrey75)rH   ZborderwidthZ
backgroundr   Z	_padding1z    )rV   r[   zCol: ?rú   zLn: ?)rV   rW   z<<set-line-and-column>>z<KeyRelease>z<ButtonRelease>)r+   ru   Ú
status_barr{   r   rl   Ú	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å   r[   zCol: %srú   zLn: %s)rF   rÇ   ZINSERTrò   rþ   rÿ   )rÒ   rP   rú   r[   r    r    r!   r  °  s    z EditorWindow.set_line_and_column))ÚfileZ_File)ÚeditZ_Edit)ÚformatZF_ormat)ÚrunZ_Run)rd   Z_Options)r   Z_Window)r
   Z_Helpc                 C   sâ   | j }i  | _}| jD ]N\}}t|ƒ\}}t| |› dd ƒ}t||d|d ||< }|j|||d qt ¡ r’t|ddd |d< }|jd|d	 |  	¡  t| j dd
| _
| jd jddd| j
d | jd  t¡| _|  ¡  d S )NZ_menu_postcommandr   )r@   ÚtearoffÚpostcommand)Úlabelr=   Ú	underlineZapple)r@   r  ZapplicationZIDLE)r	  r=   ©r  r  r:   zRecent Files)r	  r
  r=   r
   )rt   rÅ   Ú
menu_specsÚprepstrÚgetattrrs   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   rb   rc   rU   )rÅ   rÇ   rÉ   Údeleter   Zadd_windows_to_menu)rÒ   r=   rb   r    r    r!   rÊ   Ö  s    


zEditorWindow.postwindowsmenuc                 C   s   | j | }|j||d dS )z$Update label for menu item at index.)r	  N©rÅ   Úentryconfig)rÒ   r=   rÇ   r	  Úmenuitemr    r    r!   Úupdate_menu_labelà  s    
zEditorWindow.update_menu_labelc                 C   s   | j | }|j||d dS )z$Update state for menu item at index.©rð   Nr  )rÒ   r=   rÇ   rð   r  r    r    r!   rÏ   å  s    
zEditorWindow.update_menu_statec                 G   sT   |dkr<t |d ƒ}t|  d¡| ƒ|  d¡ }d}|df}| jj|g|¢R Ž  dS )zHandle scrollbar.Zmovetor   rb   ú@0,0ZscrollZunitsrN   )ÚfloatÚroundÚ	getlinenorF   Úyview)rÒ   rP   ÚargsZfractionÚlinesr    r    r!   r¨   ê  s    ÿzEditorWindow.handle_yviewc              	   C   s0  | j }| d|j› d|j› ¡}z | dd|¡o<| |dd¡}W n tyV   d}Y n0 |sv| ddd	¡ | d
|¡ | js„|  	¡  | j}|| _
tjd d… dk}|r²|jdd | jD ]N}z|\}}	}
W n tyà   Y q¸Y n0 |
d u rìq¸t| |
ƒƒ }|j||d q¸| |j|j¡ |r,| j jdd dS )Nú@ú,rì   rã   rî   Frê   rë   rb   rè   r:   r;   Zarrow)Zcursorr  ZibeamrN   )rF   rÇ   ÚxÚyrñ   ÚTclErrorrö   r÷   ÚrmenuÚ
make_rmenurP   r   rl   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…   ÷  s>    ÿ


zEditorWindow.right_menu_event)ÚCloserK   Nc                 C   sf   t | jdd}| jD ]F}|d |d  }}|d urR| j|fdd„}|j||d q| ¡  q|| _d S )Nr   r  rU   c                 S   s   |   |¡ d S rØ   ©Úevent_generate©rF   r+  r    r    r!   rY   $  s    z(EditorWindow.make_rmenu.<locals>.command©r	  rY   )rs   rF   r(  Úadd_commandrÈ   r&  )rÒ   r&  r*  r	  r+  rY   r    r    r!   r'    s    

zEditorWindow.make_rmenuc                 C   s   |   ¡ S rØ   )Úrmenu_check_copy©rÒ   r    r    r!   Úrmenu_check_cut+  s    zEditorWindow.rmenu_check_cutc                 C   s6   z| j  d¡}W n ty$   Y dS 0 |r.dS dS d S )Nrì   re   Únormal©rF   rÇ   r%  )rÒ   Zindxr    r    r!   r2  .  s
    zEditorWindow.rmenu_check_copyc                 C   s6   z| j j d| j d¡ W n ty,   Y dS 0 dS d S )Nztk::GetSelectionZ	CLIPBOARDre   r5  )rF   rÝ   Úcallr%  r3  r    r    r!   Úrmenu_check_paste6  s
    zEditorWindow.rmenu_check_pastec                 C   s   t  | j¡ dS )zHandle Help 'About IDLE' event.rN   )r   ZAboutDialogru   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ConfigDialogru   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.rN   )rr   ru   r
   Zshow_idlehelp)rÒ   rP   Úparentr    r    r!   r‹   J  s
    
zEditorWindow.help_dialogc              
   C   sp   t jd d… dkr`zt | j¡ W ql ty\ } z"tjdt|ƒ| j	d W Y d }~qld }~0 0 nt
 | j¡ dS )Nr:   r;   úDocument Start Failure©ÚtitleÚmessager9  rN   )r   rl   rh   Ú	startfilerg   ÚOSErrorr   rË   rõ   rF   Ú
webbrowserÚopen)rÒ   rP   Úwhyr    r    r!   rŒ   T  s    
ÿzEditorWindow.python_docsc                 C   s   | j  d¡ dS )Nz<<Cut>>rN   ©rF   r.  rÙ   r    r    r!   r‡   _  s    zEditorWindow.cutc                 C   s    | j  d¡sd S | j  d¡ dS )Nrê   z<<Copy>>rN   )rF   Z
tag_rangesr.  rÙ   r    r    r!   rˆ   c  s    zEditorWindow.copyc                 C   s   | j  d¡ | j  d¡ dS )Nz	<<Paste>>rè   rN   )rF   r.  rù   rÙ   r    r    r!   r‰   j  s    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   o  s    zEditorWindow.select_allc                 C   s    | j  ddd¡ | j  d¡ dS )Nrê   rë   rb   rè   rN   )rF   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                    s@   | j d@ dkr<zˆdƒ ˆdˆˆ  ƒ W n ty:   Y n0 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Ò   rE  rF  r    rD  r!   r   z  s
    z&EditorWindow.move_at_edge_if_selectionc                 C   s   | j  d¡ dS )Nz<Meta-Delete>rN   rC  rÙ   r    r    r!   rž   Ž  s    zEditorWindow.del_word_leftc                 C   s   | j  d¡ dS )Nz<Meta-d>rN   rC  rÙ   r    r    r!   rŸ   ’  s    zEditorWindow.del_word_rightc                 C   s   t  | j¡ dS rM   )r   ÚfindrF   rÙ   r    r    r!   r’   –  s    zEditorWindow.find_eventc                 C   s   t  | j¡ dS rM   )r   Z
find_againrF   rÙ   r    r    r!   r“   š  s    zEditorWindow.find_again_eventc                 C   s   t  | j¡ dS rM   )r   Zfind_selectionrF   rÙ   r    r    r!   r•   ž  s    z!EditorWindow.find_selection_eventc                 C   s   t   | j| j| j¡ dS rM   )r	   rF   r¹   rq   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–   ¦  s    zEditorWindow.replace_eventc                 C   sT   | j }t |dd¡j}|d urP| ddd¡ | d|› d¡ | d¡ |  ¡  dS )	Nz
Go To Linez/Enter a positive integer
('big' = end of file):rê   rë   rb   rè   ú.0rN   )rF   r   ZGotoÚresultrö   r÷   rù   r  )rÒ   rP   rF   Úlinenor    r    r!   r—   ª  s    þ
zEditorWindow.goto_line_eventc                 C   sn   z| j  dd¡ ¡ }W n ty,   d}Y n0 t | j dd|¡j}|durj| jr^| j |¡ n| j	 
|¡ |S )z¯Get module name from user and open it.

        Return module path or None for calls by open_module_browser
        when latter is not invoked in named editor window.
        rì   rî   r>   zOpen ModulezAEnter the name of a Python module
to search on sys.path and open:N)rF   rÆ   Ústripr%  r   Z
ModuleNamerI  rq   rA  r¹   rÀ   )rÒ   r@   Ú	file_pathr    r    r!   Úopen_module¸  s    
üzEditorWindow.open_modulec                 C   s   |   ¡  dS rM   )rM  rÙ   r    r    r!   r   Ð  s    zEditorWindow.open_module_eventc                 C   sJ   | j j}| jjdkr|s,|  ¡ }|d u r,dS ddlm} | | j|¡ dS )NZPyShellEditorWindowrN   r   )Úbrowser)	r¹   rÓ   Ú	__class__Ú__name__rM  ÚidlelibrN  ZModuleBrowserrr   )rÒ   rP   rÓ   rN  r    r    r!   r£   Ô  s    ÿz EditorWindow.open_module_browserc                 C   s   ddl m} | | j¡ dS )Nr   )ÚpathbrowserrN   )rQ  rR  ZPathBrowserrr   )rÒ   rP   rR  r    r    r!   r¤   ß  s    zEditorWindow.open_path_browserc                 C   s&   dd l }tjddg}|j|dd dS )Nr   z-cz,from turtledemo.__main__ import main; main()F)ÚshellrN   )Ú
subprocessr   Ú
executableÚPopen)rÒ   rP   rT  Úcmdr    r    r!   r¥   ä  s    þzEditorWindow.open_turtle_democ                 C   sN   |d urJ|dkrJ| j  dd| ¡ | j  ddd¡ | j  ddd¡ |  ¡  d S )Nr   rè   z%d.0rê   rë   rb   z
insert +1l)rF   r÷   rö   rø   Úcenter)rÒ   rJ  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)	rh   ri   rn   Úsplitextrá   ÚnormcaserF   rÆ   Ú
startswith)rÒ   rÓ   ÚbaseÚextrú   r    r    r!   rÁ   ô  s    zEditorWindow.ispythonsourcec                 C   s   | j r| j  | ¡ d | _ d S rØ   )rq   Zunregister_maybe_terminater3  r    r    r!   Ú
close_hooký  s    zEditorWindow.close_hookc                 C   s
   || _ d S rØ   )r_  )rÒ   r_  r    r    r!   Úset_close_hook  s    zEditorWindow.set_close_hookc                 C   s2   | j r| j  | ¡ |  ¡  | j | ¡ |  ¡  d S rØ   )rq   Zfilename_changed_editr¸   ru   Zupdate_windowlist_registryrÂ   r3  r    r    r!   rº     s
    z!EditorWindow.filename_change_hookc                 C   sV   | j r
d S |  | jj¡r"|  ¡ | _ | j rR| j | j¡ | j | j ¡ | j | j¡ d S rØ   )	r¼   rÁ   r¹   rÓ   r%   r³   Úremovefilterr´   rµ   r3  r    r    r!   Ú_addcolorizer  s    
zEditorWindow._addcolorizerc                 C   s,   | j s
d S | j  ¡  | j | j ¡ d | _ d S rØ   )r¼   Zremovecolorsr³   ra  r3  r    r    r!   Ú_rmcolorizer  s
    
zEditorWindow._rmcolorizerc                 C   sH   |   ¡  |  ¡  t | j¡ | jdur0| j ¡  | jdurD| j ¡  dS )zUpdate the color themeN)	rc  rb  r#   r&   rF   r½   Zupdate_highlight_colorsr¾   Zupdate_colorsr3  r    r    r!   rÂ     s    


zEditorWindow.ResetColorizerÚ_c                 C   sp   |  d|¡ | |¡}|r6|| jv r6|  d|d |¡ d| |¡krR| d|¡ n| d|d ¡ | |¡ d S )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   s2   t jddddd}|s"d| jd< nt j| jd< dS )	z&Update the cursor blink configuration.rA   r#   zcursor-blinkr^   rD   r   r`   N)r   r}   rF   r_   )rÒ   Zcursorblinkr    r    r!   r±   8  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ª   rr   rF   r«   )rÒ   Znew_fontr    r    r!   Ú	ResetFontB  s    




zEditorWindow.ResetFontc                 C   s|   t  ¡  | j_}| ¡ D ]\}}| jj|g|¢R Ž  q|  ¡ D ]8}t  |¡}|r>| ¡ D ]\}}| jj|g|¢R Ž  qXq>dS )z/Remove the keybindings before they are changed.N)	r   ÚGetCurrentKeySetr*   Údefault_keydefsÚitemsrF   Zevent_deleteÚget_standard_extension_namesÚGetExtensionBindings)rÒ   ÚkeydefsrP   ÚkeylistÚextensionNameÚxkeydefsr    r    r!   ÚRemoveKeybindingsS  s    
zEditorWindow.RemoveKeybindingsc                 C   sB  t  ¡  | j_}|  ¡  |  ¡ D ]}t  |¡}|r |  |¡ q i }| jjD ]B}i ||d < |d D ](}|rb|d ||d  t|d ƒd < qbqJ| j	D ]¨}| j	| }| 
t¡}|du r¶q”|d7 }td|ƒD ]r}	| |	¡dkrÈ| |	d¡}
|
rÈ| |	d¡}d}||v r||| v r|| | }|rÈt||ƒ}
|j|	|
d qÈq”dS )	z-Update the keybindings after they are changedr   rU   NrY   Úacceleratorr	  r>   )rv  )r   rl  r*   rm  r€   ro  rp  Úmenudefsr  rÅ   rÇ   r  ró   rE   Z	entrycgetÚget_acceleratorr  )rÒ   rq  rs  rt  ZmenuEventDictr=   r*  ZmenubarItemrb   rÇ   ZaccelZitemNamerP   r    r    r!   ÚApplyKeybindings_  s<    
$




zEditorWindow.ApplyKeybindingsc                 C   s   | j stjddddd| _dS )zCUpdate the indentwidth if changed and not using tabs in this windowrA   r]   z
num-spacesrC   rD   N)r¬   r   r}   r®   r3  r    r    r!   r¯   ƒ  s    
ÿz#EditorWindow.set_notabs_indentwidthc                 C   s|   t  ¡ }| jd }| t¡}|| jkr8| | jd |¡ |rn| ¡  |D ]$}|  |d ¡}|j	|d |d qH|| jd< dS )z3Update the additional help entries on the Help menur
   rU   r   r0  N)
r   ZGetAllExtraHelpSourcesListrÅ   rÇ   r  r  r  rÈ   Ú"_EditorWindow__extra_help_callbackr1  )rÒ   Z	help_listZhelpmenuZhelpmenu_lengthÚentryrW  r    r    r!   r  Š  s    


z$EditorWindow.reset_help_menu_entriesc                    s   |f‡ fdd„	}|S )zCCreate a callback with the helpfile value frozen at definition timec              
      s‚   |   d¡stj | ¡} tjd d… dkrtzt | ¡ W q~ typ } z"tj	dt
|ƒˆ jd W Y d }~q~d }~0 0 n
t | ¡ d S )N)ZwwwÚhttpr:   r;   r:  r;  )r\  rh   ri   rp   r   rl   r>  r?  r   rË   rõ   rF   r@  rA  )ÚhelpfilerB  r3  r    r!   Údisplay_extra_help  s    

ÿz>EditorWindow.__extra_help_callback.<locals>.display_extra_helpr    )rÒ   r}  r~  r    r3  r!   Z__extra_help_callback›  s    z"EditorWindow.__extra_help_callbackc              
      sæ  g }| j }|rRtj |¡rRt|dddd}| ¡ }W d  ƒ n1 sH0    Y  |r„tj |¡d }||v rx| |¡ | d|¡ g ‰ |D ]*}d|v s¬tj |dd	… ¡sŒˆ  	|¡ qŒ‡ fd
d„|D ƒ}d}|dt
|ƒ… }|r~z@t|dddd}| |¡ W d  ƒ n1 s0    Y  W nX ty| } z>t| jddƒshd| j_tjdd|› d| jd W Y d}~n
d}~0 0 | jjD ]Z}	|	j}
|
 dt¡ t|ƒD ]8\}}| ¡ }|	 |¡}|
j|| d | |dd q¤q†dS )z/Load and update the recent files list and menusÚrÚutf_8r   )r)   ÚerrorsNrf  r   ú rc   c                    s   g | ]}|ˆ vr|‘qS r    r    )Ú.0ri   ©Z	bad_pathsr    r!   Ú
<listcomp>½  rR   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	  rY   r
  )ry   rh   ri   r¿   rA  Ú	readlinesÚabspathÚremoverè   Úappendrô   Ú
writelinesr?  r  rr   r‡  r   ÚshowwarningrF   ru   rx   r  r  r  Ú	enumerateÚrstripÚ#_EditorWindow__recent_file_callbackr1  )rÒ   Únew_fileZrf_listrL  Zrf_list_fileri   ZulcharsZrf_fileÚerrÚinstancer=   ÚiÚ	file_nameÚcallbackr    r„  r!   rÃ   ª  s\    ÿ&
ÿ.ÿü
þz%EditorWindow.update_recent_files_listc                    s   |f‡ fdd„	}|S )Nc                    s   ˆ j j| d d S )N)ZeditFile)r¹   rA  )Z
fn_closurer3  r    r!   Úopen_recent_fileÙ  s    z=EditorWindow.__recent_file_callback.<locals>.open_recent_filer    )rÒ   r•  r—  r    r3  r!   Z__recent_file_callbackØ  s    z#EditorWindow.__recent_file_callbackc                 C   s‚   |   ¡ }|  ¡ }|r*|r*|d | t }n|r4|}n|r>|}nd}|pL|pL|}|  ¡ sfd| }d| }| j |¡ | j |¡ d S )Nz - Úuntitledz*%s*z*%s)Úshort_titleÚ
long_titleÚ_py_versionÚ	get_savedru   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œ  r3  r    r    r!   rœ  ï  s    zEditorWindow.get_savedc                 C   s   | j  |¡ d S rØ   )r´   Ú	set_saved)rÒ   Úflagr    r    r!   rž  ò  s    zEditorWindow.set_savedc                 C   s   | j  ¡  d S rØ   )r´   Ú
reset_undor3  r    r    r!   r   õ  s    zEditorWindow.reset_undoc                 C   s   | j j}|rtj |¡S dS )Nr˜  )r¹   rÓ   rh   ri   rá   )rÒ   rÓ   r    r    r!   r™  ø  s    zEditorWindow.short_titlec                 C   s   | j jp
dS )Nr>   )r¹   rÓ   r3  r    r    r!   rš  ü  s    zEditorWindow.long_titlec                 C   s   |   ¡  dS rM   )rX  rÙ   r    r    r!   rŠ   ÿ  s    z EditorWindow.center_insert_eventrè   c                 C   sH   | j }|  ¡ \}}|  |¡}|| }td||d  ƒ}| t|ƒ¡ d S )NrU   r<   )rF   Úgetwindowlinesr  Úmaxr  r  )rÒ   ÚmarkrF   ru   ÚbotrJ  rH   Znewtopr    r    r!   rX    s    
zEditorWindow.centerc                 C   sN   | j }|  d¡}|  d¡}||krF| ¡ dkrFt|d ƒ}|| d }||fS )Nr  z@0,65535rU   rH   )rF   r  Zwinfo_heightrC   )rÒ   rF   ru   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+))ru   Zwm_geometryÚreÚmatchÚlistrÜ   rC   Úgroups)rÒ   ZgeomÚmr    r    r!   Úget_geometry  s    
zEditorWindow.get_geometryc                 C   s   |   ¡  dS rM   )r‚   rÙ   r    r    r!   r„     s    zEditorWindow.close_eventc                 C   sH   | j rD|  ¡ s:| j ¡ dkr&| j ¡  | j ¡  | j ¡  | j  ¡ S d S )Nr5  )r¹   rœ  ru   rð   Z	deiconifyÚlowerZliftÚ	maybesaver3  r    r    r!   r¬  #  s    


zEditorWindow.maybesavec                 C   s:   z"|   ¡ }t|ƒdkr|  ¡  |W S  ty4   Y n0 d S )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	rX| j	 ¡  d | _	d | _
d | _| j ¡  d | _| j ¡  | jrŒ|  ¡  d S )N)r‘  )r¹   rÓ   rÃ   r   Zunregister_callbackrÊ   Úunload_extensionsr‚   r´   r¼   rF   rw   r³   ru   Zdestroyr_  r3  r    r    r!   r®  5  s"    



zEditorWindow._closec                 C   s   i | _ |  ¡  d S rØ   )Ú
extensionsÚload_standard_extensionsr3  r    r    r!   rÄ   I  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°  M  s    

zEditorWindow.unload_extensionsc                 C   sD   |   ¡ D ]6}z|  |¡ W q   tdt|ƒƒ t ¡  Y q0 qd S )NzFailed to load extension)ro  Úload_extensionÚprintÚreprÚ	tracebackÚ	print_exc)rÒ   r@   r    r    r!   r²  S  s    z%EditorWindow.load_standard_extensionsc                 C   s   t jddS )NT)Zeditor_only)r   ZGetExtensionsr3  r    r    r!   ro  [  s    z)EditorWindow.get_standard_extension_namesZZzDummyZzzdummyc           	   	   C   s6  | j  ||¡}z<ztjd| td}W n  ttfyF   t |¡}Y n0 W n tyh   td|ƒ ‚ Y n0 t||ƒ}t	 
|¡}t|dƒr–|  |j|¡ || ƒ}|| j|< |r2|  |¡ |D ]t}| dd¡}|d d… dkrê|dd … }qÌ|d	d … d
kr
|d d	… }qê|d }t||ƒr¼| j |t||ƒ¡ q¼d S )Nrå   )Úpackagez
Failed to import extension: rw  ú-rd  rU   rí   rc   rï   Z_event)ÚextfilesrÆ   Ú	importlibÚimport_moduleÚ__package__ÚImportErrorÚ	TypeErrorr¶  r  r   rp  r°   r  rw  r±  r€   r   rF   rƒ   )	rÒ   r@   ZfnameÚmodÚclsrq  r´  ZveventZ
methodnamer    r    r!   rµ  b  s4    






zEditorWindow.load_extensionc                 C   sH   |d u r| j j}| j}||_| ¡ D ]\}}|r$|j|g|¢R Ž  q$d S rØ   )r*   rm  rF   rq  rn  rÌ   )rÒ   rq  rF   rP   rr  r    r    r!   r€   ~  s    zEditorWindow.apply_bindingsc              	   C   sê   |du r| j j}|du r | j j}| j}| j}|D ]´\}}| |¡}|sHq0|D ]–}|s^| ¡  qL|\}	}
|	dd… dk}|r†|	dd… }	t|	ƒ\}}	t||
ƒ}||
fdd„}|rÐ|  	|
t
¡}|j|	||||d qL|j|	|||d qLq0dS )zAdd appropriate entries to the menus and submenus

        Menus that are absent or None in self.menudict are ignored.
        NrU   ú!c                 S   s   |   |¡ d S rØ   r-  r/  r    r    r!   rY      s    z(EditorWindow.fill_menus.<locals>.command)r	  r
  rY   rv  Úvariable)r	  r
  rY   rv  )r*   rw  rm  rÅ   rF   rÆ   rÈ   r  rx  Úget_var_objZ
BooleanVarZadd_checkbuttonr1  )rÒ   rw  rq  rÅ   rF   ZmnameZ	entrylistr=   r{  r	  r+  Zcheckbuttonr
  rv  rY   Úvarr    r    r!   r  ‡  s<    


þþzEditorWindow.fill_menusc                 C   s&   |   |¡}|r| ¡ }|S t|ƒ‚d S rØ   )rÆ  rÆ   Ú	NameError)rÒ   r@   rÇ  Úvaluer    r    r!   Úgetvar¬  s
    
zEditorWindow.getvarc                 C   s(   |   ||¡}|r| |¡ nt|ƒ‚d S rØ   )rÆ  r©   rÈ  )rÒ   r@   rÉ  ÚvartyperÇ  r    r    r!   Úsetvar´  s    zEditorWindow.setvarc                 C   s,   | j  |¡}|s(|r(|| jƒ | j |< }|S rØ   )rw   rÆ   rF   )rÒ   r@   rË  rÇ  r    r    r!   rÆ  »  s    zEditorWindow.get_var_objc                 C   s,   | j r$| j d|¡p"d| j |¡v S dS d S )NZTODOÚSTRINGrU   )r¼   rF   Útag_prevrangeZ	tag_names)rÒ   Z
text_indexr    r    r!   Úis_char_in_stringË  s
    ÿzEditorWindow.is_char_in_stringc                 C   s<   z"| j  d¡}| j  d¡}||fW S  ty6   Y dS 0 d S )Nrì   rî   )NNr6  )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   sB   | j }|  ¡ |kr>|j dd|d d|jd| ¡}|j|d d S )Nr\   rÞ   z
-displayofÚn)rÑ  )rF   rÔ  rÝ   r7  ZmasterZ	configure)rÒ   ZnewtabwidthrF   Zpixelsr    r    r!   Úset_tk_tabwidthè  s    þzEditorWindow.set_tk_tabwidthc                 C   sP   |r@|r@|   ¡ }d|  kr$dkr.n n|| _| j| jkr@d| _|  | j¡ d S )Nr<   r   F)Úguess_indentr®   r­   r¬   rÖ  )rÒ   rÖ   Zguessr”  r    r    r!   r»   ó  s    z#EditorWindow.set_indentation_paramsc           
      C   sP  | j }|  ¡ \}}|r6|r6| ||¡ | d|¡ dS | dd¡}|dkrp| ddd¡rd| d¡ n| ¡  dS |d d	vrŠ| d¡ dS | j}t| 	|¡ƒ}|d
ksªJ ‚|d | j
 | j
 }d
}	|| jkrÐq|d d… }|	d }	t| 	|¡ƒ}||ks|d d	vrÂqqÂ| ¡  | d|	 d¡ ||k rD| dd||  ¡ | ¡  dS )Nrè   rN   rä   r>   rï   rë   z	insert-1crc   ú 	r   rU   z
insert-%dcræ   )rF   rÐ  r  r÷   rÆ   rñ   Zbellr­   rô   Ú
expandtabsr®   rz   r¶   rè   r·   )
rÒ   rP   rF   rü   rý   Úcharsr­   ZhaveZwantZncharsdeletedr    r    r!   r˜   ü  sB    


z"EditorWindow.smart_backspace_eventc           
      C   s   | j }|  ¡ \}}| ¡  zÖ|rb|rbt|ƒt|ƒkrJ| j |¡W | ¡  S | ||¡ | d|¡ | 	dd¡}t
|| jƒ\}}|t|ƒkrœ|  || j ¡ n>| jr¨d}n&t| | j¡ƒ}| j}	d|	||	   }| d|¡ | d¡ W | ¡  dS | ¡  0 d S )Nrè   rä   rç   ræ   rN   )rF   rÐ  r¶   Ú
index2liner›   rœ   r·   r  r÷   rÆ   Úget_line_indentr­   rô   Úreindent_tor®   r¬   rÙ  rè   rù   )
rÒ   rP   rF   rü   rý   ÚprefixÚrawZ	effectiveZpadrÕ  r    r    r!   rš   (  s4    ì
þzEditorWindow.smart_indent_eventc              	   C   s.  | j }|  ¡ \}}| ¡  zø|r>|r>| ||¡ | d|¡ | dd¡}dt|ƒ }}||k rv|| dv rv|d7 }qX||kr¢| dd¡ W | d¡ | 	¡  dS |d|… }d}|râ|d	 dv râ|| j
krâ|dd	… }|d7 }q²|rö| d
| d¡ | d¡dv r| d¡ qö| dd¡ t| d¡ƒ}	t | j| j¡}
| j
s¾| jD ]`}t|	| dƒ}t|ƒd }| |d¡}|
 |¡ |
 |  |¡¡}|dus¢|dkrJ q¬qJ|
 |p¸d¡ n@| dd¡}|rÚ|d }nd}| |d¡}|
 |¡ |
 d¡ |
 ¡ }|tjkrº|tjkr n‚|tjkr:| d|¡ nh|tjkrV|  |
 ¡ ¡ nL|tj krŽ|
 !¡ dkr~| d|¡ n|  |
 "¡ ¡ nds¢J d|f ƒ‚W | d¡ | 	¡  dS |
 #¡ }| d|¡ |
 $¡ rä|  %|¡ n|rþ|
 &¡ rþ|  '|¡ W | d¡ | 	¡  dS | d¡ | 	¡  0 dS )a…  Insert a newline and indentation after Enter keypress event.

        Properly position the cursor on the new line based on information
        from the current line.  This takes into account if the current line
        is a shell prompt, is empty, has selected text, contains a block
        opener, contains a block closer, is a continuation line, or
        is inside a string.
        rè   rä   r   rØ  rU   rf  rN   Nrc   zinsert - %d charsrH  Zconsolerë   zbogus continuation type %r)(rF   rÐ  r¶   r  r÷   rÆ   rô   rè   rù   r·   rz   rÛ  rÇ   r   ZParserr®   r­   r²   r¢  r·  Zset_codeZfind_good_parse_startÚ_build_char_in_string_funcZset_lorÎ  Zget_continuation_typeZC_NONEZC_STRING_FIRST_LINEZC_STRING_NEXT_LINESZ	C_BRACKETrÝ  Zcompute_bracket_indentZC_BACKSLASHZget_num_lines_in_stmtZcompute_backslash_indentZget_base_indent_stringZis_block_openerrš   Zis_block_closerr˜   )rÒ   rP   rF   rü   rý   rú   r”  rÕ  ÚindentÚlnor$  ÚcontextZstartatZstartatindexZrawtextZbodr  ré   r    r    r!   r™   K  sž    	
T
«


ÿ




ò


ý  ÿ
z%EditorWindow.newline_and_indent_eventc                 C   s   || j fdd„}|S )Nc                 S   s   ||d|   ƒS )Nz+%dcr    )ÚoffsetZ_startindexZ_icisr    r    r!   ÚinnerÂ  s    z6EditorWindow._build_char_in_string_func.<locals>.inner)rÏ  )rÒ   Z
startindexrå  r    r    r!   rà  Á  s    ÿ
z'EditorWindow._build_char_in_string_funcc                 C   s2   | j r&t|| jƒ\}}d| d|  S d| S d S )Nrç   ræ   )r¬   Údivmodr­   )rÒ   rÕ  ZntabsZnspacesr    r    r!   Ú_make_blanksÑ  s    zEditorWindow._make_blanksc                 C   sJ   | j }| ¡  | ddd¡r(| dd¡ |r>| d|  |¡¡ | ¡  d S )Nrä   z!=rè   )rF   r¶   rñ   r  rè   rç  r·   )rÒ   r[   rF   r    r    r!   rÝ  Û  s    zEditorWindow.reindent_toc                 C   sP   t | j| jƒ ¡ \}}|r@|r@t|| jƒ\}}t|| jƒ\}}nd }}|| S ©Nr   )ÚIndentSearcherrF   r­   r  rÜ  )rÒ   Ú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Hiderd   rf   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)NNNN)N)N)N)N)N)N)N)N)N)N)N)N)rè   )rè   )N)NN)N)N)T)N)”rP  Ú
__module__Ú__qualname__Zidlelib.percolatorr$   Zidlelib.colorizerr%   r&   Zidlelib.undor'   Zidlelib.iomenur(   r)   rQ  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.squeezerr6   Zidlelib.zoomheightr7   r   ÚgetfilesystemencodingZfilesystemencodingrg   rÎ   rÐ   r×   r†   r«   r¢   r    r¦   r  r  r   rÊ   r  rÏ   r¨   r&  r…   r(  r'  r4  r2  r8  r   rŽ   r‹   rŒ   r‡   rˆ   r‰   r   r‘   r   rž   rŸ   r’   r“   r•   r”   r–   r—   rM  r   r£   r¤   r¥   rY  rÁ   r_  r`  rº   rb  rc  rÂ   ÚstringÚascii_lettersÚdigitsrg  rj  r±   rk  ru  ry  r¯   r  rz  rÃ   r  r¸   rœ  rž  r   r™  rš  rŠ   rX  r¡  r  rª  r„   r¬  r‚   r®  rÄ   r°  r²  ro  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ø   
  
+

%þ




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

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

    The effective # of spaces is the length after properly "expanding"
    the tabs into spaces, as done by str.expandtabs(tabwidth).
    )Ú_line_indent_rer¦  rb   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>   rU   rH  z>=rb   z lineend+1c)ró  r”  r·  rF   rñ   rÆ   )rÒ   r”  r£  r    r    r!   Úreadline  s    zIndentSearcher.readline)ÚclassÚdefÚforÚifÚtryÚwhilec	           	      C   s>   | j rn2||kr ||v r || _n||kr:| jr:|| _d| _ d S )NrU   )ró  rô  rõ  )	rÒ   rE   ÚtokenÚstartrb   rú   ÚINDENTÚNAMEZOPENERSr    r    r!   Ú
tokeneater%  s    zIndentSearcher.tokeneaterc              	   C   sl   t j}| jt _zHz$t  | j¡}|D ]}| j|Ž  q"W n t jtfyL   Y n0 W |t _n|t _0 | j| j	fS rØ   )
ÚtokenizeÚtabsizer­   Úgenerate_tokensrö  r  Ú
TokenErrorÚSyntaxErrorrô  rõ  )rÒ   Zsave_tabsizeÚtokensrý  r    r    r!   r  1  s    zIndentSearcher.runN)
rP  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 )Nrd  r   rU   )rG  )Ú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>   rL   rT   rS   r>   r   z-[a-z]\bc                 S   s   |   ¡  ¡ S rØ   )rò  Úupper©r©  r    r    r!   rQ   \  rR   z!get_accelerator.<locals>.<lambda>z\b\w+\bc                 S   s   t  |  ¡ |  ¡ ¡S rØ   )ÚkeynamesrÆ   rò  r  r    r    r!   rQ   ]  rR   zKey-ZCancelz
Ctrl-BreakzControl-zCtrl-r»  ú+z><ræ   rí   rï   )rÆ   r   Z	isCocoaTkr¥  Úsub)rq  r+  rr  r  r    r    r!   rx  R  s    
rx  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Ý   r7  )rr   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 ¡ qXd S )	NrU   )rr   rÓ   é
   rH   é   rè   z  rf  )
r  r   Úargvr   ZsetupAppr#   rF   ró   rè   rõ   )r9  rr   rÓ   r  rF   r”  r    r    r!   Ú_editor_windowq  s    r  Ú__main__)rA   zidlelib.idle_test.test_editorr<   F)Ú	verbosityÚexit)r  )8Úimportlib.abcr½  Úimportlib.utilrh   rl   r¥  rî  r   r  r¸  r@  ÚtkinterZtkinter.fontr   Ztkinter.ttkr   r   r   Zidlelib.configr   rQ  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  rx  r  r  rP  ZunittestrA   Zidlelib.idle_test.htestr  r    r    r    r!   Ú<module>   sx   
           Z

4
ý	
