B
    ^ Çc&+  ã               @   s¤   d dl Z d dlmZ G dd„ deƒZG dd„ dƒZG dd„ deƒZG d	d
„ d
eƒZG dd„ deƒ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)Ú	Delegatorc               @   s–   e Zd ZdZd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d„ Zd#dd„Zd$dd„Zdd„ Zdd„ Zd%dd„Zdd „ Zd!d"„ ZdS )&ÚUndoDelegatoriè  c             C   s   t  | ¡ |  ¡  d S )N)r   Ú__init__Ú
reset_undo)Úself© r   úlib/python3.7/idlelib/undo.pyr      s    
zUndoDelegator.__init__c             C   sj   | j d k	r(|  d¡ |  d¡ |  d¡ t | |¡ |d k	rf|  d| j¡ |  d| j¡ |  d| j¡ d S )Nz<<undo>>z<<redo>>z<<dump-undo-state>>)ÚdelegateZunbindr   ÚsetdelegateZbindÚ
undo_eventÚ
redo_eventÚ
dump_event)r   r	   r   r   r   r
      s    



zUndoDelegator.setdelegatec             C   sv   ddl m } || jd | j… ƒ td| jdd td| jdd td| jdd td|  ¡ ƒ || j| jd … ƒ d	S )
Nr   )Úpprintzpointer:ú )Úendzsaved:z
can_merge:zget_saved():Úbreak)r   ÚundolistÚpointerÚprintÚsavedÚ	can_mergeÚ	get_saved)r   Úeventr   r   r   r   r   (   s    zUndoDelegator.dump_eventc             C   s&   d| _ d| _g | _d| _|  d¡ d S )Néÿÿÿÿr   é   )Ú	was_savedr   r   Ú	undoblockÚ	set_saved)r   r   r   r   r   2   s
    zUndoDelegator.reset_undoc             C   s&   |r| j | _nd| _d| _|  ¡  d S )Nr   F)r   r   r   Úcheck_saved)r   Úflagr   r   r   r   9   s
    
zUndoDelegator.set_savedc             C   s   | j | jkS )N)r   r   )r   r   r   r   r   A   s    zUndoDelegator.get_savedNc             C   s
   || _ d S )N)Úsaved_change_hook)r   Úhookr   r   r   Úset_saved_change_hookF   s    z#UndoDelegator.set_saved_change_hookr   c             C   s*   |   ¡ }|| jkr&|| _| jr&|  ¡  d S )N)r   r   r    )r   Zis_savedr   r   r   r   K   s
    
zUndoDelegator.check_savedc             C   s   |   t|||ƒ¡ d S )N)ÚaddcmdÚInsertCommand)r   ÚindexÚcharsÚtagsr   r   r   ÚinsertR   s    zUndoDelegator.insertc             C   s   |   t||ƒ¡ d S )N)r#   ÚDeleteCommand)r   Úindex1Úindex2r   r   r   ÚdeleteU   s    zUndoDelegator.deletec             C   s    | j dkrtƒ | _ | j  ¡  d S )Nr   )r   ÚCommandSequenceÚ
bump_depth)r   r   r   r   Úundo_block_startc   s    
zUndoDelegator.undo_block_startc             C   sN   | j  d¡dkrJ| j }d| _ t|ƒdkrJt|ƒdkr>| d¡}|  |d¡ d S )Nr   r   r   )r   r.   ÚlenÚgetcmdr#   )r   Úcmdr   r   r   Úundo_block_stoph   s    
zUndoDelegator.undo_block_stopTc             C   sÔ   |r|  | j¡ | jdkr*| j |¡ d S | jrX| jdkrX| j| jd  }| |¡rXd S |g| j| jd …< | j| jkr|d| _| jd | _t	| jƒ| j
krÂ| jd= | jd | _| jdkrÂ| jd | _d| _|  ¡  d S )Nr   r   r   T)Údor	   r   Úappendr   r   r   Úmerger   r0   Úmax_undor   )r   r2   ZexecuteZlastcmdr   r   r   r#   t   s(    


