U
    ¿|ct=  ã                   @   sÐ   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlZd dlmZ dZejdkr|dZnd	ZG d
d„ dƒZdd„ ZedkrÌd dlmZ edddd d dlmZ eeƒ dS )é    N)Ú
filedialog)Ú
messagebox)Ú	askstring)ÚidleConfúutf-8Zwin32ÚsurrogatepassÚsurrogateescapec                   @   sè   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdZdd„ Z	dZ
dZdd„ Zd1dd„ZejZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ ZdZdZd$Zejd%kr¾d&nd'Zd(d)„ Z d2d+d,„Z!d-d.„ Z"d/d0„ Z#dS )3Ú	IOBindingc                 C   sr   || _ |j| _| j d| j¡| _| j d| j¡| _| j d| j¡| _| j d| j	¡| _
d| _| j d| j¡| _d S )Nú<<open-window-from-file>>ú<<save-window>>ú<<save-window-as-file>>ú<<save-copy-of-window-as-file>>r   ú<<print-window>>)ÚeditwinÚtextÚbindÚopenÚ_IOBinding__id_openÚsaveÚ_IOBinding__id_saveÚsave_asÚ_IOBinding__id_saveasÚsave_a_copyÚ_IOBinding__id_savecopyÚfileencodingÚprint_windowÚ_IOBinding__id_print)Úselfr   © r   úlib/python3.8/idlelib/iomenu.pyÚ__init__   s    ÿÿzIOBinding.__init__c                 C   sf   | j  d| j¡ | j  d| j¡ | j  d| j¡ | j  d| j¡ | j  d| j¡ d | _d | _ d | _d S )Nr
   r   r   r   r   )	r   Zunbindr   r   r   r   r   r   Úfilename_change_hook©r   r   r   r   Úclose(   s    zIOBinding.closec                 C   s
   | j  ¡ S ©N)r   Ú	get_savedr"   r   r   r   r%   4   s    zIOBinding.get_savedc                 C   s   | j  |¡ d S r$   )r   Ú	set_saved©r   Úflagr   r   r   r&   7   s    zIOBinding.set_savedc                 C   s   | j  ¡  d S r$   )r   Ú
reset_undor"   r   r   r   r)   :   s    zIOBinding.reset_undoNc                 C   s
   || _ d S r$   )r!   )r   Úhookr   r   r   Úset_filename_change_hook?   s    z"IOBinding.set_filename_change_hookc                 C   sF   |rt j |¡rd | _|| _n$|| _d | _|  d¡ | jrB|  ¡  d S )Né   )ÚosÚpathÚisdirÚfilenameÚdirnamer&   r!   ©r   r0   r   r   r   Úset_filenameE   s    
zIOBinding.set_filenamec                 C   sÊ   | j j}|rt|s|  ¡ }n|}|r`| j rTt| j dd ƒsT| jsT|  ¡ rT| || j¡ qp| |¡ n| jrp| j 	¡  dS |  ¡ rš|  
¡ }|dkrš| j 	¡  dS |s¨|  ¡ }n|}|r¼|  |¡ n
| j 	¡  dS )NÚinterpÚbreakÚcancel)r   ÚflistÚaskopenfileÚgetattrr0   r%   r   Úloadfiler   Ú	focus_setÚ	maybesave)r   ÚeventZeditFiler7   r0   Úreplyr   r   r   r   P   s<    
ÿþý



zIOBinding.openc           	      C   sº  z z2t  |¡}| ¡ }|j}|j}d}W 5 Q R X W nh ttfk
rœ   | jj 	¡  t
ddd| jjd}t||d}| ¡ }|j}|j}d}W 5 Q R X Y nX W nj tk
rÞ } z tjdt|ƒ| jd	 W Y ¢dS d }~X Y n. tk
r
   tjd
d| | jd	 Y dS X t|tƒs>|d k	r8tjdd| jd	 d}tj}| j dd¡ |  d ¡ || _|| _| j d|¡ |  ¡  |  |¡ |r’|  d¡ | j dd¡ | j d¡ |  |¡ dS )NFzSpecify file encodingzwThe file's encoding is invalid for Python 3.x.
IDLE will convert it to UTF-8.
What is the current encoding of the file?r   )ZinitialvalueÚparent)ÚencodingTú	I/O Error©r?   zDecoding ErrorzFile %s
Failed to DecodezMixed Newlinesz:Mixed newlines detected.
The file will be changed on save.ú1.0ÚendÚinsert)Útokenizer   Úreadr@   ÚnewlinesÚUnicodeDecodeErrorÚSyntaxErrorr   r   Úupdater   ÚOSErrorr   Ú	showerrorÚstrÚ
isinstanceÚshowwarningr-   ÚlinesepÚdeleter3   r   Úeol_conventionrE   r)   r&   Zmark_setZyviewÚupdaterecentfileslist)	r   r0   ÚfÚcharsr   rS   Z	convertedÚencÚerrr   r   r   r:   ~   sd    úþ
ý



zIOBinding.loadfilec                 C   sp   |   ¡ rdS d| jpd }tjd|tj| jd}|rPd}|  d ¡ |   ¡ sbd}n|d kr^d}nd}| j ¡  |S )NZyesz&Do you want to save %s before closing?zthis untitled documentzSave On Close©ÚtitleÚmessageÚdefaultr?   r6   Zno)r%   r0   r   ZaskyesnocancelZYESr   r   r;   )r   r[   Úconfirmr>   r   r   r   r<   ¹   s*    ÿü

zIOBinding.maybesavec                 C   sZ   | j s|  |¡ n:|  | j ¡rL|  d¡ z| j ¡  W n tk
rJ   Y nX | j ¡  dS )NTr5   )	r0   r   Ú	writefiler&   r   Ústore_file_breaksÚAttributeErrorr   r;   ©r   r=   r   r   r   r   Ï   s    

zIOBinding.savec                 C   sf   |   ¡ }|rN|  |¡rN|  |¡ |  d¡ z| j ¡  W n tk
rL   Y nX | j ¡  |  	|¡ dS )Nr,   r5   )
Úasksavefiler^   r3   r&   r   r_   r`   r   r;   rT   ©r   r=   r0   r   r   r   r   Ü   s    




