B
    ߜwa?                 @   s0  d dl Z d dlT d dlmZmZ d dlmZ d dlmZ dZ	ye j
e j
ee	ZW n ek
rn   e	ZY nX e j
ereZ	ne j
e	sede	f e	fdd	Zdd
dZG dd dZG dd dZG dd deZG dd d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)*)Frame	Scrollbar)idleConf)
zoomheightZIconszcan't find icon directory (%r)c             C   s   t  }ddl}|tj| d}|  g }d }}x|D ]}tjtj|d }t||d}	|	|	 t
||	ddd}
|
j||d t
||d	}
|
j|d |d |d }|d
kr<|d }d}q<W ||_dS )z'Utility to display the available icons.r   Nz*.gif)filemaster   Zraised)imagebdZrelief)rowcolumn)text
      )ZTkglobospathjoinsortsplitextbasename
PhotoImageappendLabelgridimages)Zicondirrootr   listr   r   r   r   namer
   label r!   lib/python3.7/idlelib/tree.py	listicons%   s&    

r#   c             C   sR   t j| jdkt j| jdki}|| j r*dnd}|dkr<| jn|}|t|d dS )a6  Handle scrollwheel event.

    For wheel up, event.delta = 120*n on Windows, -1*n on darwin,
    where n can be > 1 if one scrolls fast.  Flicking the wheel
    generates up to maybe 20 events with n up to 10 or more 1.
    Macs use wheel down (delta = 1*n) to scroll up, so positive
    delta means to scroll up on both systems.

    X-11 sends Control-Button-4,5 events instead.

    The widget parameter is needed so browser label bindings can pass
    the underlying canvas.

    This function depends on widget.yview to not be overridden by
    a subclass.
    r         NZunitsbreak)	Z	EventTypeZ
