B
    Ç S]ø:  ã               @   s&  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¡r‚eZ	ne j
 e	¡sœede	f ƒ‚e	f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               @   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)Úselfr&   r'   r(   r!   r!   r"   Ú__init__>   s    zTreeNode.__init__c             C   s6   x*| j d d … D ]}| j  |¡ | ¡  qW d | _d S )N)r+   ÚremoveÚdestroyr'   )r/   Úcr!   r!   r"   r2   H   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   )	r.   ÚKeyErrorr   r   r   r   ÚICONDIRr   r&   )r/   r   r   ZextÚfullnamer
   r!   r!   r"   ÚgeticonimageN   s    

zTreeNode.geticonimageNc             C   s:   | j r
d S |  ¡  d| _ | j | j¡ |  ¡  |  ¡  d S )NT)r*   Údeselectallr&   ÚdeleteÚimage_idÚdrawiconÚdrawtext)r/   Úeventr!   r!   r"   ÚselectZ   s    zTreeNode.selectc             C   s2   | j s
d S d| _ | j | j¡ |  ¡  |  ¡  d S )NF)r*   r&   r9   r:   r;   r<   )r/   r=   r!   r!   r"   Údeselectc   s    zTreeNode.deselectc             C   s   | j r| j  ¡  n|  ¡  d S )N)r'   r8   Údeselecttree)r/   r!   r!   r"   r8   k   s    zTreeNode.deselectallc             C   s*   | j r|  ¡  x| jD ]}| ¡  qW d S )N)r*   r?   r+   r@   )r/   Úchildr!   r!   r"   r@   q   s    zTreeNode.deselecttreec             C   s*   | j dkr|  ¡  n|  ¡  | j ¡  dS )NÚexpandedÚbreak)r)   ÚcollapseÚexpandr(   ÚOnDoubleClick)r/   r=   r!   r!   r"   Úflipw   s
    


zTreeNode.flipc             C   s2   | j  ¡ sd S | jdkr.d| _|  ¡  |  ¡  d S )NrB   )r(   Ú_IsExpandabler)   ÚupdateÚview)r/   r=   r!   r!   r"   rE      s    

zTreeNode.expandc             C   s   | j dkrd| _ |  ¡  d S )Nr%   )r)   rI   )r/   r=   r!   r!   r"   rD   ‡   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)r-   Úlastvisiblechildr&   ZcanvasyZwinfo_heightZ_getintsÚfloatZyview_moveto)r/   ÚtopZbottomZheightZvisible_topZvisible_heightZvisible_bottomÚx0Úy0Úx1Úy1Zfractionr!   r!   r"   rJ   Œ   s    

zTreeNode.viewc             C   s&   | j r| jdkr| j d  ¡ S | S d S )NrB   éÿÿÿÿ)r+   r)   rM   )r/   r!   r!   r"   rM      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   )rL   )r'   rI   r&   r9   ZALLÚdrawÚbboxÚ	configure)r/   Z	oldcursorrP   rQ   rR   rS   r!   r!   r"   rI   £   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rìd	}
|j}n
d
}
|j}|  |
¡}| j	j|d |	d |d}| j	 |d|¡ | j	 |ddd„ ¡ q–W | j	j|d |d |d |	d dd}| j	 |¡ |S )Né   rB   rK   r   é	   rU   Zgray50)ÚfillZ	minusnodeZplusnode)r
   z<1>z
<Double-1>c             S   s   d S )Nr!   )r,   r!   r!   r"   Ú<lambda>Ó   ó    zTreeNode.draw.<locals>.<lambda>r   )r,   r-   r;   r<   r)   r+   r(   Ú_GetSubListÚ	__class__r&   r   Zcreate_linerV   rH   rD   rE   r7   Úcreate_imageÚtag_bindZ	tag_lower)r/   r,   r-   ZdyÚsublistr(   rA   ZcxZcyZcylastZiconnameÚcallbackr
   Úidr!   r!   r"   rV   °   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>)r*   r(   ÚGetSelectedIconNameÚGetIconNamer7   r&   r`   r,   r-   r:   ra   r>   rG   )r/   Z	imagenamer
   rd   r!   r!   r"   r;   Ú   s    


