B
    ?™cN  ã               @   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.7/idlelib/editor.pyÚ_sphinx_version%   s    r    c               @   sF  e Zd ZddlmZ ddlmZmZ ddlm	Z	 ddl
mZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZmZmZ ddl m!Z! ddl"m#Z# ddl$m%Z% e& '¡ Z(dZ)dZ*dZ+dßdd„Z,dàdd„Z-dd„ Z.dd„ Z/dd„ Z0dd„ Z1dádd „Z2d!d"d#d$d%d&d'gZ3d(d)„ Z4d*d+„ Z5d,d-„ Z6d.d/„ Z7d0d1„ Z8dZ9d2d3„ Z:d4gZ;d5d6„ Z<d7d8„ Z=d9d:„ Z>d;d<„ Z?dâd=d>„Z@dãd?d@„ZAdädAdB„ZBdådCdD„ZCdEdF„ ZDdGdH„ ZEdIdJ„ ZFdædKdL„ZGdçdMdN„ZHdOdP„ ZIdQdR„ ZJdSdT„ ZKdUdV„ ZLdWdX„ ZMdYdZ„ ZNd[d\„ ZOd]d^„ ZPd_d`„ ZQdadb„ ZRdcdd„ ZSdèdedf„ZTdédgdh„ZUdêdidj„ZVdkdl„ ZWdmdn„ ZXdodp„ ZYdqdr„ ZZdsdt„ Z[dudv„ Z\dwdx„ Z]dydz„ Z^e_j`e_ja d{ Zbd|d}„ Zcd~d„ Zdd€d„ Zed‚dƒ„ Zfd„d…„ Zgd†d‡„ Zhdˆd‰„ ZidŠd‹„ ZjdëdŒd„ZkdŽd„ Zldd‘„ Zmd’d“„ Znd”d•„ Zod–d—„ Zpd˜d™„ Zqdšd›„ Zrdœd„ ZsdìdŸd „Ztd¡d¢„ Zudíd£d¤„Zvd¥d¦„ Zwd§d¨„ Zxd©dª„ Zyd«d¬„ Zzd­d®„ Z{d¯d°„ Z|d±d²„ Z}d³d´„ Z~dµd¶„ Zd·d¸iZ€d¹dº„ Zdîd»d¼„Z‚dïd½d¾„Zƒd¿dÀ„ Z„dðdÁdÂ„Z…dñdÃdÄ„Z†dÅdÆ„ Z‡dÇdÈ„ ZˆdÉdÊ„ Z‰dËdÌ„ ZŠdòdÍdÎ„Z‹dÏdÐ„ ZŒdÑdÒ„ ZdÓdÔ„ ZŽdÕdÖ„ Zd×dØ„ ZdÙdÚ„ Z‘dÛdÜ„ Z’dódÝdÞ„Z“dS )ôÚEditorWindowr   )Ú
Percolator)ÚColorDelegatorÚcolor_config)ÚUndoDelegator)Ú	IOBindingÚencoding)Úmainmenu)ÚMultiStatusBar)ÚAutoComplete)Ú
AutoExpand)ÚCalltip)ÚCodeContext)ÚLineNumbers)ÚFormatParagraphÚFormatRegionÚIndentsÚRstrip)Ú
ParenMatch)ÚSqueezer)Ú
ZoomHeightNTc             C   sH	  ddl m} tjd krtj tjdd¡}tj	 
d¡rvddtjd d…   }tj d	¡r^d
}qÌd}tj ||dd¡}nVtj	d d… dkr²tj tjddtƒ  ¡}	tj |	¡rÌ|	}ntj	dkrÌtj tjd¡}tj |¡}tj |¡r|t_tj	dkrdtj t_ndtjd d…  t_|| _|p*|j}|| _t|ƒ| _tj|| jd | _}
|rl|j| _|j| j_ni | _i | j_tjotj tjd¡| _d| _t|
ƒ | _ }t!|dd | _"}tj#ddddd}dddd|d tj#ddd!ddd"œ}t$t%ƒ|f|Ž | _&}| j&| j_'|  (¡  |  )¡  | j *d#| j+¡ | j ,d$| j-¡ t. /¡ rt| ,d$| j-¡ | ,d%| j0¡ | ,d&| j0¡ n| ,d'| j0¡ | ,d(t1¡ | ,d)t1¡ | ,d*t1¡ | ,d+| j2¡ | ,d,| j3¡ | ,d-| j4¡ | ,d.| j5¡ | ,d/| j6¡ | ,d0| j7¡ | ,d1| j8¡ | ,d2| j9¡ | ,d3| j:¡ | ,d4| j;¡ | ,d5d6d7„ ¡ | ,d8| j<¡ | ,d9| j=¡ | ,d:| j>¡ | ,d;| j?¡ | ,d<| j@¡ | ,d=| jA¡ | ,d>| jB¡ | ,d?| jC¡ | ,d@| jD¡ | ,dA| jE¡ | ,dB| jF¡ |  G| ¡ | _H}| ,dC|jI¡ | ,dD|jJ¡ | ,dE|jK¡ | ,dF|jL¡ | ,dG|jM¡ | ,dH|jN¡ |  O| ¡}| ,dI|jP¡ | ,dJ|jQ¡ | ,dK|  Rd¡¡ | ,dL|  RdM¡¡ | ,dN| jS¡ | ,dO| jT¡ | ,dP| jU¡ |r||j| < |rÔ| |jV|< | ,dQ| jW¡ | ,dR| jjX¡ | ,dS| jY¡ | ,dT| jZ¡ | ,dU| j[¡ |  \¡  |j]t^t_dMdV |j`dMdMdW |jadMdMdW | jb|dX< |jcdMdtddY |je|dZ< t f| jdd¡|d[< |jcdMdMtddY | g¡  |  h¡  tj#dd\d]d^d}| | _id_| _j| jj| _k|  l¡  tmtd`ƒsð| j&da t_n|  o¡  db| _p|  q|¡ | _r}|  s¡  | _t}| u|¡ |jv|_v|jw|_w| x| jy¡ |  z| ¡ | _{}| || j}¡ dc| _~|  dc¡ d | _€d | _d | _‚|rÚtj ƒ|¡rÊtj |¡sÊ| „|¡rÚdd| _~|  …|¡}|  |¡ n| †|¡ dd| _~|  ‡¡  |  y¡  |  ˆ¡  |  ‰¡  | jŠ ‹de¡}|rP| Œdf¡}|d kr$dg}|dkr>| ¡  |dM }|| _Žt | j¡ t‘j’| _’t“j”| _”t‘j•| _•| –dhdi¡ | –djdkdldm¡ | –dndo¡ | –dpdq¡ | –drdqdsdt¡ |  —| ¡}| ,dh|j˜¡ | ,dj|j™¡ | ,du|jš¡ | ,dv|  ›| ¡jœ¡ | ,dw|  | ¡jž¡ |  Ÿ| ¡}| ,dx|j ¡ | ,dr|j¡¡ || ƒ}| ,dy|j¢¡ | ,dz|j£¡ | ,d{|j¤¡ | ,d||  ¥| ¡j¦¡ |  §| ¡ | _¨}| ,dn|j©¡ | ,dp|jª¡ | ,d}|j«¡ | ,d~|  ¬| ¡j­¡ | j®rè|  ¯| ¡| _| ,d| jj°¡ n|  ±d€dd‚¡ | j²	r6|  ³| ¡| _‚tj#dddƒd^d	r&|  ´¡  | ,d„| j´¡ n|  ±d€d…d‚¡ d S )†Nr   )ÚScriptBindingZDocz
index.htmlZlinuxzpython-docs-z%s.%s.%sé   z/var/www/html/python/z/var/www/html/python/index.htmlz/usr/share/doc/ÚwinzPython%s.chmr   z0Resources/English.lproj/Documentation/index.htmlzfile://zhttps://docs.python.org/%d.%d/é   )Úmenuzrecent-files.lstÚ Úvbar)ÚnameÚmainr!   ÚwidthÚint)ÚtypeÚtexté   ZnoneZwordprocessorÚheight)r=   ÚpadxZwrapZhighlightthicknessr?   ZtabstylerD   ZWM_DELETE_WINDOWz<<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>>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>>)Ú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>>z*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   ZTextrB   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ÚhasattrrT   Ú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)Úselfre   ÚfilenameÚkeyrf   r6   ZdochomeZpyverZbasepathZchmfileri   rp   r<   r?   Ztext_optionsrB   r   ÚindentsZ	usespacesr¥   r¦   r«   Ú	is_py_srcr:   rW   ZautocompleteZ
parenmatchZscriptbindingrÁ   r   r   r   Ú__init__H   s¢   





















