a
    äIþfØ=  ã                   @   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 dlmZ d dd	„ eD ƒ¡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)Úpy_extensionsú c                 c   s   | ]}d | V  qdS )Ú*N© )Ú.0Zextr	   r	   úlib/python3.9/idlelib/iomenu.pyÚ	<genexpr>   ó    r   ú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d4d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$ed%fd&d'fZejd(krÊd)nd*Z d+d,„ Z!d5d.d/„Z"d0d1„ Z#d2d3„ Z$dS )6Ú	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	   r	   r   Ú__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+   7   s    zIOBinding.get_savedc                 C   s   | j  |¡ d S r*   )r   Ú	set_saved©r%   Úflagr	   r	   r   r,   :   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_hookB   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%   r6   r	   r	   r   Úset_filenameH   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Úgetattrr6   r+   r   Úloadfiler   Ú	focus_setÚ	maybesave)r%   ÚeventZeditFiler=   r6   Úreplyr	   r	   r   r   S   s<    
ÿþý



zIOBinding.openc           	      C   sÞ  zÆzFt  |¡(}| ¡ }|j}|j}d}W d   ƒ n1 s<0    Y  W nz ttfyÂ   | jj 	¡  t
ddd| jjd}t||d(}| ¡ }|j}|j}d}W d   ƒ n1 s´0    Y  Y n0 W nh ty } z$tjdt|ƒ| jd	 W Y d }~dS d }~0  ty.   tjd
d| | jd	 Y dS 0 t|tƒsb|d ur\t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©rE   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   ÚreadrF   ÚnewlinesÚUnicodeDecodeErrorÚSyntaxErrorr   r   Úupdater   ÚOSErrorr   Ú	showerrorÚstrÚ
isinstanceÚshowwarningr3   ÚlinesepÚdeleter9   r"   Úeol_conventionrK   r/   r,   Zmark_setZyviewÚupdaterecentfileslist)	r%   r6   ÚfÚcharsr"   rY   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 u 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ÚdefaultrE   r<   Zno)r+   r6   r   ZaskyesnocancelZYESr   r   rA   )r%   ra   ÚconfirmrD   r	   r	   r   rB   ¼   s*    ÿü

zIOBinding.maybesavec                 C   sX   | j s|  |¡ n8|  | j ¡rJ|  d¡ z| j ¡  W n tyH   Y n0 | j ¡  dS )NTr;   )	r6   r   Ú	writefiler,   r   Ústore_file_breaksÚAttributeErrorr   rA   ©r%   rC   r	   r	   r   r   Ò   s    

zIOBinding.savec                 C   sd   |   ¡ }|rL|  |¡rL|  |¡ |  d¡ z| j ¡  W n tyJ   Y n0 | j ¡  |  	|¡ dS )Nr2   r;   )
Úasksavefilerd   r9   r,   r   re   rf   r   rA   rZ   ©r%   rC   r6   r	   r	   r   r   ß   s    




zIOBinding.save_asc                 C   s.   |   ¡ }|r|  |¡ | j ¡  |  |¡ dS )Nr;   )rh   rd   r   rA   rZ   ri   r	   r	   r   r    í   s    


zIOBinding.save_a_copyc              
   C   s¤   |   ¡ }|  |¡}zPt|dƒ0}| |¡ | ¡  t | ¡ ¡ W d   ƒ n1 sT0    Y  W dS  tyž } z$t	j
dt|ƒ| jd W Y d }~dS d }~0 0 d S )NÚwbTrG   rH   F)ÚfixnewlinesÚencoder   ÚwriteÚflushr3   ÚfsyncÚfilenorR   r   rS   rT   r   )r%   r6   r   r\   r[   Úmsgr	   r	   r   rd   õ   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Ú
r:   zend-1crI   )r   ÚgetÚhasattrr   rK   rY   Úreplace©r%   r   r	   r	   r   rk     s    
ÿ
zIOBinding.fixnewlinesc              
   C   sÖ   t |tƒr|S | jdkr"| d¡S z| d¡W S  ty@   Y n0 z.| dd¡}t t |¡j	¡\}}| |¡W S  t
