
    e                    L   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 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 dlm$Z$ dZ%d ejL                         z  Z'ej                  dk(  Z(d Z) G d d      Z*d Z+ ejX                  d      Z-d Z. G d d      Z/d  Z0d!d"d#d$Z1d% Z2d& Z3d' Z4e5d(k(  r d d)l6m7Z7  e7d*d+d,-       d d.l8m9Z9  e9e4       yy)/    N)*)Font)	Scrollbar)simpledialog)
messagebox)idleConf)configdialog)grep)help)
help_about)macosx)MultiCallCreator)pyparse)query)replace)search)wheel_event)py_extensions)window   z (%s)darwinc                      t         j                  \  } }}}}|  | }|| z  }|dk(  r
|d| z  }|S |dk7  r||d    | z  }|S )zYFormat sys.version_info to produce the Sphinx version string used to install the chm docs	candidatercfinalr   )sysversion_info)majorminormicrolevelserialreleases          lib/python3.12/idlelib/editor.py_sphinx_versionr%   &   sw    ),)9)9&E5%wG%GRx=  N 
'	eAhZx((N    c                      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#  e$jJ                         Z&dZ'dZ(dZ)dZ*dwdZ+dxdZ,d Z-d Z.d Z/d Z0dxdZ1	 g dZ2d Z3d Z4d Z5d Z6d Z7dZ8d Z9d gZ:d! Z;d" Z<d# Z=d$ Z>dxd%Z?dxd&Z@dxd'ZAdxd(ZBd) ZCd* ZDd+ ZEdxd,ZFdxd-ZGd. ZHd/ ZId0 ZJd1 ZKd2 ZLd3 ZMd4 ZNd5 ZOd6 ZPd7 ZQd8 ZRdxd9ZSdxd:ZTdxd;ZUd< ZVd= ZWd> ZXd? ZYd@ ZZdA Z[dB Z\dC Z]e^j                  e^j                  z   dDz   ZadE ZbdF ZcdG ZddH ZedI ZfdJ ZgdK ZhdL ZidxdMZjdN ZkdO ZldP ZmdQ ZndR ZodS ZpdT ZqdU ZrdydVZsdW ZtdydXZudY ZvdZ Zwd[ Zxd\ Zyd] Zzd^ Z{d_ Z|d` Z}da Z~dbdciZdd ZdxdeZdzdfZdg ZdxdhZdxdiZdj Zdk Zdl Zdm Zd{dnZdo Zdp Zdq Zdr Zds Zdt Zdu ZdxdvZy)|EditorWindowr   )
Percolator)ColorDelegatorcolor_config)UndoDelegator)	IOBindingencoding)mainmenu)MultiStatusBar)AutoComplete)
AutoExpand)Calltip)CodeContext)LineNumbers)FormatParagraphFormatRegionIndentsRstrip)
ParenMatch)
ZoomHeightNTc                 D"   ddl m} t        j                  t        j
                  j                  t        j                  dd      }t        j                  j                  d      r`ddt        j                  d d z  z   }t        j
                  j                  d	      rd
}nd}t        j
                  j                  ||dd      }nt        j                  d d dk(  rYdd l}	d}
dt        j                   d}	 |	j                  |	j                   |      }
t        j
                  j'                  |
      rD|
}nAt        j                  dk(  r.t        j
                  j                  t        j                  d      }t        j
                  j)                  |      }t        j
                  j'                  |      r;|t        _        t        j                  dk(  r<dt        j                  z   t        _        ndt        j                  d d z  t        _        || _        |xs |j,                  }|| _        t/        |      | _        t3        j4                  || j0                        x| _        }|r-|j8                  | _        |j<                  | j6                  _        ni | _        i | j6                  _        t@        jB                  xr. t        j
                  j                  t@        jB                  d      | _"        d| _#        tI        |      x| _%        }tM        |d      x| _'        }tA        jP                  dddd      }ddd d|d!tA        jP                  ddd"d      d#} tS        tT              |fi |x| _+        }| jV                  | j6                  _,        | j[                          | j]                          | j6                  j_                  d$| j`                         | j6                  jc                  d%| jd                         tg        jh                         rU|jc                  d%| jd                         |jc                  d&| jj                         |jc                  d'| jj                         n|jc                  d(| jj                         |jc                  d)tl               |jc                  d*tl               |jc                  d+tl               |jc                  d,| jn                         |jc                  d-| jp                         |jc                  d.| jr                         |jc                  d/| jt                         |jc                  d0| jv                         |jc                  d1| jx                         |jc                  d2| jz                         |jc                  d3| j|                         |jc                  d4| j~                         |jc                  d5| j                         |jc                  d6d7        |jc                  d8| j                         |jc                  d9| j                         |jc                  d:| j                         |jc                  d;| j                         |jc                  d<| j                         |jc                  d=| j                         |jc                  d>| j                         |jc                  d?| j                         |jc                  d@| j                         |jc                  dA| j                         |jc                  dB| j                         | j                  |       x| _M        }|jc                  dC|j                         |jc                  dD|j                         |jc                  dE|j                         |jc                  dF|j                         |jc                  dG|j                         |jc                  dH|j                         | j                  |       }|jc                  dI|j                         |jc                  dJ|j                         |jc                  dK| j                  d             |jc                  dL| j                  dM             |jc                  dN| j                         |jc                  dO| j                         |jc                  dP| j                         |r||j<                  | <   |r| |j                  |<   |jc                  dQ| j                         |jc                  dR| j*                  j                         |jc                  dS| j                         |jc                  dT| j                         |jc                  dU| j                         | j                          |j                  t        t        dMV       |j                  dMdMW       |j                  dMdMW       | j                  |dX<   |j                  dMdt        Y       |j                  |dZ<   tA        j                  | j,                  dd      |d[<   |j                  dMdMt        Y       |j                          | j                          tA        jP                  dd\d]d^      }| | _n        d_| _o        | j                  | _p        | j                          t        t@        d`      s| jV                  da   t@        _s        | j                          db| _u        | j                  |      x| _w        }| j                         x| _y        }|j                  |       |j                  |_{        |j                  |_|        |j                  | j                         | j                  |       x| _        }|j                  | j                         dc| _        | j	                  dc       d | _        d | _        d | _        |rt        j
                  j                  |      r]t        j
                  j                  |      s>|j                  |      rEdd| _        | j                  |      }| j	                  |       n|j                  |       dd| _        | j                          | j                          | j                          | j                          | j                  j!                  de      }|rY|j#                  df      }|dg}|dk\  r|j%                          |dMz   }|| _        t3        j(                  | j*                         t,        j.                  | _        t0        j2                  | _        t0        j4                  | _        |j7                  dhdi       |j7                  djdkdldm       |j7                  dndo       |j7                  dpdq       |j7                  drdqdsdt       | j9                  | | j:                        }|jc                  dh|j<                         |jc                  dj|j>                         |jc                  du|j@                         |jc                  dv| jC                  |       jD                         |jc                  dw| jG                  |       jH                         | jK                  |       }|jc                  dx|jL                         |jc                  dr|jN                          ||       }|jc                  dy|jP                         |jc                  dz|jR                         |jc                  d{|jT                         |jc                  d|| jW                  |       jX                         | j[                  |       x| _        }|jc                  dn|j^                         |jc                  dp|j`                         |jc                  d}|jb                         |jc                  d~| je                  |       jf                         | jh                  r@| jk                  |       | _        |jc                  d| j                  jl                         n| jo                  ddd       | jp                  r_| js                  |       | _        tA        jP                  dddd^      r| ju                          |jc                  d| jt                         y | jo                  ddd       y # t"        $ r1 	 |	j                  |	j$                  |      }
