B
    Ç S] ã               @   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	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Z!de "¡  Z#e$jdkZ%dd„ Z&G dd„ de'ƒZ(dd„ Z)dd„ Z*G dd„ de'ƒZ+dd„ Z,dd d!d"œZ-d#d$„ Z.d%d&„ Z/d'd(„ Z0e1d)kr²d d*l2m3Z3 e3d+d,d-d. d d/l4m5Z5 e5e0ƒ dS )0é    N)Ú*)Ú	Scrollbar)ÚidleConf)Úconfigdialog)Úgrep)Úhelp)Ú
help_about)Úmacosx)ÚMultiCallCreator)Úpyparse)Úquery)Úreplace)Úsearch)Ú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.7/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 ddlmZ ddlm Z  ddl!m"Z" e# $¡ Z%dZ&dñdd„Z'dd„ Z(dd„ Z)dd„ Z*dd„ Z+dòdd„Z,ddd d!d"d#d$gZ-d%d&„ Z.d'd(„ Z/d)d*„ Z0d+d,„ Z1d-d.„ Z2d/d0„ Z3dZ4d1d2„ Z5d3gZ6d4d5„ Z7d6d7„ Z8d8d9„ Z9d:d;„ Z:dód<d=„Z;dôd>d?„Z<dõd@dA„Z=dödBdC„Z>dDdE„ Z?dFdG„ Z@dHdI„ ZAd÷dJdK„ZBdødLdM„ZCdNdO„ ZDdPdQ„ ZEdRdS„ ZFdTdU„ ZGdVdW„ ZHdXdY„ ZIdZd[„ ZJd\d]„ ZKd^d_„ ZLd`da„ ZMdbdc„ ZNdùddde„ZOdúdfdg„ZPdûdhdi„ZQdjdk„ ZRdldm„ ZSdndo„ ZTdpdq„ ZUdrds„ ZVdtdu„ ZWdvdw„ ZXdxdy„ ZYeZj[eZj\ dz Z]d{d|„ Z^d}d~„ Z_dd€„ Z`dd‚„ Zadƒd„„ Zbd…d†„ Zcd‡dˆ„ Zddüd‰dŠ„Zed‹dŒ„ ZfddŽ„ Zgdd„ Zhd‘d’„ Zid“d”„ Zjd•d–„ Zkd—d˜„ Zld™dš„ Zmdýdœd„ZndždŸ„ Zodþd d¡„Zpd¢d£„ Zqd¤d¥„ Zrd¦d§„ Zsd¨d©„ Ztdªd«„ Zud¬d­„ Zvd®d¯„ Zwd°d±„ Zxd²d³„ Zyd´dµiZzd¶d·„ Z{dÿd¸d¹„Z|d dºd»„Z}d¼d½„ Z~dd¾d¿„ZddÀdÁ„Z€dÂdÃ„ ZdÄdÅ„ Z‚dÆdÇ„ ZƒdÈdÉ„ Z„ddËdÌ„Z…dÍdÎ„ Z†dÏdÐ„ Z‡dÑdÒ„ ZˆdÓdÔ„ Z‰dÕdÖ„ ZŠd×dØ„ Z‹dÙdÚ„ ZŒdÛdÜ„ ZdÝdÞ„ ZŽdßdà„ Zdádâ„ Zdãdä„ Z‘dådæ„ Z’dçdè„ Z“dédê„ Z”dëdì„ Z•dídî„ Z–dïdð„ Z—dS (  ÚEditorWindowr   )Ú
Percolator)ÚColorDelegatorÚcolor_config)ÚUndoDelegator)Ú	IOBindingÚencoding)Úmainmenu)ÚMultiStatusBar)ÚAutoComplete)Ú
AutoExpand)ÚCalltip)ÚCodeContext)ÚFormatParagraph)Ú
ParenMatch)ÚRstrip)ÚSqueezer)Ú
ZoomHeightNc             C   s\  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 tjd¡| _d| _t|
ƒ | _ }t!|dd | _"}tj#ddddd| _$dddd| j$d tj#ddd!ddd"œ}t%t&ƒ|f|Ž | _'}| j'| j_(|  )¡  |  *¡  | j +d#| j,¡ | j -d$| j.¡ t/ 0¡ rp| -d$| j.¡ | -d%| j1¡ | -d&| j1¡ n| -d'| j1¡ | -d(| j2¡ | -d)| j2¡ | -d*| j2¡ | -d+| j3¡ | -d,| j4¡ | -d-| j5¡ | -d.| j6¡ | -d/| j7¡ | -d0| j8¡ | -d1| j9¡ | -d2| j:¡ | -d3| j;¡ | -d4d5d6„ ¡ | -d7| j<¡ | -d8| j=¡ | -d9| j>¡ | -d:| j?¡ | -d;| j@¡ | -d<| jA¡ | -d=| jB¡ | -d>| jC¡ | -d?| jD¡ | -d@| jE¡ | -dA| jF¡ | -dB| jG¡ | -dC| jH¡ | -dD| jI¡ | -dE| jJ¡ | -dF| jK¡ | -dG| jL¡ | -dH| jM¡ | -dI| jN¡ | -dJ|  Od¡¡ | -dK|  OdL¡¡ | -dM| jP¡ | -dN| jQ¡ | -dO| jR¡ |rö||j| < |r®| |jS|< | -dP| jT¡ | -dQ| jjU¡ | -dR| jV¡ | -dS| jW¡ | -dT| jX¡ |  Y¡  | jZ|dU< |j[t\t]dV |j^|dW< t _| jdd¡|dX< |j[t`tadLdY |j[tbtadLdY | c¡  tj#ddZd[d\d}| | _dd]| _e| je| _f|  g¡  d^| _h|  i|¡ | _j}|  k¡  | _l}| m|¡ |jn|_n|jo|_o| p| jq¡ |  r| ¡ | _s}| t| ju¡ d_| _v|  wd_¡ d | _x|rbtj y|¡rRtj |¡sR| z|¡rbd`| _v|  {|¡}|  w|¡ n| ||¡ d`| _v|  }¡  |  q¡  |  ~¡  |  ¡  | j€ da¡}|rØ| ‚db¡}|d kr¬dc}|dkrÆ| ƒ¡  |dL }|| _„t …| j†¡ t‡jˆ| _ˆt‰jŠ| _Št‡j‹| _‹| Œddde¡ | Œdfdgdhdi¡ | Œdjdk¡ | Œdldm¡ | Œdndmdodp¡ |  | ¡}| -dd|jŽ¡ | -df|j¡ | -dq|j¡ | -dr|  ‘| ¡j’¡ | -ds|  “| ¡j”¡ |  •| ¡}| -dt|j–¡ | -dn|j—¡ || ƒ}| -du|j˜¡ | -dv|j™¡ | -dw|jš¡ | -dx|  ›| ¡jœ¡ |  | ¡}| -dj|jž¡ | -dl|jŸ¡ | -dy|j ¡ | -dz|  ¡| ¡j¢¡ | -d{|  £| ¡j¤¡ 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)r8   ZpadxZwrapZhighlightthicknessr:   Ztabstyler?   ZWM_DELETE_WINDOWz<<close-window>>z<Control-Button-1>z<2>z<3>z<MouseWheel>z
<Button-4>z
<Button-5>z<<cut>>z<<copy>>z	<<paste>>z<<center-insert>>z<<help>>z<<python-docs>>z<<about-idle>>z<<open-config-dialog>>z<<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>>z<<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>>z<<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>>Úcommand)ÚsideÚfillZyscrollcommandÚfont)rF   rG   ÚexpandÚIndentz
use-spacesÚboolr   )é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>>)¥Zidlelib.runscriptr1   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   r7   Ú	GetOptionr:   r
   ZTextr=   Zfocused_widgetÚcreatemenubarÚapply_bindingsZprotocolÚcloseÚbindÚclose_eventr	   ZisAquaTkÚright_menu_eventÚmousescrollÚ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_eventÚindent_region_eventÚdedent_region_eventÚcomment_region_eventÚuncomment_region_eventÚtabify_region_eventÚuntabify_region_eventÚtoggle_tabs_eventÚ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Úhandle_yviewÚpackÚRIGHTÚYÚsetÚGetFontZLEFTZBOTHZTOPZ	focus_setÚusetabsÚtabwidthÚindentwidthÚset_notabs_indentwidthÚ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ÚexistsÚloadfileÚispythonsourceZset_filenameÚResetColorizerÚupdate_recent_files_listÚload_extensionsÚmenudictÚgetÚindexÚadd_separatorÚ	wmenu_endZregister_callbackÚpostwindowsmenuÚtkMessageBoxÚaskyesnoÚtkSimpleDialogÚ
