
   .fUf                   f   S r SSKrSSKrSSKrSSKrSSKJrJr  SSK	J
r
JrJrJrJrJr  SSKJrJrJrJrJr  SSK	Jr  SSKJr  SSKJr   " S	 S
\
5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r \!S:X  a  SSK"J#r#  \#" SSSS9  SSK$J%r%  \%" \\\ 5        gg)a|  
Dialogs that query users and verify the answer before accepting.

Query is the generic base class for a popup dialog.
The user must either enter a valid answer or close the dialog.
Entries are validated when <Return> is entered or [Ok] is clicked.
Entries are ignored when [Cancel] or [X] are clicked.
The 'return value' is .result set to either a valid answer or None.

Subclass SectionName gets a name for a new config file section.
Configdialog uses it for new highlight theme and keybinding set names.
Subclass ModuleName gets a name for File => Open Module.
Subclass HelpSource gets menu item and path for additions to Help menu.
    N)
executableplatform)Toplevel	StringVar
BooleanVarWES)FrameButtonEntryLabelCheckbutton)
filedialog)Font)_setup_dialogc                   t   ^  \ rS rSrSrS0 SSS.S jrSS jrS rSS	 jrS
 r	SS jr
SS jrU 4S jrSrU =r$ )Query!   zgBase class for getting verified answer from a user.

For this base class, accept any non-blank string.
 Ftext0
used_names_htest_utestc                :   Xl         X0l        X@l        XPl        [        R
                  " X5        U R                  5         U R                  U5        U R                  U5        U(       d  U R                  5         [        U 5        U R                  S:X  a  U R                  SU R                  5        U R                  SU R                  5        U R                  SU R                  5        U R                  SU R                  5        U R                  SU R                  5        U R!                  5         U R#                  5         U R%                  SUR'                  5       UR)                  5       S-  U R+                  5       S-  -
  -   UR-                  5       U(       d'  UR/                  5       S-  U R1                  5       S-  -
  OS	-   4-  5        U R3                  S
S
S9  U(       d;  U R5                  5         U R6                  R9                  5         U R;                  5         gg)a  Create modal popup, return when destroyed.

Additional subclass init must be done before this unless
_utest=True is passed to suppress wait_window().

title - string, title of popup dialog
message - string, informational message to display
text0 - initial value for entry
used_names - names already in use
_htest - bool, change box location when running htest
_utest - bool, leave window hidden and not modal
aquaz<Command-.>z<Key-Escape>WM_DELETE_WINDOWz<Key-Return>z
<KP_Enter>z+%d+%d      F)heightwidthN)parentmessager   r   r   __init__withdrawtitle	transientgrab_setr   _windowingsystembindcancelprotocolokcreate_widgetsupdate_idletasksgeometrywinfo_rootxwinfo_widthwinfo_reqwidthwinfo_rootywinfo_heightwinfo_reqheight	resizable	deiconifyentry	focus_setwait_window)selfr#   r'   r$   r   r   r   r   s           $/usr/lib/python3.13/idlelib/query.pyr%   Query.__init__&   s    
$$'