n# t"        $ r Y nw xY wY w xY w)Nr   )ScriptBindingDocz
index.htmllinuxzpython-docs-z%s.%s.%s   z/var/www/html/python/z/var/www/html/python/index.htmlz/usr/share/doc/win zSoftware\Python\PythonCore\z\Help\Main Python Documentationr   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   nonewordprocessorheight)rF   padxwraphighlightthicknessrH   tabstylerP   WM_DELETE_WINDOW<<close-window>>z<Control-Button-1>z<2>z<3>z<MouseWheel>z
<Button-4>z
<Button-5>z<Configure>z<<cut>>z<<copy>>z	<<paste>>z<<center-insert>>z<<help>>z<<python-docs>>z<<about-idle>>z<<open-config-dialog>><<open-module>>z<<do-nothing>>c                      yNbreak )events    r$   <lambda>z'EditorWindow.__init__.<locals>.<lambda>   s    r&   z<<select-all>>z<<remove-selection>>z<<find>>z<<find-again>>z<<find-in-files>>z<<find-selection>>z<<replace>><<goto-line>>z<<smart-backspace>>z<<newline-and-indent>>z<<smart-indent>>z<<indent-region>>z<<dedent-region>>z<<comment-region>>z<<uncomment-region>>z<<tabify-region>>z<<untabify-region>>z<<toggle-tabs>><<change-indentwidth>>z<Left>z<Right>   z<<del-word-left>>z<<del-word-right>>z<<beginning-of-line>>z<<open-new-window>>z<<close-all-windows>>z<<open-class-browser>>z<<open-path-browser>>z<<open-turtle-demo>>)sidefillexpand)weightcommand)rowcolumnsticky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*ode*ontextdisabledzline-numbers-defaultz<<toggle-line-numbers>>*ine*umbers)idlelib.runscriptr=   r(   help_urlospathjoinr   base_prefixplatformcountr   isdirwinregwinver
QueryValueHKEY_CURRENT_USERFileNotFoundErrorHKEY_LOCAL_MACHINEisfilenormpathflistrootMenumenubarr   ListedTopleveltopvarstkinter_varsinversedictinstance_dictr   userdirrecent_files_pathprompt_last_lineFrame
text_framer   rE   	GetOptionr   TextrL   focused_widgetcreatemenubarapply_bindingsprotocolclosebindclose_eventr   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_eventr7   fregionindent_region_eventdedent_region_eventcomment_region_eventuncomment_region_eventtabify_region_eventuntabify_region_eventr8   toggle_tabs_eventchange_indentwidth_eventmove_at_edge_if_selectiondel_word_leftdel_word_righthome_callbackdictnew_callbackclose_all_callbackopen_module_browseropen_path_browseropen_turtle_demoset_status_barpackLEFTBOTHrowconfigurecolumnconfigurehandle_yviewgridNSEWsetGetFont	focus_set	set_widthusetabstabwidthindentwidthset_notabs_indentwidthhasattrrm   update_cursor_blinknum_context_linesr)   perr,   undoinsertfilterundo_block_startundo_block_stopset_saved_change_hooksaved_change_hookr-   ioset_filename_change_hookfilename_change_hook	good_loadset_indentation_paramscolorcode_contextline_numbersexistsloadfileispythonsourceset_filenameResetColorizerupdate_recent_files_listload_extensionsmenudictgetindexadd_separator	wmenu_endregister_callbackpostwindowsmenur   
askintegerr   askyesno	showerror	event_addr1   user_input_insert_tagsautocomplete_eventtry_open_completions_eventforce_open_completions_eventr2   expand_word_eventr6   format_paragraph_eventr:   flash_paren_eventparen_closed_eventcheck_module_eventrun_module_eventrun_custom_eventr9   	do_rstripr3   ctiptry_open_calltip_eventrefresh_calltip_eventforce_open_calltip_eventr;   zoom_height_eventallow_code_contextr4   toggle_code_context_eventupdate_menu_stateallow_line_numbersr5   toggle_line_numbers_event)selfr   filenamekeyr   r=   dochomepyverbasepathr~   docfileKEYr   r   rE   rH   text_optionsrL   r   indents	usespacesr   r   r   	is_py_srcrD   rp   autocomplete
parenmatchscriptbindingr	  s                                  r$   __init__zEditorWindow.__init__J   sM   3  (ww||COOULIG||!!'*&c6F6Fr6J)JJ77==!89?G0H ggll8U+0,@Gbq!U*5cjj\:;$//0H0H#NG 77>>'*%G)'',,sJLgg&&w/Gww~~g&(/%<<8+,58M8M,ML))I+.+;+;BQ+?*@%
!uzz	Dz..t$,,GG3 %

D &+%6%6DHH" "D%'DHH"!)!1!1 "6bggll  "476 !#',Sz1*$Zf==	D""6>7O&'+",,uF	 2+D1*MMM	D"&)),djj9($*:*:;??II($*:*:; II*4+@+@AIIeT223 IIeD112		.+.		,,		,,		-!6!67		)TXX&		*dii(		+tzz*		%t'?'?@		*d../		#T%5%56		"D$5$56		*D,>,>?		#T%;%;<		"$9:		"DOO4		($*?*?@		*doo.		"D$9$9:		%t'?'?@		&(A(AB		-!3!34		/4#7#78		'(B(BC		*4+H+HI		$T%<%<=!%!2!24!88w		%w'B'BC		%w'B'BC		&(D(DE		('*H*HI		%w'B'BC		')F)FG,,t$		#W%>%>?		*G,L,LM		(D::1=>		)T;;A>?		%t'9'9:		&(;(;<		)4+=+=>&)Ed#"&

3II+T->->?II-tzz/L/LMII.0H0HIII-t/E/EFII,d.C.CDTQ7!,""1Q"/++Y		a$	/!%''		6>JV		a$	/ &&vx'3&B	$}   ==##% x!12&*ii&@H#  " "2..3--//	D $ 5 5#33""4#9#9:~~d++"
##D$=$=>##E*
  ww~~h'h0G;;x(%)DN $ 3 3H =I//	:)!% %%'}}  ***U#C{ax""$Ag DN$$T%9%9: '11"++#-- 	);713H+-E	G-/GH,.GH)+D24M	O
 ((t/J/JK		$l&E&EF		,99	;		.;;	=		#T__T%:%L%LM		(&&t,CC	E__T*
		#Z%A%AB		$j&C&CD%d+		$m&F&FG		"M$B$BC		"M$B$BC		/4;;t#4#>#>?<<--	D		($*E*EF		')C)CD		*D,I,IJ		#T__T%:%L%LM"" $ 0 0 6DII/''AAC ""9mZH"" $ 0 0 6D!!&."8vG..0II/1O1OP""9mZHU ) "("3"3F4M4M47#9, 	sG   7AC% C%	ADC/ADDADD	ADDADDADDADDADc                 $    | j                          y N)r   r  r\   s     r$   r   zEditorWindow.handle_winconfigl  s    r&   c           	      D   | j                   }t        t        |j                  j                  |j                  d      |j                  d      g            }|j                         d|z  z
  }t        ||j                  d            j                  d      }||z  | _	        y )NborderrQ   rC   rj   )rj   0)
rL   summaptkgetintcgetwinfo_widthr   measurerH   )r  rL   inner_paddingpixel_widthzero_char_widths        r$   r   zEditorWindow.set_widtho  s    yyC81D1561B1D E F&&(1}+<< DIIf-.66s; 	 O3
r&   c                 t    | j                   j                         \  }}| j                  j                  |       yrY   )r   defaultfilenamer   new)r  r\   dirnamebasenames       r$   r   zEditorWindow.new_callback|  s,     GG335

