o
    QEc&+                     @   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rRd dl
mZ edddd d dlmZ ee dS 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\idlelib\undo.pyr      s   
zUndoDelegator.__init__c                 C   sn   | j d ur| d | d | d t| | |d ur5| d| j | d| j | d| j d S 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_savedr   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 r   )r   r   r   r	   r	   r
   r   A   s   zUndoDelegator.get_savedNc                 C   s
   || _ d S r   )saved_change_hook)r   hookr	   r	   r
   set_saved_change_hookF      
z#UndoDelegator.set_saved_change_hookr   c                 C   s2   |   }|| jkr|| _| jr|   d S d S d S r   )r   r   r#   )r   Zis_savedr	   r	   r
   r!   K   s   
zUndoDelegator.check_savedc                 C   s   |  t||| d S r   )addcmdInsertCommand)r   indexcharstagsr	   r	   r
   insertR      zUndoDelegator.insertc                 C   s   |  t|| d S r   )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_depthr   r	   r	   r
   undo_block_startc   s   
zUndoDelegator.undo_block_startc                 C   sV   | j ddkr'| j }d| _ t|dkr)t|dkr|d}| |d d S d S d S r   )r   r5   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r,| jdkr,| j| jd  }||r,d S |g| j| jd < | j| jkr>d| _| jd | _t	| j| j
kra| jd= | jd | _| jdkra| jd | _d| _|   d S )Nr   r   r   T)dor   r   appendr   r   r   merger   r7   max_undor!   )r   r:   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   r:   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   r7   r   r@   redor   r   r!   rB   r	   r	   r
   r      s   zUndoDelegator.redo_eventr   )T)__name__
__module____qualname__r?   r   r   r   r   r    r   r#   r%   r   r!   r,   r2   r6   r;   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   s0   i | _ i | _|| _|| _|| _|r|| _d S d S r   )marks_beforemarks_afterr0   r1   r*   r+   )r   r0   r1   r*   r+   r	   r	   r
   r      s   
zCommand.__init__c                 C   s>   | j j}| j| j| j| jf}| jd u r|d d }|t| S )Nr   )	__class__rD   r0   r1   r*   r+   repr)r   str	   r	   r
   __repr__   s
   
zCommand.__repr__c                 C      d S r   r	   r   textr	   r	   r
   r<         z
Command.doc                 C   rO   r   r	   rP   r	   r	   r
   rC      rR   zCommand.redoc                 C   rO   r   r	   rP   r	   r	   r
   rA      rR   zCommand.undoc                 C   s   dS r3   r	   r9   r	   r	   r
   r>      rR   zCommand.mergec                 C   s4   i }|  D ]}|dkr|dkr||||< q|S )Nr,   Zcurrent)Z
mark_namesr)   )r   rQ   marksnamer	   r	   r
   
save_marks   s   zCommand.save_marksc                 C   s"   |  D ]
\}}||| qd S r   )itemsmark_set)r   rQ   rS   rT   r)   r	   r	   r
   	set_marks   s   zCommand.set_marksr   )rD   rE   rF   r+   r   rN   r<   rC   rA   r>   rU   rX   r	   r	   r	   r
   rG      s    
	rG   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 r   rG   r   )r   r0   r*   r+   r	   r	   r
   r      r-   zInsertCommand.__init__c                 C   sv   |  || _|| j| _|| jddr|d| _|| j| j| j |d| jt| jf | _	|  || _
d S )N>end-1cz%s+%dc)rU   rH   r)   r0   comparer,   r*   r+   r7   r1   rI   rP   r	   r	   r
   r<      s   zInsertCommand.doc                 C   s>   | d| j || j| j| j | || j |d d S Nr,   )rW   r0   r,   r*   r+   rX   rI   seerP   r	   r	   r
   rC      s   zInsertCommand.redoc                 C   :   | d| j || j| j | || j |d d S r]   )rW   r0   r2   r1   rX   rH   r^   rP   r	   r	   r
   rA         zInsertCommand.undoc                 C   s   | j |j urdS | j|jkrdS | j|jkrdS t|jdkr!dS | jr4| | jd | |jkr4dS |j| _| j|j | _dS )NFr   r   T)rJ   r1   r0   r+   r7   r*   classifyr9   r	   r	   r
   r>      s   zInsertCommand.merge_c                 C   s   || j v rdS |dkrdS dS )Nalphanumeric