zTreeNode.drawiconc          
   C   sf  | j d d }| jd }| j ¡ }|r€| jj||d|d}| j |d| j¡ | j |d| j¡ | j 	|¡\}}}}t
|dƒd	 }| j ¡ pŒd
}	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¡ || _d S )NrY   r	   é   re   )rf   r   z<1>z
<Double-1>éÈ   r   z	<no text>r   r   )r   r   ZpadxZpadyZhiliteZnormal)rf   Zwindow)r,   r-   r(   ÚGetLabelTextr&   Zcreate_textra   r>   rG   rW   ÚmaxÚGetTextÚentryÚAttributeErrorÚedit_finishr    r   r   ZCurrentThemer*   rX   ZGetHighlightZcreate_windowÚbindÚselect_or_editZtext_id)r/   ZtextxZtextyZ	labeltextrd   rP   rQ   rR   rS   r   Zthemer!   r!   r"   r<   ç   s:    




zTreeNode.drawtextc             C   s*   | j r| j ¡ r|  |¡ n
|  |¡ d S )N)r*   r(   Ú
IsEditableÚeditr>   )r/   r=   r!   r!   r"   rr   	  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   é   )Zipadxz<Return>z<Escape>)ZEntryr    rn   ÚinsertZselection_rangeZENDÚpackÚ	focus_setrq   rp   Úedit_cancel)r/   r=   r!   r!   r"   rt     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   )rn   ro   Úgetr2   r(   rm   ÚSetTextr    r<   r&   rz   )r/   r=   rn   r   r!   r!   r"   rp     s    