wr&   c                     |j                   dz  dk7  r|j                  dk(  ry | j                  j                  d      rq| j                  j	                  ddd      rT| j                  j	                  ddd      r7t        | j                  j                  d      j                  d      d	         }nI| j                  j                  dd      }t        t        |            D ]  }||   d
vs n t        |      }t        | j                  j                  d      j                  d      d	         }||k(  rd}dt        |      z   dz   }|j                   d	z  dk(  r| j                  j                  ddd       nQ| j                  j                  d      s| j                  j                  dd       n| j                  j	                  | j                  j                  d      d| j                  j                  d            r| j                  j                  dd       n| j                  j                  dd       | j                  j                  |      }| j                  j                  d      }| j                  j	                  |d|      r||}}| j                  j                  ddd       | j                  j                  d||       | j                  j                  d|       | j                  j                  d       y)N   r   Homeiomark<=zinsert lineendinsert linestart.r`   ) 	insertzinsert linestart+csel1.0rp   	sel.first	my_anchor<sel.last>rZ   )statekeysymrL   r   comparerI   splitr   rangelenstr
tag_removemark_settag_addsee)r  r\   insertptlinelineatdestfirstlasts           r$   r   zEditorWindow.home_callback  sP   KK!O!ellf&<99??8$99Xt-=>99/x@499??84::3?BCH99==!35EFD!#d), #>3# TTYY__X.44S9!<=vH"3x=04KKMaII  u599??;/		"";999$$TYY__[%A3%)YY__X%>@II&&{K@II&&{J?IIOOD)E99??;/Dyy  s40!%dII  u5IIeUD1		8T*		hr&   c                    | j                  | j                        | _        t        | j                  ddd      }t        j
                  dk(  r"| j                  j                  ddt               | j                  j                  dd	t               | j                  j                  d
dt               | j                  j                  t        t               |j                  t        t               | j                  j                  d| j                         | j                  j                  ddd       | j                  j                  | j                         y )Nr`   grey75)rP   borderwidth
backgroundr   	_padding1z    )ra   rg   zCol: ?rV  zLn: ?)ra   rb   z<<set-line-and-column>>z<KeyRelease>z<ButtonRelease>)r0   r   
status_barr   r   r{   	set_labelRIGHTr   BOTTOMXrL   r   set_line_and_columnr   
after_idle)r  seps     r$   r   zEditorWindow.set_status_bar  s    --dhh7DHHQA(K<<8# OO%%k6%F!!(H5!A!!&'!>&q1f1%		0$2J2JK		5*,=	?		T556r&   c                     | j                   j                  t              j                  d      \  }}| j                  j                  dd|z         | j                  j                  dd|z         y )Nr>  rg   zCol: %srV  zLn: %s)rL   r   INSERTrM  r`  ra  )r  r\   rV  rg   s       r$   re  z EditorWindow.set_line_and_column  sT    yyv.44S9f!!(I,>?!!&(T/:r&   ))file_File)edit_Edit)formatF_ormat)run_Run)rr   _Options)r   _Window)r   _Helpc                 t   | j                   }i x| _        }| j                  D ]K  \  }}t        |      \  }}t	        | | dd      }t        ||d|      x||<   }|j                  |||       M t        j                         r&t        |dd      x|d<   }|j                  d	|
       | j                          t        | j                   d      | _
        | j                  d   j                  ddd| j                         | j                  d   j                  t              | _        | j                          y)a  Populate the menu bar widget for the editor window.

        Each option on the menubar is itself a cascade-type Menu widget
        with the menubar as the parent.  The names, labels, and menu
        shortcuts for the menubar items are stored in menu_specs.  Each
        submenu is subsequently populated in fill_menus(), except for
        'Recent Files' which is added to the File menu here.

        Instance variables:
        menubar: Menu widget containing first level menu items.
        menudict: Dictionary of {menuname: Menu instance} items.  The keys
            represent the valid menu items for this window and may be a
            subset of all the menudefs available.
        recent_files_menu: Menu widget contained within the 'file' menudict.
        _menu_postcommandNr   )rF   tearoffpostcommand)labelrD   	underlineapple)rF   rw  applicationIDLE)ry  rD   rw  rj  r@   zRecent Files)ry  rz  rD   r   )r   r   
menu_specsprepstrgetattrr   add_cascader   
isCarbonTk
fill_menusrecent_files_menuinsert_cascader   ENDbase_helpmenu_lengthreset_help_menu_entries)r  mbarr   rF   ry  rz  rx  rD   s           r$   r   zEditorWindow.createmenubar  s=     ||#%%?? 	JKD%&u~Iu!$4&0A(BDIK$(D!5@%B BHTNT5tyI	J -1$W:;.= =H]#d65!%dllA!>f,,Qn78262H2H 	- 	J %)MM&$9$?$?$D!$$&r&   c                     | j                   d   }|j                  d      }|d}|| j                  kD  r|j                  | j                  dz   |       t	        j
                  |       y)zSCallback to register window.

        Only called when Window menu exists.
        r   rp   Nrq   r`   )r   r   r   deleter   add_windows_to_menu)r  rD   rp   s      r$   r   zEditorWindow.postwindowsmenu  s[    
 }}X&jj;CKKq(#.""4(r&   c                 H    | j                   |   }|j                  ||       y)z$Update label for menu item at index.)ry  Nr   entryconfig)r  rD   r   ry  menuitems        r$   update_menu_labelzEditorWindow.update_menu_label  #    ==&U%0r&   c                 H    | j                   |   }|j                  ||       y)z$Update state for menu item at index.rJ  Nr  )r  rD   r   rJ  r  s        r$   r  zEditorWindow.update_menu_state  r  r&   c                     |dk(  rCt        |d         }t        | j                  d      |z        | j                  d      z
  }d}|df} | j                  j                  |g|  y)zHandle scrollbar.movetor   rp   @0,0scrollunitsrZ   )floatround	getlinenorL   yview)r  r\   argsfractionliness        r$   r   zEditorWindow.handle_yview  si    HT!W~H4>>%08;<^^F+,EE7#D		%%r&   c                    | j                   }|j                  d|j                   d|j                         }	 |j	                  dd|      xr |j	                  |dd      }|s%|j                  ddd	       |j                  d
|       | j                  s| j                          | j                  }|| _
        t        j                  d d dk(  }|r|j                  d       | j                  D ]0  }	 |\  }}	}
|
 t!        | |
             }|j#                  ||       2 |j%                  |j&                  |j(                         |r| j                   j                  d       y# t
        $ r d}Y w xY w# t        $ r Y w xY w)N@,rE  r<  rH  FrC  rD  rp   rA  r@   rA   arrow)cursorr  ibeamrZ   )rL   r   xyrL  TclErrorrQ  rR  rmenu
make_rmenur\   r   r{   configrmenu_specs
ValueErrorr  entryconfiguretk_popupx_rooty_root)r  r\   rL   newdexin_selectionr  iswinitemry  	eventnameverify_staterJ  s               r$   r   zEditorWindow.right_menu_event(  sy   yyay%''34	! LLdFC C<<zB  OOE5%0MM(F+zzOO


Ra E)KKwK'$$ 		5D15.y, #/GD,/1E  e 4		5 	u||U\\2IIG,7  	! L	!   s#   (E% 1E7%E43E47	FF)CloserV   Nc                     t        | j                  d      }| j                  D ]B  }|d   |d   }}|$| j                  |fd}|j                  ||       3|j	                          D || _        y )Nr   r~  r`   c                 &    | j                  |       y r$  event_generaterL   r  s     r$   re   z(EditorWindow.make_rmenu.<locals>.commandU  s    ''	2r&   ry  re   )r   rL   r  add_commandr   r  )r  r  r  ry  r  re   s         r$   r  zEditorWindow.make_rmenuP  st    TYY*$$ 	&D#AwQ9E !%i 3!!w!?##%	& 
r&   c                 "    | j                         S r$  )rmenu_check_copyr  s    r$   rmenu_check_cutzEditorWindow.rmenu_check_cut\  s    $$&&r&   c                 d    	 | j                   j                  d      }|rdS dS # t        $ r Y yw xY w)NrE  normalrs   rL   r   r  )r  indxs     r$   r  zEditorWindow.rmenu_check_copy_  s<    	499??;/D  $833  		s   # 	//c                     	 | j                   j                  j                  d| j                   d       y# t        $ r Y yw xY w)Nztk::GetSelection	CLIPBOARDr  rs   )rL   r+  callr  r  s    r$   rmenu_check_pastezEditorWindow.rmenu_check_pasteg  s?    	IILL0$))[I   		s   14 	A A c                 B    t        j                  | j                         y)zHandle Help 'About IDLE' event.rZ   )r   AboutDialogr   r%  s     r$   r   zEditorWindow.about_dialogo  s     	txx(r&   c                 D    t        j                  | j                  d       y)z&Handle Options 'Configure IDLE' event.SettingsrZ   )r	   ConfigDialogr   r%  s     r$   r   zEditorWindow.config_dialogu  s     	!!$((:6r&   c                 x    | j                   r| j                   }n| j                  }t        j                  |       y)zHandle Help 'IDLE Help' event.rZ   )r   r   r   show_idlehelp)r  r\   parents      r$   r   zEditorWindow.help_dialog{  s.     99YYFXXF6"r&   c                 2   t         j                  d d dk(  r!	 t        j                  | j                         yt        j                  | j                         y# t
        $ r5}t        j                  dt        |      | j                         Y d }~yd }~ww xY w)Nr@   rA   Document Start Failuretitlemessager  rZ   )r   r{   rw   	startfilerv   OSErrorr   r   rP  rL   
webbrowseropen)r  r\   whys      r$   r   zEditorWindow.python_docs  s~    <<u$8T]]+  OODMM*  8$$+CHTYY8 8 8s   A 	B!+BBc                 :    | j                   j                  d       y)Nz<<Cut>>rZ   rL   r  r%  s     r$   r   zEditorWindow.cut  s    		  +r&   c                 r    | j                   j                  d      sy | j                   j                  d       y)NrC  z<<Copy>>rZ   )rL   
tag_rangesr  r%  s     r$   r   zEditorWindow.copy  s,    yy##E*		  ,r&   c                 p    | j                   j                  d       | j                   j                  d       y)Nz	<<Paste>>rA  rZ   )rL   r  rT  r%  s     r$   r   zEditorWindow.paste  s'    		  -		hr&   c                     | j                   j                  ddd       | j                   j                  dd       | j                   j                  d       y)NrC  rD  zend-1crA  rZ   )rL   rS  rR  rT  r%  s     r$   r   zEditorWindow.select_all  s?    		%1		8U+		hr&   c                 t    | j                   j                  ddd       | j                   j                  d       y)NrC  rD  rp   rA  rZ   )rL   rQ  rT  r%  s     r$   r   zEditorWindow.remove_selection  s+    		UE51		hr&   c                 z    | j                   j                  | j                   j                  df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                 t    | j                   dz  dk(  r	  d        d          y y # t        $ r Y y w xY w)NrM   r   rE  rA  )rJ  r  )r\   
edge_indexedges_tableself_text_indexself_text_mark_sets    r$   move_at_edgez<EditorWindow.move_at_edge_if_selection.<locals>.move_at_edge  sH    aA%#K0&xZ1HI &   s   + 	77)rL   r   rR  )r  r  r  r  r  r  s    ` @@@r$   r   z&EditorWindow.move_at_edge_if_selection  s4     ))//!YY//5	 r&   c                 :    | j                   j                  d       y)Nz<Meta-Delete>rZ   r  r%  s     r$   r   zEditorWindow.del_word_left  s    		  1r&   c                 :    | j                   j                  d       y)Nz<Meta-d>rZ   r  r%  s     r$   r   zEditorWindow.del_word_right  s    		  ,r&   c                 B    t        j                  | j                         yrY   )r   findrL   r%  s     r$   r   zEditorWindow.find_event  s    DIIr&   c                 B    t        j                  | j                         yrY   )r   
find_againrL   r%  s     r$   r   zEditorWindow.find_again_event  s    $))$r&   c                 B    t        j                  | j                         yrY   )r   find_selectionrL   r%  s     r$   r   z!EditorWindow.find_selection_event  s    dii(r&   c                 n    t        j                   | j                  | j                  | j                         yrY   )r
   rL   r   r   r%  s     r$   r   z EditorWindow.find_in_files_event  s!    		$))TWWdjj1r&   c                 B    t        j                   | j                         yrY   )r   rL   r%  s     r$   r   zEditorWindow.replace_event  s    		"r&   c                     | j                   }t        j                  |dd      j                  }|I|j	                  ddd       |j                  d| d       |j                  d       | j                          y)	Nz