zEditorWindow.__init__c             C   s   |   ¡  d S )N)r   )rÆ   rG   r   r   r   rx   `  s    zEditorWindow.handle_winconfigc             C   s^   | j }tt|jj| d¡| d¡gƒƒ}| ¡ d|  }t|| d¡d d¡}|| | _	d S )NZborderrE   r9   rQ   )rQ   Ú0)
rB   ÚsumÚmapÚtkZgetintZcgetZwinfo_widthr   Úmeasurer?   )rÆ   rB   Zinner_paddingZpixel_widthZzero_char_widthr   r   r   r   c  s    zEditorWindow.set_widthc             C   s   | j  ¡ \}}| j |¡ dS )NrF   )r«   Zdefaultfilenamere   Únew)rÆ   rG   Ú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	 ƒ}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Ú.rJ   )ú ú	Úinsertzinsert linestart+ÚcÚselz1.0rW   z	sel.firstZ	my_anchorú<zsel.lastú>rF   )ÚstateZkeysymrB   r¹   Úcomparer@   Úsplitr¸   ÚrangeÚlenÚstrÚ
tag_removeÚmark_setÚtag_addÚsee)rÆ   rG   ZinsertptÚlineZlineatÚdestÚfirstÚlastr   r   r   r’   u  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 )NrJ   Zgrey75)rD   ZborderwidthZ
backgroundr   Z	_padding1z    )rK   rP   zCol: ?rç   zLn: ?)rK   rL   z<<set-line-and-column>>z<KeyRelease>z<ButtonRelease>)r)   ri   Ú
status_barro   r   r`   Ú	set_labelZRIGHTr™   ZBOTTOMÚXrB   ru   Ú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Õ   rP   zCol: %srç   zLn: %s)rB   r¹   ZINSERTrß   rë   rì   )rÆ   rG   rç   rP   r   r   r   rî   °  s    z EditorWindow.set_line_and_column)ÚfileZ_File)ÚeditZ_Edit)ÚformatZF_ormat)ÚrunZ_Run)rY   Z_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   )r=   Útearoff)Úlabelr:   Ú	underlineZappleZapplicationZIDLE)rõ   r:   )rô   rð   r7   zRecent Files)rõ   rö   r:   r   )rh   r·   Ú
menu_specsÚprepstrrg   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   rr   À  s"    