MouseWheelZdeltaZButtonPressZnumtypewidgetyviewZSCROLL)eventr)   Zuplinesr!   r!   r"   wheel_event;   s    r-   c               @   s   e Zd Zdd Zd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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"d#Zd0d$d%Zd1d&d'Zd2d(d)ZdS )3TreeNodec             C   s:   || _ || _|| _d| _d| _g | _d  | _| _i | _d S )N	collapsedF)	canvasparentitemstateselectedchildrenxy
iconimages)selfr0   r1   r2   r!   r!   r"   __init__V   s    zTreeNode.__init__c             C   s6   x*| j d d  D ]}| j | |  qW d | _d S )N)r5   removedestroyr1   )r9   cr!   r!   r"   r<   `   s    zTreeNode.destroyc             C   sf   y
| j | S  tk
r   Y nX tj|\}}|p6d}tjt|| }t| j|d}|| j |< |S )Nz.gif)r   r   )	r8   KeyErrorr   r   r   r   ICONDIRr   r0   )r9   r   r   Zextfullnamer
   r!   r!   r"   geticonimagef   s    

zTreeNode.geticonimageNc             C   s:   | j r
d S |   d| _ | j| j |   |   d S )NT)r4   deselectallr0   deleteimage_iddrawicondrawtext)r9   r+   r!   r!   r"   selectr   s    zTreeNode.selectc             C   s2   | j s
d S d| _ | j| j |   |   d S )NF)r4   r0   rC   rD   rE   rF   )r9   r+   r!   r!   r"   deselect{   s    zTreeNode.deselectc             C   s   | j r| j   n|   d S )N)r1   rB   deselecttree)r9   r!   r!   r"   rB      s    zTreeNode.deselectallc             C   s*   | j r|   x| jD ]}|  qW d S )N)r4   rH   r5   rI   )r9   childr!   r!   r"   rI      s    zTreeNode.deselecttreec             C   s*   | j dkr|   n|   | j  dS )Nexpandedr'   )r3   collapseexpandr2   OnDoubleClick)r9   r+   r!   r!   r"   flip   s
    


zTreeNode.flipc             C   s2   | j  sd S | jdkr.d| _|   |   d S )NrK   )r2   _IsExpandabler3   updateview)r9   r+   r!   r!   r"   rM      s    

zTreeNode.expandc             C   s   | j dkrd| _ |   d S )Nr/   )r3   rQ   )r9   r+   r!   r!   r"   rL      s    
zTreeNode.collapsec             C   s   | j d }|  j d }|| }| jd}| j }| j|}||krV||krVd S | j| jd \}}}	}
||kr||kr|| | }n|}t||
 }| j| d S )Nr      r   scrollregion)r7   lastvisiblechildr0   ZcanvasyZwinfo_heightZ_getintsfloatZyview_moveto)r9   topZbottomZheightZvisible_topZvisible_heightZvisible_bottomx0y0x1y1Zfractionr!   r!   r"   rR      s    

zTreeNode.viewc             C   s&   | j r| jdkr| j d  S | S d S )NrK   )r5   r3   rU   )r9   r!   r!   r"   rU      s    zTreeNode.lastvisiblechildc             C   s   | j r| j   nj| jd }d| jd< | j  | jt | dd | jt\}}}}| jjdd||fd || jd< d S )NZcursorZwatch   r   r   )rT   )r1   rQ   r0   rC   ZALLdrawbbox	configure)r9   Z	oldcursorrX   rY   rZ   r[   r!   r!   r"   rQ      s    


zTreeNode.updatec             C   sx  d}|| | _ | _|   |   | jdkr4|| S | jsz| j }|sP|d S x(|D ] }| | j	| |}| j
| qVW |d }|| }d}	x| jD ]}|}	| j	j|d |d ||d dd |||}|j r|jdkrd	}
|j}n
d
}
|j}| |
}| j	j|d |	d |d}| j	|d| | j	|ddd  qW | j	j|d |d |d |	d dd}| j	| |S )N   rK   rS   r   	   r]   Zgray50)fillZ	minusnodeZplusnode)r
   z<1>z
<Double-1>c             S   s   d S )Nr!   )r6   r!   r!   r"   <lambda>       zTreeNode.draw.<locals>.<lambda>r   )r6   r7   rE   rF   r3   r5   r2   _GetSubList	__class__r0   r   Zcreate_liner^   rP   rL   rM   rA   create_imagetag_bindZ	tag_lower)r9   r6   r7   Zdysublistr2   rJ   ZcxZcyZcylastZiconnamecallbackr
   idr!   r!   r"   r^      sD    


"


zTreeNode.drawc             C   s~   | j r | j p| j pd}n| j p,d}| |}| jj| j| jd|d}|| _	| j
|d| j | j
|d| j d S )NZ
openfolderZfoldernw)anchorr
   z<1>z
<Double-1>)r4   r2   GetSelectedIconNameGetIconNamerA   r0   rh   r6   r7   rD   ri   rG   rO   )r9   Z	imagenamer
   rl   r!   r!   r"   rE      s    


zTreeNode.drawiconc          
      s   j d d } jd } j }|r jj||d|d} j|d j  j|d j  j	|\}}}}t
|dd	 } j pd
}	y
 j W n tk
r   Y n
X    y
 j W n* tk
r   t j|	dddd _Y nX t }
 jr jt|
d n jt|
d  jj||d jd} jd j  jd j  jd fdd  jd fdd  jd fdd | _d S )Nra   r	   r$   rm   )rn   r   z<1>z
<Double-1>   r   z	<no text>r   r   )r   r   ZpadxZpadyZhiliteZnormal)rn   Zwindowz<MouseWheel>c                s   t |  jS )N)r-   r0   )e)r9   r!   r"   rd     re   z#TreeNode.drawtext.<locals>.<lambda>z
<Button-4>c                s   t |  jS )N)r-   r0   )rr   )r9   r!   r"   rd      re   z
<Button-5>c                s   t |  jS )N)r-   r0   )rr   )r9   r!   r"   rd   !  re   )r6   r7   r2   GetLabelTextr0   Zcreate_textri   rG   rO   r_   maxGetTextentryAttributeErroredit_finishr    r   r   ZCurrentThemer4   r`   ZGetHighlightZcreate_windowbindselect_or_editZtext_id)r9   ZtextxZtextyZ	labeltextrl   rX   rY   rZ   r[   r   Zthemer!   )r9   r"   rF      s@    




