U
    ¿|c   ã                   @   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    úlib/python3.8/idlelib/editor.pyÚ_sphinx_version%   s    r"   c                   @   sF  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 „Z2d!d"d#d$d%d&d'gZ3d(d)„ Z4d*d+„ Z5d,d-„ Z6d.d/„ Z7d0d1„ Z8dZ9d2d3„ Z:d4gZ;d5d6„ Z<d7d8„ Z=d9d:„ Z>d;d<„ Z?dâd=d>„Z@dãd?d@„ZAdädAdB„ZBdådCdD„ZCdEdF„ ZDdGdH„ ZEdIdJ„ ZFdædKdL„ZGdçdMdN„ZHdOdP„ ZIdQdR„ ZJdSdT„ ZKdUdV„ ZLdWdX„ ZMdYdZ„ ZNd[d\„ ZOd]d^„ ZPd_d`„ ZQdadb„ ZRdcdd„ ZSdèdedf„ZTdédgdh„ZUdêdidj„ZVdkdl„ ZWdmdn„ ZXdodp„ ZYdqdr„ ZZdsdt„ Z[dudv„ Z\dwdx„ Z]dydz„ Z^e_j`e_ja d{ Zbd|d}„ Zcd~d„ Zdd€d„ Zed‚dƒ„ Zfd„d…„ Zgd†d‡„ Zhdˆd‰„ ZidŠd‹„ ZjdëdŒd„ZkdŽd„ Zldd‘„ Zmd’d“„ Znd”d•„ Zod–d—„ Zpd˜d™„ Zqdšd›„ Zrdœd„ ZsdìdŸd „Ztd¡d¢„ Zudíd£d¤„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   sH	  ddl m} tjd k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|Ž | _&}| j&| j_'|  (¡  |  )¡  | j *d#| j+¡ | j ,d$| j-¡ t. /¡ rt| ,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¡}|rP| Œdf¡}|d kr$dg}|dkr>| ¡  |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²	r6|  ³| ¡| _‚tj#dddƒd^d	r&|  ´¡  | ,d„| j´¡ n|  ±d€d…d‚¡ d S )†Nr   )ÚScriptBindingZDocz