newlineZpunctuation)rc   )r   cr	   r	   r
   ra      s
   
zInsertCommand.classifyr   )rD   rE   rF   r   r<   rC   rA   r>   stringascii_lettersdigitsrc   ra   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 r   rY   r/   r	   r	   r
   r     r-   zDeleteCommand.__init__c                 C   s   |  || _|| j| _| jr|| j| _n	|| jd | _|| jddr/|d| _|| j| j| _|| j| j |  || _	d S )Nz +1crZ   r[   )
rU   rH   r)   r0   r1   r\   getr*   r2   rI   rP   r	   r	   r
   r<     s   zDeleteCommand.doc                 C   r_   r]   )rW   r0   r2   r1   rX   rI   r^   rP   r	   r	   r
   rC     r`   zDeleteCommand.redoc                 C   r_   r]   )rW   r0   r,   r*   rX   rH   r^   rP   r	   r	   r
   rA   $  r`   zDeleteCommand.undor   )rD   rE   rF   r   r<   rC   rA   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 )r4   c                 C   s   g | _ d| _d S r3   )cmdsdepthr   r	   r	   r
   r   0  s   
zCommandSequence.__init__c                 C   s>   | j j}g }| jD ]
}|d|f  q	|d d| d S )Nz    %rz(
z,
z
))rJ   rD   rk   r=   join)r   rL   Zstrsr:   r	   r	   r
   rN   4  s
   
zCommandSequence.__repr__c                 C   s
   t | jS r   )r7   rk   r   r	   r	   r
   __len__;  r&   zCommandSequence.__len__c                 C   s   | j | d S r   )rk   r=   r9   r	   r	   r
   r=   >  s   zCommandSequence.appendc                 C   s
   | j | S r   )rk   )r   ir	   r	   r
   r8   A  r&   zCommandSequence.getcmdc                 C   s   | j D ]}|| qd S r   )rk   rC   )r   rQ   r:   r	   r	   r
   rC   D  s   
zCommandSequence.redoc                 C   s.   | j d d  }|  |D ]}|| qd S r   )rk   reverserA   )r   rQ   rk   r:   r	   r	   r
   rA   H  s
   zCommandSequence.undor   c                 C   s   | j | | _ | j S r   )rl   )r   Zincrr	   r	   r
   r5   N  s   zCommandSequence.bump_depthN)r   )rD   rE   rF   r   rN   rn   r=   r8   rC   rA   r5   r	   r	   r	   r
   r4   ,  s    r4   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                      
     d S r   )r   r	   dr	   r
   <lambda>b     
 z!_undo_delegator.<locals>.<lambda>)rQ   Zcommandleft)ZsideZRedoc                      rx   r   )r   r	   ry   r	   r
   r{   d  r|   ZDumpc                      rx   r   )r   r	   ry   r	   r
   r{   f  r|   )Ztkinterrq   rr   rs   Zidlelib.percolatorrt   titlemapintZgeometrysplitZpackZ	focus_setr   Zinsertfilter)parentrq   rr   rs   rt   ZundowinxyrQ   prA   rC   dumpr	   ry   r
   _undo_delegatorS  s$   
 
r   __main__)mainzidlelib.idle_test.test_undo   F)	verbosityexit)run)rg   Zidlelib.delegatorr   r   rG   r(   r.   r4   r   rD   Zunittestr   Zidlelib.idle_test.htestr   r	   r	   r	   r
   <module>   s     -9$'