askintegerÚ	showerrorÚ	event_addr(   Zautocomplete_eventZtry_open_completions_eventZforce_open_completions_eventr)   Zexpand_word_eventr,   Zformat_paragraph_eventr-   Zflash_paren_eventZparen_closed_eventZcheck_module_eventZrun_module_eventZrun_custom_eventr.   Z	do_rstripr*   Ztry_open_calltip_eventZrefresh_calltip_eventZforce_open_calltip_eventr0   Zzoom_height_eventr+   Ztoggle_code_context_event)ÚselfrY   ÚfilenameÚkeyrZ   r1   ZdochomeZpyverZbasepathZchmfiler]   rd   r7   Ztext_optionsr=   Z	usespacesrž   rŸ   r¤   Ú	is_py_srcr5   rM   ZautocompleteZ
parenmatchZscriptbindingZctipr   r   r   Ú__init__A   sz   





















zEditorWindow.__init__c             C   sn   t |tƒr`y| | j¡}W nD tk
r^   y| | j¡}W n tk
rX   | d¡}Y nX Y nX t dd|¡S )z4Return filename as BMP unicode so displayable in Tk.z	iso8859-1u   [ð€€-ô¿¿]u   ï¿½)Ú
isinstanceÚbytesÚdecodeÚfilesystemencodingÚUnicodeDecodeErrorr%   ÚreÚsub)rº   r»   r   r   r   Ú_filename_to_unicode>  s    
z!EditorWindow._filename_to_unicodec             C   s   | j  ¡ \}}| j |¡ dS )Nr@   )r¤   ZdefaultfilenamerY   Únew)rº   rA   ÚdirnameÚbasenamer   r   r   rŽ   M  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	 ƒ}n:| j dd¡}x*tt	|ƒƒD ]}|| d
kr€P q€W 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¡¡rD| 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iomarkz<=zinsert lineendzinsert linestartÚ.rD   )ú ú	Úinsertzinsert linestart+ÚcÚselz1.0rM   z	sel.firstZ	my_anchorú<zsel.lastú>r@   )ÚstateZkeysymr=   r°   Úcomparer;   Úsplitr¯   ÚrangeÚlenÚstrÚ
tag_removeÚmark_setÚtag_addÚsee)rº   rA   ZinsertptÚlineZlineatÚdestÚfirstÚlastr   r   r   rŒ   R  s@    
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 )NrD   Zgrey75)r?   ZborderwidthZ
backgroundr   Z	_padding1z    )rF   ÚcolumnzCol: ?rÝ   zLn: ?)rF   rG   z<<set-line-and-column>>z<KeyRelease>z<ButtonRelease>)r'   r]   Ú
status_barrc   r   rT   Ú	set_labelr•   r”   ZBOTTOMÚXr=   ri   Úset_line_and_columnr¹   Z
after_idle)rº   Úsepr   r   r   r’   }  s    
zEditorWindow.set_status_barc             C   s>   | j  t¡ d¡\}}| j dd| ¡ | j dd| ¡ d S )NrË   rá   zCol: %srÝ   zLn: %s)r=   r°   ZINSERTrÕ   râ   rã   )rº   rA   rÝ   rá   r   r   r   rå     s    z EditorWindow.set_line_and_column)ÚfileZ_File)ÚeditZ_Edit)ÚformatZF_ormat)ÚrunZ_Run)ZoptionsZ_Options)r   Z_Window)r   Z_Helpc             C   sÒ   | j }i  | _}xD| jD ]:\}}t|ƒ\}}t||dd ||< }|j|||d qW 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   )r8   Útearoff)Úlabelr5   Ú	underlineZappleZapplicationZIDLE)rì   r5   )rë   rç   r2   zRecent Files)rì   rí   r5   r   )r\   r®   Ú
menu_specsÚprepstrr[   Zadd_cascader	   Z
isCarbonTkÚ
fill_menusÚrecent_files_menuZinsert_cascader°   ÚENDÚbase_helpmenu_lengthÚreset_help_menu_entries)rº   Zmbarr®   r8   rì   rí   r5   r   r   r   rf     s"    

zEditorWindow.createmenubarc             C   sJ   | j d }| d¡}|d kr d}|| jkr<| | jd |¡ t |¡ d S )Nr   rM   rN   rD   )r®   r°   r²   Údeleter   Zadd_windows_to_menu)rº   r5   rM   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º   r5   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Ó   N)r®   rö   )rº   r5   r°   rÓ   r÷   r   r   r   Úupdate_menu_stateÀ  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   rM   z@0,0ZscrollÚunitsr@   )ÚfloatÚroundÚ	getlinenor=   Úyview)rº   rA   ÚargsZfractionÚlinesr   r   r   r“   Å  s    zEditorWindow.handle_yviewc             C   s@   t j|jdkt j|jdki}||j r*dnd}| j |d¡ dS )aš  Handle scrollwheel event.

        For wheel up, event.delta = 120*n on Windows, -1*n on darwin,
        where n can be > 1 if one scrolls fast.  Flicking the wheel
        generates up to maybe 20 events with n up to 10 or more 1.
        Macs use wheel down (delta = 1*n) to scroll up, so positive
        delta means to scroll up on both systems.

        X-11 sends Control-Button-4 event instead.
        r   rÊ   éûÿÿÿr>   rú   r@   )Z	EventTypeZ
MouseWheelZdeltaZButtonZnumr<   r=   Zyview_scroll)rº   rA   Zupr   r   r   r   rl   Ð  s
    zEditorWindow.mousescrollc       	   	   C   sØ   | j  dd|j|jf ¡ | js(|  ¡  | j}|| _tjd d… dk}|rX| j j	dd xX| j
D ]N}y|\}}}W n tk
rˆ   w`Y nX |d kr”q`t| |ƒƒ }|j||d q`W | |j|j¡ |rÔ| j j	dd d	S )
NrÎ   z@%d,%dr2   r3   Zarrow)Zcursor)rÓ   Zibeamr@   )r=   rÚ   ÚxÚyÚrmenuÚ
make_rmenurA   r   rT   ZconfigÚrmenu_specsÚ
ValueErrorÚgetattrZentryconfigureZtk_popupZx_rootZy_root)	rº   rA   r  ZiswinÚitemrì   Ú	eventnameZverify_staterÓ   r   r   r   rk   ã  s*    zEditorWindow.right_menu_event)ZClosez<<close-window>>Nc             C   sj   t | jdd}xP| jD ]F}|d |d  }}|d k	rT| j|fdd„}|j||d q| ¡  qW || _d S )Nr   )rë   rD   c             S   s   |   |¡ d S )N)Úevent_generate)r=   r
  r   r   r   rE     s    z(EditorWindow.make_rmenu.<locals>.command)rì   rE   )r[   r=   r  Úadd_commandr±   r  )rº   r  r	  rì   r
  rE   r   r   r   r    s    zEditorWindow.make_rmenuc             C   s   |   ¡ S )N)Úrmenu_check_copy)rº   r   r   r   Úrmenu_check_cut  s    zEditorWindow.rmenu_check_cutc             C   s6   y| j  d¡}W n tk