5vMMOd  F*IImT[[1		.$++.($++6		.$''*		,(&&('')!+d.A.A.CA.EEG&&(! ))+A-0D0D0Fq0HH'*, 	 	e51NNJJ  "     c           	      .   [        U SS9=U l        nUR                  SSSS9  UR                  SSS9  [	        USS	U R
                  S
9n[        X R                  5      U l        [        USU R                  S9U l
        [        SSU R                  S9U l        [	        USSU R                  S9U l        UR                  SSSS[        S9  U R                  R                  SSSS[        [         -   SS/S9  U R                  R                  SSSS[        [         -   S9  U R#                  5         [%        X!SU R&                  S9U l        [%        USU R*                  S9U l        U R(                  R                  SSSS9  U R,                  R                  SSSS9  g)zpCreate entry (rows, extras, buttons.

Entry stuff on rows 0-2, spanning cols 0-2.
Buttons on row 99, cols 1, 2.

   )paddingr   news)columnrowsticky   )weightwleftanchorjustifytext   )r"   textvariableTkCaptionFontT)nameexistsroot redrO   
foregroundfont      rE   rF   
columnspanpadxrG   rE   rF   r^   r_   rG   padyr   active)rO   defaultcommandCancel)rO   rd   c   )rE   rF   r_   N)r   framegridgrid_columnconfigurer   r$   r   r   entryvarr   r:   r   r#   
error_fontentry_errorr   r	   create_extrar   r.   	button_okr,   button_cancel)r=   ok_textrg   
entrylabels       r>   r/   Query.create_widgetsY   s    #444
U

!6
2""1Q"/5f $.
!$

35G
O&*> SU&*oo7 	qaAAaH

qaAAac V 	 	%QA!!%&qS 	 	* 	XtwwH#Hdkk; 	1"15qbq9r@   c                     g N )r=   s    r>   rm   Query.create_extra}   s    Dr@   c                 :    SU-   U=(       d    U R                   S'   g )NzERROR: rO   )rl   )r=   r$   widgets      r>   	showerrorQuery.showerror   s    /87/B	#4##V,r@   c                     U R                   R                  5       R                  5       nU(       d  U R                  S5        gU$ )zReturn non-blank entry or None.zblank line.N)r:   getstripry   )r=   r:   s     r>   entry_okQuery.entry_ok   s2    

 &&(NN=)r@   c                     SU R                   S'   U R                  5       nUb  X l        U R                  5         gU R                  R                  5         g)zIf entry is valid, bind it to 'result' and destroy tk widget.

Otherwise leave dialog open for user to correct entry or cancel.
r   rO   N)rl   r~   resultdestroyr:   r;   )r=   eventr:   s      r>   r.   Query.ok   sE    
 $& KLLN JJ  "r@   c                 2    SU l         U R                  5         g)z0Set dialog result to None and destroy tk widget.N)r   r   )r=   r   s     r>   r,   Query.cancel   s    r@   c                 B   > U R                  5         [        TU ]	  5         g rt   )grab_releasesuperr   )r=   	__class__s    r>   r   Query.destroy   s    r@   )ro   rn   r:   rl   rj   rk   rg   r$   r#   r   r   r   )OKrt   )__name__
__module____qualname____firstlineno____doc__r%   r/   rm   ry   r~   r.   r,   r   __static_attributes____classcell__r   s   @r>   r   r   !   sD     9;re1f":H !C#
 r@   r   c                   <   ^  \ rS rSrSrSSS.U 4S jjrS rSrU =r$ )SectionName   z*Get a name for a config file section name.Fr   r   c          	      $   > [         TU ]  XX4XVS9  g )N)r   r   r   r   r%   )r=   r#   r'   r$   r   r   r   r   s          r>   r%   SectionName.__init__   s     & 	 	7r@   c                    U R                   R                  5       R                  5       nU(       d  U R                  S5        g[	        U5      S:  a  U R                  S5        gXR
                  ;   a  U R                  S5        gU$ )z2Return sensible ConfigParser section name or None.no name specified.NrP   z"name is longer than 30 characters.zname is already in use.)r:   r|   r}   ry   lenr   )r=   rS   s     r>   r~   SectionName.entry_ok   sh    zz~~%%'NN/0Yr\NN?@__$NN45r@   ru   	r   r   r   r   r   r%   r~   r   r   r   s   @r>   r   r      s!    0 !7 7
 r@   r   c                   <   ^  \ rS rSrSrSSS.U 4S jjrS rSrU =r$ )
