B
    f³]Ý8  ã               @   s  d 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 G dd	„ d	eƒZG d
d„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZedkrddlmZ edddd ddlm Z  e eeeƒ dS )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)ÚFontc                   sl   e Zd ZdZdi dddœdd„Zddd	„Zd
d„ Zddd„Zdd„ Zddd„Z	ddd„Z
‡ fdd„Z‡  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      	      C   sX  || _ || _|| _|| _t | |¡ |  ¡  |  |¡ |  |¡ |  	¡  | j
 dd¡}|dkr”y| j
 dd| jdd¡ W n   Y nX |  d| j¡ |  d	| j¡ |  d
| j¡ |  d| j¡ |  d| j¡ |  ¡  |  ¡  |  d| ¡ | ¡ d |  ¡ d   | ¡ |s$| ¡ d |  ¡ d  nd f ¡ | jddd |sT|  ¡  |  ¡  dS )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
        ÚtkÚwindowingsystemZaquaz!::tk::unsupported::MacWindowStyleZstyleZmoveableModalr   z<Command-.>z<Key-Escape>ZWM_DELETE_WINDOWz<Key-Return>z
<KP_Enter>z+%d+%dé   é–   F)ZheightÚwidthN)ÚparentÚmessager   r   r   Ú__init__ZwithdrawÚtitleZ	transientZgrab_setr   ZcallZ_wZbindÚcancelZprotocolÚokÚcreate_widgetsZupdate_idletasksZgeometryZwinfo_rootxZwinfo_widthZwinfo_reqwidthZwinfo_rootyZwinfo_heightZwinfo_reqheightZ	resizableZ	deiconifyZwait_window)	Úselfr   r   r   r   r   r   r   r   © r$   úlib/python3.7/idlelib/query.pyr   %   sB    


*zQuery.__init__ÚOKc             C   s6  t | dd | _}|jdddd |jddd t|dd	| jd
}t| | jƒ| _t	|d| jd| _
| j
 ¡  tdd| jd| _t|dd| jd| _|jddddtd | j
jddddtt ddgd | jjddddtt d |  ¡  t||d| jd| _t|d| jd| _| jjdddd | jjdddd dS )zˆCreate entry (rows, extras, buttons.

        Entry stuff on rows 0-2, spanning cols 0-2.
        Buttons on row 99, cols 1, 2.
        é
   )Zpaddingr   Znews)ÚcolumnÚrowÚstickyé   )ZweightÚwÚleft)ÚanchorÚjustifyÚtexté   )r   ÚtextvariableZTkCaptionFontT)ÚnameÚexistsÚrootú Úred)r0   Ú
foregroundÚfonté   é   )r(   r)   Ú
columnspanÚpadxr*   )r(   r)   r<   r=   r*   Úpadyr   Zactive)r0   ÚdefaultÚcommandZCancel)r0   r@   éc   )r(   r)   r=   N)r
   ÚframeÚgridZgrid_columnconfigurer   r   r   r   Zentryvarr   ÚentryÚ	focus_setr   r   Ú
error_fontÚentry_errorr   r   Úcreate_extrar   r!   Z	button_okr    Zbutton_cancel)r#   Zok_textrB   Z
entrylabelr$   r$   r%   r"   [   s0    

zQuery.create_widgetsc             C   s   d S )Nr$   )r#   r$   r$   r%   rH      ó    zQuery.create_extraNc             C   s   d| |p| j d< d S )NzERROR: r0   )rG   )r#   r   Zwidgetr$   r$   r%   Ú	showerror   s    zQuery.showerrorc             C   s.   d| j d< | j ¡  ¡ }|s*|  d¡ dS |S )zReturn non-blank entry or None.r   r0   zblank line.N)rG   rD   ÚgetÚstriprJ   )r#   rD   r$   r$   r%   Úentry_ok…   s    

zQuery.entry_okc             C   s.   |   ¡ }|dk	r || _|  ¡  n
| j ¡  dS )zIf entry is valid, bind it to 'result' and destroy tk widget.

        Otherwise leave dialog open for user to correct entry or cancel.
        N)rM   ÚresultÚdestroyrD   rE   )r#   ÚeventrD   r$   r$   r%   r!   Ž   s
    