r$   dS X |r.dS dS d S )Nz	sel.firstÚdisabledÚnormal)r=   r°   ÚTclError)rº   Zindxr   r   r   r    s
    zEditorWindow.rmenu_check_copyc             C   s6   y| j j d| j d¡ W n tk
r,   dS X dS d S )Nztk::GetSelectionZ	CLIPBOARDr  r  )r=   ÚtkÚcallr  )rº   r   r   r   Úrmenu_check_paste  s
    zEditorWindow.rmenu_check_pastec             C   s   t  | j¡ dS )zHandle Help 'About IDLE' event.r@   )r   ZAboutDialogr]   )rº   rA   r   r   r   rs   "  s    zEditorWindow.about_dialogc             C   s   t  | jd¡ dS )z&Handle Options 'Configure IDLE' event.ZSettingsr@   )r   ZConfigDialogr]   )rº   rA   r   r   r   rt   (  s    zEditorWindow.config_dialogc             C   s"   | j r| j }n| j}t |¡ dS )zHandle Help 'IDLE Help' event.r@   )rZ   r]   r   Zshow_idlehelp)rº   rA   Úparentr   r   r   rq   .  s
    
zEditorWindow.help_dialogc          
   C   sn   t jd d… dkr^yt | j¡ W qj tk
rZ } ztjdt|ƒ| j	d W d d }~X Y qjX nt
 | j¡ dS )Nr2   r3   zDocument Start Failure)ÚtitleÚmessager  r@   )r   rT   rP   Ú	startfilerO   ÚOSErrorr´   r¸   rØ   r=   Ú
webbrowserÚopen)rº   rA   Úwhyr   r   r   rr   8  s    $zEditorWindow.python_docsc             C   s   | j  d¡ dS )Nz<<Cut>>r@   )r=   r  )rº   rA   r   r   r   rm   C  s    zEditorWindow.cutc             C   s    | j  d¡sd S | j  d¡ dS )NrÐ   z<<Copy>>r@   )r=   Z
tag_rangesr  )rº   rA   r   r   r   rn   G  s    zEditorWindow.copyc             C   s   | j  d¡ | j  d¡ dS )Nz	<<Paste>>rÎ   r@   )r=   r  rÜ   )rº   rA   r   r   r   ro   N  s    zEditorWindow.pastec             C   s.   | j  ddd¡ | j  dd¡ | j  d¡ dS )NrÐ   z1.0zend-1crÎ   r@   )r=   rÛ   rÚ   rÜ   )rº   rA   r   r   r   rv   S  s    zEditorWindow.select_allc             C   s    | j  ddd¡ | j  d¡ dS )NrÐ   z1.0rM   rÎ   r@   )r=   rÙ   rÜ   )rº   rA   r   r   r   rw   Y  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>yˆdƒ ˆdˆˆ  ƒ W n tk
r<   Y nX d S )Nr>   r   z	sel.firstrÎ   )rÓ   r  )rA   )Ú
edge_indexÚedges_tableÚself_text_indexÚself_text_mark_setr   r   Úmove_at_edgei  s    z<EditorWindow.move_at_edge_if_selection.<locals>.move_at_edge)r=   r°   rÚ   )rº   r  r!  r   )r  r  r  r   r   r‰   ^  s
    z&EditorWindow.move_at_edge_if_selectionc             C   s   | j  d¡ dS )Nz<Meta-Delete>r@   )r=   r  )rº   rA   r   r   r   rŠ   r  s    zEditorWindow.del_word_leftc             C   s   | j  d¡ dS )Nz<Meta-d>r@   )r=   r  )rº   rA   r   r   r   r‹   v  s    zEditorWindow.del_word_rightc             C   s   t  | j¡ dS )Nr@   )r   Úfindr=   )rº   rA   r   r   r   rx   z  s    zEditorWindow.find_eventc             C   s   t  | j¡ dS )Nr@   )r   Z