Go To Linez/Enter a positive integer
('big' = end of file):rC  rD  rp   rA  .0rZ   )rL   r   GotoresultrQ  rR  rT  re  )r  r\   rL   linenos       r$   r   zEditorWindow.goto_line_event  st    yyl) &	 	
 OOE5%0MM(vhbM2HHX$$&r&   c                 b   	 | j                   j                  dd      j                         }t	        j
                  | j                   dd|      j                  }|D| j                  r| j                  j                  |       |S | j                  j                  |       |S # t        $ r d}Y w xY w)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.
        rE  rH  rB   zOpen ModulezAEnter the name of a Python module
to search on sys.path and open:)rL   r   stripr  r   
ModuleNamer  r   r  r   r   )r  rF   	file_paths      r$   open_modulezEditorWindow.open_module  s    	99==j9??AD $$		=2	 f	 	
  zz

	*    +  	D	s   *B   B.-B.c                 $    | j                          yrY   )r  r%  s     r$   r   zEditorWindow.open_module_event  s    r&   c                     | j                   j                  }| j                  j                  dk(  r|s| j	                         }|yddlm} |j                  | j                  |       y)NPyShellEditorWindowrZ   r   )browser)	r   r  	__class____name__r  idlelibr  ModuleBrowserr   )r  r\   r  r  s       r$   r   z EditorWindow.open_module_browser  sX    77##''+@@'')H#dii2r&   c                 F    ddl m} |j                  | j                         y)Nr   )pathbrowserrZ   )r  r  PathBrowserr   )r  r\   r  s      r$   r   zEditorWindow.open_path_browser  s    '		*r&   c                 X    dd l }t        j                  ddg}|j                  |d       y)Nr   z-cz,from turtledemo.__main__ import main; main()F)shellrZ   )
subprocessr   
executablePopen)r  r\   r  cmds       r$   r   zEditorWindow.open_turtle_demo  s1    ~~=? 	E*r&   c                     |p|dkD  rj| j                   j                  dd|z         | j                   j                  ddd       | j                   j                  ddd       | j	                          y y y )Nr   rA  z%d.0rC  rD  rp   z
insert +1l)rL   rR  rQ  rS  center)r  r  s     r$   gotolinezEditorWindow.gotoline  sc    &1*IIx&9II  u5IIeX|<KKM	 #-r&   c                 v   |rt         j                  j                  |      ryt         j                  j                  t         j                  j	                  |            \  }}t         j                  j                  |      t        v ry| j                  j                  dd      }|j                  d      xr d|v S )NTrD  z1.0 lineendz#!python)
rw   rx   r}   splitextr7  normcaser   rL   r   
startswith)r  r  baseextrV  s        r$   r   zEditorWindow.ispythonsource%  s    277==2GG$$RWW%5%5h%?@	c77C M1yy}}UM2t$9T)99r&   c                 b    | j                   r#| j                   j                  |        d | _         y y r$  )r   unregister_maybe_terminater  s    r$   
close_hookzEditorWindow.close_hook.  s'    ::JJ11$7DJ r&   c                     || _         y r$  )r  )r  r  s     r$   set_close_hookzEditorWindow.set_close_hook3  s	    $r&   c                     | j                   r| j                   j                  |        | j                          | j                  j	                  |        | j                          y r$  )r   filename_changed_editr   r   update_windowlist_registryr   r  s    r$   r   z!EditorWindow.filename_change_hook6  sE    ::JJ,,T2 ++D1r&   c                    | j                   ry | j                  | j                  j                        r| j	                         | _         | j                   r2| j
                  j                  | j                   | j                         y y )N)filterafter)r   r   r   r  r*   r   insertfilterafterr   r  s    r$   _addcolorizerzEditorWindow._addcolorizer=  s_    ::tww//0,,.DJ::HH&&djj		&J r&   c                     | j                   sy | j                   j                          | j                  j                  | j                          d | _         y r$  )r   removecolorsr   removefilterr  s    r$   _rmcolorizerzEditorWindow._rmcolorizerF  s9    zz