zUndoDelegator.addcmdc             C   sP   | j dkr|  ¡  dS | j| j d  }| | j¡ | j d | _ d| _|  ¡  dS )Nr   r   r   F)r   Úbellr   Úundor	   r   r   )r   r   r2   r   r   r   r   ‹   s    
zUndoDelegator.undo_eventc             C   sR   | j t| jƒkr|  ¡  dS | j| j  }| | j¡ | j d | _ d| _|  ¡  dS )Nr   r   F)r   r0   r   r8   Úredor	   r   r   )r   r   r2   r   r   r   r   –   s    zUndoDelegator.redo_event)N)N)T)Ú__name__Ú
__module__Ú__qualname__r7   r   r
   r   r   r   r   r    r"   r   r   r(   r,   r/   r3   r#   r   r   r   r   r   r   r      s$   



r   c               @   sR   e Zd ZdZd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 )ÚCommandNc             C   s,   i | _ i | _|| _|| _|| _|r(|| _d S )N)Úmarks_beforeÚmarks_afterr*   r+   r&   r'   )r   r*   r+   r&   r'   r   r   r   r   §   s    zCommand.__init__c             C   s>   | j j}| j| j| j| jf}| jd kr2|d d… }|t|ƒ S )Nr   )Ú	__class__r;   r*   r+   r&   r'   Úrepr)r   ÚsÚtr   r   r   Ú__repr__°   s
    
zCommand.__repr__c             C   s   d S )Nr   )r   Útextr   r   r   r4   ·   s    z
Command.doc             C   s   d S )Nr   )r   rF   r   r   r   r:   º   s    zCommand.redoc             C   s   d S )Nr   )r   rF   r   r   r   r9   ½   s    zCommand.undoc             C   s   dS )Nr   r   )r   r2   r   r   r   r6   À   s    zCommand.mergec             C   s8   i }x.|  ¡ D ]"}|dkr|dkr| |¡||< qW |S )Nr(   Zcurrent)Z
mark_namesr%   )r   rF   ÚmarksÚnamer   r   r   Ú
save_marksÃ   s
    zCommand.save_marksc             C   s&   x |  ¡ D ]\}}| ||¡ q
W d S )N)ÚitemsÚmark_set)r   rF   rG   rH   r%   r   r   r   Ú	set_marksÊ   s    zCommand.set_marks)N)r;   r<   r=   r'   r   rE   r4   r:   r9   r6   rI   rL   r   r   r   r   r>   ¢   s   
	r>   c               @   sN   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zej	ej
 d Zdd„ ZdS )r$   Nc             C   s   t  | |d ||¡ d S )N)r>   r   )r   r*   r&   r'   r   r   r   r   Ò   s    zInsertCommand.__init__c             C   sv   |   |¡| _| | j¡| _| | jdd¡r6| d¡| _| | j| j| j¡ | d| jt| jƒf ¡| _	|   |¡| _
d S )Nú>zend-1cz%s+%dc)rI   r?   r%   r*   Úcomparer(   r&   r'   r0   r+   r@   )r   rF   r   r   r   r4   Õ   s    zInsertCommand.doc             C   s>   |  d| j¡ | | j| j| j¡ |  || j¡ | d¡ d S )Nr(   )rK   r*   r(   r&   r'   rL   r@   Úsee)r   rF   r   r   r   r:   à   s    zInsertCommand.redoc             C   s:   |  d| j¡ | | j| j¡ |  || j¡ | d¡ d S )Nr(   )rK   r*   r,   r+   rL   r?   rO   )r   rF   r   r   r   r9   ç   s    zInsertCommand.undoc             C   s‚   | j |j k	rdS | j|jkr dS | j|jkr0dS t|jƒdkrBdS | jrh|  | jd ¡|  |j¡krhdS |j| _| j|j | _dS )NFr   r   T)rA   r+   r*   r'   r0   r&   Úclassify)r   r2   r   r   r   r6   î   s    zInsertCommand.mergeÚ_c             C   s   || j krdS |dkrdS dS )NÚalphanumericÚ
ÚnewlineZpunctuation)rR   )r   Úcr   r   r   rP      s
    