index.htmlZlinuxzpython-docs-z%s.%s.%sé   z/var/www/html/python/z/var/www/html/python/index.htmlz/usr/share/doc/ÚwinzPython%s.chmr   z0Resources/English.lproj/Documentation/index.htmlzfile://zhttps://docs.python.org/%d.%d/é   )Úmenuzrecent-files.lstÚ Úvbar)ÚnameÚmainr#   ÚwidthÚint©ÚtypeÚtexté   ZnoneZwordprocessorÚheight)r?   ÚpadxZwrapZhighlightthicknessrA   ZtabstylerG   ZWM_DELETE_WINDOWú<<close-window>>z<Control-Button-1>z<2>z<3>z<MouseWheel>z
<Button-4>z
<Button-5>z<Configure>z<<cut>>z<<copy>>z	<<paste>>z<<center-insert>>z<<help>>z<<python-docs>>z<<about-idle>>z<<open-config-dialog>>ú<<open-module>>z<<do-nothing>>c                 S   s   dS ©NÚbreakr    ©Úeventr    r    r!   Ú<lambda>©   ó    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TextrE   Zfocused_widgetÚcreatemenubarÚapply_bindingsZprotocolÚcloseÚbindÚclose_eventr   ZisAquaTkÚright_menu_eventr   Úhandle_winconfigÚcutÚcopyÚpasteÚcenter_insert_eventÚhelp_dialogÚpython_docsÚabout_dialogÚconfig_dialogÚopen_module_eventÚ
select_allÚremove_selectionÚ
find_eventÚfind_again_eventÚfind_in_files_eventÚfind_selection_eventÚreplace_eventÚgoto_line_eventÚsmart_backspace_eventÚnewline_and_indent_eventÚsmart_indent_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)Úselfro   ÚfilenameÚkeyrp   r8   ZdochomeZpyverZbasepathZchmfilers   rz   r>   rA   Ztext_optionsrE   r—   ÚindentsZ	usespacesr¯   r°   rµ   Ú	is_py_srcr<   r`   ZautocompleteZ
parenmatchZscriptbindingrÉ   r    r    r!   Ú__init__H   sÒ   
 ÿÿ

ÿÿ
 ÿ   ÿù







 ÿ






 ÿ ÿ
ÿÿ
ÿ
ÿ ÿzEditorWindow.__init__c                 C   s   |   ¡  d S ©N)r§   ©rÎ   rN   r    r    r!   r‚   `  s    zEditorWindow.handle_winconfigc                 C   s^   | j }tt|jj| d¡| d¡gƒƒ}| ¡ d|  }t|| d¡d d¡}|| | _	d S )NZborderrH   r;   rZ   )rZ   Ú0)
rE   ÚsumÚmapÚtkZgetintZcgetZwinfo_widthr   ÚmeasurerA   )rÎ   rE   Zinner_paddingZpixel_widthZzero_char_widthr    r    r!   r§   c  s    ÿÿzEditorWindow.set_widthc                 C   s   | j  ¡ \}}| j |¡ dS rK   )rµ   Zdefaultfilenamero   Únew)rÎ   rN   ÚdirnameÚbasenamer    r    r!   rž   p  s    zEditorWindow.new_callbackc                 C   sÂ  |j d@ dkr|jdkrd S | j d¡rd| j ddd¡rd| j ddd¡rdt| j d¡ d¡d	 ƒ}n8| j dd¡}tt	|ƒƒD ]}|| d
k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Ú.rS   )ú ú	Úinsertzinsert linestart+ÚcÚselú1.0r`   ú	sel.firstZ	my_anchorú<úsel.lastú>rL   )ÚstateZkeysymrE   rÃ   ÚcomparerB   ÚsplitrÂ   ÚrangeÚlenÚstrÚ
tag_removeÚmark_setÚtag_addÚsee)rÎ   rN   ZinsertptÚlineZlineatÚdestÚfirstÚlastr    r    r!   rœ   u  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 )NrS   Zgrey75)rG   ZborderwidthZ
backgroundr   Z	_padding1z    )rT   rY   zCol: ?rö   zLn: ?)rT   rU   z<<set-line-and-column>>z<KeyRelease>z<ButtonRelease>)r+   rs   Ú
status_barry   r   rj   Ú	set_labelZRIGHTr£   ZBOTTOMÚXrE   r   Úset_line_and_columnrÈ   Z
after_idle)rÎ   Úsepr    r    r!   r¢      s    
 ÿzEditorWindow.set_status_barc                 C   s>   | j  t¡ d¡\}}| j dd| ¡ | j dd| ¡ d S )Nrá   rY   zCol: %srö   zLn: %s)rE   rÃ   ZINSERTrî   rú   rû   )rÎ   rN   rö   rY   r    r    r!   rý   °  s    z EditorWindow.set_line_and_column)ÚfileZ_File)ÚeditZ_Edit)ÚformatZF_ormat)ÚrunZ_Run)rb   Z_Options)r   Z_Window)r
   Z_Helpc                 C   sâ   | j }i  | _}| jD ]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ÿ   r9   zRecent Files)r  r  r<   r
   )rr   rÁ   Ú
menu_specsÚprepstrÚgetattrrq   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 kr d}|| jkr<| | jd |¡ t |¡ d S )Nr   r`   ra   rS   )rÁ   rÃ   rÅ   Údeleter   Zadd_windows_to_menu)rÎ   r<   r`   r    r    r!   rÆ   Ö  s    


zEditorWindow.postwindowsmenuc                 C   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   sR   |dkr<t |d ƒ}t|  d¡| ƒ|  d¡ }d}|df}| jj|f|žŽ  dS )zHandle scrollbar.Zmovetor   r`   ú@0,0ZscrollZunitsrL   )ÚfloatÚroundÚ	getlinenorE   Úyview)rÎ   rN   ÚargsZfractionÚlinesr    r    r!   r¤   ê  s    ÿzEditorWindow.handle_yviewc              	   C   s4  | j }| d|j› d|j› ¡}z | dd|¡o<| |dd¡}W n tk
rX   d}Y nX |sx| ddd	¡ | d
|¡ | js†|  	¡  | j}|| _
tjd d… dk}|r´|jdd | jD ]P}z|\}}	}
W n tk
rä   Y qºY nX |
d krðqºt| |
ƒƒ }|j||d qº| |j|j¡ |r0| j jdd dS )Nú@ú,rè   rß   rê   Fræ   rç   r`   rä   r9   r:   Zarrow)Zcursorr  ZibeamrL   )rE   rÃ   ÚxÚyrí   ÚTclErrorrò   ró   ÚrmenuÚ
make_rmenurN   r   rj   ZconfigÚrmenu_specsÚ
ValueErrorr
  ZentryconfigureZtk_popupZx_rootZy_root)rÎ   rN   rE   ZnewdexZin_selectionr"  ZiswinÚitemr  Ú	eventnameZverify_staterì   r    r    r!   r   ÷  s>    ÿ


zEditorWindow.right_menu_event)ZCloserI   Nc                 C   sf   t | jdd}| jD ]F}|d |d  }}|d k	rR| j|fdd„}|j||d q| ¡  q|| _d S )Nr   r  rS   c                 S   s   |   |¡ d S rÔ   ©Úevent_generate©rE   r'  r    r    r!   rW   $  s    z(EditorWindow.make_rmenu.<locals>.command©r  rW   )rq   rE   r$  Úadd_commandrÄ   r"  )rÎ   r"  r&  r  r'  rW   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   s8   z| j  d¡}W n tk
r&   Y dS X |r0dS dS d S )Nrè   rc   Únormal©rE   rÃ   r!  )rÎ   Zindxr    r    r!   r-  .  s
    zEditorWindow.rmenu_check_copyc                 C   s8   z| j j d| j d¡ W n tk
r.   Y dS X dS d S )Nztk::GetSelectionZ	CLIPBOARDrc   r0  )rE   rÙ   Úcallr!  r.  r    r    r!   Úrmenu_check_paste6  s
    zEditorWindow.rmenu_check_pastec                 C   s   t  | j¡ dS )zHandle Help 'About IDLE' event.rL   )r   ZAboutDialogrs   rÕ   r    r    r!   r‰   >  s    zEditorWindow.about_dialogc                 C   s   t  | jd¡ dS )z&Handle Options 'Configure IDLE' event.ZSettingsrL   )r   ZConfigDialogrs   rÕ   r    r    r!   rŠ   D  s    zEditorWindow.config_dialogc                 C   s"   | j r| j }n| j}t |¡ dS )zHandle Help 'IDLE Help' event.rL   )rp   rs   r
   Zshow_idlehelp)rÎ   rN   Úparentr    r    r!   r‡   J  s
    
zEditorWindow.help_dialogc              
   C   sn   t jd d… dkr^zt | j¡ W qj tk
rZ } ztjdt|ƒ| j	d W 5 d }~X Y qjX nt
 | j¡ dS )Nr9   r:   úDocument Start Failure©ÚtitleÚmessager4  rL   )r   rj   rf   Ú	startfilere   ÚOSErrorr   rÇ   rñ   rE   Ú
webbrowserÚopen)rÎ   rN   Úwhyr    r    r!   rˆ   T  s     ÿzEditorWindow.python_docsc                 C   s   | j  d¡ dS )Nz<<Cut>>rL   ©rE   r)  rÕ   r    r    r!   rƒ   _  s    zEditorWindow.cutc                 C   s    | j  d¡sd S | j  d¡ dS )Nræ   z<<Copy>>rL   )rE   Z
tag_rangesr)  rÕ   r    r    r!   r„   c  s    zEditorWindow.copyc                 C   s   | j  d¡ | j  d¡ dS )Nz	<<Paste>>rä   rL   )rE   r)  rõ   rÕ   r    r    r!   r…   j  s    zEditorWindow.pastec                 C   s.   | j  ddd¡ | j  dd¡ | j  d¡ dS )Nræ   rç   zend-1crä   rL   )rE   rô   ró   rõ   rÕ   r    r    r!   rŒ   o  s    zEditorWindow.select_allc                 C   s    | j  ddd¡ | j  d¡ dS )Nræ   rç   r`   rä   rL   )rE   rò   rõ   rÕ   r    r    r!   r   u  s    zEditorWindow.remove_selectionc                    s*   | j j‰| j j‰d‰‡ ‡‡‡fdd„}|S )zèCursor move begins at start or end of selection

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

        )zsel.first+1czsel.last-1cc                    sB   | j d@ dkr>zˆdƒ ˆdˆˆ  ƒ W n tk
