
    "e:                     j   d Z ddlZddlZddlZddlZddlmZmZ ddl	m
Z
mZmZmZmZmZ ddlmZmZmZmZmZ ddl	mZ ddlmZ ddlmZ  G d	 d
e
      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z e!dk(  r"ddl"m#Z#  e#ddd       ddl$m%Z%  e%eee        yy)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                   `     e Zd ZdZdi ddddZddZd ZddZd	 Zdd
Z	ddZ
 fdZ xZS )QueryzoBase class for getting verified answer from a user.

    For this base class, accept any non-blank string.
     Ftext0
used_names_htest_utestc                (   || _         || _        || _        || _        t	        j
                  | |       | j                          | j                  |       | j                  |       |s| j                          t        |        | j                  dk(  r| j                  d| j                         | j                  d| j                         | j                  d| j                         | j                  d| j                         | j                  d| j                         | j!                          | j#                          | j%                  d|j'                         |j)                         dz  | j+                         dz  z
  z   |j-                         |s'|j/                         dz  | j1                         dz  z
  nd	z   fz         | j3                  d
d
       |s;| j5                          | j6                  j9                          | j;                          yy)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           lib/python3.12/idlelib/query.pyr$   z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           	         t        | d      x| _        }|j                  ddd       |j                  dd       t	        |dd	| j
                  
      }t        | | j                        | _        t        |d| j                        | _
        t        dd| j                        | _        t	        |dd| j                        | _        |j                  ddddt               | j                  j                  ddddt        t         z   ddg       | j                  j                  ddddt        t         z          | j#                          t%        ||d| j&                        | _        t%        |d| j*                        | _        | j(                  j                  ddd       | j,                  j                  ddd       y)zCreate 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rM   
foregroundfont      rC   rD   
columnspanpadxrE   rC   rD   r\   r]   rE   padyr   active)rM   defaultcommandCancel)rM   rb   c   )rC   rD   r]   N)r   framegridgrid_columnconfigurer   r#   r   r   entryvarr   r9   r   r"   
error_fontentry_errorr   r	   create_extrar   r-   	button_okr+   button_cancel)r<   ok_textre   
entrylabels       r=   r.   z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 	 	* 	GXtwwH#Hdkk; 	1"15qbq9r>   c                      y N )r<   s    r=   rk   zQuery.create_extra}   s    r>   c                 0    d|z   |xs | j                   d<   y )NzERROR: rM   )rj   )r<   r#   widgets      r=   	showerrorzQuery.showerror   s    /87/B	#4##V,r>   c                 ~    | j                   j                         j                         }|s| j                  d       y|S )zReturn non-blank entry or None.zblank line.N)r9   getstripru   )r<   r9   s     r=   entry_okzQuery.entry_ok   s2    

 &&(NN=)r>   c                     d| j                   d<   | j                         }||| _        | j                          y| j                  j                          y)zIf entry is valid, bind it to 'result' and destroy tk widget.

        Otherwise leave dialog open for user to correct entry or cancel.
        r   rM   N)rj   ry   resultdestroyr9   r:   )r<   eventr9   s      r=   r-   zQuery.ok   sG    
 $& DKLLN JJ  "r>   c                 2    d| _         | j                          y)z0Set dialog result to None and destroy tk widget.N)r{   r|   )r<   r}   s     r=   r+   zQuery.cancel   s    r>   c                 B    | j                          t        | 	          y rq   )grab_releasesuperr|   )r<   	__class__s    r=   r|   zQuery.destroy   s    r>   )OKrq   )__name__
__module____qualname____doc__r$   r.   rk   ru   ry   r-   r+   r|   __classcell__r   s   @r=   r   r   !   sD     9;re1f":H !C#
 r>   r   c                   0     e Zd ZdZddd fd