zEditorWindow.createmenubarc             C   sJ   | j d }| d¡}|d kr d}|| jkr<| | jd |¡ t |¡ d S )Nr   rW   rX   rJ   )r·   r¹   r»   Údeleter   Zadd_windows_to_menu)rÆ   r:   rW   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Ý   N)r·   rÿ   )rÆ   r:   r¹   rÝ   r   r   r   r   rÃ   ã  s    
zEditorWindow.update_menu_statec             G   sR   |dkr<t |d ƒ}t|  d¡| ƒ|  d¡ }d}|df}| jj|f|žŽ  dS )zHandle scrollbar.Zmovetor   rW   z@0,0ZscrollZunitsrF   )ÚfloatÚroundÚ	getlinenorB   Úyview)rÆ   rG   ÚargsZfractionÚlinesr   r   r   rš   è  s    zEditorWindow.handle_yviewc          	   C   s6  | j }| d|j› d|j› ¡}y | dd|¡o<| |dd¡}W n tk
rX   d}Y nX |sx| ddd	¡ | d
|¡ | js†|  	¡  | j}|| _
tjd d… dk}|r´|jdd 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¡ |r2| j jdd dS )Nú@ú,z	sel.firstz<=zsel.lastFrÚ   z1.0rW   rØ   r7   r8   Zarrow)Zcursor)rÝ   ZibeamrF   )rB   r¹   ÚxÚyrÞ   ÚTclErrorrã   rä   ÚrmenuÚ
make_rmenurG   r   r`   ZconfigÚrmenu_specsÚ
ValueErrorÚgetattrZentryconfigureZtk_popupZx_rootZy_root)rÆ   rG   rB   ZnewdexZin_selectionr  ZiswinÚitemrõ   Ú	eventnameZverify_staterÝ   r   r   r   rw   õ  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ô   rJ   c             S   s   |   |¡ d S )N)Úevent_generate)rB   r  r   r   r   rN   "  s    z(EditorWindow.make_rmenu.<locals>.command)rõ   rN   )rg   rB   r  Úadd_commandrº   r  )rÆ   r  r  rõ   r  rN   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.firstrZ   Únormal)rB   r¹   r  )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	CLIPBOARDrZ   r  )rB   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.rF   )r	   ZAboutDialogri   )rÆ   rG   r   r   r   r   <  s    zEditorWindow.about_dialogc             C   s   t  | jd¡ dS )z&Handle Options 'Configure IDLE' event.ZSettingsrF   )r   ZConfigDialogri   )rÆ   rG   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.rF   )rf   ri   r   Zshow_idlehelp)rÆ   rG   Úparentr   r   r   r}   H  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 )Nr7   r8   zDocument Start Failure)ÚtitleÚmessager  rF   )r   r`   r\   Ú	startfiler[   ÚOSErrorr½   r¿   râ   rB   Ú
webbrowserÚopen)rÆ   rG   Úwhyr   r   r   r~   R  s    $zEditorWindow.python_docsc             C   s   | j  d¡ dS )Nz<<Cut>>rF   )rB   r  )rÆ   rG   r   r   r   ry   ]  s    zEditorWindow.cutc             C   s    | j  d¡sd S | j  d¡ dS )NrÚ   z<<Copy>>rF   )rB   Z
tag_rangesr  )rÆ   rG   r   r   r   rz   a  s    zEditorWindow.copyc             C   s   | j  d¡ | j  d¡ dS )Nz	<<Paste>>rØ   rF   )rB   r  ræ   )rÆ   rG   r   r   r   r{   h  s    zEditorWindow.pastec             C   s.   | j  ddd¡ | j  dd¡ | j  d¡ dS )NrÚ   z1.0zend-1crØ   rF   )rB   rå   rä   ræ   )rÆ   rG   r   r   r   r‚   m  s    zEditorWindow.select_allc             C   s    | j  ddd¡ | j  d¡ dS )NrÚ   z1.0rW   rØ   rF   )rB   rã   ræ   )rÆ   rG   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                sB   | j d@ dkr>yˆdƒ ˆdˆˆ  ƒ W n tk
r<   Y nX d S )NrC   r   z	sel.firstrØ   )rÝ   r  )rG   )Ú
edge_indexÚedges_tableÚself_text_indexÚself_text_mark_setr   r   Úmove_at_edgeƒ  s    z<EditorWindow.move_at_edge_if_selection.<locals>.move_at_edge)rB   r¹   rä   )rÆ   r#  r'  r   )r#  r$  r%  r&  r   r   x  s
    z&EditorWindow.move_at_edge_if_selectionc             C   s   | j  d¡ dS )Nz<Meta-Delete>rF   )rB   r  )rÆ   rG   r   r   r   r   Œ  s    zEditorWindow.del_word_leftc             C   s   | j  d¡ dS )Nz<Meta-d>rF   )rB   r  )rÆ   rG   r   r   r   r‘     s    zEditorWindow.del_word_rightc             C   s   t  | j¡ dS )NrF   )r   ÚfindrB   )rÆ   rG   r   r   r   r„   ”  s    zEditorWindow.find_eventc             C   s   t  | j¡ dS )NrF   )r   Z