zInsertCommand.classify)N)r;   r<   r=   r   r4   r:   r9   r6   ÚstringZascii_lettersZdigitsrR   rP   r   r   r   r   r$   Ï   s   
r$   c               @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )r)   Nc             C   s   t  | ||d d ¡ d S )N)r>   r   )r   r*   r+   r   r   r   r     s    zDeleteCommand.__init__c             C   s   |   |¡| _| | j¡| _| jr0| | j¡| _n| | jd ¡| _| | jdd¡r^| d¡| _| | j| j¡| _| | j| j¡ |   |¡| _	d S )Nz +1crM   zend-1c)
rI   r?   r%   r*   r+   rN   Úgetr&   r,   r@   )r   rF   r   r   r   r4     s    zDeleteCommand.doc             C   s:   |  d| j¡ | | j| j¡ |  || j¡ | d¡ d S )Nr(   )rK   r*   r,   r+   rL   r@   rO   )r   rF   r   r   r   r:     s    zDeleteCommand.redoc             C   s:   |  d| j¡ | | j| j¡ |  || j¡ | d¡ d S )Nr(   )rK   r*   r(   r&   rL   r?   rO   )r   rF   r   r   r   r9   $  s    zDeleteCommand.undo)N)r;   r<   r=   r   r4   r:   r9   r   r   r   r   r)     s   
r)   c               @   sN   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d„Z
dS )r-   c             C   s   g | _ d| _d S )Nr   )ÚcmdsÚdepth)r   r   r   r   r   0  s    zCommandSequence.__init__c             C   sB   | j j}g }x| jD ]}| d|f ¡ qW |d d |¡ d S )Nz    %rz(
z,
z
))rA   r;   rX   r5   Újoin)r   rC   Zstrsr2   r   r   r   rE   4  s
    zCommandSequence.__repr__c             C   s
   t | jƒS )N)r0   rX   )r   r   r   r   Ú__len__;  s    zCommandSequence.__len__c             C   s   | j  |¡ d S )N)rX   r5   )r   r2   r   r   r   r5   >  s    zCommandSequence.appendc             C   s
   | j | S )N)rX   )r   Úir   r   r   r1   A  s    zCommandSequence.getcmdc             C   s   x| j D ]}| |¡ qW d S )N)rX   r:   )r   rF   r2   r   r   r   r:   D  s    zCommandSequence.redoc             C   s2   | j d d … }| ¡  x|D ]}| |¡ qW d S )N)rX   Úreverser9   )r   rF   rX   r2   r   r   r   r9   H  s    
zCommandSequence.undor   c             C   s   | j | | _ | j S )N)rY   )r   Zincrr   r   r   r.   N  s    zCommandSequence.bump_depthN)r   )r;   r<   r=   r   rE   r[   r5   r1   r:   r9   r.   r   r   r   r   r-   ,  s   r-   c                s  ddl m}m}m} ddlm} || ƒ}| d¡ tt|  	¡  
d¡dd … ƒ\}}| 	d||d f ¡ ||d	d
}| ¡  | ¡  ||ƒ}	tƒ ‰ |	 ˆ ¡ ||d‡ fdd„d}
|
jdd ||d‡ fdd„d}|jdd ||d‡ fdd„d}|jdd d S )Nr   )ÚToplevelÚTextÚButton)Ú
PercolatorzTest UndoDelegatorú+r   z+%d+%dé¯   é
   )ZheightZUndoc                  s
   ˆ   d ¡S )N)r   r   )Údr   r   Ú<lambda>b  ó    z!_undo_delegator.<locals>.<lambda>)rF   ZcommandÚleft)ZsideZRedoc                  s
   ˆ   d ¡S )N)r   r   )re   r   r   rf   d  rg   ZDumpc                  s
   ˆ   d ¡S )N)r   r   )re   r   r   rf   f  rg   )Ztkinterr^   r_   r`   Zidlelib.percolatorra   ÚtitleÚmapÚintZgeometryÚsplitZpackZ	focus_setr   Zinsertfilter)Úparentr^   r_   r`   ra   ZundowinÚxÚyrF   Úpr9   r:   Údumpr   )re   r   Ú_undo_delegatorS  s$    
 
rr   Ú__main__)Úmainzidlelib.idle_test.test_undoé   F)Ú	verbosityÚexit)Úrun)rV   Zidlelib.delegatorr   r   r>   r$   r)   r-   rr   r;   Zunittestrt   Zidlelib.idle_test.htestrx   r   r   r   r   Ú<module>   s    -9$'