zIOBinding.save_asc                 C   s.   |   ¡ }|r|  |¡ | j ¡  |  |¡ dS )Nr5   )rb   r^   r   r;   rT   rc   r   r   r   r   ê   s    


zIOBinding.save_a_copyc              
   C   s’   |   ¡ }|  |¡}z<t|dƒ&}| |¡ | ¡  t | ¡ ¡ W 5 Q R X W dS  tk
rŒ } z t	j
dt|ƒ| jd W Y ¢dS d }~X Y nX d S )NÚwbTrA   rB   F)ÚfixnewlinesÚencoder   ÚwriteÚflushr-   ÚfsyncÚfilenorL   r   rM   rN   r   )r   r0   r   rV   rU   Úmsgr   r   r   r^   ò   s    

ÿzIOBinding.writefilec                 C   sT   | j  d¡dkr*t| jdƒs*| j  dd¡ | j  dd¡}| jdkrP| d| j¡}|S )z/Return text with final 
 if needed and os eols.zend-2cÚ
r4   zend-1crC   )r   ÚgetÚhasattrr   rE   rS   Úreplace©r   r   r   r   r   re      s    
ÿ
zIOBinding.fixnewlinesc              
   C   sØ   t |tƒr|S | jdkr"| d¡S z| d¡W S  tk
rB   Y nX z.| dd¡}t t |¡j	¡\}}| |¡W S  t
k
rœ } zt|ƒ}W 5 d }~X Y n tk
r¶   d| }Y nX tjdd| | jd | d¡S )Nz	utf-8-sigÚasciiro   zInvalid encoding '%s'rA   z%s.
Saving as UTF-8rB   )rO   Úbytesr   rf   ÚUnicodeEncodeErrorrF   Údetect_encodingÚioÚBytesIOÚreadlinerJ   rN   r   rM   r   )r   rV   ZencodedrW   Ú_rX   Zfailedr   r   r   rf   
  s,    


ýzIOBinding.encodec                 C   sd  t jddt j| jd}|s(| j ¡  dS d }|  ¡ }|r>| j}|rJ|d kr€tjdd\}}|}t	 
|¡ |  |¡s€t	 |¡ dS t	j}d}|dkrªt d	d
d¡}	|	d }	n|dkrÂt d	d
d¡}	nd}|r6|	t |¡ }	t	 |	d¡}
|
 ¡  ¡ }|
 
