B
    ^ Çcå?  ã               @   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¡r‚eZ	ne j
 e	¡sœe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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é   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 ¡ 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¡ ˆ 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 )Ú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!   )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+%dé2   é¯   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<..