find_againr=   )rº   rA   r   r   r   ry   ~  s    zEditorWindow.find_again_eventc             C   s   t  | j¡ dS )Nr@   )r   Zfind_selectionr=   )rº   rA   r   r   r   r{   ‚  s    z!EditorWindow.find_selection_eventc             C   s   t   | j| j| j¡ dS )Nr@   )r   r=   r¤   rY   )rº   rA   r   r   r   rz   †  s    z EditorWindow.find_in_files_eventc             C   s   t   | j¡ dS )Nr@   )r   r=   )rº   rA   r   r   r   r|   Š  s    zEditorWindow.replace_eventc             C   sT   | j }tjdd|d}|d kr"dS |dkr6| ¡  dS | dd| ¡ | d¡ dS )NZGotozGo to line number:)r  r@   r   rÎ   z%d.0)r=   r¶   r·   ÚbellrÚ   rÜ   )rº   rA   r=   Úlinenor   r   r   r}   Ž  s    

zEditorWindow.goto_line_eventc             C   sp   y| 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.
        z	sel.firstzsel.lastr6   zOpen ModulezAEnter the name of a Python module
to search on sys.path and open:N)r=   r¯   Ústripr  r   Z
ModuleNameÚresultrY   r  r¤   r©   )rº   r8   Z	file_pathr   r   r   Úopen_module›  s    
zEditorWindow.open_modulec             C   s   |   ¡  dS )Nr@   )r'  )rº   rA   r   r   r   ru   ³  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PyShellEditorWindowr@   r   )Úbrowser)	r¤   r»   Ú	__class__Ú__name__r'  Úidlelibr(  ZModuleBrowserrZ   )rº   rA   r»   r(  r   r   r   r   ·  s    z EditorWindow.open_module_browserc             C   s   ddl m} | | j¡ dS )Nr   )Úpathbrowserr@   )r+  r,  ZPathBrowserrZ   )rº   rA   r,  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)Úshellr@   )Ú
subprocessr   Ú
executableÚPopen)rº   rA   r.  Ú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Ð   z1.0rM   z
insert +1l)r=   rÚ   rÙ   rÛ   Úcenter)rº   r$  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.pywz1.0z1.0 lineendz#!Zpython)	rP   rQ   rV   ÚsplitextrÉ   Únormcaser=   r¯   Ú
startswith)rº   r»   ÚbaseZextrÝ   r   r   r   rª   ×  s    zEditorWindow.ispythonsourcec             C   s   | j r| j  | ¡ d | _ d S )N)rY   Zunregister_maybe_terminate)rº   r   r   r   Ú
close_hookà  s    zEditorWindow.close_hookc             C   s
   || _ d S )N)r8  )rº   r8  r   r   r   Úset_close_hookå  s    zEditorWindow.set_close_hookc             C   s2   | j r| j  | ¡ |  ¡  | j | ¡ |  ¡  d S )N)rY   Zfilename_changed_editr£   r]   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 )N)	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 )N)r§   Zremovecolorsrž   r:  )rº   r   r   r   Ú_rmcolorizerú  s
    
zEditorWindow._rmcolorizerc             C   s    |   ¡  |  ¡  t | j¡ dS )zUpdate the color themeN)r<  r;  r   r"   r=   )rº   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º   r=   ÚposÚcharr   r   r   Úcolorize_syntax_error
  s    
z"EditorWindow.colorize_syntax_errorc             C   s   t  | jdd¡| jd< dS )z.Update the text widgets' font if it is changedr9   r   rH   N)r   r˜   rZ   r=   )rº   r   r   r   Ú	ResetFont  s    zEditorWindow.ResetFontc             C   s„   t  ¡  | j_}x&| ¡ D ]\}}| jj|f|žŽ  qW xF|  ¡ D ]:}t  |¡}|rBx&| ¡ D ]\}}| jj|f|žŽ  q^W qBW dS )z/Remove the keybindings before they are changed.N)	r   ÚGetCurrentKeySetr&   Údefault_keydefsÚitemsr=   Zevent_deleteÚget_standard_extension_namesÚGetExtensionBindings)rº   ÚkeydefsrA   ÚkeylistÚextensionNameÚxkeydefsr   r   r   ÚRemoveKeybindings  s    
zEditorWindow.RemoveKeybindingsc             C   sV  t  ¡  | j_}|  ¡  x(|  ¡ D ]}t  |¡}|r"|  |¡ q"W i }xR| jjD ]F}i ||d < x4|d D ](}|rj|d ||d  t|d ƒd < qjW qPW x¶| j	D ]¬}| j	| }| 
t¡}|dkrÄq¢|d7 }x€td|ƒD ]r}	| |	¡dkrØ| |	d¡}
|
rØ| |	d¡}d}||kr.||| kr.|| | }|rØt||ƒ}
|j|	|
d qØW q¢W dS )	z-Update the keybindings after they are changedr   rD   NrE   Úacceleratorrì   r6   )rN  )r   rD  r&   rE  rg   rG  rH  Úmenudefsrï   r®   r°   rò   rÖ   r<   Z	entrycgetÚget_acceleratorrö   )rº   rI  rK  rL  ZmenuEventDictr5   r	  ZmenubarItemrM   r°   ZaccelZitemNamerA   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 windowr9   rJ   z
num-spacesr;   )r<   N)r™   r   re   r›   )rº   r   r   r   rœ   K  s    
z#EditorWindow.set_notabs_indentwidthc             C   s€   t  ¡ }| jd }| t¡}|| jkr8| | jd |¡ |rr| ¡  x,|D ]$}|  |d ¡}|j	|d |d qJW || jd< dS )z3Update the additional help entries on the Help menur   rD   r   )rì   rE   N)
r   ZGetAllExtraHelpSourcesListr®   r°   rò   ró   rõ   r±   Ú"_EditorWindow__extra_help_callbackr  )rº   Z	help_listZhelpmenuZhelpmenu_lengthÚentryr1  r   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rryt | ¡ W q| tk
rn } ztj	dt
|ƒˆ jd W d d }~X Y q|X n
t | ¡ d S )N)ZwwwZhttpr2   r3   zDocument Start Failure)r  r  r  )r6  rP   rQ   rX   r   rT   r  r  r´   r¸   rØ   r=   r  r  )Úhelpfiler  )rº   r   r   Údisplay_extra_helpe  s    
$z>EditorWindow.__extra_help_callback.<locals>.display_extra_helpr   )rº   rT  rU  r   )rº   r   Z__extra_help_callbackc  s    z"EditorWindow.__extra_help_callbackc          
      sÌ  g }t j | j¡r8t| jdddd}| ¡ }W dQ R X |rjt j |¡d }||kr^| |¡ | d|¡ g ‰ x2|D ]*}d|ks”t j |dd	… ¡stˆ  	|¡ qtW ‡ fd
