B
    ߜwaP                 @   s  d dl Z d dl m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 ejrdZdZnyd dlZeejd W n eejfk
r   Y nX ejdkrdZdZnyeejZere e W nX ee e!fk
rD   y e" d	 Zer"e e W n e#e!fk
r>   Y nX Y nX erZe$ Zd
ZndZdZe%dej&Z'e%dej&Z(dd Z)G dd dZ*dd Z+e,dkrd dl-m.Z. e.dddd d dl/m0Z0 e0e+ dS )    N)BOM_UTF8)	askstring)idleConfzutf-8surrogateescape Zwin32   strictasciiz&^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)z^[ \t\f]*(?:[#\r\n]|$)c             C   s   t | tr| d}n| }d|kr8|dddd }n$d|krV|dddd }n|g}x2|D ]&}t|}|dk	rzP t|sbdS qbW dS |d}yt	| W n  t
k
r   t
d| Y nX |S )aV  Return the encoding declaration according to PEP 263.

    When checking encoded data, only the first two lines should be passed
    in to avoid a UnicodeDecodeError if the rest of the data is not unicode.
    The first two lines would contain the encoding specification.

    Raise a LookupError if the encoding is declared but unknown.
    z
iso-8859-1
   Nr   zUnknown encoding: )
isinstancebytesdecodesplit	coding_rematchblank_regroupcodecslookupLookupError)datalinesZlstliner   name r   lib/python3.7/idlelib/iomenu.pycoding_specB   s*    	




r   c               @   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dZee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%d& ZdZdZ d'Z!e"j#d(krd)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 )Nz<<open-window-from-file>>z<<save-window>>z<<save-window-as-file>>z<<save-copy-of-window-as-file>>z<<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__p   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 )Nz<<open-window-from-file>>z<<save-window>>z<<save-window-as-file>>z<<save-copy-of-window-as-file>>z<<print-window>>)	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_saved)r.   r   r   r   r2      s    zIOBinding.get_savedc             C   s   | j | d S )N)r    	set_saved)r.   flagr   r   r   r3      s    zIOBinding.set_savedc             C   s   | j   d S )N)r    
reset_undo)r.   r   r   r   r5      s    zIOBinding.reset_undoNc             C   s
   || _ d S )N)r0   )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 )Nr   )ospathisdirfilenamedirnamer3   r0   )r.   r;   r   r   r   set_filename   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getattrr;   r2   r#   loadfiler!   	focus_set	maybesave)r.   eventZeditFilerA   r;   replyr   r   r   r#      s6    




zIOBinding.openz(\r\n)|\n|\rc       	   
   C   sB  y<t |d(}| |  }|d | }W d Q R X W n8 tk
rt } ztjdt|| jd dS d }~X Y nX | 	||\}}|d krtjdd| | jd dS | j
|}|r|d| _| j
d|}| jd	d
 | d  | jd	| |   | | |r| d | jdd	 | jd | | dS )Nrbr   z	I/O Error)parentFzDecoding ErrorzFile %s
Failed to Decodez\nz1.0endinsertT)r#   readlineseekreadOSErrortkMessageBox	showerrorstrr!   _decodeeol_researchr   eol_conventionsubdeleter=   rL   r5   r3   Zmark_setZyviewupdaterecentfileslist)	r.   r;   f	two_linesr   msgcharsZ	convertedZfirsteolr   r   r   rD      s:    





zIOBinding.loadfilec          
   C   s  d}| trHy|dd d}W n tk
r8   dS X d| _|dfS yt|}W nN tk
r } ztjdd| | j	d	 d}W dd}~X Y n tk
r   dS X |ryt
||}|| _|dfS  tk
r   Y nX yt
|d
}d| _|dfS  tk
r   Y nX yt
|d}d| _|dfS  tk
r4   Y nX y>| jj	  tddt| jj	d}|rnt
||}d| _|dfS  ttfk
r   Y nX dS )zCreate a Unicode string.N   zutf-8)NFBOMFzError loading the filez^The encoding '%s' is not known to this Python installation. The file may not display correctly)titlemessagerJ   r	   z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?)ZinitialvaluerJ   T)
startswithr   r   UnicodeDecodeErrorr+   r   r   rQ   rR   r!   rS   r    updater   encoding)r.   r\   r   r^   encr   r   r   r   rT      sh    





zIOBinding._decodec             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)ra   rb   defaultrJ   r@   Zno)r2   r;   rQ   ZaskyesnocancelZYESr!   r%   rE   )r.   rb   confirmrH   r   r   r   rF   <  s&    


zIOBinding.maybesavec             C   sZ   | j s| | n:| | j rL| d y| j  W n tk
rJ   Y nX | j  dS )NTr?   )	r;   r'   	writefiler3   r    store_file_breaksAttributeErrorr!   rE   )r.   rG   r   r   r   r%   R  s    

zIOBinding.savec             C   sf   |   }|rN| |rN| | | d y| j  W n tk
rL   Y nX | j  | 	| dS )Nr   r?   )
asksavefilerj   r=   r3   r    rk   rl   r!   rE   rZ   )r.   rG   r;   r   r   r   r'   _  s    




zIOBinding.save_asc             C   s.   |   }|r| | | j  | | dS )Nr?   )rm   rj   r!   rE   rZ   )r.   rG   r;   r   r   r   r)   m  s    


zIOBinding.save_a_copyc          
   C   s   |   }| |}y:t|d&}|| |  t|  W d Q R X dS  tk
r } zt	j
dt|| jd dS d }~X Y nX d S )NwbTz	I/O Error)rJ   F)fixnewlinesencoder#   writeflushr8   fsyncfilenorP   rQ   rR   rS   r!   )r.   r;   r!   r^   r[   r]   r   r   r   rj   u  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-2cr
   r>   zend-1cz1.0)r!   gethasattrr    rL   rW   replace)r.   r!   r   r   r   ro     s    