!djj)
r&   c                    | j                          | j                          t        j                  | j                         | j
                  | j
                  j                          | j                  | j                  j                          yy)zUpdate the color themeN)	r-  r)  r(   r+   rL   r   update_highlight_colorsr   update_colorsr  s    r$   r   zEditorWindow.ResetColorizerM  so     	!!$)),(557(++- )r&   _c                 0   |j                  d|       |j                  |      }|r$|| j                  v r|j                  d|dz   |       d|j                  |      k(  r|j                  d|       n|j                  d|dz          |j	                  |       y )NERRORz
 wordstart
rA  z+1c)rS  r   
IDENTCHARSrR  rT  )r  rL   poschars       r$   colorize_syntax_errorz"EditorWindow.colorize_syntax_error\  s{    Wc"xx}DDOO+LL#"4c:488C= MM(C(MM(C%K0r&   c                     t        j                  dddd      }|sd| j                  d<   yt         j                  | j                  d<   y)	z&Update the cursor blink configuration.rG   r(   zcursor-blinkrl   rJ   r   rn   N)r   r   rL   rm   )r  cursorblinks     r$   r   z EditorWindow.update_cursor_blinkg  sC    ((VE)*DIIo& *2)@)@DIIo&r&   c                    | j                   | j                   j                          | j                  | j                  j                          t        j                  | j
                  dd      }|| j                  d<   | j                          y)z.Update the text widgets' font if it is changedNrG   r(   rj   )r   update_fontr   r   r   r   rL   r   )r  new_fonts     r$   	ResetFontzEditorWindow.ResetFontq  sr     ())+ ())+##DIIv~F$		&r&   c                 |   t        j                         x| j                  _        }|j	                         D ]"  \  }} | j
                  j                  |g|  $ | j                         D ]O  }t        j                  |      }|s|j	                         D ]"  \  }} | j
                  j                  |g|  $ Q y)zgRemove the virtual, configurable keybindings.

        Leaves the default Tk Text keybindings.
        N)	r   GetCurrentKeySetr/   default_keydefsitemsrL   event_deleteget_standard_extension_namesGetExtensionBindings)r  keydefsr\   keylistextensionNamexkeydefss         r$   RemoveKeybindingszEditorWindow.RemoveKeybindings  s     3;2K2K2MM%%mmo 	4NE7"DII""5373	4!>>@ 	<M44]CH&.nn&6 <NE7*DII**5;7;<	<r&   c                 
   t        j                         x| j                  _        }| j	                          | j                         D ]+  }t        j                  |      }|s| j	                  |       - i }| j                  j                  D ]4  }i ||d   <   |d   D ]"  }|s|d   ||d      t        |d         d   <   $ 6 | j                  D ]  }| j                  |   }|j                  t              }|*|dz  }t        d|      D ]u  }	|j                  |	      dk(  s|j                  |	d      }
|
s-|j                  |	d      }d}||v r|||   v r||   |   }|sWt        ||      }
|j!                  |	|
       w  y)	zeApply the virtual, configurable keybindings.

        Alse update hotkeys to current keyset.
        r   r`   Nre   acceleratorry  rB   )rL  )r   r@  r/   rA  r   rD  rE  menudefsr  r   r   r  rN  rK   	entrycgetget_acceleratorr  )r  rF  rH  rI  menuEventDictrD   r  menubarItemrp   r   accelitemNamer\   s                r$   ApplyKeybindingszEditorWindow.ApplyKeybindings  s    3;2K2K2MM%!>>@ 	.M44]CH##H-	. MM** 	JD%'M$q'"Q JBFq'M$q'*747+;A+>?J	J
  == 	GK==-D**S/C{1HCq# G99U#y0 NN5-@E#'>>%#A "&-7'=+EE(5k(B8(L $3GU$CE ,,U,FG	Gr&   c                 Z    | j                   st        j                  dddd      | _        yy)zCUpdate the indentwidth if changed and not using tabs in this windowrG   rk   z
num-spacesrI   rJ   N)r   r   r   r   r  s    r$   r   z#EditorWindow.set_notabs_indentwidth  s,     ||'11&(<7< >D r&   c                 t   t        j                         }| j                  d   }|j                  t              }|| j
                  kD  r|j                  | j
                  dz   |       |rA|j                          |D ],  }| j                  |d         }|j                  |d   |       . || j                  d<   y)z4Update the additional help entries on the Help menu.r   r`   r   r  N)
r   GetAllExtraHelpSourcesListr   r   r  r  r  r   _extra_help_callbackr  )r  	help_listhelpmenuhelpmenu_lengthentryr  s         r$   r  z$EditorWindow.reset_help_menu_entries  s    779	==("..-T666OOT66:_M""$" B//a9$$58S$AB !)fr&   c                      |f fd	}|S )z9Return a callback that loads resource (file or web page).c                 l   | j                  d      st        j                  j                  |       } t        j
                  d d dk(  r	 t        j                  |        y t        j                  |        y # t        $ r5}t        j                  dt        |      j                         Y d }~y d }~ww xY w)N)wwwhttpr@   rA   r  r  )r  rw   rx   r   r   r{   r  r  r   r   rP  rL   r  r  )helpfiler  r  s     r$   display_extra_helpz=EditorWindow._extra_help_callback.<locals>.display_extra_help  s    &&777++H5||BQ5(<LL*
 )	  <((/G #C< <<s   	A5 5	B3>+B..B3r[   )r  resourcerb  s   `  r$   rX  z!EditorWindow._extra_help_callback  s    (0 
	* "!r&   c                    g }| j                   }|rFt        j                  j                  |      r't	        |dd      5 }|j                         }ddd       |rIt        j                  j                  |      dz   }||v r|j                  |       |j                  d|       g }|D ]:  }d|v s#t        j                  j                  |dd       r*|j                  |       < |D cg c]	  }||vs| }}d	}|dt        |       }|r*	 t	        |d
dd      5 }|j                  |       ddd       | j&                  j(                  D ]u  }
|
j*                  }|j-                  dt.               t1        |      D ]C  \  }}|j3                         }|
j5                  |      }|j7                  ||   dz   |z   |d       E w y# 1 sw Y   uxY wc c}w # 1 sw Y   xY w# t        $ rY}	t        | j                  dd      s7d| j                  _        t!        j"                  dd|	 d| j$                         Y d}	~	
d}	~	ww xY w)z/Load and update the recent files list and menusutf_8r   )r.   errorsNr4  r    rq   1234567890ABCDEFGHIJKwrecentfiles_messageFTzIDLE Warningz)Cannot save Recent Files list to disk.
  z