zQuery.okc             C   s   d| _ |  ¡  dS )z0Set dialog result to None and destroy tk widget.N)rN   rO   )r#   rP   r$   r$   r%   r    ›   s    zQuery.cancelc                s   |   ¡  tƒ  ¡  d S )N)Zgrab_releaseÚsuperrO   )r#   )Ú	__class__r$   r%   rO       s    zQuery.destroy)r&   )N)N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   rH   rJ   rM   r!   r    rO   Ú__classcell__r$   r$   )rR   r%   r       s   5
$
	

r   c                   s0   e Zd ZdZdddœ‡ fdd„
Zdd„ Z‡  ZS )ÚSectionNamez*Get a name for a config file section name.F)r   r   c               s   t ƒ j||||||d d S )N)r   r   r   )rQ   r   )r#   r   r   r   r   r   r   )rR   r$   r%   r   ©   s    zSectionName.__init__c             C   s`   d| j d< | j ¡  ¡ }|s*|  d¡ dS t|ƒdkrD|  d¡ dS || jkr\|  d¡ dS |S )z2Return sensible ConfigParser section name or None.r   r0   zno name specified.Nr1   z"name is longer than 30 characters.zname is already in use.)rG   rD   rK   rL   rJ   Úlenr   )r#   r3   r$   r$   r%   rM   ®   s    




zSectionName.entry_ok)rS   rT   rU   rV   r   rM   rW   r$   r$   )rR   r%   rX   ¥   s   rX   c                   s0   e Zd ZdZdddœ‡ fdd„
Zdd„ Z‡  ZS )Ú
ModuleNamez-Get a module name for Open Module menu entry.F)r   r   c               s   t ƒ j||||||d d S )N)r   r   r   )rQ   r   )r#   r   r   r   r   r   r   )rR   r$   r%   r   Â   s    zModuleName.__init__c          
   C   sÜ   d| j d< | j ¡  ¡ }|s*|  d¡ dS ytj |¡}W n4 tt	fk
rn } z|  t
|ƒ¡ dS d}~X Y nX |dkr†|  d¡ dS t|jtjjƒs¤|  d¡ dS y|j |¡}W n" tk
rÖ   | jd| d dS X |S )	z0Return entered module name as file path or None.r   r0   zno name specified.Nzmodule not foundznot a source-based modulez$loader does not support get_filename)r   )rG   rD   rK   rL   rJ   Ú	importlibÚutilÚ	find_specÚ
ValueErrorÚImportErrorÚstrÚ
isinstanceÚloaderÚabcÚSourceLoaderÚget_filenameÚAttributeError)r#   r3   ÚspecÚmsgZ	file_pathr$   r$   r%   rM   Ç   s.    



zModuleName.entry_ok)rS   rT   rU   rV   r   rM   rW   r$   r$   )rR   r%   rZ   ¾   s   rZ   c                   s\   e Zd ZdZddi dddœ‡ fdd„
Zdd„ Zd	d
„ Zdd„ Zej	Z
dd„ Zdd„ Z	‡  ZS )Ú
HelpSourcez,Get menu name and help source for Help menu.r   F)ÚmenuitemÚfilepathr   r   r   c      	   	      s(   || _ d}tƒ j|||||||d dS )z·Get 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   r   r   r   N)rk   rQ   r   )	r#   r   r   rj   rk   r   r   r   r   )rR   r$   r%   r   ç   s
    zHelpSource.__init__c             C   sÊ   | j }t|dddd}t| | jƒ| _t|| jdd| _t|dd| jd	}t|d