d„|D ƒ}d}|dt
|ƒ… }y,t| jdddd}| |¡ W dQ R X W n\ tk
rP } z<t| jddƒs@d| j_tjdd|  t|ƒ¡ | jd W dd}~X Y nX xt| jjD ]h}|j}	|	 dt¡ xNt|ƒD ]B\}
}| ¡ }|  |¡}| |¡}|	j||
 d | |dd q|W q\W dS )z/Load and update the recent files list and menusÚrÚutf_8r   )r%   ÚerrorsNr>  r   ú rN   c                s   g | ]}|ˆ kr|‘qS r   r   )Ú.0rQ   )Ú	bad_pathsr   r   ú
<listcomp>ƒ  s    z9EditorWindow.update_recent_files_list.<locals>.<listcomp>Z1234567890ABCDEFGHIJKÚwÚrecentfilelist_error_displayedFTzIDLE Warningz|Cannot update File menu Recent Files list. Your operating system says:
%s
Select OK and IDLE will continue without updating.)r  r  r  rÌ   )rì   rE   rí   )rP   rQ   r¨   ra   r  Ú	readlinesÚabspathÚremoverÎ   Úappendr×   Ú
writelinesr  r  rZ   r^  r´   ÚshowwarningrÆ   rØ   r=   r]   r`   rñ   rõ   rò   Ú	enumerateÚrstripÚ#_EditorWindow__recent_file_callbackr  )rº   Únew_fileZrf_listZrf_list_filerQ   ZulcharsZrf_fileÚerrÚinstancer5   ÚiÚ	file_nameZ
ufile_nameÚcallbackr   )r[  r   r¬   r  sL    



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_closure)rº   r   r   Úopen_recent_file¡  s    z=EditorWindow.__recent_file_callback.<locals>.open_recent_filer   )rº   rl  rn  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_savedr]   Zwm_titleZwm_iconname)rº   ZshortZlongr  Ziconr   r   r   r£   ¥  s    zEditorWindow.saved_change_hookc             C   s
   | j  ¡ S )N)rŸ   rs  )rº   r   r   r   rs  ·  s    zEditorWindow.get_savedc             C   s   | j  |¡ d S )N)rŸ   Ú	set_saved)rº   Úflagr   r   r   rt  º  s    zEditorWindow.set_savedc             C   s   | j  ¡  d S )N)rŸ   Ú
reset_undo)rº   r   r   r   rv  ½  s    zEditorWindow.reset_undoc             C   s(   | j j}|rtj |¡}nd}|  |¡S )Nro  )r¤   r»   rP   rQ   rÉ   rÆ   )rº   r»   r   r   r   rp  À  s
    zEditorWindow.short_titlec             C   s   |   | jjpd¡S )Nr6   )rÆ   r¤   r»   )rº   r   r   r   rq  É  s    zEditorWindow.long_titlec             C   s   |   ¡  dS )Nr@   )r2  )rº   rA   r   r   r   rp   Í  s    z EditorWindow.center_insert_eventrÎ   c             C   sH   | j }|  ¡ \}}|  |¡}|| }td||d  ƒ}| t|ƒ¡ d S )NrD   r4   )r=   Úgetwindowlinesrý   Úmaxrþ   rû   )rº   Úmarkr=   r]   Úbotr$  r?   Znewtopr   r   r   r2  Ñ  s    
zEditorWindow.centerc             C   sN   | j }|  d¡}|  d¡}||krF| ¡ dkrFt|d ƒ}|| d }||fS )Nz@0,0z@0,65535rD   r?   )r=   rý   Zwinfo_heightr;   )rº   r=   r]   rz  r?   r   r   r   rw  Ù  s    

zEditorWindow.getwindowlinesc             C   s   | j }tt| |¡ƒƒS )N)r=   r;   rû   r°   )rº   ry  r=   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+))r]   Zwm_geometryrÄ   ÚmatchÚlistÚmapr;   Úgroups)rº   ZgeomÚmr   r   r   Úget_geometryç  s    
zEditorWindow.get_geometryc             C   s   |   ¡  dS )Nr@   )rh   )rº   rA   r   r   r   rj   í  s    zEditorWindow.close_eventc             C   sH   | j rD|  ¡ s:| j ¡ dkr&| j ¡  | j ¡  | j ¡  | j  ¡ S d S )Nr  )r¤   rs  r]   rÓ   Z	deiconifyÚlowerZliftÚ	maybesave)rº   r   r   r   r‚  ñ  s    


zEditorWindow.maybesavec             C   s    |   ¡ }t|ƒdkr|  ¡  |S )NZcancel)r‚  rØ   Ú_close)rº   Zreplyr   r   r   rh   ú  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)rh  )r¤   r»   r¬   r   Zunregister_callbackr³   Úunload_extensionsrh   rŸ   r§   r=   r_   rž   r]   Zdestroyr8  )rº   r   r   r   rƒ     s"    



zEditorWindow._closec             C   s   i | _ |  ¡  d S )N)Ú
extensionsÚload_standard_extensions)rº   r   r   r   r­     s    zEditorWindow.load_extensionsc             C   s4   x(t | j ¡ ƒD ]}t|dƒr| ¡  qW i | _d S )Nrh   )r|  r…  ÚvaluesÚhasattrrh   )rº   Úinsr   r   r   r„    s    
zEditorWindow.unload_extensionsc             C   sH   xB|   ¡ D ]6}y|  |¡ W q
   tdt|ƒƒ t ¡  Y q
X q
W d S )NzFailed to load extension)rG  Úload_extensionÚprintÚreprÚ	tracebackÚ	print_exc)rº   r8   r   r   r   r†    s    z%EditorWindow.load_standard_extensionsc             C   s   t jddS )NT)Zeditor_only)r   ZGetExtensions)rº   r   r   r   rG  &  s    z)EditorWindow.get_standard_extension_namesZZzDummyZzzdummyc       	   	   C   sF  | j  ||¡}y>y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|< |rB|  |¡ x„|D ]|}| dd¡}x |d d… dkrò|dd … }qÔW x"|d	d … d
kr|d d	… }qöW |d }t||ƒrÂ| j |t||ƒ¡ qÂW d S )NrË   )Úpackagez
Failed to import extension: rO  ú-r=  rD   rÑ   rN   rÒ   Z_event)Úextfilesr¯   Ú	importlibÚimport_moduleÚ__package__ÚImportErrorÚ	TypeErrorr‹  r  r   rH  rˆ  rð   rO  r…  rg   r   r=   ri   )	rº   r8   ÚfnameÚmodÚclsrI  r‰  ZveventZ
methodnamer   r   r   rŠ  -  s4    







zEditorWindow.load_extensionc             C   sJ   |d kr| j j}| j}||_x(| ¡ D ]\}}|r&|j|f|žŽ  q&W d S )N)r&   rE  r=   rI  rF  r¹   )rº   rI  r=   rA   rJ  r   r   r   rg   I  s    zEditorWindow.apply_bindingsc          	   C   sò   |dkr| j j}|dkr | j j}| j}| j}xÀ|D ]¸\}}| |¡}|sJq2xž|D ]–}|sb| ¡  qP|\}	}
|	dd… dk}|rŠ|	dd… }	t|	ƒ\}}	t||
ƒ}||
fdd„}|rÔ|  	|
t
¡}|j|	||||d qP|j|	|||d qPW q2W dS )zAdd appropriate entries to the menus and submenus

        Menus that are absent or None in self.menudict are ignored.
        NrD   ú!c             S   s   |   |¡ d S )N)r  )r=   r
  r   r   r   rE   k  s    z(EditorWindow.fill_menus.<locals>.command)rì   rí   rE   rN  Zvariable)rì   rí   rE   rN  )r&   rO  rE  r®   r=   r¯   r±   rï   rP  Úget_var_objZ
BooleanVarZadd_checkbuttonr  )rº   rO  rI  r®   r=   ZmnameZ	entrylistr5   rS  rì   r
  Zcheckbuttonrí   rN  rE   Úvarr   r   r   rð   R  s8    




zEditorWindow.fill_menusc             C   s&   |   |¡}|r| ¡ }|S t|ƒ‚d S )N)r›  r¯   Ú	NameError)rº   r8   rœ  Úvaluer   r   r   Úgetvarw  s
    
zEditorWindow.getvarc             C   s(   |   ||¡}|r| |¡ nt|ƒ‚d S )N)r›  r—   r  )rº   r8   rž  Úvartyperœ  r   r   r   Úsetvar  s    zEditorWindow.setvarc             C   s,   | j  |¡}|s(|r(|| jƒ | j |< }|S )N)r_   r¯   r=   )rº   r8   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ÚSTRINGrD   )r§   r=   Útag_prevrangeZ	tag_names)rº   Z
text_indexr   r   r   Úis_char_in_string–  s    zEditorWindow.is_char_in_stringc             C   s:   y | j  d¡}| j  d¡}||fS  tk
r4   dS X d S )Nz	sel.firstzsel.last)NN)r=   r°   r  )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)r=   Ú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 )NrH   Zmeasurez
-displayofÚn)r¦  )r=   r¨  r  r  ZmasterZ	configure)rº   Znewtabwidthr=   Zpixelsr   r   r   Úset_tk_tabwidth³  s    
zEditorWindow.set_tk_tabwidthTc             C   sP   |r@|r@|   ¡ }d|  kr$dkr.n n|| _| j| jkr@d| _|  | j¡ d S )Nr4   r   F)Úguess_indentr›   rš   r™   rª  )rº   r½   Zguessrk  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
}	xJ|| jkrÐP |d d… }|	d }	t| 	|¡ƒ}||ks|d d	krÄP qÄW | ¡  | d|	 d¡ ||k rD| dd||  ¡ | ¡  dS )NrÎ   r@   zinsert linestartr6   rÒ   z1.0z	insert-1crN   z 	r   rD   z
insert-%dcrÌ   )r=   r¥  rõ   rÚ   r¯   rÔ   r#  rš   r×   Ú
expandtabsÚAssertionErrorr›   rb   r¡   rÎ   r¢   )
rº   rA   r=   rß   rà   Úcharsrš   ZhaveZwantZncharsdeletedr   r   r   r~   Ç  sD    


z"EditorWindow.smart_backspace_eventc       
      C   sê   | j }|  ¡ \}}| ¡  zÀ|rV|rVt|ƒt|ƒkr>|  |¡S | ||¡ | d|¡ | dd¡}t|| j	ƒ\}}|t
|ƒkr|  || j ¡ n>| jrœd}n&t
| | j	¡ƒ}| j}	d|	||	   }| d|¡ | d¡ dS | ¡  X d S )NrÎ   zinsert linestartrÍ   rÌ   r@   )r=   r¥  r¡   Ú
index2liner   rõ   rÚ   r¯   Ú
classifywsrš   r×   Úreindent_tor›   r™   r¬  rÎ   rÜ   r¢   )
rº   rA   r=   rß   rà   ÚprefixÚrawÚ	effectiveZpadr©  r   r   r   r€   ó  s,    

zEditorWindow.smart_indent_eventc          	   C   sþ  | j }|  ¡ \}}| ¡  zÈ|r>|r>| ||¡ | d|¡ | dd¡}dt|ƒ }}x ||k rx|| dkrx|d }qZW ||kr’| dd¡ dS |d |… }d}x2|rÔ|d dkrÔ|| jkrÔ|d d… }|d }q¤W |rê| d	| d¡ x| d¡dkr| d¡ qìW | dd¡ t	| 
d¡ƒ}	t | j| j¡}
| js¶xf| jD ]\}t|	| dƒ}t|ƒd
 }| |d¡}|
 |¡ |
 |  |¡¡}|d k	sœ|dkrDP qDW |
 |p°d¡ n@| dd¡}|rÒ|d }nd}| |d¡}|
 |¡ |
 d¡ |
 ¡ }|tjkrž|tjkrn‚|tjkr2| d|¡ nh|tjkrN|  |
 ¡ ¡ nL|tjkr†|
 ¡ dkrv| d|¡ n|  |
  ¡ ¡ ndsšt!d|f ƒ‚dS |
 "¡ }| d|¡ |
 #¡ rÈ|  $|¡ n|râ|
 %¡ râ|  &|¡ dS | 'd¡ | (¡  X d S )NrÎ   zinsert linestartr   z 	rD   r>  r@   rN   zinsert - %d charsz.0Zconsolez1.0zbogus continuation type %r))r=   r¥  r¡   rõ   rÚ   r¯   r×   rÎ   rb   r¯  r°   r   ZParserr›   rš   r   rx  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Ü   r¢   )rº   rA   r=   rß   rà   rÝ   rk  r©  ÚindentZlnor  ÚcontextZstartatZstartatindexZrawtextZbodrV  rÏ   r   r   r   r     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   sz   |   ¡ \}}}}xTtt|ƒƒD ]D}|| }|rt|| jƒ\}}	|	| j }	|  |	¡||d …  ||< qW |  ||||¡ dS )Nr@   )Ú
get_regionrÖ   r×   r°  rš   r›   Ú_make_blanksÚ
set_region)
rº   rA   ÚheadÚtailr®  r   r@  rÝ   r³  r´  r   r   r   r   …  s    
z EditorWindow.indent_region_eventc       
      C   s€   |   ¡ \}}}}xZtt|ƒƒD ]J}|| }|rt|| jƒ\}}	t|	| j dƒ}	|  |	¡||d …  ||< qW |  ||||¡ dS )Nr   r@   )	rº  rÖ   r×   r°  rš   rx  r›   r»  r¼  )
rº   rA   r½  r¾  r®  r   r@  rÝ   r³  r´  r   r   r   r‚     s    z EditorWindow.dedent_region_eventc             C   sR   |   ¡ \}}}}x,tt|ƒd ƒD ]}|| }d| ||< q"W |  ||||¡ dS )NrD   z##r@   )rº  rÖ   r×   r¼  )rº   rA   r½  r¾  r®  r   r@  rÝ   r   r   r   rƒ   ›  s    z!EditorWindow.comment_region_eventc             C   sŠ   |   ¡ \}}}}xdtt|ƒƒD ]T}|| }|s0q|d d… dkrN|dd … }n|d d… dkrj|dd … }|||< qW |  ||||¡ dS )Nr4   z##rD   ú#r@   )rº  rÖ   r×   r¼  )rº   rA   r½  r¾  r®  r   r@  rÝ   r   r   r   r„   £  s    z#EditorWindow.uncomment_region_eventc             C   s–   |   ¡ \}}}}|  ¡ }|d kr$d S x\tt|ƒƒD ]L}|| }|r2t||ƒ\}	}
t|
|ƒ\}}d| d|  ||	d …  ||< q2W |  ||||¡ dS )NrÍ   rÌ   r@   )rº  Ú_asktabwidthrÖ   r×   r°  Údivmodr¼  )rº   rA   r½  r¾  r®  r   rš   r@  rÝ   r³  r´  ÚntabsÚnspacesr   r   r   r…   ±  s     $z EditorWindow.tabify_region_eventc             C   s`   |   ¡ \}}}}|  ¡ }|d kr$d S x&tt|ƒƒD ]}||  |¡||< q2W |  ||||¡ dS )Nr@   )rº  rÀ  rÖ   r×   r¬  r¼  )rº   rA   r½  r¾  r®  r   rš   r@  r   r   r   r†   ¾  s     z"EditorWindow.untabify_region_eventc             C   sF   | j ddd| j  d d| j  d d | jdrB| j | _d	| _d
S )NzToggle tabsz
Turn tabs )ZonZoffz?
Indent width )zwill bez
remains atz 8.z!
 Note: a tab is always 8 columns)r  r   r@   )rµ   r™   r=   r›   )rº   rA   r   r   r   r‡   Ç  s    