find_againrB   )rÆ   rG   r   r   r   r…   ˜  s    zEditorWindow.find_again_eventc             C   s   t  | j¡ dS )NrF   )r   Zfind_selectionrB   )rÆ   rG   r   r   r   r‡   œ  s    z!EditorWindow.find_selection_eventc             C   s   t   | j| j| j¡ dS )NrF   )r   rB   r«   re   )rÆ   rG   r   r   r   r†      s    z EditorWindow.find_in_files_eventc             C   s   t   | j¡ dS )NrF   )r   rB   )rÆ   rG   r   r   r   rˆ   ¤  s    zEditorWindow.replace_eventc             C   sT   | j }t |dd¡j}|d k	rP| ddd¡ | d|› d¡ | d¡ |  ¡  dS )	Nz
Go To Linez/Enter a positive integer
('big' = end of file):rÚ   z1.0rW   rØ   z.0rF   )rB   r   ZGotoÚresultrã   rä   ræ   rî   )rÆ   rG   rB   Ú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.lastr;   zOpen ModulezAEnter the name of a Python module
to search on sys.path and open:N)rB   r¸   Ústripr  r   Z
ModuleNamer)  re   r!  r«   r²   )rÆ   r=   Ú	file_pathr   r   r   Úopen_module¶  s    
zEditorWindow.open_modulec             C   s   |   ¡  dS )NrF   )r-  )rÆ   rG   r   r   r   r   Î  s    zEditorWindow.open_module_eventc             C   sJ   | j j}| jjdkr|s,|  ¡ }|d kr,dS ddlm} | | j|¡ dS )NZPyShellEditorWindowrF   r   )Úbrowser)	r«   rÇ   Ú	__class__Ú__name__r-  Úidlelibr.  ZModuleBrowserrf   )rÆ   rG   rÇ   r.  r   r   r   r•   Ò  s    z EditorWindow.open_module_browserc             C   s   ddl m} | | j¡ dS )Nr   )ÚpathbrowserrF   )r1  r2  ZPathBrowserrf   )rÆ   rG   r2  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)ÚshellrF   )Ú
subprocessr   Ú
executableÚPopen)rÆ   rG   r4  Ú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.0rW   z
insert +1l)rB   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)	r\   r]   rb   ÚsplitextrÓ   ÚnormcaserB   r¸   Ú
startswith)rÆ   rÇ   ÚbaseZextrç   r   r   r   r³   ò  s    zEditorWindow.ispythonsourcec             C   s   | j r| j  | ¡ d | _ d S )N)re   Zunregister_maybe_terminate)rÆ   r   r   r   Ú
close_hookû  s    zEditorWindow.close_hookc             C   s
   || _ d S )N)r>  )rÆ   r>  r   r   r   Úset_close_hook   s    zEditorWindow.set_close_hookc             C   s2   | j r| j  | ¡ |  ¡  | j | ¡ |  ¡  d S )N)re   Zfilename_changed_editrª   ri   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   sH   |   ¡  |  ¡  t | j¡ | jdk	r0| j ¡  | jdk	rD| j ¡  dS )zUpdate the color themeN)	rB  rA  r!   r$   rB   r¯   Zupdate_highlight_colorsr°   Zupdate_colors)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Æ   rB   Ú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-blinkrS   )rA   r   rU   N)r   rq   rB   rT   )rÆ   Zcursorblinkr   r   r   r£   6  s
    z EditorWindow.update_cursor_blinkc             C   sN   | j dk	r| j  ¡  | jdk	r(| j ¡  t | jdd¡}|| jd< |  ¡  dS )z.Update the text widgets' font if it is changedNr>   r!   rQ   )r¯   Zupdate_fontr°   r   rœ   rf   rB   r   )rÆ   Znew_fontr   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ÚitemsrB   Zevent_deleteÚget_standard_extension_namesÚGetExtensionBindings)rÆ   ÚkeydefsrG   ÚkeylistÚextensionNameÚxkeydefsr   r   r   ÚRemoveKeybindingsQ  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   rJ   NrN   Úacceleratorrõ   r;   )rT  )r   rJ  r(   rK  rs   rM  rN  Úmenudefsrø   r·   r¹   rû   rà   rA   Z	entrycgetÚget_acceleratorrÿ   )rÆ   rO  rQ  rR  ZmenuEventDictr:   r  ZmenubarItemrW   r¹   ZaccelZitemNamerG   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>   rR   z