ModuleName   z-Get a module name for Open Module menu entry.Fr   c          	      $   > [         TU ]  XX4XVS9  g )Nr   r   r   r   )r=   r#   r'   r$   r   r   r   r   s          r>   r%   ModuleName.__init__   s    $ 	 	5r@   c                    U R                   R                  5       R                  5       nU(       d  U R                  S5        g [        R
                  R                  U5      nUc  U R                  S5        g[        UR                  [        R                  R                  5      (       d  U R                  S5        g UR                  R                  U5      nU$ ! [        [        4 a$  nU R                  [        U5      5         SnAgSnAff = f! [         a    U R                  S5         g[         aA     UR                  R                  5       n U$ ! [          a    U R                  S5          gf = ff = f)z0Return entered module name as file path or None.r   Nzmodule not found.znot a source-based module.z%loader does not support get_filename.zloader failed to get filename.)r:   r|   r}   ry   	importlibutil	find_spec
ValueErrorImportErrorstr
isinstanceloaderabcSourceLoaderget_filenameAttributeError	TypeError)r=   rS   specmsg	file_paths        r>   r~   ModuleName.entry_ok   s<   zz~~%%'NN/0	>>++D1D <NN./$++y}}'A'ABBNN78	006I + K( 	NN3s8$	  	NNBC 	 KK446	   ?@		sH   C =D D*D		DE8.	E88EE40E83E44E8ru   r   r   s   @r>   r   r      s!    3 !5 5
 r@   r   c                       \ rS rSrSrS rSrg)Goto   z1Get a positive line number for editor Go To Line.c                      [        U R                  R                  5       5      nUS::  a  U R	                  S5        g U$ ! [         a    U R	                  S5         g f = f)Nznot a base 10 integer.r   znot a positive integer.)intr:   r|   r   ry   )r=   linenos     r>   r~   Goto.entry_ok   s[    	)*F Q;NN45  	NN34	s   #? AAru   N)r   r   r   r   r   r~   r   ru   r@   r>   r   r      s
    7	r@   r   c                   r   ^  \ rS rSrSrSS0 SSS.U 4S jjrS rS rS	 r\	R                  rS
 rS r
SrU =r$ )
HelpSource   z,Get menu name and help source for Help menu.r   F)menuitemfilepathr   r   r   c          
      6   > X@l         Sn[        T	U ]	  XXXVUS9  g)zGet menu entry and url/local file for Additional Help.