Zd Z xZS )SectionNamez*Get a name for a config file section name.Fr   r   c                0    t         |   ||||||       y )N)r   r   r   r   r$   )r<   r"   r&   r#   r   r   r   r   s          r=   r$   zSectionName.__init__   s"    J &v 	 	7r>   c                     | j                   j                         j                         }|s| j                  d       yt	        |      dkD  r| j                  d       y|| j
                  v r| j                  d       y|S )z2Return sensible ConfigParser section name or None.no name specified.NrN   z"name is longer than 30 characters.zname is already in use.)r9   rw   rx   ru   lenr   )r<   rQ   s     r=   ry   zSectionName.entry_ok   sj    zz~~%%'NN/0Yr\NN?@T__$NN45r>   r   r   r   r   r$   ry   r   r   s   @r=   r   r      s    0 !7
r>   r   c                   0     e Zd ZdZddd fd
Zd Z xZS )
ModuleNamez-Get a module name for Open Module menu entry.Fr   c                0    t         |   ||||||       y )Nr   r   r   r   )r<   r"   r&   r#   r   r   r   r   s          r=   r$   zModuleName.__init__   s"    u$V 	 	5r>   c                    | j                   j                         j                         }|s| j                  d       y	 t        j
                  j                  |      }|| j                  d       yt        |j                  t        j                  j                        s| j                  d       y	 |j                  j                  |      }|S # t        t        f$ r$}| j                  t        |             Y d}~yd}~ww xY w# t        $ r | j                  d       Y yt        $ r@ 	 |j                  j                         }Y |S # t         $ r | j                  d       Y Y yw xY ww xY w)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.)r9   rw   rx   ru   	importlibutil	find_spec
ValueErrorImportErrorstr
isinstanceloaderabcSourceLoaderget_filenameAttributeError	TypeError)r<   rQ   specmsg	file_paths        r=   ry   zModuleName.entry_ok   s9   zz~~%%'NN/0	>>++D1D <NN./$++y}}'A'ABNN78	006I + K( 	NN3s8$	  	NNBC 	 KK446	   ?@		sG   C 2D DC==DE)!E)*EE%!E)$E%%E)r   r   s   @r=   r   r      s    3 !5
r>   r   c                       e Zd ZdZd Zy)Gotoz1Get a positive line number for editor Go To Line.c                     	 t        | j                  j                               }|dk  r| j	                  d       y |S # t        $ r | j	                  d       Y y w xY w)Nznot a base 10 integer.r   znot a positive integer.)intr9   rw   r   ru   )r<   linenos     r=   ry   zGoto.entry_ok   s[    	)*F Q;NN45  	NN34	s   #> AAN)r   r   r   r   ry   rr   r>   r=   r   r      s
    7	r>   r   c                   f     e Zd ZdZddi ddd fd
Zd Zd Zd Zej                  Z
d	 Zd
 Z	 xZS )
HelpSourcez,Get menu name and help source for Help menu.r   F)menuitemfilepathr   r   r   c          	      D    || _         d}t        	| 	  |||||||       y)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$   zHelpSource.__init__   s4     !/wh%fV 	 	Er>   c           	      D   | j                   }t        |ddd      }t        | | j                        | _        t        || j                  d      | _        t        |dd| j                  	      }t        |d
d| j                        | _
        |j                  ddddddgt               | j                  j                  ddddt        t        z   ddg       |j                  dddt        t        z          | j                  j                  ddddt        t        z          y)zAdd path widjets to rows 10-12.rH   rI   z,Help File Path: Enter URL or browse for filerJ   (   )rO   r!   Browse   )rM   r!   rb   rT   rU   rV   r   r@   rY   rZ   )rC   rD   r\   r]   r_   rE      r   r^   )rC   rD   r]   rE      r[   N)re   r   r   r   pathvarr   pathr   browse_fileri   
path_errorrf   r   r	   r
   )r<   re   	pathlabelbrowses       r=   rk   zHelpSource.create_extra  s   