zEditorWindow.toggle_tabs_eventc             C   s8   | j dd| j| jddd}|r4|| jkr4| js4|| _dS )NzIndent widthz6New indent width (2-16)
(Always use 8 when using tabs)r4   é   )r  ÚinitialvalueÚminvalueÚmaxvaluer@   )r·   r=   r›   r™   )rº   rA   rÇ   r   r   r   rˆ   Ý  s    z%EditorWindow.change_indentwidth_eventc             C   sn   | j }|  ¡ \}}|r8|r8| |d ¡}| |d ¡}n| d¡}| d¡}| ||¡}| d¡}||||fS )Nz
 linestartz-1c lineend +1czinsert linestartzinsert lineend +1cr>  )r=   r¥  r°   r¯   rÕ   )rº   r=   rß   rà   r½  r¾  r®  r   r   r   r   rº  é  s    


zEditorWindow.get_regionc             C   sx   | j }d |¡}||kr$| ¡  d S | ddd¡ | d|¡ | ¡  | ||¡ | ||¡ | ¡  | 	d|d¡ d S )Nr>  rÐ   z1.0rM   rÎ   )
r=   rR   r#  rÙ   rÚ   r¡   rõ   rÎ   r¢   rÛ   )rº   r½  r¾  r®  r   r=   Únewcharsr   r   r   r¼  ö  s    
zEditorWindow.set_regionc             C   s2   | j r&t|| jƒ\}}d| d|  S d| S d S )NrÍ   rÌ   )r™   rÁ  rš   )rº   r©  rÂ  rÃ  r   r   r   r»    s    zEditorWindow._make_blanksc             C   sJ   | j }| ¡  | ddd¡r(| dd¡ |r>| d|  |¡¡ | ¡  d S )Nzinsert linestartz!=rÎ   )r=   r¡   rÔ   rõ   rÎ   r»  r¢   )rº   rá   r=   r   r   r   r±    s    zEditorWindow.reindent_toc             C   s   | j dd| j| jdddS )Nz	Tab widthzColumns per tab? (2-16)r4   rÄ  )r  rÅ  rÆ  rÇ  )r·   r=   r›   )rº   r   r   r   rÀ    s    zEditorWindow._asktabwidthc             C   sP   t | j| jƒ ¡ \}}|r@|r@t|| jƒ\}}t|| jƒ\}}nd }}|| S )Nr   )ÚIndentSearcherr=   rš   rê   r°  )rº   ÚopenerZindentedr³  ZindentsmallZindentlarger   r   r   r«  '  s    zEditorWindow.guess_indent)NNNN)N)N)N)N)N)N)N)N)N)N)N)rÎ   )rÎ   )N)NN)N)N)T)˜r*  Ú
__module__Ú__qualname__Zidlelib.percolatorr    Zidlelib.colorizerr!   r"   Zidlelib.undor#   Zidlelib.iomenur$   r%   r+  r&   Zidlelib.statusbarr'   Zidlelib.autocompleter(   Zidlelib.autoexpandr)   Zidlelib.calltipr*   Zidlelib.codecontextr+   Zidlelib.paragraphr,   Zidlelib.parenmatchr-   Zidlelib.rstripr.   Zidlelib.squeezerr/   Zidlelib.zoomheightr0   r   ÚgetfilesystemencodingrÂ   rO   r¾   rÆ   rŽ   rŒ   r’   rå   rî   rf   r³   rø   rù   r“   rl   r  rk   r  r  r  r  r  rs   rt   rq   rr   rm   rn   ro   rv   rw   r‰   rŠ   r‹   rx   ry   r{   rz   r|   r}   r'  ru   r   r   r‘   r3  rª   r8  r9  r¥   r;  r<  r«   ÚstringZascii_lettersZdigitsr?  rB  rC  rM  rQ  rœ   rô   rR  r¬   rg  r£   rs  rt  rv  rp  rq  rp   r2  rw  rý   r€  rj   r‚  rh   rƒ  r­   r„  r†  rG  r‘  rŠ  rg   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±  rÀ  r«  r   r   r   r   r   -   s  
 ~+






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

	
	%	,#i	
	r   c             C   s   t t| ƒƒS )N)r;   rû   )r°   r   r   r   r¯  1  s    r¯  c             C   s\   d }}xJ| D ]B}|dkr,|d }|d }q|dkrN|d }|| d | }qP qW ||fS )Nr   rÌ   rD   rÍ   r   )Úsrš   r³  r´  Zchr   r   r   r°  9  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 )Nr   )r=   rš   rk  ÚfinishedÚblkopenlineÚindentedline)rº   r=   rš   r   r   r   r¾   N  s    zIndentSearcher.__init__c             C   sL   | j r
