£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
     fN                 @   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rd 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   3/opt/alt/python37/lib64/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+dddZ,dddZ-dd Z.dd Z/dd Z0dd Z1dd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?dd=d>Z@dd?d@ZAddAdBZBddCdDZCdEdF ZDdGdH ZEdIdJ ZFddKdLZGddMdNZHdOdP ZIdQdR ZJdSdT ZKdUdV ZLdWdX ZMdYdZ ZNd[d\ ZOd]d^ ZPd_d` ZQdadb ZRdcdd ZSddedfZTddgdhZUddidjZVdkdl ZWdmdn ZXdodp ZYdqdr ZZdsdt Z[dudv Z\dwdx Z]dydz Z^e_j`e_ja d{ Zbd|d} Zcd~d Zddd Zedd Zfdd Zgdd Zhdd Zidd ZjdddZkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd ZsdddZtdd ZudddZvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd ZddiZdd ZdddZdddZdd ZdddZdddĄZddƄ ZddȄ Zddʄ Zdd̄ Zddd΄ZddЄ Zdd҄ ZddԄ Zddք Zdd؄ Zddڄ Zdd܄ ZdddބZd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
}qd}tj||dd}nVtj	d d dkrtjtjddt  }	tj|	r|	}ntj	dkrt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 | _|rtj|rtj|s||rdd| _~| |}| | n|| dd| _~|   | y  |   |   | jde}|rP|df}|d kr$dg}|dkr>|  |dM }|| _t| j tj| _tj| _tj| _|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| ddd | j	r6| | | _tj#dddd^d	r&|   |,d| j n| ddd 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   endz<<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rP qW t	|}t| jddd	 }||krd}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 rt|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   wY nX |
d krqt| |
 }|j||d qW ||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 )zCursor 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 )zGet 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#!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   rA  )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)	rC  rB  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rq|d7 }xtd|D ]r}	||	dkr||	d}
|
r||	d}d}||kr.||| kr.|| | }|rt||}
|j|	|
d qW qW dS )	z-Update the keybindings after they are changedr   rJ   NrN   acceleratorr   r;   )rU  )r   rK  r(   rL  rs   rN  rO  menudefsr   r   r   r   r   rA   Z	entrycgetget_acceleratorr   )r   rP  rR  rS  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   r[  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st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 qW q`W dS )z/Load and update the recent files list and menusrutf_8r   )r'   errorsNrE  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   re  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   )rb  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   rs  ru  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   rz  )r   r   r   r   rz    s    zEditorWindow.get_savedc             C   s   | j | d S )N)r   	set_saved)r   flagr   r   r   r{    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 )Nrv  )r   r   r\   r]   r   )r   r   r   r   r   rw    s    zEditorWindow.short_titlec             C   s   | j jp
dS )Nr;   )r   r   )r   r   r   r   rx    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   rz  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)ro  )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)rN  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   rN  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  }qW x"|d	d  d
kr|d d	 }qW |d }t||r| j|t|| qW d S )Nr   )packagez
Failed to import extension: rV  -rD  rJ   r   rX   r   Z_event)extfilesr   	importlibimport_module__package__ImportError	TypeErrorr  r  r   rO  r   r   rV  r  rs   r   rB   ru   )	r   r=   ZfnamemodclsrP  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(   rL  rB   rP  rM  r   )r   rP  rB   rG   rQ  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   rU  Zvariable)r   r   rN   rU  )r(   rV  rL  r   rB   r   r   r   rW  get_var_objZ
BooleanVarZadd_checkbuttonr  )r   rV  rP  r   rB   ZmnameZ	entrylistr:   rZ  r   r  Zcheckbuttonr   rU  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guessrr  r   r   r   r     s    z#EditorWindow.set_indentation_paramsc       
      C   sB  | 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
 | j
 | j
 }d}	xH|| jkrP |d d }|	d
 }	t|	|}||ks|d d	krP qW |  |d|	 d ||k r6|dd||   |  dS )Nr   rF   zinsert linestartr;   r   z1.0z	insert-1crX   z 	rJ   r   z
insert-%dcr   )rB   r  r   r   r   r   Zbellr   r   
expandtabsr   rn   r   r   r   )
r   rG   rB   r   r   charsr   ZhaveZwantZncharsdeletedr   r   r   r     sB    


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rd}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 }qW |r|d
| d x|ddkr|d qW |dd t	|
d}	t| j| j}
| jsxf| jD ]\}t|	| d}t|d }||d}|
| |
| |}|dk	s|dkrDP qDW |
|pd n@|dd}|r|d }nd}||d}|
| |
d |
 }|tjkr|tjkrnn|tjkr2|d| nT|tjkrN| |
  n8|tjkr|
 dkrv|d| n| |
   n 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   rE  rF   NrX   zinsert - %d charsz.0Zconsolez1.0)(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_indentZget_base_indent_stringZis_block_openerr   Zis_block_closerr   r   r   )r   rG   rB   r   r   r   rr  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   rB  rC  r   stringZascii_lettersZdigitsrF  rI  r   rJ  rT  rX  r   r   rY  r   rn  r   rz  r{  r}  rw  rx  r|   r8  r~  r  r  rv   r  rt   r  r   r  r  rN  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 )zReturn 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   rr  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  rr  r  rB   r   r   )r   rr  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 )NrD  r   rJ   )r(  )srr  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>   <<open-module>><<goto-line>><<change-indentwidth>>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)rP  r  rQ  r  r   r   r   rW  P  s    
rW  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  rE  )
r  r   argvr
   ZsetupAppr!   rB   r   r   r   )r  rf   r   r   rB   rr  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_versionry  r   r    objectr!   r  compiler  r  r  r   r  rW  r  r  r0  Zunittestr>   Zidlelib.idle_test.htestr   r   r   r   r   <module>   sv   
           X

4
	