yœ } zt|ƒ}W Y d }~n"d }~0  ty´   d| }Y n0 tjdd| | jd | d¡S )Nz	utf-8-sigÚasciiru   zInvalid encoding '%s'rG   z%s.
Saving as UTF-8rH   )rU   Úbytesr"   rl   ÚUnicodeEncodeErrorrL   Údetect_encodingÚioÚBytesIOÚreadlinerP   rT   r   rS   r   )r%   r\   Zencodedr]   Ú_r^   Zfailedr	   r	   r   rl     s,    


ýzIOBinding.encodec                 C   sd  t jddt j| jd}|s(| j ¡  dS d }|  ¡ }|r>| j}|rJ|d u 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 Printerr_   r;   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 statusrH   z-Printing is not enabled for this platform: %s)r   ZaskokcancelZOKr   rA   r+   r6   ÚtempfileZmkstempr3   r)   rd   ÚunlinkÚnamer   Z	GetOptionÚshlexZquoteÚpopenrM   ÚstripÚreprrS   Zshowinfo)r%   rC   rc   ZtempfilenameZsavedr6   ZtfdÚplatformZprintPlatformZcommandÚpipeÚoutputZstatusra   r	   r	   r   r#   ,  sb    ü



ÿ
ÿÿ
zIOBinding.print_windowzPython filesÚTEXT)z
Text filesz*.txtrŽ   )z	All filesr   Údarwinz.pyÚ c                 C   s<   |   d¡\}}| js(tj| j| jd| _| jj||d}|S )Nr   )rE   Ú	filetypes©Z
initialdirZinitialfile)ÚdefaultfilenameÚ
opendialogr   ZOpenr   r‘   Úshow©r%   ÚdirÚbaser6   r	   r	   r   r>   i  s    ÿzIOBinding.askopenfiler   c                 C   sT   | j rtj | j ¡S | jr$| jdfS zt ¡ }W n tyF   d}Y n0 |dfS d S )Nr   )r6   r3   r4   Úsplitr7   ÚgetcwdrR   )r%   ÚmodeÚpwdr	   r	   r   r“   q  s    

zIOBinding.defaultfilenamec                 C   s@   |   d¡\}}| js,tj| j| j| jd| _| jj||d}|S )Nr   )rE   r‘   Údefaultextensionr’   )r“   Ú
savedialogr   ZSaveAsr   r‘   r   r•   r–   r	   r	   r   rh   }  s    ýzIOBinding.asksavefilec                 C   s   | j jr| j  |¡ dS )z-Update recent file list on all editor windowsN)r   r=   Zupdate_recent_files_listr8   r	   r	   r   rZ   ‡  s    zIOBinding.updaterecentfileslist)NN)r   )%Ú__name__Ú
__module__Ú__qualname__r&   r)   r+   r,   r/   r'   r1   r6   r7   r9   r   r3   rW   rY   r@   rB   r   r   r    rd   rk   rl   r#   r”   rž   r   r‘   Úsysr‹   r   r>   r“   rh   rZ   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ú+r2   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   r=   r   r   Úprintr   ÚsaveasÚsavecopyrv   r	   r	   r   r&   ”  s    z'_io_binding.<locals>.MyEditWin.__init__c                 S   s   dS )Nr   r	   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_generaterg   r	   r	   r   r   Ÿ  s    z#_io_binding.<locals>.MyEditWin.openc                 S   s   | j  d¡ d S )Nr   rª   rg   r	   r	   r   r§   ¡  s    z$_io_binding.<locals>.MyEditWin.printc                 S   s   | j  d¡ d S )Nr   rª   rg   r	   r	   r   r   £  s    z#_io_binding.<locals>.MyEditWin.savec                 S   s   | j  d¡ d S )Nr   rª   rg   r	   r	   r   r¨   ¥  s    z%_io_binding.<locals>.MyEditWin.saveasc                 S   s   | j  d¡ d S )Nr   rª   rg   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¤   r`   ÚmapÚintZgeometryr™   ZpackrA   r   )	rE   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)r{   r3   r‡   r¢   r„   rL   r¬   r   r   Ztkinter.simpledialogr   ZidlelibZidlelib.configr   Zidlelib.utilr   ÚjoinrF   r‹   Úerrorsr   r²   rŸ   Zunittestr   Zidlelib.idle_test.htestr·   r	   r	   r	   r   Ú<module>   s2   
  t$