Select OK to continue.r  r?  )ry  re   rz  )r   rw   rx   r   r  	readlinesabspathremoverA  appendrO  
writelinesr  r  r   rj  r   showwarningrL   r   r   r  r  r  	enumeraterstrip#_EditorWindow__recent_file_callbackr  )r  new_filerf_listr   rf_list_file	bad_pathsrx   ulcharsrf_fileerrinstancerD   i	file_namecallbacks                  r$   r   z%EditorWindow.update_recent_files_list  s;    **		2i&y: 3=I&0023 wwx047H7"x(NN1h'	 	'Dt|277>>$q*#=  &	' %,EDt9/D4EE)!CL)*)S#*9> 0AH&&w/0 .. 	.H--DKK3 )' 2 .9%,,.	#::9E  wqzC'7)'C)1+, ! ..	.=3 3 F
0 0  *tyy*?G48DII1**!%%(E *9!9  $yy	**sH   G'	G1G
G  G+G  GGG   	I)AH==Ic                      |f fd	}|S )Nc                 >    j                   j                  |        y )N)editFile)r   r  )
fn_closurer  s    r$   open_recent_filez=EditorWindow.__recent_file_callback.<locals>.open_recent_file  s    GGLL*L-r&   r[   )r  r}  r  s   `  r$   __recent_file_callbackz#EditorWindow.__recent_file_callback  s    (1 	.r&   c                 8   | j                         }| j                         }|r|r|dz   |z   t        z   }n|r|}n|r|}nd}|xs |xs |}| j                         s
d|z  }d|z  }| j                  j                  |       | j                  j                  |       y )Nz - untitledz*%s*z*%s)short_title
long_title_py_version	get_savedr   wm_titlewm_iconname)r  shortlongr  icons        r$   r   zEditorWindow.saved_change_hook  s      " TEMD(;6EEEE%%~~UNE4<D% T"r&   c                 6    | j                   j                         S r$  )r   r  r  s    r$   r  zEditorWindow.get_saved%  s    yy""$$r&   c                 :    | j                   j                  |       y r$  )r   	set_saved)r  flags     r$   r  zEditorWindow.set_saved(  s    		D!r&   c                 8    | j                   j                          y r$  )r   
reset_undor  s    r$   r  zEditorWindow.reset_undo+  s    		r&   c                 t    | j                   j                  }|rt        j                  j	                  |      S dS )Nr  )r   r  rw   rx   r7  )r  r  s     r$   r  zEditorWindow.short_title.  s-    77##-5rww)E:Er&   c                 6    | j                   j                  xs dS )NrB   )r   r  r  s    r$   r  zEditorWindow.long_title2  s    ww%2%r&   c                 $    | j                          yrY   )r  r%  s     r$   r   z EditorWindow.center_insert_event5  s    r&   c                     | j                   }| j                         \  }}| j                  |      }||z
  }t        d||dz  z
        }|j	                  t        |             y )Nr`   rC   )rL   getwindowlinesr  maxr  r  )r  markrL   r   botr  rP   newtops           r$   r  zEditorWindow.center9  sY    yy&&(S%sQ*+

5=!r&   c                     | j                   }| j                  d      }| j                  d      }||k(  r)|j                         dk(  rt        |d         }||z   dz
  }||fS )Nr  z@0,65535r`   rP   )rL   r  winfo_heightrI   )r  rL   r   r  rP   s        r$   r  zEditorWindow.getwindowlinesA  sc    yynnV$nnZ(#:$++-2h(F,"CCxr&   c                 `    | j                   }t        t        |j                  |                  S r$  )rL   rI   r  r   )r  r  rL   s      r$   r  zEditorWindow.getlinenoK  s$    yy5D)*++r&   c                     | j                   j                         }t        j                  d|      }t	        t        t        |j                                     S )zReturn (width, height, x, y)z(\d+)x(\d+)\+(-?\d+)\+(-?\d+))r   wm_geometryrematchlistr*  rI   groups)r  geomms      r$   get_geometryzEditorWindow.get_geometryO  s=    xx##%HH5t<CQXXZ())r&   c                 $    | j                          yrY   )r   r%  s     r$   r   zEditorWindow.close_eventU  s    

r&   c                 F   | j                   r| j                         sk| j                  j                         dk7  r| j                  j	                          | j                  j                          | j                  j                          | j                   j                         S y )Nr  )r   r  r   rJ  	deiconifylowerlift	maybesaver  s    r$   r  zEditorWindow.maybesaveY  si    77>>#88>>#X-HH&&( 77$$&& r&   c                     	 | j                         }t        |      dk7  r| j                          |S # t        $ r Y y w xY w)Ncancel)r  rP  _closeAttributeError)r  replys     r$   r   zEditorWindow.closeb  s?    	NN$E5zX%L 		s   /2 	>>c                 P   | j                   j                  r&| j                  | j                   j                         t        j                  | j
                         | j                          | j                   j                          d | _         d | _        | j                  r!| j                  j                          d | _	        d | _
        d | _        | j                  j                          d | _        | j                  j                          | j                  r| j                          y y )N)rt  )r   r  r   r   unregister_callbackr   unload_extensionsr   r   r   rL   r   r   r   destroyr  r  s    r$   r  zEditorWindow._closek  s    77))4773C3C)D""4#7#78 	::JJDJ	 ??OO r&   c                 2    i | _         | j                          y r$  )
extensionsload_standard_extensionsr  s    r$   r   zEditorWindow.load_extensions  s    %%'r&   c                     t        | j                  j                               D ]  }t        |d      s|j	                          ! i | _        y )Nr   )r  r  valuesr   r   )r  inss     r$   r  zEditorWindow.unload_extensions  s?    ..01 	CsG$			 r&   c                     | j                         D ]  }	 | j                  |        y #  t        dt        |             t	        j
                          Y ExY w)NzFailed to load extension)rD  load_extensionprintrepr	traceback	print_exc)r  rF   s     r$   r  z%EditorWindow.load_standard_extensions  sO    557 	&D&##D)	&&0$t*=##%s	   )+Ac                 .    t        j                  d      S )NT)editor_only)r   GetExtensionsr  s    r$   rD  z)EditorWindow.get_standard_extension_names  s    %%$77r&   ZzDummyzzdummyc                    | j                   j                  ||      }	 	 t        j                  d|z   t              }t        ||      }t        j                  |      }t        |d      r| j                  |j                  |        ||       }|| j                  |<   |r| j                  |       |D ]x  }|j!                  dd      }|d d dk(  r|dd  }|d d dk(  r|d	d  d
k(  r|d d	 }|d	d  d
k(  r|dz   }t        ||      sS| j"                  j%                  |t        ||             z y y # t
        t        f$ r t        j                  |      }Y w xY w# t
        $ r t        d|        w xY w)Nr>  )packagez
Failed to import extension: rM  -r1  r`   rG  rq   rI  _event)extfilesr   	importlibimport_module__package__ImportError	TypeErrorr  r  r   rE  r   r  rM  r  r   r   rL   r   )	r  rF   fnamemodclsrF  r  vevent
methodnames	            r$   r  zEditorWindow.load_extension  s   !!$-	5--cEk;O c4 //53
#OOCLL'2$i #(! E#^^C5
 !n+!+ABJ !!n+ o,!+CRJ !o,'(2
3
+IINN673
+CDE   + 5--e45 	2D9	s#   D/ /$EE EE E1c                     || j                   j                  }| j                  }||_        |j	                         D ]  \  }}|s	 |j
                  |g|   y)z"Add events with keys to self.text.N)r/   rA  rL   rF  rB  r   )r  rF  rL   r\   rG  s        r$   r   zEditorWindow.apply_bindings  sU    ?mm33Gyy%mmo 	0NE7u/w/	0r&   c           	         || j                   j                  }|| j                   j                  }| j                  }| j                  }|D ]  \  }}|j                  |      }|s|D ]  }||j                          |\  }	}
|	dd dk(  }|r|	dd }	t        |	      \  }}	t        ||
      }||
fd}|r-| j                  |
t              }|j                  |	||||       y|j                  |	|||         y)zFill in dropdown menus used by this window.

        Items whose name begins with '!' become checkbuttons.
        Other names indicate commands.  None becomes a separator.
        Nr`   !c                 &    | j                  |       y r$  r  r  s     r$   re   z(EditorWindow.fill_menus.<locals>.command  s    ++I6r&   )ry  rz  re   rL  variable)ry  rz  re   rL  )r/   rM  rA  r   rL   r   r   r  rO  get_var_obj
