B
    ߜwa&+                 @   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rd 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 )Nr      )	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$'