%VMO	 t}}5%dll"E	HA $ 0 02CE%)__6 	aRAARF 	 	!		aRAAacF 	 	$1"1QqS9A2!!$%aC 	 	)r>   c                 R    t        j                  | |      j                  ||      S )N)r"   	filetypes)
initialdirinitialfile)r   Openshow)r<   r   initdirinitfiles       r=   askfilenamezHelpSource.askfilename  s%     di@X>	?r>   c                    g d}| j                   j                         }|r#t        j                  j	                  |      \  }}nd }t
        d d dk(  rut        j                  j                  t        j                  j                  t              d      }t        j                  j                  |      s)t        j                         }nt        j                         }| j                  |||      }|r| j                   j                  |       y y )N))z
HTML Filesz*.htm *.htmlTEXT)z	PDF Filesz*.pdfr   )zWindows Help Filesz*.chm)z
Text Filesz*.txtr   )z	All Files*rY   winDoc)r   rw   osr   splitr   joindirnamer   isdirgetcwdr   set)r<   r   r   dirbasefiles         r=   r   zHelpSource.browse_file!  s     	 ||!d+ICD|u$ggll277??:#>Fww}}S)))+Ciik	35LLT" r>   c                 d   | j                   j                         j                         }|s| j                  d| j                         y|j                  d      sW|dd dk(  r|dd }t        j                   j                  |      s| j                  d| j                         yt        dk(  rd|z   }|S )	z(Simple validity check for menu file pathzno help file path specified.N)zwww.httprZ   zfile:zhelp file path does not exist.darwinzfile://)	r   rw   rx   ru   r   
startswithr   rR   r   )r<   r   s     r=   path_okzHelpSource.path_ok9  s    yy}}$$&NN94??K!12BQx7"ABx77>>$'?#08#!D(r>   c                 t    d| j                   d<   | j                         }| j                         }||dS ||fS )z,Return apparently valid (name, path) or Noner   rM   N)r   item_okr   )r<   rQ   r   s      r=   ry   zHelpSource.entry_okJ  s=    "$||~||~|t|tE$Er>   )r   r   r   r   r$   rk   r   r   r   ry   r   r   r   r   s   @r=   r   r      sA    2 35ruUE)(?#, ""G"Fr>   r   c                   >     e Zd ZdZg ddd fd
Zd Zd Zd Z xZS )	CustomRunzGet 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                4    d}t         |   ||||||       y)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$   zCustomRun.__init__Y  s*     9whf 	 	.r>   c                    | j                   }t        | d      | _        t        || j                  ddd      }t	        |dd| j
                        | _        |j                  d	d
ddd       | j                  j                  d	dddd       y)zAdd run mode on rows 10-12.T)valueFzRestart shell)variableonvalueoffvaluerM   rT   rU   rV   r   r@   rY   rZ   rH   r[   r   weN)re   r   
restartvarr   r   ri   
args_errorrf   )r<   re   restarts      r=   rk   zCustomRun.create_extrae  s    

$T6edoot',?DCE%)__6 	A2!!CHA2!!$( 	 	*r>   c                     | j                   j                         j                         }	 t        j                  |d      }|S # t
        $ r$}| j                  t        |             Y d}~yd}~ww xY w)z.Return command line arg list or None if error.T)posixN)r9   rw   rx   shlexr   r   ru   r   )r<   
cli_stringr   errs       r=   cli_args_okzCustomRun.cli_args_okr  s\    ZZ^^%++-
	{{:T:H   	NN3s8$	s   A 	A0A++A0c                 f    | j                         }| j                  j                         }|dS ||fS )z4Return apparently valid (cli_args, restart) or None.N)r   r   rw   )r<   r   r   s      r=   ry   zCustomRun.entry_ok|  s7    ##%//%%''t@h-@@r>   )	r   r   r   r   r$   rk   r   ry   r   r   s   @r=   r   r   Q  s'     35e
.*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   rr   r>   r=   <module>r      s   * % 	  $ < < @ @   .H D% 0' 'T5  ZF ZFx/A /Ad z	'15A+z9% r>   