dS | jd  }| _t|ƒd }| j |dd¡r:dS | j ||d ¡S )Nr6   rD   z.0z>=rM   z lineend+1c)rÐ  rk  rŒ  r=   rÔ   r¯   )rº   rk  ry  r   r   r   ÚreadlineT  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 )NrD   )rÐ  rÑ  rÒ  )	rº   r<   ÚtokenÚstartrM   rÝ   ÚINDENTÚNAMEZOPENERSr   r   r   Ú
tokeneater]  s    zIndentSearcher.tokeneaterc          	   C   sl   t j}| jt _zHy(t  | j¡}x|D ]}| j|Ž  q$W W n t jtfk
rR   Y nX W d |t _X | j| j	fS )N)
ÚtokenizeÚtabsizerš   Úgenerate_tokensrÓ  rÞ  Ú
TokenErrorÚSyntaxErrorrÑ  rÒ  )rº   Zsave_tabsizeÚtokensrÚ  r   r   r   rê   i  s    

zIndentSearcher.runN)
r*  rË  rÌ  r¾   rÓ  rß  rÜ  rÝ  rÞ  rê   r   r   r   r   rÉ  G  s   
	rÉ  c             C   s6   |   d¡}|dkr.| d |… | |d d …  } || fS )Nr=  r   rD   )r"  )rÏ  rk  r   r   r   rï   {  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>   ú<<change-indentwidth>>ú<<goto-line>>ú<<open-module>>r6   r   z-[a-z]\bc             S   s   |   ¡  ¡ S )N)ÚgroupÚupper)r  r   r   r   rB   ”  rC   z!get_accelerator.<locals>.<lambda>z\b\w+\bc             S   s   t  |  ¡ |  ¡ ¡S )N)Úkeynamesr¯   rë  )r  r   r   r   rB   •  rC   zKey-ZCancelz