num-spacesr@   )rA   N)rž   r   rq   r    )rÆ   r   r   r   r¡     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   rJ   r   )rõ   rN   N)
r   ZGetAllExtraHelpSourcesListr·   r¹   rû   rü   rþ   rº   Ú"_EditorWindow__extra_help_callbackr  )rÆ   Z	help_listZhelpmenuZhelpmenu_lengthÚentryr7  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httpr7   r8   zDocument Start Failure)r  r  r  )r<  r\   r]   rd   r   r`   r  r  r½   r¿   râ   rB   r   r!  )Úhelpfiler"  )rÆ   r   r   Údisplay_extra_help›  s    
$z>EditorWindow.__extra_help_callback.<locals>.display_extra_helpr   )rÆ   rZ  r[  r   )rÆ   r   Z__extra_help_callback™  s    z"EditorWindow.__extra_help_callbackc          
      sÆ  g }| j }|r>tj |¡r>t|dddd}| ¡ }W dQ R X |rptj |¡d }||krd| |¡ | d|¡ g ‰ x2|D ]*}d|ksštj |dd	… ¡szˆ  	|¡ qzW ‡ fd
d„|D ƒ}d}|dt
|ƒ… }|rVy*t|dddd}| |¡ W dQ R X W nV tk
rT } z6t| jddƒsDd| j_tjdd|› d| jd W dd}~X Y nX xj| jjD ]^}	|	j}
|
 dt¡ xDt|ƒD ]8\}}| ¡ }|	 |¡}|