zTreeNode.drawtextc             C   s*   | j r| j r| | n
| | d S )N)r4   r2   
IsEditableeditrG   )r9   r+   r!   r!   r"   rz   $  s    zTreeNode.select_or_editc             C   sr   t | jdddd| _| jd| jd  | jdt | jjdd | j  | jd| j	 | jd| j
 d S )	Nr   r	   )r   highlightthicknesswidthr   r&   )Zipadxz<Return>z<Escape>)ZEntryr    rv   insertZselection_rangeZENDpack	focus_setry   rx   edit_cancel)r9   r+   r!   r!   r"   r|   *  s    
zTreeNode.editc             C   s|   y| j }| ` W n tk
r"   d S X | }|  |rR|| j krR| j| | j }|| jd< |   | j	
  d S )Nr   )rv   rw   getr<   r2   ru   SetTextr    rF   r0   r   )r9   r+   rv   r   r!   r!   r"   rx   3  s    

zTreeNode.edit_finishc             C   sB   y| j }| ` W n tk
r"   d S X |  |   | j  d S )N)rv   rw   r<   rF   r0   r   )r9   r+   rv   r!   r!   r"   r   B  s    zTreeNode.edit_cancel)N)N)N)N)N)N)N)N)N)__name__
__module____qualname__r:   r<   rA   rG   rH   rB   rI   rO   rM   rL   rR   rU   rQ   r^   rE   rF   rz   r|   rx   r   r!   r!   r!   r"   r.   T   s(   

	



*%

	
r.   c               @   st   e Zd ZdZdd Zdd Zdd 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 )TreeItemzAbstract class representing tree items.

    Methods should typically be overridden, otherwise a default action
    is used.

    c             C   s   dS )z)Constructor.  Do whatever you need to do.Nr!   )r9   r!   r!   r"   r:   V  s    zTreeItem.__init__c             C   s   dS )zReturn text string to display.Nr!   )r9   r!   r!   r"   ru   Y  s    zTreeItem.GetTextc             C   s   dS )z>Return label text string to display in front of text (if any).Nr!   )r9   r!   r!   r"   rs   \  s    zTreeItem.GetLabelTextNc             C   s   | j dkr|  | _ | j S )z%Do not override!  Called by TreeNode.N)
expandableIsExpandable)r9   r!   r!   r"   rP   a  s    

zTreeItem._IsExpandablec             C   s   dS )z"Return whether there are subitems.r	   r!   )r9   r!   r!   r"   r   g  s    zTreeItem.IsExpandablec             C   s"   |   sg S |  }|sd| _|S )z%Do not override!  Called by TreeNode.r   )r   
GetSubListr   )r9   rj   r!   r!   r"   rf   k  s    zTreeItem._GetSubListc             C   s   dS )z-Return whether the item's text may be edited.Nr!   )r9   r!   r!   r"   r{   t  s    zTreeItem.IsEditablec             C   s   dS )z+Change the item's text (if it is editable).Nr!   )r9   r   r!   r!   r"   r   w  s    zTreeItem.SetTextc             C   s   dS )z-Return name of icon to be displayed normally.Nr!   )r9   r!   r!   r"   rp   z  s    zTreeItem.GetIconNamec             C   s   dS )z2Return name of icon to be displayed when selected.Nr!   )r9   r!   r!   r"   ro   }  s    zTreeItem.GetSelectedIconNamec             C   s   dS )z%Return list of items forming sublist.Nr!   )r9   r!   r!   r"   r     s    zTreeItem.GetSubListc             C   s   dS )z%Called on a double-click on the item.Nr!   )r9   r!   r!   r"   rN     s    zTreeItem.OnDoubleClick)r   r   r   __doc__r:   ru   rs   r   rP   r   rf   r{   r   rp   ro   r   rN   r!   r!   r!   r"   r   M  s   	r   c               @   sH   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d Z
dS )FileTreeItemz4Example TreeItem subclass -- browse the file system.c             C   s
   || _ d S )N)r   )r9   r   r!   r!   r"   r:     s    zFileTreeItem.__init__c             C   s   t j| jp| jS )N)r   r   r   )r9   r!   r!   r"   ru     s    zFileTreeItem.GetTextc             C   s   t j| jdkS )N )r   r   r   )r9   r!   r!   r"   r{     s    zFileTreeItem.IsEditablec             C   sl   t j| j}t j||}t j|t j| jkr:d S yt | j| || _W n tk