r<   Y nX d S )NrF   r   rè   rä   )rì   r!  rM   ©Ú
edge_indexZedges_tableZself_text_indexZself_text_mark_setr    r!   Úmove_at_edge…  s    z<EditorWindow.move_at_edge_if_selection.<locals>.move_at_edge)rE   rÃ   ró   )rÎ   r@  rA  r    r?  r!   r™   z  s
    z&EditorWindow.move_at_edge_if_selectionc                 C   s   | j  d¡ dS )Nz<Meta-Delete>rL   r>  rÕ   r    r    r!   rš   Ž  s    zEditorWindow.del_word_leftc                 C   s   | j  d¡ dS )Nz<Meta-d>rL   r>  rÕ   r    r    r!   r›   ’  s    zEditorWindow.del_word_rightc                 C   s   t  | j¡ dS rK   )r   ÚfindrE   rÕ   r    r    r!   rŽ   –  s    zEditorWindow.find_eventc                 C   s   t  | j¡ dS rK   )r   Z
find_againrE   rÕ   r    r    r!   r   š  s    zEditorWindow.find_again_eventc                 C   s   t  | j¡ dS rK   )r   Zfind_selectionrE   rÕ   r    r    r!   r‘   ž  s    z!EditorWindow.find_selection_eventc                 C   s   t   | j| j| j¡ dS rK   )r	   rE   rµ   ro   rÕ   r    r    r!   r   ¢  s    z EditorWindow.find_in_files_eventc                 C   s   t   | j¡ dS rK   )r   rE   rÕ   r    r    r!   r’   ¦  s    zEditorWindow.replace_eventc                 C   sT   | j }t |dd¡j}|d k	rP| ddd¡ | d|› d¡ | d¡ |  ¡  dS )	Nz
Go To Linez/Enter a positive integer
('big' = end of file):ræ   rç   r`   rä   ú.0rL   )rE   r   ZGotoÚresultrò   ró   rõ   rý   )rÎ   rN   rE   Úlinenor    r    r!   r“   ª  s     þ
zEditorWindow.goto_line_eventc                 C   sp   z| j  dd¡ ¡ }W n tk
r.   d}Y nX t | j dd|¡j}|dk	rl| 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)rE   rÂ   Ústripr!  r   Z
ModuleNamerD  ro   r<  rµ   r¼   )rÎ   r?   Ú	file_pathr    r    r!   Úopen_module¸  s    
 üzEditorWindow.open_modulec                 C   s   |   ¡  dS rK   )rH  rÕ   r    r    r!   r‹   Ð  s    zEditorWindow.open_module_eventc                 C   sJ   | j j}| jjdkr|s,|  ¡ }|d kr,dS ddlm} | | j|¡ dS )NZPyShellEditorWindowrL   r   )Úbrowser)	rµ   rÏ   Ú	__class__Ú__name__rH  ÚidlelibrI  ZModuleBrowserrp   )rÎ   rN   rÏ   rI  r    r    r!   rŸ   Ô  s    ÿz EditorWindow.open_module_browserc                 C   s   ddl m} | | j¡ dS )Nr   )ÚpathbrowserrL   )rL  rM  ZPathBrowserrp   )rÎ   rN   rM  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)ÚshellrL   )Ú
subprocessr   Ú
executableÚPopen)rÎ   rN   rO  Úcmdr    r    r!   r¡   ä  s    þzEditorWindow.open_turtle_democ                 C   sN   |d k	rJ|dkrJ| j  dd| ¡ | j  ddd¡ | j  ddd¡ |  ¡  d S )Nr   rä   z%d.0ræ   rç   r`   z
insert +1l)rE   ró   rò   rô   Úcenter)rÎ   rE  r    r    r!   Úgotolineí  s
    zEditorWindow.gotolinec                 C   s`   |rt j |¡rdS t j t j |¡¡\}}t j |¡dkr@dS | j dd¡}| d¡o^d|kS )NT)z.pyz.pywrç   z1.0 lineendz#!Zpython)	rf   rg   rl   ÚsplitextrÝ   ÚnormcaserE   rÂ   Ú
startswith)rÎ   rÏ   ÚbaseZextrö   r    r    r!   r½   ô  s    zEditorWindow.ispythonsourcec                 C   s   | j r| j  | ¡ d | _ d S rÔ   )ro   Zunregister_maybe_terminater.  r    r    r!   Ú
close_hooký  s    zEditorWindow.close_hookc                 C   s
   || _ d S rÔ   )rY  )rÎ   rY  r    r    r!   Úset_close_hook  s    zEditorWindow.set_close_hookc                 C   s2   | j r| j  | ¡ |  ¡  | j | ¡ |  ¡  d S rÔ   )ro   Zfilename_changed_editr´   rs   Zupdate_windowlist_registryr¾   r.  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±   r.  r    r    r!   Ú_addcolorizer  s    
zEditorWindow._addcolorizerc                 C   s,   | j s
d S | j  ¡  | j | j ¡ d | _ d S rÔ   )r¸   Zremovecolorsr¯   r[  r.  r    r    r!   Ú_rmcolorizer  s
    
zEditorWindow._rmcolorizerc                 C   sH   |   ¡  |  ¡  t | j¡ | jdk	r0| j ¡  | jdk	rD| j ¡  dS )zUpdate the color themeN)	r]  r\  r#   r&   rE   r¹   Zupdate_highlight_colorsrº   Zupdate_colorsr.  r    r    r!   r¾     s    


zEditorWindow.ResetColorizerÚ_c                 C   sp   |  d|¡ | |¡}|r6|| jkr6|  d|d |¡ d| |¡krR| d|¡ n| d|d ¡ | |¡ d S )NZERRORz
 wordstartÚ
rä   z+1c)rô   rÂ   Ú
IDENTCHARSró   rõ   )rÎ   rE   ÚposÚcharr    r    r!   Úcolorize_syntax_error-  s    
z"EditorWindow.colorize_syntax_errorc                 C   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.r@   r#   zcursor-blinkr\   rC   r   r^   N)r   r{   rE   r]   )rÎ   Zcursorblinkr    r    r!   r­   8  s       ÿz EditorWindow.update_cursor_blinkc                 C   sN   | j dk	r| j  ¡  | jdk	r(| j ¡  t | jdd¡}|| jd< |  ¡  dS )z.Update the text widgets' font if it is changedNr@   r#   rZ   )r¹   Zupdate_fontrº   r   r¦   rp   rE   r§   )rÎ   Znew_fontr    r    r!   Ú	ResetFontB  s    




zEditorWindow.ResetFontc                 C   sx   t  ¡  | j_}| ¡ D ]\}}| jj|f|žŽ  q|  ¡ D ]6}t  |¡}|r<| ¡ D ]\}}| jj|f|žŽ  qVq<dS )z/Remove the keybindings before they are changed.N)	r   ÚGetCurrentKeySetr*   Údefault_keydefsÚitemsrE   Zevent_deleteÚget_standard_extension_namesÚGetExtensionBindings)rÎ   ÚkeydefsrN   ÚkeylistÚextensionNameÚxkeydefsr    r    r!   Ú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kr¶q”|d7 }td|ƒD ]r}	| |	¡dkrÈ| |	d¡}
|
rÈ| |	d¡}d}||kr||| kr|| | }|rÈt||ƒ}
|j|	|
d qÈq”dS )	z-Update the keybindings after they are changedr   rS   NrW   Úacceleratorr  r=   )ro  )r   re  r*   rf  r}   rh  ri  Úmenudefsr	  rÁ   rÃ   r  rï   rD   Z	entrycgetÚget_acceleratorr  )rÎ   rj  rl  rm  ZmenuEventDictr<   r&  ZmenubarItemr`   rÃ   ZaccelZitemNamerN   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 windowr@   r[   z
num-spacesrB   rC   N)r¨   r   r{   rª   r.  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
   rS   r   r+  N)