¡ }|rd| | }|rPdt|	ƒ | }t jd|| jd nd| }t jd|| jd |r`t	 |¡ dS )NZPrintzPrint to Default PrinterrY   r5   Z	IDLE_tmp_)ÚprefixTÚposixÚmainZGeneralzprint-command-posixz 2>&1Úntzprint-command-winFÚrz#Printing failed (exit status 0x%x)
zPrinting command: %s
zPrint statusrB   z-Printing is not enabled for this platform: %s)r   ZaskokcancelZOKr   r;   r%   r0   ÚtempfileZmkstempr-   r#   r^   ÚunlinkÚnamer   Z	GetOptionÚshlexZquoteÚpopenrG   ÚstripÚreprrM   Zshowinfo)r   r=   r]   ZtempfilenameZsavedr0   ZtfdÚplatformZprintPlatformZcommandÚpipeÚoutputZstatusr[   r   r   r   r   )  sb    ü



ÿ
ÿÿ
zIOBinding.print_window))zPython filesz
*.py *.pywÚTEXT)z
Text filesz*.txtrˆ   )z	All filesÚ*Údarwinz.pyÚ c                 C   s<   |   d¡\}}| js(tj| j| jd| _| jj||d}|S )Nr   )r?   Ú	filetypes©Z
initialdirZinitialfile)ÚdefaultfilenameÚ
opendialogr   ZOpenr   rŒ   Úshow©r   ÚdirÚbaser0   r   r   r   r8   f  s    ÿzIOBinding.askopenfiler   c                 C   sV   | j rtj | j ¡S | jr$| jdfS zt ¡ }W n tk
rH   d}Y nX |dfS d S )Nr‹   )r0   r-   r.   Úsplitr1   ÚgetcwdrL   )r   ÚmodeÚpwdr   r   r   rŽ   n  s    

zIOBinding.defaultfilenamec                 C   s@   |   d¡\}}| js,tj| j| j| jd| _| jj||d}|S )Nr   )r?   rŒ   Údefaultextensionr   )rŽ   Ú
savedialogr   ZSaveAsr   rŒ   r˜   r   r‘   r   r   r   rb   z  s    ýzIOBinding.asksavefilec                 C   s   | j jr| j  |¡ dS )z-Update recent file list on all editor windowsN)r   r7   Zupdate_recent_files_listr2   r   r   r   rT   „  s    zIOBinding.updaterecentfileslist)NN)r   )$Ú__name__Ú
__module__Ú__qualname__r    r#   r%   r&   r)   r!   r+   r0   r1   r3   r   r-   rQ   rS   r:   r<   r   r   r   r^   re   rf   r   r   r™   rŒ   Úsysr…   r˜   r8   rŽ   rb   rT   r   r   r   r   r	      s:   
,;
2

r	   c           	      C   s’   ddl m}m} || ƒ}| d¡ tt|  ¡  d¡dd … ƒ\}}| d||d f ¡ G dd	„ d	ƒ}||ƒ}| ¡  | 	¡  ||ƒ}t
|ƒ d S )
Nr   )ÚToplevelÚTextzTest IOBindingú+r,   z+%d+%dé¯   c                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )z_io_binding.<locals>.MyEditWinc                 S   s`   || _ d | _| j  d| j¡ | j  d| j¡ | j  d| j¡ | j  d| j¡ | j  d| j¡ d S )Nz<Control-o>z<Control-p>z<Control-s>z<Alt-s>z<Control-c>)r   r7   r   r   Úprintr   ÚsaveasÚsavecopyrp   r   r   r   r    ‘  s    z'_io_binding.<locals>.MyEditWin.__init__c                 S   s   dS )Nr   r   r"   r   r   r   r%   ™  ó    z(_io_binding.<locals>.MyEditWin.get_savedc                 S   s   d S r$   r   r'   r   r   r   r&   š  r¥   z(_io_binding.<locals>.MyEditWin.set_savedc                 S   s   d S r$   r   r"   r   r   r   r)   ›  r¥   z)_io_binding.<locals>.MyEditWin.reset_undoc                 S   s   | j  d¡ d S )Nr
   ©r   Zevent_generatera   r   r   r   r   œ  s    z#_io_binding.<locals>.MyEditWin.openc                 S   s   | j  d¡ d S )Nr   r¦   ra   r   r   r   r¢   ž  s    z$_io_binding.<locals>.MyEditWin.printc                 S   s   | j  d¡ d S )Nr   r¦   ra   r   r   r   r      s    z#_io_binding.<locals>.MyEditWin.savec                 S   s   | j  d¡ d S )Nr   r¦   ra   r   r   r   r£   ¢  s    z%_io_binding.<locals>.MyEditWin.saveasc                 S   s   | j  d¡ d S )Nr   r¦   ra   r   r   r   r¤   ¤  s    z'_io_binding.<locals>.MyEditWin.savecopyN)rš   r›   rœ   r    r%   r&   r)   r   r¢   r   r£   r¤   r   r   r   r   Ú	MyEditWin  s   r§   )Útkinterrž   rŸ   rZ   ÚmapÚintZgeometryr”   Zpackr;   r	   )	r?   rž   rŸ   ÚrootÚxÚyr§   r   r   r   r   r   Ú_io_binding‰  s    
 r®   Ú__main__)r{   zidlelib.idle_test.test_iomenué   F)Ú	verbosityÚexit)Úrun)ru   r-   r   r   r~   rF   r¨   r   r   Ztkinter.simpledialogr   ZidlelibZidlelib.configr   r@   r…   Úerrorsr	   r®   rš   Zunittestr{   Zidlelib.idle_test.htestr³   r   r   r   r   Ú<module>   s.   
  t$