a
    Ùc¿_N  ã                   @   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e,ƒZ-dd„ Z.e /d¡Z0dd„ Z1G dd„ de,ƒZ2d d!„ Z3d"d#d$d%œZ4d&d'„ Z5d(d)„ Z6d*d+„ Z7e8d,kräd d-l9m:Z: e:d.d/d0d1 d d2l;m<Z< e<e7ƒ dS )3é    N)Ú*)ÚFont)Ú	Scrollbar)Ú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.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.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highlightthicknessr?   ZtabstylerE   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*Code ContextÚdisabledzline-numbers-defaultz<<toggle-line-numbers>>ú*Line Numbers)µZidlelib.runscriptr6   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   ÚTextrC   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_eventr0   ÚfregionÚindent_region_eventZdedent_region_eventZcomment_region_eventZuncomment_region_eventZtabify_region_eventZuntabify_region_eventr1   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ÚpostwindowsmenuÚtkMessageBoxZaskyesnoÚtkSimpleDialogZ
askintegerÚ	showerrorÚ	event_addr*   Zautocomplete_eventZtry_open_completions_eventZforce_open_completions_eventr+   Zexpand_word_eventr/   Zformat_paragraph_eventr3   Zflash_paren_eventZparen_closed_eventZcheck_module_eventZrun_module_eventZrun_custom_eventr2   Z	do_rstripr,   ÚctipZtry_open_calltip_eventZrefresh_calltip_eventZforce_open_calltip_eventr5   Zzoom_height_eventÚallow_code_contextr-   Ztoggle_code_context_eventÚupdate_menu_stateÚallow_line_numbersr.   Útoggle_line_numbers_event)Úselfrm   ÚfilenameÚkeyrn   r6   ZdochomeZpyverZbasepathZchmfilerq   rx   r<   r?   Ztext_optionsrC   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Ï   rL   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borderrF   r9   rX   )rX   Ú0)
rC   ÚsumÚmapÚtkZgetintZcgetZwinfo_widthr   Úmeasurer?   )rÏ   rC   Zinner_paddingZpixel_widthZzero_char_widthr   r   r   r¦   c  s    ÿÿzEditorWindow.set_widthc                 C   s   | j  ¡ \}}| j |¡ dS rI   )r´   Zdefaultfilenamerm   Únew)rÏ   rL   Ú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Ú.rQ   )ú ú	Úinsertzinsert linestart+ÚcÚselú1.0r^   ú	sel.firstZ	my_anchorú<úsel.lastú>rJ   )ÚstateZkeysymrC   rÂ   Úcomparer@   ÚsplitrÁ   ÚrangeÚlenÚstrÚ
tag_removeÚmark_setÚtag_addÚsee)rÏ   rL   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 )NrQ   Zgrey75)rE   ZborderwidthZ
backgroundr   Z	_padding1z    )rR   rW   zCol: ?r÷   zLn: ?)rR   rS   z<<set-line-and-column>>z<KeyRelease>z<ButtonRelease>)r)   rq   Ú
status_barrw   r   rh   Ú	set_labelZRIGHTr¢   ZBOTTOMÚXrC   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â   rW   zCol: %sr÷   zLn: %s)rC   rÂ   ZINSERTrï   rû   rü   )rÏ   rL   r÷   rW   r   r   r   rþ   °  s    z EditorWindow.set_line_and_column))ÚfileZ_File)ÚeditZ_Edit)ÚformatZF_ormat)ÚrunZ_Run)r`   Z_Options)r   Z_Window)r   Z_Helpc                 C   sÎ   | j }i  | _}| jD ]:\}}t|ƒ\}}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 )Nr   )r=   Útearoff)Úlabelr:   Ú	underlineZappleZapplicationZIDLE)r  r:   ©r  r   r7   zRecent Files)r  r  r:   r   )rp   rÀ   Ú
menu_specsÚprepstrro   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{   À  s&    
ÿþzEditorWindow.createmenubarc                 C   sJ   | j d }| d¡}|d u r d}|| jkr<| | jd |¡ t |¡ d S )Nr   r^   r_   rQ   )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   sT   |dkr<t |d ƒ}t|  d¡| ƒ|  d¡ }d}|df}| jj|g|¢R Ž  dS )zHandle scrollbar.Zmovetor   r^   ú@0,0ZscrollZunitsrJ   )ÚfloatÚroundÚ	getlinenorC   Úyview)rÏ   rL   Ú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è   r^   rå   r7   r8   Zarrow)Zcursorr  ZibeamrJ   )rC   rÂ   ÚxÚyrî   ÚTclErrorró   rô   ÚrmenuÚ
make_rmenurL   r   rh   ZconfigÚrmenu_specsÚ
ValueErrorÚgetattrZentryconfigureZtk_popupZx_rootZy_root)rÏ   rL   rC   ZnewdexZin_selectionr!  ZiswinÚitemr  Ú	eventnameZverify_staterí   r   r   r   r€   õ  s>    ÿ


zEditorWindow.right_menu_event)ZCloserG   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  rQ   c                 S   s   |   |¡ d S rÕ   ©Úevent_generate©rC   r'  r   r   r   rU   "  s    z(EditorWindow.make_rmenu.<locals>.command©r  rU   )ro   rC   r#  Úadd_commandrÃ   r!  )rÏ   r!  r&  r  r'  rU   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é   ra   Únormal©rC   rÂ   r   )rÏ   Zindxr   r   r   r-  ,  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	CLIPBOARDra   r0  )rC   rÚ   Úcallr   r.  r   r   r   Úrmenu_check_paste4  s
    zEditorWindow.rmenu_check_pastec                 C   s   t  | j¡ dS )zHandle Help 'About IDLE' event.rJ   )r	   ZAboutDialogrq   rÖ   r   r   r   rˆ   <  s    zEditorWindow.about_dialogc                 C   s   t  | jd¡ dS )z&Handle Options 'Configure IDLE' event.ZSettingsrJ   )r   ZConfigDialogrq   rÖ   r   r   r   r‰   B  s    zEditorWindow.config_dialogc                 C   s"   | j r| j }n| j}t |¡ dS )zHandle Help 'IDLE Help' event.rJ   )rn   rq   r   Zshow_idlehelp)rÏ   rL   Úparentr   r   r   r†   H  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 )Nr7   r8   úDocument Start Failure©ÚtitleÚmessager4  rJ   )r   rh   rd   Ú	startfilerc   ÚOSErrorrÆ   rÈ   rò   rC   Ú
webbrowserÚopen)rÏ   rL   Úwhyr   r   r   r‡   R  s    
ÿzEditorWindow.python_docsc                 C   s   | j  d¡ dS )Nz<<Cut>>rJ   ©rC   r)  rÖ   r   r   r   r‚   ]  s    zEditorWindow.cutc                 C   s    | j  d¡sd S | j  d¡ dS )Nrç   z<<Copy>>rJ   )rC   Z
tag_rangesr)  rÖ   r   r   r   rƒ   a  s    zEditorWindow.copyc                 C   s   | j  d¡ | j  d¡ dS )Nz	<<Paste>>rå   rJ   )rC   r)  rö   rÖ   r   r   r   r„   h  s    zEditorWindow.pastec                 C   s.   | j  ddd¡ | j  dd¡ | j  d¡ dS )Nrç   rè   zend-1crå   rJ   )rC   rõ   rô   rö   rÖ   r   r   r   r‹   m  s    zEditorWindow.select_allc                 C   s    | j  ddd¡ | j  d¡ dS )Nrç   rè   r^   rå   rJ   )rC   ró   rö   rÖ   r   r   r   rŒ   s  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 )NrD   r   ré   rå   )rí   r   rK   ©Ú
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)rC   rÂ   rô   )rÏ   r@  rA  r   r?  r   r˜   x  s
    z&EditorWindow.move_at_edge_if_selectionc                 C   s   | j  d¡ dS )Nz<Meta-Delete>rJ   r>  rÖ   r   r   r   r™   Œ  s    zEditorWindow.del_word_leftc                 C   s   | j  d¡ dS )Nz<Meta-d>rJ   r>  rÖ   r   r   r   rš     s    zEditorWindow.del_word_rightc                 C   s   t  | j¡ dS rI   )r   ÚfindrC   rÖ   r   r   r   r   ”  s    zEditorWindow.find_eventc                 C   s   t  | j¡ dS rI   )r   Z
find_againrC   rÖ   r   r   r   rŽ   ˜  s    zEditorWindow.find_again_eventc                 C   s   t  | j¡ dS rI   )r   Zfind_selectionrC   rÖ   r   r   r   r   œ  s    z!EditorWindow.find_selection_eventc                 C   s   t   | j| j| j¡ dS rI   )r   rC   r´   rm   rÖ   r   r   r   r      s    z EditorWindow.find_in_files_eventc                 C   s   t   | j¡ dS rI   )r   rC   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è   r^   rå   ú.0rJ   )rC   r   ZGotoÚresultró   rô   rö   rþ   )rÏ   rL   rC   Ú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)rC   rÁ   Ústripr   r   Z
ModuleNamerD  rm   r<  r´   r»   )rÏ   r=   Ú	file_pathr   r   r   Úopen_module¶  s    
üzEditorWindow.open_modulec                 C   s   |   ¡  dS rI   )rH  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PyShellEditorWindowrJ   r   )Úbrowser)	r´   rÐ   Ú	__class__Ú__name__rH  ÚidlelibrI  ZModuleBrowserrn   )rÏ   rL   rÐ   rI  r   r   r   rž   Ò  s    ÿz EditorWindow.open_module_browserc                 C   s   ddl m} | | j¡ dS )Nr   )ÚpathbrowserrJ   )rL  rM  ZPathBrowserrn   )rÏ   rL   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)ÚshellrJ   )Ú
subprocessr   Ú
executableÚPopen)rÏ   rL   rO  Ú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è   r^   z
insert +1l)rC   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v r@dS | j dd¡}| d¡o^d|v S )NT)z.pyz.pywrè   z1.0 lineendz#!Zpython)	rd   re   rj   ÚsplitextrÞ   ÚnormcaserC   rÁ   Ú
startswith)rÏ   rÐ   ÚbaseZextr÷   r   r   r   r¼   ò  s    zEditorWindow.ispythonsourcec                 C   s   | j r| j  | ¡ d | _ d S rÕ   )rm   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Õ   )rm   Zfilename_changed_editr³   rq   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ur0| j ¡  | jdurD| j ¡  dS )zUpdate the color themeN)	r]  r\  r!   r$   rC   r¸   Zupdate_highlight_colorsr¹   Zupdate_colorsr.  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 )NZERRORz
 wordstartÚ
rå   z+1c)rõ   rÁ   Ú
IDENTCHARSrô   rö   )rÏ   rC   Ú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-blinkrZ   rA   r   r\   N)r   ry   rC   r[   )rÏ   Zcursorblinkr   r   r   r¬   6  s    ÿz EditorWindow.update_cursor_blinkc                 C   sN   | j dur| j  ¡  | jdur(| j ¡  t | jdd¡}|| jd< |  ¡  dS )z.Update the text widgets' font if it is changedNr>   r!   rX   )r¸   Zupdate_fontr¹   r   r¥   rn   rC   r¦   )rÏ   Znew_fontr   r   r   Ú	ResetFont@  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ÚitemsrC   Zevent_deleteÚget_standard_extension_namesÚGetExtensionBindings)rÏ   ÚkeydefsrL   ÚkeylistÚextensionNameÚxkeydefsr   r   r   ÚRemoveKeybindingsQ  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   rQ   NrU   Úacceleratorr  r;   )ro  )r   re  r(   rf  r|   rh  ri  Úmenudefsr	  rÀ   rÂ   r  rð   rB   Z	entrycgetÚget_acceleratorr  )rÏ   rj  rl  rm  ZmenuEventDictr:   r&  ZmenubarItemr^   rÂ   ZaccelZitemNamerL   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>   rY   z
num-spacesr@   rA   N)r§   r   ry   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   rQ   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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wwwZhttpr7   r8   r5  r6  )rW  rd   re   rl   r   rh   r9  r:  rÆ   rÈ   rò   rC   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 }|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'   ÚerrorsNr_  r   ú r_   c                    s   g | ]}|ˆ vr|‘qS r   r   )Ú.0re   ©Z	bad_pathsr   r   Ú
<listcomp>»  rN   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  rã   )r  rU   r  )ru   rd   re   rº   r<  Ú	readlinesÚabspathÚremoverå   Úappendrñ   Ú
writelinesr:  r%  rn   r  rÆ   ÚshowwarningrC   rq   rt   r  r  r  Ú	enumerateÚrstripÚ#_EditorWindow__recent_file_callbackr,  )rÏ   Únew_fileZrf_listrG  Zrf_list_filere   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_savedrq   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Ð   rd   re   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 rI   )rS  rÖ   r   r   r   r…   ý  s    z EditorWindow.center_insert_eventrå   c                 C   sH   | j }|  ¡ \}}|  |¡}|| }td||d  ƒ}| t|ƒ¡ d S )NrQ   r9   )rC   Úgetwindowlinesr  Úmaxr  r  )rÏ   ÚmarkrC   rq   ÚbotrE  rE   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,65535rQ   rE   )rC   r  Zwinfo_heightr@   )rÏ   rC   rq   r›  rE   r   r   r   r˜  	  s    

zEditorWindow.getwindowlinesc                 C   s   | j }tt| |¡ƒƒS rÕ   )rC   r@   r  rÂ   )rÏ   rš  rC   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+))rq   Zwm_geometryÚreÚmatchÚlistrÙ   r@   Úgroups)rÏ   ZgeomÚmr   r   r   Úget_geometry  s    
zEditorWindow.get_geometryc                 C   s   |   ¡  dS rI   )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”  rq   rí   Z	deiconifyÚlowerZliftÚ	maybesaver.  r   r   r   r£  !  s    


zEditorWindow.maybesavec                 C   s:   z"|   ¡ }t|ƒdkr|  ¡  |W S  ty4   Y n0 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·   rC   rs   r®   rq   ZdestroyrY  r.  r   r   r   r¤  3  s"    



zEditorWindow._closec                 C   s   i | _ |  ¡  d S rÕ   )Ú
extensionsÚload_standard_extensionsr.  r   r   r   r¿   G  s    zEditorWindow.load_extensionsc                 C   s0   t | j ¡ ƒD ]}t|dƒr| ¡  qi | _d S )Nr}   )rž  r§  Úvaluesr«   r}   )rÏ   Úinsr   r   r   r¦  K  s    

zEditorWindow.unload_extensionsc                 C   sD   |   ¡ D ]6}z|  |¡ W q   tdt|ƒƒ t ¡  Y q0 qd S )NzFailed to load extension)rh  Úload_extensionÚprintÚreprÚ	tracebackÚ	print_exc)rÏ   r=   r   r   r   r¨  Q  s    z%EditorWindow.load_standard_extensionsc                 C   s   t jddS )NT)Zeditor_only)r   ZGetExtensionsr.  r   r   r   rh  Y  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: rp  ú-r^  rQ   rê   r_   rì   Z_event)ÚextfilesrÁ   Ú	importlibÚimport_moduleÚ__package__ÚImportErrorÚ	TypeErrorr¬  r%  r   ri  r«   r
  rp  r§  r|   r   rC   r~   )	rÏ   r=   ÚfnameÚmodÚclsrj  rª  ZveventZ
methodnamer   r   r   r«  `  s4    