r   ZGetAllExtraHelpSourcesListrÁ   rÃ   r  r  r  rÄ   Ú"_EditorWindow__extra_help_callbackr,  )rÎ   Z	help_listZhelpmenuZhelpmenu_lengthÚentryrR  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rrzt | ¡ W q| tk
rn } ztj	dt
|ƒˆ jd W 5 d }~X Y q|X n
t | ¡ d S )N)ZwwwZhttpr9   r:   r5  r6  )rW  rf   rg   rn   r   rj   r9  r:  r   rÇ   rñ   rE   r;  r<  )Úhelpfiler=  r.  r    r!   Údisplay_extra_help  s    
 ÿz>EditorWindow.__extra_help_callback.<locals>.display_extra_helpr    )rÎ   ru  rv  r    r.  r!   Z__extra_help_callback›  s    z"EditorWindow.__extra_help_callbackc              
      sº  g }| j }|r>tj |¡r>t|dddd}| ¡ }W 5 Q R X |rptj |¡d }||krd| |¡ | d|¡ g ‰ |D ]*}d|ks˜tj |dd… ¡sxˆ  	|¡ qx‡ fd	d
„|D ƒ}d}|dt
|ƒ… }|rRz*t|dddd}| |¡ W 5 Q R X W nV tk
rP } z6t| jddƒs@d| j_tjdd|› d| jd W 5 d}~X Y nX | jjD ]Z}	|	j}
|
 dt¡ t|ƒD ]8\}}| ¡ }|	 |¡}|