rf   Y nX d S )N)r   r   dirnamer   renameOSError)r9   r   newpathr!   r!   r"   r     s    
zFileTreeItem.SetTextc             C   s   |   sdS d S )NZpython)r   )r9   r!   r!   r"   rp     s    zFileTreeItem.GetIconNamec             C   s   t j| jS )N)r   r   isdir)r9   r!   r!   r"   r     s    zFileTreeItem.IsExpandablec             C   sj   yt | j}W n tk
r$   g S X |jt jjd g }x*|D ]"}tt j| j|}|| q@W |S )N)key)	r   listdirr   r   r   normcaser   r   r   )r9   namesrj   r   r2   r!   r!   r"   r     s    
zFileTreeItem.GetSubListN)r   r   r   r   r:   ru   r{   r   rp   r   r   r!   r!   r!   r"   r     s   r   c               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )ScrolledCanvasc             K   sh  d|krd|d< || _ t|| _| jjddd | jjddd t| jf|| _| jjdddd t| jdd	| _	| j	jddd
d t| jddd| _
| j
jdddd | j	j| jd< | jj| j	d< | j
j| jd< | jj| j
d< | jd| j | jd| j | jd| j | jd| j | jdt | jdt | jdt | jd| j | j  d S )NZyscrollincrementrS   r   r	   )ZweightZnsew)r   r   Zstickyvbar)r   ZnsehbarZ
horizontal)r   ZorientZewsZyscrollcommandZcommandZxscrollcommandz<Key-Prior>z
<Key-Next>z<Key-Up>z
<Key-Down>z<MouseWheel>z
<Button-4>z
<Button-5>z<Alt-Key-2>)r   r   frameZrowconfigureZcolumnconfigureZCanvasr0   r   r   r   r   setr*   Zxviewry   page_up	page_downunit_up	unit_downr-   zoom_heightr   )r9   r   Zoptsr!   r!   r"   r:     s2    
zScrolledCanvas.__init__c             C   s   | j dd dS )Nr\   pager'   )r0   yview_scroll)r9   r+   r!   r!   r"   r     s    zScrolledCanvas.page_upc             C   s   | j dd dS )Nr	   r   r'   )r0   r   )r9   r+   r!   r!   r"   r     s    zScrolledCanvas.page_downc             C   s   | j dd dS )Nr\   unitr'   )r0   r   )r9   r+   r!   r!   r"   r     s    zScrolledCanvas.unit_upc             C   s   | j dd dS )Nr	   r   r'   )r0   r   )r9   r+   r!   r!   r"   r     s    zScrolledCanvas.unit_downc             C   s   t | j dS )Nr'   )r   r   r   )r9   r+   r!   r!   r"   r     s    zScrolledCanvas.zoom_heightN)	r   r   r   r:   r   r   r   r   r   r!   r!   r!   r"   r     s   r   c             C   s   t | }tt|  ddd  \}}|d|d |d f  t|dddd}|jjdd	td
 t	t
}t|jd |}|  d S )N+r	   z+%d+%d2      Zwhiter   )Zbgr}   Z	takefocusZboth)rM   rc   Zside)ZToplevelmapintZgeometrysplitr   r   r   ZLEFTr   r?   r.   r0   rM   )r1   rW   r6   r7   Zscr2   Znoder!   r!   r"   _tree_widget  s     r   __main__)mainzidlelib.idle_test.test_treer   F)	verbosityexit)run)N)r   ZtkinterZtkinter.ttkr   r   Zidlelib.configr   Zidlelibr   r?   r   r   r   __file__Z_icondir	NameErrorr   RuntimeErrorr#   r-   r.   r   r   r   r   r   Zunittestr   Zidlelib.idle_test.htestr   r!   r!   r!   r"   <module>   s4   

 z<..