zIOBinding.fixnewlinesc          
   C   s   t |tr|S | jdkr&t|d S y
|dS  tk
rD   Y nX yt|}d }W n* tk
r } z|}d }W d d }~X Y n
X |sd}|ry
||S  tk
r   d| }Y nX tj	dd| | j
d t|d S )Nr`   zutf-8r	   zInvalid encoding '%s'z	I/O Errorz%s.
Saving as UTF-8)rJ   )r   r   r+   r   rp   UnicodeErrorr   r   rQ   rR   r!   )r.   r^   rg   Zfailedr]   r   r   r   rp     s4    




zIOBinding.encodec             C   sd  t jddt j| jd}|s(| j  dS d }|  }|r>| j}|rJ|d krtjdd\}}|}t	
| | |st	| dS t	j}d}|dkrtd	d
d}	|	d }	n|dkrt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 Printer)ra   rb   rh   rJ   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 status)rJ   z-Printing is not enabled for this platform: %s)rQ   ZaskokcancelZOKr!   rE   r2   r;   tempfileZmkstempr8   r1   rj   unlinkr   r   Z	GetOptionshlexZquotepopenrO   stripreprrR   Zshowinfo)r.   rG   ri   ZtempfilenameZsavedr;   ZtfdplatformZprintPlatformZcommandpipeoutputZstatusrb   r   r   r   r,     sX    







zIOBinding.print_window))zPython filesz
*.py *.pywTEXT)z
Text filesz*.txtr   )z	All files*darwinz.pyr   c             C   s<   |  d\}}| js(tj| j| jd| _| jj||d}|S )Nr#   )rJ   	filetypes)
initialdirinitialfile)defaultfilename
opendialogtkFileDialogZOpenr!   r   show)r.   dirbaser;   r   r   r   rB     s    zIOBinding.askopenfiler#   c             C   sV   | j rtj| j S | jr$| jdfS yt }W n tk
rH   d}Y nX |dfS d S )Nr   )r;   r8   r9   r   r<   getcwdrP   )r.   modepwdr   r   r   r     s    

zIOBinding.defaultfilenamec             C   s@   |  d\}}| js,tj| j| j| jd| _| jj||d}|S )Nr%   )rJ   r   defaultextension)r   r   )r   
savedialogr   ZSaveAsr!   r   r   r   )r.   r   r   r;   r   r   r   rm     s    zIOBinding.asksavefilec             C   s   | j jr| j | dS )z-Update recent file list on all editor windowsN)r    rA   Zupdate_recent_files_list)r.   r;   r   r   r   rZ     s    zIOBinding.updaterecentfileslist)NN)r#   ))__name__
__module____qualname__r/   r1   r2   r3   r5   r0   r7   r;   r<   r=   r#   ZeolrecompilerU   r8   lineseprW   rD   rT   rF   r%   r'   r)   rj   ro   rp   r,   r   r   r   sysr   r   rB   r   rm   rZ   r   r   r   r   r   k   s@   
,
$D
'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!   rA   r"   r#   printr%   saveassavecopy)r.   r!   r   r   r   r/     s    z'_io_binding.<locals>.MyEditWin.__init__c             S   s   dS )Nr   r   )r.   r   r   r   r2   $      z(_io_binding.<locals>.MyEditWin.get_savedc             S   s   d S )Nr   )r.   r4   r   r   r   r3   %  r   z(_io_binding.<locals>.MyEditWin.set_savedc             S   s   d S )Nr   )r.   r   r   r   r5   &  r   z)_io_binding.<locals>.MyEditWin.reset_undoc             S   s   | j d d S )Nz<<open-window-from-file>>)r!   event_generate)r.   rG   r   r   r   r#   '  s    z#_io_binding.<locals>.MyEditWin.openc             S   s   | j d d S )Nz<<print-window>>)r!   r   )r.   rG   r   r   r   r   )  s    z$_io_binding.<locals>.MyEditWin.printc             S   s   | j d d S )Nz<<save-window>>)r!   r   )r.   rG   r   r   r   r%   +  s    z#_io_binding.<locals>.MyEditWin.savec             S   s   | j d d S )Nz<<save-window-as-file>>)r!   r   )r.   rG   r   r   r   r   -  s    z%_io_binding.<locals>.MyEditWin.saveasc             S   s   | j d d S )Nz<<save-copy-of-window-as-file>>)r!   r   )r.   rG   r   r   r   r   /  s    z'_io_binding.<locals>.MyEditWin.savecopyN)r   r   r   r/   r2   r3   r5   r#   r   r%   r   r   r   r   r   r   	MyEditWin  s   r   )Ztkinterr   r   ra   mapintZgeometryr   ZpackrE   r   )	rJ   r   r   rootxyr   r!   r    r   r   r   _io_binding  s    
 r   __main__)r{   zidlelib.idle_test.test_iomenur   F)	verbosityexit)run)1r   r   r8   r   r   r   r~   Ztkinter.filedialogZ
filedialogr   Ztkinter.messageboxZ
messageboxrQ   Ztkinter.simpledialogr   ZidlelibZidlelib.configr   Ztestingrf   errorsZlocale	setlocaleLC_CTYPEImportErrorErrorr   nl_langinfoCODESETZlocale_encodingr   	NameErrorrl   r   Zgetdefaultlocale
ValueErrorlowerr   ASCIIr   r   r   r   r   r   Zunittestr{   Zidlelib.idle_test.htestr   r   r   r   r   <module>   sf   
)   ,$