j|| d | |dd qxqZdS )z/Load and update the recent files list and menusÚrÚutf_8r   )r)   Úerrorsr_  r   ú ra   c                    s   g | ]}|ˆ kr|‘qS r    r    )Ú.0rg   ©Z	bad_pathsr    r!   Ú
<listcomp>½  s      z9EditorWindow.update_recent_files_list.<locals>.<listcomp>Z1234567890ABCDEFGHIJKÚwÚrecentfiles_messageFTzIDLE Warningz)Cannot save Recent Files list to disk.
  z
Select OK to continue.r6  Nrâ   )r  rW   r  )rw   rf   rg   r»   r<  Ú	readlinesÚabspathÚremoverä   Úappendrð   Ú
writelinesr:  r
  rp   r  r   ÚshowwarningrE   rs   rv   r  r  r  Ú	enumerateÚrstripÚ#_EditorWindow__recent_file_callbackr,  )rÎ   Únew_fileZrf_listrG  Zrf_list_filerg   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µ   r<  )Z
fn_closurer.  r    r!   Úopen_recent_fileÙ  s    z=EditorWindow.__recent_file_callback.<locals>.open_recent_filer    )rÎ   r  r  r    r.  r!   Z__recent_file_callbackØ  s    z#EditorWindow.__recent_file_callbackc                 C   s‚   |   ¡ }|  ¡ }|r*|r*|d | t }n|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_savedrs   Zwm_titleZwm_iconname)rÎ   ZshortZlongr7  Ziconr    r    r!   r´   Ý  s    zEditorWindow.saved_change_hookc                 C   s
   | j  ¡ S rÔ   )r°   r”  r.  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_undor.  r    r    r!   r—  õ  s    zEditorWindow.reset_undoc                 C   s   | j j}|rtj |¡S dS )Nr  )rµ   rÏ   rf   rg   rÝ   )rÎ   rÏ   r    r    r!   r‘  ø  s    zEditorWindow.short_titlec                 C   s   | j jp