zTreeNode.edit_finishc             C   sB   y| j }| ` W n tk
r"   d S X | ¡  |  ¡  | j ¡  d S )N)rn   ro   r2   r<   r&   rz   )r/   r=   rn   r!   r!   r"   r{   '  s    zTreeNode.edit_cancel)N)N)N)N)N)N)N)N)N)Ú__name__Ú
__module__Ú__qualname__r0   r2   r7   r>   r?   r8   r@   rG   rE   rD   rJ   rM   rI   rV   r;   r<   rr   rt   rp   r{   r!   r!   r!   r"   r$   <   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 )ÚTreeItemz‚Abstract 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!   )r/   r!   r!   r"   r0   ;  s    zTreeItem.__init__c             C   s   dS )zReturn text string to display.Nr!   )r/   r!   r!   r"   rm   >  s    zTreeItem.GetTextc             C   s   dS )z>Return label text string to display in front of text (if any).Nr!   )r/   r!   r!   r"   rk   A  s    zTreeItem.GetLabelTextNc             C   s   | j dkr|  ¡ | _ | j S )z%Do not override!  Called by TreeNode.N)Ú
expandableÚIsExpandable)r/   r!   r!   r"   rH   F  s    

zTreeItem._IsExpandablec             C   s   dS )z"Return whether there are subitems.r	   r!   )r/   r!   r!   r"   rƒ   L  s    zTreeItem.IsExpandablec             C   s"   |   ¡ sg S |  ¡ }|sd| _|S )z%Do not override!  Called by TreeNode.r   )rƒ   Ú
GetSubListr‚   )r/   rb   r!   r!   r"   r^   P  s    zTreeItem._GetSubListc             C   s   dS )z-Return whether the item's text may be edited.Nr!   )r/   r!   r!   r"   rs   Y  s    zTreeItem.IsEditablec             C   s   dS )z+Change the item's text (if it is editable).Nr!   )r/   r   r!   r!   r"   r}   \  s    zTreeItem.SetTextc             C   s   dS )z-Return name of icon to be displayed normally.Nr!   )r/   r!   r!   r"   rh   _  s    zTreeItem.GetIconNamec             C   s   dS )z2Return name of icon to be displayed when selected.Nr!   )r/   r!   r!   r"   rg   b  s    zTreeItem.GetSelectedIconNamec             C   s   dS )z%Return list of items forming sublist.Nr!   )r/   r!   r!   r"   r„   e  s    zTreeItem.GetSubListc             C   s   dS )z%Called on a double-click on the item.Nr!   )r/   r!   r!   r"   rF   h  s    zTreeItem.OnDoubleClick)r~   r   r€   Ú__doc__r0   rm   rk   r‚   rH   rƒ   r^   rs   r}   rh   rg   r„   rF   r!   r!   r!   r"   r   2  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   )r/   r   r!   r!   r"   r0   r  s    zFileTreeItem.__init__c             C   s   t j | j¡p| jS )N)r   r   r   )r/   r!   r!   r"   rm   u  s    zFileTreeItem.GetTextc             C   s   t j | j¡dkS )NÚ )r   r   r   )r/   r!   r!   r"   rs   x  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)r/   r   Únewpathr!   r!   r"   r}   {  s    
zFileTreeItem.SetTextc             C   s   |   ¡ sdS d S )NZpython)rƒ   )r/   r!   r!   r"   rh   †  s    zFileTreeItem.GetIconNamec             C   s   t j | j¡S )N)r   r   Úisdir)r/   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   )r/   Únamesrb   r   r(   r!   r!   r"   r„     s    
zFileTreeItem.GetSubListN)r~   r   r€   r…   r0   rm   rs   r}   rh   rƒ   r„   r!   r!   r!   r"   r†   n  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   s>  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| j¡ | j ¡  d S )NZyscrollincrementrK   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<Alt-Key-2>)r   r   ÚframeZrowconfigureZcolumnconfigureZCanvasr&   r   r   r’   r“   ÚsetZyviewZxviewrq   Úpage_upÚ	page_downÚunit_upÚ	unit_downÚzoom_heightrz   )r/   r   Zoptsr!   r!   r"   r0     s,    
zScrolledCanvas.__init__c             C   s   | j  dd¡ dS )NrT   ÚpagerC   )r&   Úyview_scroll)r/   r=   r!   r!   r"   r–   µ  s    zScrolledCanvas.page_upc             C   s   | j  dd¡ dS )Nr	   r›   rC   )r&   rœ   )r/   r=   r!   r!   r"   r—   ¸  s    zScrolledCanvas.page_downc             C   s   | j  dd¡ dS )NrT   ÚunitrC   )r&   rœ   )r/   r=   r!   r!   r"   r˜   »  s    zScrolledCanvas.unit_upc             C   s   | j  dd¡ dS )Nr	   r   rC   )r&   rœ   )r/   r=   r!   r!   r"   r™   ¾  s    zScrolledCanvas.unit_downc             C   s   t  | j¡ dS )NrC   )r   rš   r   )r/   r=   r!   r!   r"   rš   Á  s    zScrolledCanvas.zoom_heightN)	r~   r   r€   r0   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+%dé2   é¯   Zwhiter   )Zbgru   Z	takefocusZboth)rE   r[   Zside)ZToplevelÚmapÚintZgeometryÚsplitr‘   r”   ry   ZLEFTr†   r5   r$   r&   rE   )r'   rO   r,   r-   Zscr(   Znoder!   r!   r"   Ú_tree_widgetÆ  s     r¤   Ú__main__)Úmainzidlelib.idle_test.test_treer   F)Ú	verbosityÚexit)Úrun)r   ZtkinterZtkinter.ttkr   r   Zidlelib.configr   Zidlelibr   r5   r   r   rˆ   Ú__file__Z_icondirÚ	NameErrorrŒ   ÚRuntimeErrorr#   r$   r   r†   r‘   r¤   r~   Zunittestr¦   Zidlelib.idle_test.htestr©   r!   r!   r!   r"   Ú<module>   s2   
 w<.*