BooleanVaradd_checkbuttonr  )r  rM  rF  r   rL   mname	entrylistrD   r\  ry  r  checkbuttonrz  rL  re   vars                   r$   r  zEditorWindow.fill_menus  s+    }}--H?mm33G==yy ( 	BE9<<&D" B=&&(',$E9#(!9#3K" %ab	'.u~$Iu"1'9"EK%)Y 7""..y*E,,5I$+%( - * ((u	185@ ) B%B		Br&   c                 b    | j                  |      }|r|j                         }|S t        |      r$  )r  r   	NameError)r  rF   r  values       r$   getvarzEditorWindow.getvar  s/    t$GGIELD/!r&   c                 d    | j                  ||      }|r|j                  |       y t        |      r$  )r  r   r  )r  rF   r  vartyper  s        r$   setvarzEditorWindow.setvar  s,    tW-GGEND/!r&   c                     | j                   j                  |      }|s#|r! || j                        x| j                   |<   }|S )z:Return a tkinter variable instance for the event.
        )r   r   rL   )r  r  r  r  s       r$   r  zEditorWindow.get_var_obj  sB     ##I.w181CCDi(3
r&   c                     | j                   r;| j                  j                  d|      xs d| j                  j                  |      v S y)NTODOSTRINGr`   )r   rL   tag_prevrange	tag_names)r  
text_indexs     r$   is_char_in_stringzEditorWindow.is_char_in_string  sE    :: 99**6:> ?tyy22:>>? r&   c                     	 | j                   j                  d      }| j                   j                  d      }||fS # t        $ r Y yw xY w)NrE  rH  NNr  )r  rY  rZ  s      r$   get_selection_indicesz"EditorWindow.get_selection_indices  sG    	IIOOK0E99??:.D$; 		s   9< 	AAc                 F    | j                   d   xs t        }t        |      S )Ntabs)rL   TK_TABWIDTH_DEFAULTrI   )r  currents     r$   get_tk_tabwidthzEditorWindow.get_tk_tabwidth  s     ))F#:':7|r&   c           	          | j                   }| j                         |k7  rC|j                  j                  dd|d   d|j                  d|z        }|j                  |       y y )Nrj   r/  z
-displayofn)r  )rL   r  r+  r  master	configure)r  newtabwidthrL   pixelss       r$   set_tk_tabwidthzEditorWindow.set_tk_tabwidth"  s^    yy![0WW\\&)T&\"."%"35F NNN' 1r&   c                     |rG|rE| j                         }d|cxk  rdk  r
n n|| _        | j                  | j                  k7  rd| _        | j	                  | j                         y )NrC   r   F)guess_indentr   r   r   r  )r  r  guessr|  s       r$   r   z#EditorWindow.set_indentation_params-  sS    !!#AA{{#$ 4==0$T]]+r&   c                    | j                   }| j                         \  }}|r'|r%|j                  ||       |j                  d|       y|j	                  dd      }|dk(  r6|j                  ddd      r|j                  d       y|j                          y|d   d	vr|j                  d       y| j                  }t        |j                  |            }|d
kD  sJ |dz
  | j                  z  | j                  z  }d
}		 |d d }|	dz   }	t        |j                  |            }||k  s|d   d	vrn2|j                          |j                  d|	z  d       ||k  r#|j                  dd||z
  z  | j                         |j                          y)NrA  rZ   r=  rB   rI  rD  z	insert-1crq    	r   r`   z
insert-%dcr?  )rL   r  r  rR  r   rL  bellr   rO  
expandtabsr   r   rA  r   r   )
r  r\   rL   rY  rZ  charsr   havewantncharsdeleteds
             r$   r   z"EditorWindow.smart_backspace_event6  s   yy002tTKKt$MM(E* +X6B;||Hc51K(  		"IU"KK$ ==5##H-.axd...$2B2BB#2JE)A-Mu''12Dt|uRy5  	L=0(;$;KK#"5335r&   c                 $   | j                   }| j                         \  }}|j                          	 |rh|rft        |      t        |      k7  r+| j                  j                  |      |j                          S |j                  ||       |j                  d|       |j                  dd      }t        || j                        \  }}|t        |      k(  r| j                  || j                  z          ng| j                  rd}n;t        |j!                  | j                              }| j                  }	d|	||	z  z
  z  }|j#                  d|| j$                         |j'                  d       	 |j                          y# |j                          w xY w)NrA  r=  r@  r?  rZ   )rL   r  r   
index2liner   r   r   r  rR  r   get_line_indentr   rO  reindent_tor   r   r
  rA  r   rT  )
r  r\   rL   rY  rZ  prefixraw	effectivepadr  s
             r$   r   zEditorWindow.smart_indent_eventa  sR    yy002t	#e$
4(88<<;;EB(   "' E4(h.XX0(;F,VT]]CNCc&k!  T-=-=!=> <<C #F$5$5dmm$D EI((AY]!23CHc4+F+FGHHX  "D  "s   5E= 7C4E= =Fc                 	   | j                   }| j                         \  }}|j                          	 |r&|r$|j                  ||       |j	                  d|       |j                  dd      }dt        |      }}||k  r||   dv r|dz  }||k  r||   dv r||k(  r@|j                  dd| j                         	 |j                  d       |j                          y|d| }d}|r|d	   dv r|dd	 }|dz  }|r|d	   dv r|r|j                  d
|z  d       |j                  d      dv r%|j                  d       |j                  d      dv r%|j                  dd| j                         t        |j                  d            }	t        j                  | j                  | j                         }
| j"                  s| j$                  D ]k  }t'        |	|z
  d      }t)        |      dz   }|j                  |d      }|