dS )Nr=   )rµ   rÏ   r.  r    r    r!   r’  ü  s    zEditorWindow.long_titlec                 C   s   |   ¡  dS rK   )rS  rÕ   r    r    r!   r†   ÿ  s    z EditorWindow.center_insert_eventrä   c                 C   sH   | j }|  ¡ \}}|  |¡}|| }td||d  ƒ}| t|ƒ¡ d S )NrS   r;   )rE   Úgetwindowlinesr  Úmaxr  r  )rÎ   ÚmarkrE   rs   ÚbotrE  rG   Znewtopr    r    r!   rS    s    
zEditorWindow.centerc                 C   sN   | j }|  d¡}|  d¡}||krF| ¡ dkrFt|d ƒ}|| d }||fS )Nr  z@0,65535rS   rG   )rE   r  Zwinfo_heightrB   )rÎ   rE   rs   r›  rG   r    r    r!   r˜    s    

zEditorWindow.getwindowlinesc                 C   s   | j }tt| |¡ƒƒS rÔ   )rE   rB   r  rÃ   )rÎ   rš  rE   r    r    r!   r    s    zEditorWindow.getlinenoc                 C   s(   | j  ¡ }t d|¡}ttt| ¡ ƒƒS )zReturn (width, height, x, y)z(\d+)x(\d+)\+(-?\d+)\+(-?\d+))rs   Zwm_geometryÚreÚmatchÚlistrØ   rB   Úgroups)rÎ   ZgeomÚmr    r    r!   Úget_geometry  s    
zEditorWindow.get_geometryc                 C   s   |   ¡  dS rK   )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 )Nr0  )rµ   r”  rs   rì   Z	deiconifyÚlowerZliftÚ	maybesaver.  r    r    r!   r£  #  s    


zEditorWindow.maybesavec                 C   s<   z"|   ¡ }t|ƒdkr|  ¡  |W S  tk
r6   Y nX d S )NZ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¸   rE   ru   r¯   rs   ZdestroyrY  r.  r    r    r!   r¤  5  s"    



zEditorWindow._closec                 C   s   i | _ |  ¡  d S rÔ   )Ú
extensionsÚload_standard_extensionsr.  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X qd S )NzFailed to load extension)rh  Ú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GetExtensionsr.  r    r    r!   rh  [  s    z)EditorWindow.get_standard_extension_namesZZzDummyZzzdummyc           	   	   C   s:  | j  ||¡}z>ztjd| td}W n" ttfk
rH   t |¡}Y nX W n  tk
rl   td|ƒ ‚ Y nX t||ƒ}t	 
|¡}t|dƒrš|  |j|¡ || ƒ}|| j|< |r6|  |¡ |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: rp  ú-r^  rS   ré   ra   rë   Z_event)ÚextfilesrÂ   Ú	importlibÚimport_moduleÚ__package__ÚImportErrorÚ	TypeErrorr¬  r
  r   ri  r¬   r  rp  r§  r}   r   rE   r   )	rÎ   r?   ÚfnameÚmodÚclsrj  rª  ZveventZ
methodnamer    r    r!   r«  b  s4    






zEditorWindow.load_extensionc                 C   sF   |d kr| j j}| j}||_| ¡ D ]\}}|r$|j|f|žŽ  q$d S rÔ   )r*   rf  rE   rj  rg  rÈ   )rÎ   rj  rE   rN   rk  r    r    r!   r}   ~  s    zEditorWindow.apply_bindingsc              	   C   sê   |dkr| j j}|dk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.
        NrS   ú!c                 S   s   |   |¡ d S rÔ   r(  r*  r    r    r!   rW      s    z(EditorWindow.fill_menus.<locals>.command)r  r  rW   ro  Zvariable)r  r  rW   ro  )r*   rp  rf  rÁ   rE   rÂ   rÄ   r	  rq  Úget_var_objZ
BooleanVarZadd_checkbuttonr,  )rÎ   rp  rj  rÁ   rE   ZmnameZ	entrylistr<   rt  r  r'  Zcheckbuttonr  ro  rW   Ú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Ô   )ru   rÂ   rE   )rÎ   r?   rÁ  r½  r    r    r!   r¼  »  s    zEditorWindow.get_var_objc                 C   s,   | j r$| j d|¡p"d| j |¡kS dS d S )NZTODOÚSTRINGrS   )r¸   rE   Útag_prevrangeZ	tag_names)rÎ   Z
text_indexr    r    r!   Úis_char_in_stringË  s
    ÿzEditorWindow.is_char_in_stringc                 C   s>   z"| j  d¡}| j  d¡}||fW S  tk