j|| d | |dd q€W q`W dS )z/Load and update the recent files list and menusÚrÚutf_8r   )r'   ÚerrorsNrD  r   ú rX   c                s   g | ]}|ˆ kr|‘qS r   r   )Ú.0r]   )Ú	bad_pathsr   r   ú
<listcomp>»  s    z9EditorWindow.update_recent_files_list.<locals>.<listcomp>Z1234567890ABCDEFGHIJKÚwÚrecentfiles_messageFTzIDLE Warningz)Cannot save Recent Files list to disk.
  z
Select OK to continue.)r  r  r  rÖ   )rõ   rN   rö   )rm   r\   r]   r±   r!  Ú	readlinesÚabspathÚremoverØ   Úappendrá   Ú
writelinesr  r  rf   rd  r½   ÚshowwarningrB   ri   rl   rú   rþ   rû   Ú	enumerateÚrstripÚ#_EditorWindow__recent_file_callbackr  )rÆ   Únew_fileZrf_listr,  Zrf_list_filer]   ZulcharsZrf_fileÚerrÚinstancer:   ÚiÚ	file_nameÚcallbackr   )ra  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Æ   rr  rt  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_savedri   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¦   ry  )rÆ   r   r   r   ry  í  s    zEditorWindow.get_savedc             C   s   | j  |¡ d S )N)r¦   Ú	set_saved)rÆ   Úflagr   r   r   rz  ð  s    zEditorWindow.set_savedc             C   s   | j  ¡  d S )N)r¦   Ú
reset_undo)rÆ   r   r   r   r|  ó  s    zEditorWindow.reset_undoc             C   s   | j j}|rtj |¡S dS )Nru  )r«   rÇ   r\   r]   rÓ   )rÆ   rÇ   r   r   r   rv  ö  s    zEditorWindow.short_titlec             C   s   | j jp
dS )Nr;   )r«   rÇ   )rÆ   r   r   r   rw  ú  s    zEditorWindow.long_titlec             C   s   |   ¡  dS )NrF   )r8  )rÆ   rG   r   r   r   r|   ý  s    z EditorWindow.center_insert_eventrØ   c             C   sH   | j }|  ¡ \}}|  |¡}|| }td||d  ƒ}| t|ƒ¡ d S )NrJ   r9   )rB   Úgetwindowlinesr  Úmaxr  r  )rÆ   ÚmarkrB   ri   Úbotr*  rD   Znewtopr   r   r   r8    s    
zEditorWindow.centerc             C   sN   | j }|  d¡}|  d¡}||krF| ¡ dkrFt|d ƒ}|| d }||fS )Nz@0,0z@0,65535rJ   rD   )rB   r  Zwinfo_heightr@   )rÆ   rB   ri   r€  rD   r   r   r   r}  	  s    

zEditorWindow.getwindowlinesc             C   s   | j }tt| |¡ƒƒS )N)rB   r@   r  r¹   )rÆ   r  rB   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+))ri   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 )NrF   )rt   )rÆ   rG   r   r   r   rv     s    zEditorWindow.close_eventc             C   sH   | j rD|  ¡ s:| j ¡ dkr&| j ¡  | j ¡  | j ¡  | j  ¡ S d S )Nr  )r«   ry  ri   rÝ   Z	deiconifyÚlowerZliftÚ	maybesave)rÆ   r   r   r   rˆ  !  s    


zEditorWindow.maybesavec             C   s:   y |   ¡ }t|ƒdkr|  ¡  |S  tk
r4   Y nX d S )NZcancel)rˆ  râ   Ú_closeÚAttributeError)rÆ   Zreplyr   r   r   rt   *  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)rn  )r«   rÇ   rµ   r   Zunregister_callbackr¼   Úunload_extensionsrt   r¦   r®   rB   rk   r¥   ri   Zdestroyr>  )rÆ   r   r   r   r‰  3  s"    



zEditorWindow._closec             C   s   i | _ |  ¡  d S )N)Ú
extensionsÚload_standard_extensions)rÆ   r   r   r   r¶   G  s    zEditorWindow.load_extensionsc             C   s4   x(t | j ¡ ƒD ]}t|dƒr| ¡  qW i | _d S )Nrt   )rƒ  rŒ  Úvaluesr¢   rt   )rÆ   Úinsr   r   r   r‹  K  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)rM  Ú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GetExtensions)rÆ   r   r   r   rM  Y  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: rU  ú-rC  rJ   rÛ   rX   rÜ   Z_event)Úextfilesr¸   Ú	importlibÚimport_moduleÚ__package__ÚImportErrorÚ	TypeErrorr‘  r  r   rN  r¢   rù   rU  rŒ  rs   r   rB   ru   )	rÆ   r=   ÚfnameÚmodÚclsrO  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(   rK  rB   rO  rL  rÀ   )rÆ   rO  rB   rG   rP  r   r   r   rs   |  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.
        NrJ   ú!c             S   s   |   |¡ d S )N)r  )rB   r  r   r   r   rN   ž  s    z(EditorWindow.fill_menus.<locals>.command)rõ   rö   rN   rT  Zvariable)rõ   rö   rN   rT  )r(   rU  rK  r·   rB   r¸   rº   rø   rV  Úget_var_objZ
BooleanVarZadd_checkbuttonr  )rÆ   rU  rO  r·   rB   ZmnameZ	entrylistr:   rY  rõ   r  Zcheckbuttonrö   rT  rN   Úvarr   r   r   rù   …  s8    




zEditorWindow.fill_menusc             C   s&   |   |¡}|r| ¡ }|S t|ƒ‚d S )N)r¡  r¸   Ú	NameError)rÆ   r=   r¢  Úvaluer   r   r   Úgetvarª  s
    
zEditorWindow.getvarc             C   s(   |   ||¡}|r| |¡ nt|ƒ‚d S )N)r¡  r›   r£  )rÆ   r=   r¤  Úvartyper¢  r   r   r   Úsetvar²  s    zEditorWindow.setvarc             C   s,   | j  |¡}|s(|r(|| jƒ | j |< }|S )N)rk   r¸   rB   )rÆ   r=   r¦  r¢  r   r   r   r¡  ¹  s    zEditorWindow.get_var_objc             C   s,   | j r$| j d|¡p"d| j |¡kS dS d S )NZTODOÚSTRINGrJ   )r®   rB   Ú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)rB   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)rB   Ú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 )NrQ   rÐ   z
-displayofÚn)r¬  )rB   r®  rÏ   r  ZmasterZ	configure)rÆ   ZnewtabwidthrB   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guessrq  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Ø   rF   zinsert linestartr;   rÜ   z1.0z	insert-1crX   z 	r   rJ   z
insert-%dcrÖ   )rB   r«  rþ   rä   r¸   rÞ   ZbellrŸ   rá   Ú
expandtabsÚAssertionErrorr    rn   r¨   rØ   r©   )
rÆ   rG   rB   ré   rê   ÚcharsrŸ   ZhaveZwantZncharsdeletedr   r   r   rŠ   ú  sD    


z"EditorWindow.smart_backspace_eventc       
      C   sì   | j }|  ¡ \}}| ¡  zÂ|rX|rXt|ƒt|ƒkr@| j |¡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Ö   rF   )rB   r«  r¨   Ú
index2liner   rŽ   rþ   rä   r¸   Úget_line_indentrŸ   rá   Úreindent_tor    rž   r²  rØ   ræ   r©   )
rÆ   rG   rB   ré   rê   ÚprefixÚrawZ	effectiveZpadr¯  r   r   r   rŒ   &  s,    
zEditorWindow.smart_indent_eventc          	   C   sþ  | j }|  ¡ \}}| ¡  zÈ|r>|r>| ||¡ | d|¡ | dd¡}dt|ƒ }}x ||k rx|| dkrx|d7 }qZW ||kr’| dd¡ dS |d|… }d}x2|rÔ|d	 dkrÔ|| jkrÔ|dd	… }|d7 }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 )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Ø   zinsert linestartr   z 	rJ   rD  rF   NrX   zinsert - %d charsz.0Zconsolez1.0zbogus continuation type %r))rB   r«  r¨   rþ   rä   r¸   rá   rØ   rn   rµ  r¹   r   ZParserr    rŸ   r¤   r~  r’  Zset_codeZfind_good_parse_startÚ_build_char_in_string_funcZset_lor©  Zget_continuation_typeZC_NONEZC_STRING_FIRST_LINEZC_STRING_NEXT_LINESZ	C_BRACKETr·  Zcompute_bracket_indentZC_BACKSLASHZget_num_lines_in_stmtZcompute_backslash_indentr³  Zget_base_indent_stringZis_block_openerrŒ   Zis_block_closerrŠ   ræ   r©   )rÆ   rG   rB   ré   rê   rç   rq  r¯  ÚindentZlnor  ÚcontextZstartatZstartatindexZrawtextZbodr\  rÙ   r   r   r   r‹   I  s†    	






z%EditorWindow.newline_and_indent_eventc             C   s   || j fdd„}|S )Nc             S   s   ||d|   ƒS )Nz+%dcr   )ÚoffsetZ_startindexZ_icisr   r   r   ÚinnerÀ  s    z6EditorWindow._build_char_in_string_func.<locals>.inner)rª  )rÆ   Z
startindexr¾  r   r   r   rº  ¿  s    z'EditorWindow._build_char_in_string_funcc             C   s2   | j r&t|| jƒ\}}d| d|  S d| S d S )Nr×   rÖ   )rž   ÚdivmodrŸ   )rÆ   r¯  ZntabsZnspacesr   r   r   Ú_make_blanksÏ  s    zEditorWindow._make_blanksc             C   sJ   | j }| ¡  | ddd¡r(| dd¡ |r>| d|  |¡¡ | ¡  d S )Nzinsert linestartz!=rØ   )rB   r¨   rÞ   rþ   rØ   rÀ  r©   )rÆ   rP   rB   r   r   r   r·  Ù  s    zEditorWindow.reindent_toc             C   sP   t | j| jƒ ¡ \}}|r@|r@t|| jƒ\}}t|| jƒ\}}nd }}|| S )Nr   )ÚIndentSearcherrB   rŸ   ró   r¶  )rÆ   ÚopenerZindentedr¹  ZindentsmallZindentlarger   r   r   r±  ç  s    zEditorWindow.guess_indentc             C   sN   | j d krd S | j jr&| j  ¡  d}n| j  ¡  d}| jdd|› dd d S )NZShowZHiderY   z*Line Numbersz Line Numbers)r:   r¹   rõ   )r°   Zis_shownZhide_sidebarZshow_sidebarr  )rÆ   rG   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)”r0  Ú
__module__Ú__qualname__Zidlelib.percolatorr"   Zidlelib.colorizerr#   r$   Zidlelib.undor%   Zidlelib.iomenur&   r'   r1  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filesystemencodingr[   rÂ   rÄ   rË   rx   r   r”   r’   r˜   rî   r÷   rr   r¼   r  rÃ   rš   r  rw   r  r  r  r  r  r   r€   r}   r~   ry   rz   r{   r‚   rƒ   r   r   r‘   r„   r…   r‡   r†   rˆ   r‰   r-  r   r•   r–   r—   r9  r³   r>  r?  r¬   rA  rB  r´   ÚstringZascii_lettersZdigitsrE  rH  r£   rI  rS  rW  r¡   rý   rX  rµ   rm  rª   ry  rz  r|  rv  rw  r|   r8  r}  r  r†  rv   rˆ  rt   r‰  r¶   r‹  r  rM  r—  r  rs   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 )N)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‚  rW   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 )Nr   )rB   rŸ   rq  ÚfinishedÚblkopenlineÚindentedline)rÆ   rB   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;   rJ   z.0z>=rW   z lineend+1c)rÉ  rq  r’  rB   rÞ   r¸   )rÆ   rq  r  r   r   r   Úreadline  s    zIndentSearcher.readline)ÚclassÚdefÚforÚifÚtryÚwhilec	       	      C   s>   | j rn2||kr ||kr || _n||kr:| jr:|| _d| _ d S )NrJ   )rÉ  rÊ  rË  )	rÆ   rA   ÚtokenÚstartrW   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ó   /  s    

zIndentSearcher.runN)
r0  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 )NrC  r   rJ   )r(  )Úsrq  r   r   r   rø   A  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>>r;   r   z-[a-z]\bc             S   s   |   ¡  ¡ S )N)rÈ  Úupper)r…  r   r   r   rH   Z  rI   z!get_accelerator.<locals>.<lambda>z\b\w+\bc             S   s   t  |  ¡ |  ¡ ¡S )N)Úkeynamesr¸   rÈ  )r…  r   r   r   rH   [  rI   zKey-ZCancelz
Ctrl-BreakzControl-zCtrl-r–  ú+z><rÖ   rÛ   rÜ   )r¸   r
   Z	isCocoaTkr  Úsub)rO  r  rP  rÞ  r   r   r   rV  P  s    
rV  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  )rf   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< x,tdƒD ] }| dd| t	|ƒ d ¡ qZW d S )	NrJ   )rf   rÇ   é
   rD   é   rØ   z  rD  )
ré  r   Úargvr
   ZsetupAppr!   rB   rà   rØ   râ   )r  rf   rÇ   rñ   rB   rq  r   r   r   Ú_editor_windowo  s    rí  Ú__main__)r>   zidlelib.idle_test.test_editorr9   F)Ú	verbosityÚexit)ró   )=Zimportlib.abcr˜  Úimportlib.utilr\   r`   r  rÆ  r   rØ  r“  r   ZtkinterZtkinter.fontr   Ztkinter.ttkr   Ztkinter.simpledialogZsimpledialogr¾   Ztkinter.messageboxZ
messageboxr½   Zidlelib.configr   r1  r   r   r   r	   r
   Zidlelib.multicallr   r   r   r   r   Zidlelib.treer   r   r­  Zpython_versionrx  r   r    Úobjectr!   rµ  ÚcompilerÇ  r¶  rÁ  rø   ræ  rV  ré  rí  r0  Zunittestr>   Zidlelib.idle_test.htestró   r   r   r   r   Ú<module>   sv   
           X

4
	