User enters a name for the Help resource and a web url or file
name. The user can browse for the file.
zName for item on Help menu:r   N)r   r   r%   )
r=   r#   r'   r   r   r   r   r   r$   r   s
            r>   r%   HelpSource.__init__   s,     !/w%V 	 	Er@   c           	         U R                   n[        USSSS9n[        X R                  5      U l        [        XR                  SS9U l        [        USSU R                  S	9n[        US
SU R                  S9U l
        UR                  SSSSSS/[        S9  U R                  R                  SSSS[        [        -   SS/S9  UR                  SSS[        [        -   S9  U R                  R                  SSSS[        [        -   S9  g)zAdd path widjets to rows 10-12.rJ   rK   z,Help File Path: Enter URL or browse for filerL   (   )rQ   r"   Browse   )rO   r"   rd   rV   rW   rX   r   rB   r[   r\   )rE   rF   r^   r_   ra   rG      r   r`   )rE   rF   r_   rG      r]   N)rg   r   r   r   pathvarr   pathr   browse_filerk   
path_errorrh   r   r	   r
   )r=   rg   	pathlabelbrowses       r>   rm   HelpSource.create_extra  s    

%VMO	 }}5%ll"E	HA $ 0 02CE%)__6 	aRAARF 	 	!		aRAAacF 	 	$1"1QqS9A2!!$%aC 	 	)r@   c                 D    [         R                  " XS9R                  X#S9$ )N)r#   	filetypes)
initialdirinitialfile)r   Openshow)r=   r   initdirinitfiles       r>   askfilenameHelpSource.askfilename  s!     d@>	?r@   c                 :   / SQnU R                   R                  5       nU(       a"  [        R                  R	                  U5      u  p4OS n[
        S S S:X  a{  [        R                  R                  [        R                  R                  [        5      S5      n[        R                  R                  U5      (       d  [        R                  " 5       nO[        R                  " 5       nU R                  XU5      nU(       a  U R                   R                  U5        g g )N))z
HTML Filesz*.htm *.htmlTEXT)z	PDF Filesz*.pdfr   )zWindows Help Filesz*.chm)z
Text Filesz*.txtr   )z	All Files*r[   winDoc)r   r|   osr   splitr   joindirnamer   isdirgetcwdr   set)r=   r   r   dirbasefiles         r>   r   HelpSource.browse_file!  s     	 ||!d+ICD|u$ggll277??:#>Fww}}S))))+Ciik	5LLT" r@   c                    U R                   R                  5       R                  5       nU(       d  U R                  SU R                  5        gUR                  S5      (       d^  USS S:X  a  USS n[        R                   R                  U5      (       d  U R                  SU R                  5        g[        S:X  a  SU-   nU$ )	z(Simple validity check for menu file pathzno help file path specified.N)zwww.httpr\   zfile:zhelp file path does not exist.darwinzfile://)	r   r|   r}   ry   r   
startswithr   rT   r   )r=   r   s     r>   path_okHelpSource.path_ok9  s    yy}}$$&NN94??K!122BQx7"ABx77>>$''?#08#!D(r@   c                 v    SU R                   S'   U R                  5       nU R                  5       nUb  Uc  S$ X4$ )z,Return apparently valid (name, path) or Noner   rO   N)r   item_okr   )r=   rS   r   s      r>   r~   HelpSource.entry_okJ  s;    "$||~||~|t|tE$Er@   )r   r   r   r   )r   r   r   r   r   r%   rm   r   r   r   r~   r   r   r   r   r   s   @r>   r   r      sM    2 35ruUE E)(?#, ""G"F Fr@   r   c                   J   ^  \ rS rSrSr/ SSS.U 4S jjrS rS rS rS	r	U =r
$ )
	CustomRuniQ  zzGet settings for custom run of module.

1. Command line arguments to extend sys.argv.
2. Whether to restart Shell or not.
F)cli_argsr   r   c          	      (   > Sn[         TU ]  XXcXES9  g)zcli_args is a list of strings.

The list is assigned to the default Entry StringVar.
The strings are displayed joined by ' ' for display.
z$Command Line Arguments for sys.argv:r   Nr   )r=   r#   r'   r   r   r   r$   r   s          r>   r%   CustomRun.__init__Y  s$     9w 	 	.r@   c                     U R                   n[        U SS9U l        [        XR                  SSSS9n[	        USSU R
                  S9U l        UR                  S	S
SSSS9  U R                  R                  S	SSSSS9  g)zAdd run mode on rows 10-12.T)valueFzRestart shell)variableonvalueoffvaluerO   rV   rW   rX   r   rB   r[   r\   rJ   r]   r   weN)rg   r   
restartvarr   r   rk   
args_errorrh   )r=   rg   restarts      r>   rm   CustomRun.create_extrae  s    

$T6eoot',?DCE%)__6 	A2!!CHA2!!$( 	 	*r@   c                     U R                   R                  5       R                  5       n [        R                  " USS9nU$ ! [
         a$  nU R                  [        U5      5         SnAgSnAff = f)z.Return command line arg list or None if error.T)posixN)r:   r|   r}   shlexr   r   ry   r   )r=   
cli_stringr   errs       r>   cli_args_okCustomRun.cli_args_okr  s\    ZZ^^%++-
	{{:T:H   	NN3s8$	s   A 
A/A**A/c                 f    U R                  5       nU R                  R                  5       nUc  S$ X4$ )z4Return apparently valid (cli_args, restart) or None.N)r  r  r|   )r=   r   r  s      r>   r~   CustomRun.entry_ok|  s5    ##%//%%''t@h-@@r@   )r  r  )r   r   r   r   r   r%   rm   r  r~   r   r   r   s   @r>   r   r   Q  s2     35e
. 
.*A Ar@   r   __main__)mainzidlelib.idle_test.test_queryr   F)	verbosityexit)run)&r   importlib.utilr   importlib.abcr   r  sysr   r   tkinterr   r   r   r   r	   r
   tkinter.ttkr   r   r   r   r   r   tkinter.fontr   tkinter.simpledialogr   r   r   r   r   r   r   r   unittestr  idlelib.idle_test.htestr  ru   r@   r>   <module>r     s   * % 	  $ < < @ @   .H D% 0' 'T5  ZF ZFx/A /Ad z	'15A+z9% r@   