d| j	d| _
|jddddddgtd | jjddddtt ddgd |jdddtt d | j
jddddtt d dS )zAdd path widjets to rows 10-12.r,   r-   z,Help File Path: Enter URL or browse for file)r.   r/   r0   é(   )r2   r   ZBrowseé   )r0   r   r@   r6   r7   )r0   r8   r9   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*   N)rB   r   r   rk   Úpathvarr   Úpathr   Úbrowse_filerF   Ú
path_errorrC   r   r   r	   )r#   rB   Z	pathlabelZbrowser$   r$   r%   rH   ô   s     
zHelpSource.create_extrac             C   s   t j| |dj||dS )N)r   Ú	filetypes)Z
initialdirZinitialfile)r   ZOpenZshow)r#   rt   ZinitdirZinitfiler$   r$   r%   Úaskfilename  s    zHelpSource.askfilenamec             C   s˜   dddddg}| j  ¡ }|r.tj |¡\}}nHd }td d… dkrntj tj t¡d¡}tj 	|¡svt 
¡ }nt 
¡ }|  |||¡}|r”| j  |¡ d S )	N)z
HTML Filesz*.htm *.htmlÚTEXT)z	PDF Filesz*.pdfrv   )zWindows Help Filesz*.chm)z
Text Filesz*.txtrv   )z	All FilesÚ*r:   ÚwinZDoc)rp   rK   Úosrq   Úsplitr   ÚjoinÚdirnamer   ÚisdirÚgetcwdru   Úset)r#   rt   rq   ÚdirÚbaseÚfiler$   r$   r%   rr     s"    

zHelpSource.browse_filec             C   s|   | j  ¡  ¡ }|s$|  d| j¡ dS | d¡sx|dd… dkrJ|dd… }tj  |¡sh|  d| j¡ dS tdkrxd| }|S )	z(Simple validity check for menu file pathzno help file path specified.N)zwww.Zhttpr;   zfile:zhelp file path does not exist.Údarwinzfile://)	rq   rK   rL   rJ   rs   Ú
startswithry   r4   r   )r#   rq   r$   r$   r%   Úpath_ok'  s    
zHelpSource.path_okc             C   s@   d| j d< d| jd< |  ¡ }|  ¡ }|dks4|dkr8dS ||fS )z,Return apparently valid (name, path) or Noner   r0   N)rG   rs   Úitem_okr…   )r#   r3   rq   r$   r$   r%   rM   8  s
    

zHelpSource.entry_ok)rS   rT   rU   rV   r   rH   ru   rr   rX   rM   r†   r…   rW   r$   r$   )rR   r%   ri   ã   s   ri   c                   sB   e Zd ZdZg dddœ‡ fdd„
Zdd„ Zdd	„ Zd
d„ Z‡  ZS )Ú	CustomRunz†Get 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    d}t ƒ j||||||d dS )z¢cli_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   r   r   N)rQ   r   )r#   r   r   rˆ   r   r   r   )rR   r$   r%   r   H  s    zCustomRun.__init__c             C   sj   | j }t| dd| _t|| jdddd}t|dd| jd| _|jd	d
dddd | jjd	ddddd dS )zAdd run mode on rows 10-12.T)ÚvalueFzRestart shell)ZvariableZonvalueZoffvaluer0   r6   r7   )r0   r8   r9   r   r'   r:   r;   r,   )r(   r)   r<   r=   r*   ro   ZweN)rB   r   Ú
restartvarr   r   rF   Z
args_errorrC   )r#   rB   Úrestartr$   r$   r%   rH   T  s    

zCustomRun.create_extrac          
   C   sV   | j  ¡  ¡ }ytj|dd}W n0 tk
rP } z|  t|ƒ¡ dS d}~X Y nX |S )z6Validity check and parsing for command line arguments.T)ÚposixN)rD   rK   rL   Úshlexrz   r^   rJ   r`   )r#   Z
cli_stringrˆ   Úerrr$   r$   r%   Úcli_args_oka  s    zCustomRun.cli_args_okc             C   s0   d| j d< |  ¡ }| j ¡ }|dkr(dS ||fS )z3Return apparently valid (cli_args, restart) or Noner   r0   N)rG   r   rŠ   rK   )r#   rˆ   r‹   r$   r$   r%   rM   k  s    

zCustomRun.entry_ok)	rS   rT   rU   rV   r   rH   r   rM   rW   r$   r$   )rR   r%   r‡   @  s   
r‡   Ú__main__)Úmainzidlelib.idle_test.test_queryr   F)Ú	verbosityÚexit)Úrun)!rV   r[   ry   r   Úsysr   r   Ztkinterr   r   r   r   r   r	   Ztkinter.ttkr
   r   r   r   r   r   Ztkinter.fontr   r   rX   rZ   ri   r‡   rS   Zunittestr‘   Zidlelib.idle_test.htestr”   r$   r$   r$   r%   Ú<module>   s&     %]3
