o
     JAf&+                     @   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	   #/usr/lib/python3.10/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   setdelegate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    r6   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   r8   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   r8   r   rA   redor   r   r"   rC   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-   r3   r7   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_afterr1   r2   r+   r,   )r   r1   r2   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__rE   r1   r2   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   rP   r   r	   rQ   r	   r	   r
   rD      rS   zCommand.redoc                 C   rP   r   r	   rQ   r	   r	   r
   rB      rS   zCommand.undoc                 C   s   dS r4   r	   r:   r	   r	   r
   r?      rS   zCommand.mergec                 C   s4   i }|  D ]}|dkr|dkr||||< q|S )Nr-   current)Z
mark_namesr*   )r   rR   marksnamer	   r	   r
   
save_marks   s   zCommand.save_marksc                 C   s"   |  D ]
\}}||| qd S r   )itemsmark_set)r   rR   rU   rV   r*   r	   r	   r
   	set_marks   s   zCommand.set_marksr   )rE   rF   rG   r,   r   rO   r=   rD   rB   r?   rW   rZ   r	   r	   r	   r
   rH      s    
	rH   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   rH   r   )r   r1   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)rW   rI   r*   r1   comparer-   r+   r,   r8   r2   rJ   rQ   r	   r	   r
   r=      s   zInsertCommand.doc                 C   s>   | d| j || j| j| j | || j |d d S Nr-   )rY   r1   r-   r+   r,   rZ   rJ   seerQ   r	   r	   r
   rD      s   zInsertCommand.redoc                 C   :   | d| j || j| j | || j |d d S r_   )rY   r1   r3   r2   rZ   rI   r`   rQ   r	   r	   r
   rB         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)rK   r2   r1   r,   r8   r+   classifyr:   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
newlinepunctuation)re   )r   cr	   r	   r
   rc      s
   
zInsertCommand.classifyr   )rE   rF   rG   r   r=   rD   rB   r?   stringascii_lettersdigitsre   rc   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   r[   r0   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 +1cr\   r]   )
rW   rI   r*   r1   r2   r^   getr+   r3   rJ   rQ   r	   r	   r
   r=     s   zDeleteCommand.doc                 C   ra   r_   )rY   r1   r3   r2   rZ   rJ   r`   rQ   r	   r	   r
   rD     rb   zDeleteCommand.redoc                 C   ra   r_   )rY   r1   r-   r+   rZ   rI   r`   rQ   r	   r	   r
   rB   $  rb   zDeleteCommand.undor   )rE   rF   rG   r   r=   rD   rB   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 )r5   c                 C   s   g | _ d| _d S r4   )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
))rK   rE   rn   r>   join)r   rM   Zstrsr;   r	   r	   r
   rO   4  s
   
zCommandSequence.__repr__c                 C   s
   t | jS r   )r8   rn   r   r	   r	   r
   __len__;  r'   zCommandSequence.__len__c                 C   s   | j | d S r   )rn   r>   r:   r	   r	   r
   r>   >  s   zCommandSequence.appendc                 C   s
   | j | S r   )rn   )r   ir	   r	   r
   r9   A  r'   zCommandSequence.getcmdc                 C   s   | j D ]}|| qd S r   )rn   rD   )r   rR   r;   r	   r	   r
   rD   D  s   
zCommandSequence.redoc                 C   s.   | j d d  }|  |D ]}|| qd S r   )rn   reverserB   )r   rR   rn   r;   r	   r	   r
   rB   H  s
   zCommandSequence.undor   c                 C   s   | j | | _ | j S r   )ro   )r   Zincrr	   r	   r
   r6   N  s   zCommandSequence.bump_depthN)r   )rE   rF   rG   r   rO   rq   r>   r9   rD   rB   r6   r	   r	   r	   r
   r5   ,  s    r5   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>)rR   Zcommandleft)ZsideZRedoc                      r{   r   )r   r	   r|   r	   r
   r~   d  r   ZDumpc                      r{   r   )r   r	   r|   r	   r
   r~   f  r   )tkinterrt   ru   rv   Zidlelib.percolatorrw   titlemapintZgeometrysplitpackZ	focus_setr   Zinsertfilter)parentrt   ru   rv   rw   ZundowinxyrR   prB   rD   dumpr	   r|   r
   _undo_delegatorS  s$   
 
r   __main__)mainzidlelib.idle_test.test_undo   F)	verbosityexit)run)rj   Zidlelib.delegatorr   r   rH   r)   r/   r5   r   rE   Zunittestr   Zidlelib.idle_test.htestr   r	   r	   r	   r
   <module>   s     -9$'