Ctrl-BreakzControl-zCtrl-r  ú+z><rÌ   rÑ   rÒ   )r¯   r	   Z	isCocoaTkrÄ   rÅ   )rI  r
  rJ  rÏ  r   r   r   rP  Š  s    
rP  c             C   s4   | j }| ddd¡ | ddd¡ | ddd¡ d S )	NZtcl_wordBreakAfterza br   r—   Ztcl_wordcharsz\wZtcl_nonwordcharsz\W)r  r  )rZ   r  r   r   r   Úfixwordbreaks   s    rï  c             C   s‚   | }t |ƒ tjdd … r&tjd }nd }t |d ¡ t||d}|j}d|d< x,tdƒD ] }| dd| t	|ƒ d ¡ qZW d S )	NrD   )rZ   r»   é
   r?   é   rÎ   z  r>  )
rï  r   Úargvr	   ZsetupAppr   r=   rÖ   rÎ   rØ   )r  rZ   r»   rè   r=   rk  r   r   r   Ú_editor_window©  s    ró  Ú__main__)r9   zidlelib.idle_test.test_editorr4   F)Ú	verbosityÚexit)rê   )6Zimportlib.abcr’  Úimportlib.utilrP   rT   rÎ  rß  r  r  ZtkinterZtkinter.ttkr   Ztkinter.simpledialogZsimpledialogr¶   Ztkinter.messageboxZ
messageboxr´   Zidlelib.configr   r+  r   r   r   r   r	   Zidlelib.multicallr
   r   r   r   r   r   r§  Zpython_versionrr  r   r   r   Úobjectr   r¯  r°  rÉ  rï   rí  rP  rï  ró  r*  Zunittestr9   Zidlelib.idle_test.htestrê   r   r   r   r   Ú<module>   sn   
            4
	