zEditorWindow.load_extensionc                 C   sH   |d u r| j j}| j}||_| ¡ D ]\}}|r$|j|g|¢R Ž  q$d S rÕ   )r(   rf  rC   rj  rg  rÉ   )rÏ   rj  rC   rL   rk  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.
        NrQ   ú!c                 S   s   |   |¡ d S rÕ   r(  r*  r   r   r   rU   ž  s    z(EditorWindow.fill_menus.<locals>.command)r  r  rU   ro  Zvariable)r  r  rU   ro  )r(   rp  rf  rÀ   rC   rÁ   rÃ   r	  rq  Úget_var_objZ
BooleanVarZadd_checkbuttonr,  )rÏ   rp  rj  rÀ   rC   ZmnameZ	entrylistr:   rt  r  r'  Zcheckbuttonr  ro  rU   Ú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Õ   )rs   rÁ   rC   )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ÚSTRINGrQ   )r·   rC   Ú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ë   )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)rC   ÚTK_TABWIDTH_DEFAULTr@   )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 )NrX   rÛ   z
-displayofÚn)rÇ  )rC   rÉ  rÚ   r2  ZmasterZ	configure)rÏ   ZnewtabwidthrC   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 )Nr9   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å   rJ   rá   r;   rì   rè   z	insert-1cr_   ú 	r   rQ   z
insert-%dcrã   )rC   rÆ  r  rô   rÁ   rî   Zbellr¨   rñ   Ú
expandtabsr©   rv   r±   rå   r²   )
rÏ   rL   rC   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ã   rJ   )rC   rÆ  r±   Ú
index2liner–   r—   r²   r  rô   rÁ   Úget_line_indentr¨   rñ   Úreindent_tor©   r§   rÎ  rå   rö   )
rÏ   rL   rC   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Í  rQ   r_  rJ   Nr_   zinsert - %d charsrC  Zconsolerè   zbogus continuation type %r)(rC   rÆ  r±   r  rô   rÁ   rñ   rå   rö   r²   rv   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Ï   rL   rC   rù   rú   r÷   rŒ  rÊ  ÚindentZlnor  ÚcontextZstartatZstartatindexZrawtextZbodrw  ræ   r   r   r   r”   I  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å   )rC   r±   rî   r  rå   rÛ  r²   )rÏ   rW   rC   r   r   r   rÒ  Ù  s    zEditorWindow.reindent_toc                 C   sP   t | j| jƒ ¡ \}}|r@|r@t|| jƒ\}}t|| jƒ\}}nd }}|| S ©Nr   )ÚIndentSearcherrC   r¨   r  rÑ  )rÏ   Z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Hider`   rb   z Line Numbers)r:   rÂ   r  )r¹   Zis_shownZhide_sidebarZshow_sidebarr  )rÏ   rL   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.sidebarr.   Zidlelib.formatr/   r0   r1   r2   Zidlelib.parenmatchr3   Zidlelib.squeezerr4   Zidlelib.zoomheightr5   r   ÚgetfilesystemencodingZfilesystemencodingrc   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Õ   )r@   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Ü  )rC   r¨   rŒ  ÚfinishedÚblkopenlineÚindentedline)rÏ   rC   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;   rQ   rC  z>=r^   z lineend+1c)rä  rŒ  r­  rC   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 )NrQ   )rä  rå  ræ  )	rÏ   rB   ÚtokenÚstartr^   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  /  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   rQ   )rB  )ÚsrŒ  r   r   r   r	  A  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>   rH   rP   rO   r;   r   z-[a-z]\bc                 S   s   |   ¡  ¡ S rÕ   )rã  Úupper©r   r   r   r   rM   Z  rN   z!get_accelerator.<locals>.<lambda>z\b\w+\bc                 S   s   t  |  ¡ |  ¡ ¡S rÕ   )ÚkeynamesrÁ   rã  rþ  r   r   r   rM   [  rN   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  P  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  )rn   rÚ   r   r   r   Úfixwordbreaksf  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 )	NrQ   )rn   rÐ   é
   rE   é   rå   z  r_  )
r  r   Úargvr
   ZsetupAppr!   rC   rð   rå   rò   )r4  rn   rÐ   r  rC   rŒ  r   r   r   Ú_editor_windowo  s    r  Ú__main__)r>   zidlelib.idle_test.test_editorr9   F)Ú	verbosityÚexit)r  )=Úimportlib.abcr³  Úimportlib.utilrd   rh   rœ  rá  r   ró  r®  r;  ZtkinterZtkinter.fontr   Ztkinter.ttkr   Ztkinter.simpledialogZsimpledialogrÇ   Ztkinter.messageboxZ
messageboxrÆ   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    Úobjectr!   rÐ  Úcompilerâ  rÑ  rÝ  r	  rÿ  rq  r  r  rK  Zunittestr>   Zidlelib.idle_test.htestr  r   r   r   r   Ú<module>   sx   
           X

4
ý	