j+                  |       |
j-                  | j/                  |            }||dk(  sk n |
j1                  xs d       nP|j3                  dd      }|r|d   }nd}|j                  |d      }|
j+                  |       |
j1                  d       |
j5                         }|t        j6                  k7  r	|t        j8                  k(  rn|t        j:                  k(  r|j                  d|| j                         n|t        j<                  k(  r | j?                  |
jA                                nn|t        jB                  k(  rQ|
jE                         dkD  r|j                  d|| j                         n*| j?                  |
jG                                n
J d|       	 |j                  d       |j                          y|
jI                         }|j                  d|| j                         |
jK                         r| jM                  |       n#|r!|
jO                         r| jQ                  |       	 |j                  d       |j                          y# |j                  d       |j                          w xY w)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.
        rA  r=  r   r  r`   r4  rZ   Nrq   zinsert - %d charsr  consolerD  zbogus continuation type ))rL   r  r   r  rR  r   rO  rA  r   rT  r   r  r   r   Parserr   r   r   r   r  r  set_codefind_good_parse_start_build_char_in_string_funcset_lor  get_continuation_typeC_NONEC_STRING_FIRST_LINEC_STRING_NEXT_LINES	C_BRACKETr  compute_bracket_indentC_BACKSLASHget_num_lines_in_stmtcompute_backslash_indentget_base_indent_stringis_block_openerr   is_block_closerr   )r  r\   rL   rY  rZ  rV  r|  r  indentlnor  contextstartatstartatindexrawtextbodrrB  s                     r$   r   z%EditorWindow.newline_and_indent_event  s(    yy002te	#E4(h.88.9D c$iqAa%DGu,Q a%DGu,Av . 779j HHX  "k "1XF A48u,CRyQ 48u, /!3X> ((8$-H% ((8$- KK$(C(CD TZZ12Ct//?A((#55 G!#-3G#'=4#7L"hh|X>GJJw'11 ;;LIKC'Q, "&&y(;#$Q4L#(L((<:

7#'')AGNN"333'555 KK&$2M2MN'+++
 $$Q%=%=%?@'--- ..014Hf$($?$?A (()C)C)EF> 8>> HHX  " --/FKK&$*E*EF  "''.A--/**51HHX  " HHX  "s4   A$Q "Q #Q ?AQ C#Q 2E3Q A2Q #R c                 &    || j                   fd}|S )Nc                      ||d| z  z         S )Nz+%dcr[   )offset_startindex_iciss      r$   innerz6EditorWindow._build_char_in_string_func.<locals>.inner  s    v677r&   )r  )r  
startindexr7  s      r$   r  z'EditorWindow._build_char_in_string_func  s    &0..	8 r&   c                 l    | j                   r$t        || j                        \  }}d|z  d|z  z   S d|z  S )Nr@  r?  )r   divmodr   )r  r  ntabsnspacess       r$   _make_blankszEditorWindow._make_blanks  s9    <<#At}}5NE7%<#-//7Nr&   c                    | j                   }|j                          |j                  ddd      r|j                  dd       |r,|j	                  d| j                  |      | j                         |j                          y )Nr=  z!=rA  )rL   r   rL  r  rA  r=  r   r   )r  rg   rL   s      r$   r  zEditorWindow.reindent_to  sj    yy<<*D(;KK*H5KK$"3"3F";335r&   c                     t        | j                        j                         \  }}|r9|r7t        || j                        \  }}t        || j                        \  }}||z
  S dx}}||z
  S Nr   )IndentSearcherrL   rp  r  r   )r  openerindentedr  indentsmallindentlarges         r$   r  zEditorWindow.guess_indent%  sq    )$))488:h.vt}}EC.xGC [(( )*)K+[((r&   c                     | j                   y | j                   j                  r| j                   j                          d}n| j                   j                          d}| j	                  dd| d       y )NShowHiderr   rt   z Line Numbers)rD   r   ry  )r   is_shownhide_sidebarshow_sidebarr  )r  r\   
menu_labels      r$   r  z&EditorWindow.toggle_line_numbers_event.  sp    $%%**,J**,JI](2|=%A 	 	Cr&   )NNNNr$  )rA  r  )T)r  
__module____qualname__idlelib.percolatorr)   idlelib.colorizerr*   r+   idlelib.undor,   idlelib.iomenur-   r.   r  r/   idlelib.statusbarr0   idlelib.autocompleter1   idlelib.autoexpandr2   idlelib.calltipr3   idlelib.codecontextr4   idlelib.sidebarr5   idlelib.formatr6   r7   r8   r9   idlelib.parenmatchr:   idlelib.zoomheightr;   r   getfilesystemencodingfilesystemencodingrv   r  r  r   r"  r   r   r   r   r   re  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  r   r   r   r   r  r   r  r!  r   r)  r-  r   stringascii_lettersdigitsr5  r8  r   r>  rJ  rT  r   r  rX  r   rs  r   r  r  r  r  r  r   r  r  r  r  r   r  r   r  r   r  r  rD  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(   3   s   ->*2 01-'/+MM--2224H!`ID	4
)V7 ;&J#'J)1
1
	 E!J 	,K

'4	

(0	
:
%K. %%5;J	A"<&GP>)"",.\ 
#$%"F&",*'((&8 	9
HE80$BL""$(,)V!#Fq#p )Cr&   r(   c                 *    t        t        |             S r$  )rI   r  )r   s    r$   r  r  <  s    uU|r&   z[ \t]*c                     t         j                  |       }|j                         t        |j	                         j                  |            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  rp   rO  groupr
  )rV  r   r  s      r$   r  r  A  s;     	d#A557C	,,X6777r&   c                   X    e Zd ZdZd Zd Zej                  ej                  dfdZ	d Z
y)rA  z4Manage initial indent guess, returned by run method.c                 J    || _         dx| _        | _        d x| _        | _        y r@  )rL   r|  finishedblkopenlineindentedline)r  rL   s     r$   r"  zIndentSearcher.__init__N  s'    	!""/334,r&   c                     | j                   ry| j                  dz   x}| _        t        |      dz   }| j                  j	                  |dd      ry| j                  j                  ||dz         S )NrB   r`   r  z>=rp   z lineend+1c)rg  r|  r  rL   rL  r   )r  r|  r  s      r$   readlinezIndentSearcher.readlineS  s`    ==VVaZDFAw~99T4/yy}}T4-#788r&   )classdefforifr  trywhilewithc	                     | j                   ry ||k(  r||v r|| _        y ||k(  r| j                  r|| _        d| _         y y y )Nr`   )rg  rh  ri  )	r  rK   tokenstartrp   rV  INDENTNAMEOPENERSs	            r$   
tokeneaterzIndentSearcher.tokeneater\  sI    
 ==T\ew.#DV^ 0 0 $DDM !1^r&   c                     	 t        j                  | j                        }|D ]  } | j                  |   	 | j                  | j                  fS # t         j                  t
        f$ r Y 3w xY w)ztReturn 2 lines containing block opener and and indent.

        Either the indent line or both may be None.
        )tokenizegenerate_tokensrk  ry  
TokenErrorSyntaxErrorrh  ri  )r  tokensrt  s      r$   rp  zIndentSearcher.runi  sp    
	--dmm<F ('(
 !2!222 ##[1 		s   5A A,+A,N)r  rM  rN  __doc__r"  rk  r{  rv  rw  ry  rp  r[   r&   r$   rA  rA  K  s.    :4
9 #// -3r&   rA  c                 R    | j                  d      }|dk\  r| d| | |dz   d z   } || fS )zExtract the underscore from a string.

    For example, prepstr("Co_py") returns (2, "Copy").

    Args:
        s: String with underscore.

    Returns:
        Tuple of (position of underscore, string without underscore).
    r1  r   Nr`   )r  )sr|  s     r$   r  r  z  s:     	
sAAvbqEAacdGOa4Kr&   []/)bracketleftbracketrightslashc                 
   | j                  |      }|rt        j                         r|dv ry|d   }t        j                  dd |      }t        j                  dd |      }t        j                  dd|      }t        j                  d	d
|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }|S )ak  Return a formatted string for the keybinding of an event.

    Convert the first keybinding for a given event to a form that
    can be displayed as an accelerator on the menu.

    Args:
        keydefs: Dictionary of valid events to keybindings.
        eventname: Event to retrieve keybinding for.

    Returns:
        Formatted string of the keybinding.
    >   r^   rW   r_   rB   r   z-[a-z]\bc                 >    | j                         j                         S r$  )rd  upperr  s    r$   r]   z!get_accelerator.<locals>.<lambda>  s    aggioo&7 r&   z\b\w+\bc                 f    t         j                  | j                         | j                               S r$  )keynamesr   rd  r  s    r$   r]   z!get_accelerator.<locals>.<lambda>  s    X\\!'')QWWY%G r&   zKey-Cancelz
Ctrl-BreakzControl-zCtrl-r  +z><r?  rG  rI  )r   r   	isCocoaTkr  sub)rF  r  rG  r  s       r$   rO  rO    s     kk)$G ))+	 >6 16 
A
{7;A
zGKA
vr1A
xq)A
z7A&A
sCA
tS!A
sBA
sBAHr&   c                     | j                   }|j                  ddd       |j                  ddd       |j                  ddd       y )	Ntcl_wordBreakAfterza br   r   tcl_wordcharsz\wtcl_nonwordcharsz\W)r+  r  )r   r+  s     r$   fixwordbreaksr    s?     
BGG %+GGE?E*GGE%u-r&   c                 @   | }t        |       t        j                  dd  rt        j                  d   }nd }t        j                  |d        t        ||      }|j                  }d|d<   t        d      D ]&  }|j                  dd|z  t        |      z   dz          ( y )	Nr`   )r   r  
   rP      rA  z  r4  )
r  r   argvr   setupAppr(   rL   rN  rA  rP  )r  r   r  rl  rL   r|  s         r$   _editor_windowr    s    D$
xx|88A;
OOD$TH5D99DDN2Y 6Hd1fs1vo456r&   __main__)rG   zidlelib.idle_test.test_editorrC   F)	verbosityexit)rp  ):importlib.abcr  importlib.utilrw   r{   r  r^  r   r{  r  r  tkintertkinter.fontr   tkinter.ttkr   r   r   idlelib.configr   r  r	   r
   r   r   r   idlelib.multicallr   r   r   r   r   idlelib.treer   idlelib.utilr   r   r  python_versionr  r   r%   r(   r  compilerc  r  rA  r  r  rO  r  r  r  unittestrG   idlelib.idle_test.htestrp  r[   r&   r$   <module>r     s     	  	  
      !    #       .     $ &   ///11		!
FC FCR0 "**Y'8*3 *3^$ 
(V.6$ z	(AEB+ r&   