r8   Y dS X d S )Nrè   rê   )NNr1  )rÎ   rø   rù   r    r    r!   Úget_selection_indices×  s    
z"EditorWindow.get_selection_indicesc                 C   s   | j d pt}t|ƒS )NÚtabs)rE   ÚTK_TABWIDTH_DEFAULTrB   )rÎ   Zcurrentr    r    r!   Úget_tk_tabwidthâ  s    zEditorWindow.get_tk_tabwidthc              	   C   sB   | j }|  ¡ |kr>|j dd|d d|jd| ¡}|j|d d S )NrZ   rÚ   z
-displayofÚn)rÇ  )rE   rÉ  rÙ   r2  ZmasterZ	configure)rÎ   ZnewtabwidthrE   Zpixelsr    r    r!   Úset_tk_tabwidthè  s     þzEditorWindow.set_tk_tabwidthc                 C   sP   |r@|r@|   ¡ }d|  kr$dkr.n n|| _| j| jkr@d| _|  | j¡ d S )Nr;   r   F)Úguess_indentrª   r©   r¨   rË  )rÎ   rÒ   ZguessrŒ  r    r    r!   r·   ó  s    z#EditorWindow.set_indentation_paramsc           
      C   sP  | j }|  ¡ \}}|r6|r6| ||¡ | d|¡ dS | dd¡}|dkrp| ddd¡rd| d¡ n| ¡  dS |d d	krŠ| d¡ dS | j}t| 	|¡ƒ}|d
ksªt
‚|d | j | j }d
}	|| jkrÐq|d d… }|	d }	t| 	|¡ƒ}||ks|d d	krÂqqÂ| ¡  | d|	 d¡ ||k rD| dd||  ¡ | ¡  dS )Nrä   rL   rà   r=   rë   rç   z	insert-1cra   ú 	r   rS   z
insert-%dcrâ   )rE   rÆ  r  ró   rÂ   rí   Zbellr©   rð   Ú
expandtabsÚAssertionErrorrª   rx   r²   rä   r³   )
rÎ   rN   rE   rø   rù   Úcharsr©   ZhaveZwantZncharsdeletedr    r    r!   r”   ü  sB    


z"EditorWindow.smart_backspace_eventc           
      C   sô   | j }|  ¡ \}}| ¡  zÊ|r\|r\t|ƒt|ƒkrD| 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 | ¡  X d S )Nrä   rà   rã   râ   rL   )rE   rÆ  r²   r³   Ú
index2liner—   r˜   r  ró   rÂ   Úget_line_indentr©   rð   Úreindent_torª   r¨   rÎ  rä   rõ   )
rÎ   rN   rE   rø   rù   ÚprefixÚrawZ	effectiveZpadrÊ  r    r    r!   r–   (  s,    
zEditorWindow.smart_indent_eventc              	   C   s   | j }|  ¡ \}}| ¡  zÊ|r>|r>| ||¡ | d|¡ | dd¡}dt|ƒ }}||k rv|| dkrv|d7 }qX||kr”| 	dd¡ W ¢XdS |d|… }d}|rÔ|d	 dkrÔ|| j
krÔ|dd	… }|d7 }q¤|rè| d
| d¡ | d¡dkr| d¡ qè| 	dd¡ t| d¡ƒ}	t | j| j¡}
| j
s°| jD ]`}t|	| dƒ}t|ƒd }| |d¡}|
 |¡ |
 |  |¡¡}|dk	s”|dkr< qžq<|
 |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rH|  |
 ¡ ¡ nL|tj kr€|
 !¡ dkrp| 	d|¡ n|  |
 "¡ ¡ nds”t#d|f ƒ‚W ¢PdS |
 $¡ }| 	d|¡ |
 %¡ rÆ|  &|¡ n|rà|
 '¡ rà|  (|¡ W ¢dS | d¡ | ¡  X 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Í  rS   r_  rL   Nra   zinsert - %d charsrC  Zconsolerç   zbogus continuation type %r))rE   rÆ  r²   rõ   r³   r  ró   rÂ   rð   rä   rx   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_indentrÏ  Zget_base_indent_stringZis_block_openerr–   Zis_block_closerr”   )rÎ   rN   rE   rø   rù   rö   rŒ  rÊ  ÚindentÚlnor   ÚcontextZstartatZstartatindexZrawtextZbodrw  rå   r    r    r!   r•   K  sˆ    	




ÿ






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ä   )rE   r²   rí   r  rä   rÝ  r³   )rÎ   rY   rE   r    r    r!   rÓ  Û  s    zEditorWindow.reindent_toc                 C   sP   t | j| jƒ ¡ \}}|r@|r@t|| jƒ\}}t|| jƒ\}}nd }}|| S ©Nr   )ÚIndentSearcherrE   r©   r  rÒ  )rÎ   ZopenerZindentedrÕ  ZindentsmallZindentlarger    r    r!   rÌ  é  s    zEditorWindow.guess_indentc                 C   sN   | j d krd S | j jr&| j  ¡  d}n| j  ¡  d}| jdd|› dd d S )NZShowZHiderb   rd   z Line Numbers)r<   rÃ   r  )rº   Zis_shownZhide_sidebarZshow_sidebarr  )rÎ   rN   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)”rK  Ú
__module__Ú__qualname__Zidlelib.percolatorr$   Zidlelib.colorizerr%   r&   Zidlelib.undor'   Zidlelib.iomenur(   r)   rL  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filesystemencodingre   rÊ   rÌ   rÓ   r‚   r§   rž   rœ   r¢   rý   r  r|   rÆ   r  rË   r¤   r"  r   r$  r#  r/  r-  r3  r‰   rŠ   r‡   rˆ   rƒ   r„   r…   rŒ   r   r™   rš   r›   rŽ   r   r‘   r   r’   r“   rH  r‹   rŸ   r    r¡   rT  r½   rY  rZ  r¶   r\  r]  r¾   ÚstringZascii_lettersZdigitsr`  rc  r­   rd  rn  rr  r«   r  rs  r¿   rˆ  r´   r”  r•  r—  r‘  r’  r†   rS  r˜  r  r¡  r€   r£  r~   r¤  rÀ   r¦  r¨  rh  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Ô   )rB   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  r`   rð   ÚgrouprÎ  )rö   r©   r   r    r    r!   rÒ    s    
rÒ  c                   @   s8   e Zd Zdd„ Zdd„ Zejejdfdd„Zdd	„ Z	d
S )rß  c                 C   s(   || _ || _d | _| _d  | _| _d S rÞ  )rE   r©   rŒ  ÚfinishedÚblkopenlineÚindentedline)rÎ   rE   r©   r    r    r!   rÓ     s    zIndentSearcher.__init__c                 C   sL   | j r
dS | jd  }| _t|ƒd }| j |dd¡r:dS | j ||d ¡S )Nr=   rS   rC  z>=r`   z lineend+1c)ræ  rŒ  r­  rE   rí   rÂ   )rÎ   rŒ  rš  r    r    r!   Úreadline  s    zIndentSearcher.readline)ÚclassÚdefÚforÚifÚtryÚwhilec	           	      C   s>   | j rn2||kr ||kr || _n||kr:| jr:|| _d| _ d S )NrS   )ræ  rç  rè  )	rÎ   rD   ÚtokenÚstartr`   rö   ÚINDENTÚNAMEZOPENERSr    r    r!   Ú
tokeneater%  s    zIndentSearcher.tokeneaterc              	   C   sh   t j}| jt _zDz$t  | j¡}|D ]}| j|Ž  q"W n t jtfk
rN   Y nX W 5 |t _X | 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)
rK  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 )Nr^  r   rS   )rB  )ÚsrŒ  r    r    r!   r	  C  s    
r	  ú[ú]ú/)ZbracketleftZbracketrightZslashc                 C   s´   |   |¡}|rt ¡ r"|dk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>   rQ   rR   rJ   r=   r   z-[a-z]\bc                 S   s   |   ¡  ¡ S rÔ   )rå  Úupper©r   r    r    r!   rO   \  rP   z!get_accelerator.<locals>.<lambda>z\b\w+\bc                 S   s   t  |  ¡ |  ¡ ¡S rÔ   )ÚkeynamesrÂ   rå  r   r    r    r!   rO   ]  rP   zKey-ZCancelz
Ctrl-BreakzControl-zCtrl-r±  ú+z><râ   ré   rë   )rÂ   r   Z	isCocoaTkrœ  Úsub)rj  r'  rk  rû  r    r    r!   rq  R  s    
rq  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Ù   r2  )rp   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 )	NrS   )rp   rÏ   é
   rG   é   rä   z  r_  )
r  r   Úargvr   ZsetupAppr#   rE   rï   rä   rñ   )r4  rp   rÏ   r   rE   rŒ  r    r    r!   Ú_editor_windowq  s    r  Ú__main__)r@   zidlelib.idle_test.test_editorr;   F)Ú	verbosityÚexit)r  )8Úimportlib.abcr³  Úimportlib.utilrf   rj   rœ  rã  r   rõ  r®  r;  ZtkinterZtkinter.fontr   Ztkinter.ttkr   r   r   Zidlelib.configr   rL  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  rq  r  r  rK  Zunittestr@   Zidlelib.idle_test.htestr  r    r    r    r!   Ú<module>   sx   
           Z

4
ý	
