
\[\                 @   s  d  Z  d d l Z d d l Z d d l Z d d l m Z d d l m Z d d l m	 Z	 m
 Z
 m Z d d l m Z Gd d   d  Z Gd	 d
   d
 e
  Z Gd d   d e
  Z Gd d   d e
  Z d d   Z e d k r d d l m Z e e  n  d S)a  Class browser.

XXX TO DO:

- reparse when source changed (maybe just a button would be OK?)
    (or recheck on window popup)
- add popup menu with more options (e.g. doc strings, base classes, imports)
- show function argument list? (have to do pattern matching on source)
- should the classes and methods lists also be in the module's menu bar?
- add base classes to class browser tree
    N)PyShell)ListedToplevel)TreeNodeTreeItemScrolledCanvas)idleConfc               @   sR   e  Z d  Z d d d  Z d d d  Z d d   Z d	 d
   Z d d   Z d S)ClassBrowserFc             C   sF   | |  _  t j j | d |  j  d  |  _ | |  _ |  j |  d S)zH
        _htest - bool, change box when location running htest.
        r   z.pyN)nameospathjoinfile_htestinit)selfflistr	   r   r    r   */usr/lib/python3.4/idlelib/ClassBrowser.py__init__   s    	#	zClassBrowser.__init__Nc             C   s   |  j  j   |  j j   d  S)N)topZdestroynode)r   Zeventr   r   r   close#   s    zClassBrowser.closec             C   sA  | |  _  t j j   t | j  |  _ } | j d |  j  | j	 d |  j  |  j
 r | j d | j j   | j j   d f  n  |  j   | j   t j d d d  } t j | d  d	 } t | d
 | d d d d } | j j d d d d  |  j   } t | j d  |  |  _ } | j   | j   d  S)NZWM_DELETE_WINDOWz<Escape>z+%d+%d   mainZThemer	   Znormal
backgroundZbgZhighlightthicknessr   Z	takefocus   expandZfillZboth)r   pyclbrZ_modulesclearr   rootr   Zprotocolr   Zbindr   ZgeometryZwinfo_rootxZwinfo_rootysettitleZ	focus_setr   Z	GetOptionZGetHighlightr   ZframeZpackrootnoder   Zcanvasr   updater   )r   r   r   Zthemer   Zscitemr   r   r   r   r   '   s$    			'


zClassBrowser.initc             C   s+   |  j  j d |  j  |  j  j d  d  S)NzClass Browser - zClass Browser)r   Zwm_titler	   Zwm_iconname)r   r   r   r   r    >   s    zClassBrowser.settitlec             C   s   t  |  j  S)N)ModuleBrowserTreeItemr   )r   r   r   r   r!   B   s    zClassBrowser.rootnode)__name__
__module____qualname__r   r   r   r    r!   r   r   r   r   r      s
   r   c               @   sd   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 S)r$   c             C   s   | |  _  d  S)N)r   )r   r   r   r   r   r   G   s    zModuleBrowserTreeItem.__init__c             C   s   t  j j |  j  S)N)r
   r   basenamer   )r   r   r   r   GetTextJ   s    zModuleBrowserTreeItem.GetTextc             C   s   d S)Npythonr   )r   r   r   r   GetIconNameM   s    z!ModuleBrowserTreeItem.GetIconNamec             C   sF   g  } x9 |  j    D]+ } t | |  j |  j  } | j |  q W| S)N)listclassesClassBrowserTreeItemclassesr   append)r   sublistr	   r#   r   r   r   
GetSubListP   s
    z ModuleBrowserTreeItem.GetSubListc             C   sY   t  j j |  j d d    d k r) d  St  j j |  j  sB d  St j j |  j  d  S)N   z.py)r
   r   normcaser   existsr   r   open)r   r   r   r   OnDoubleClickW   s
    %z#ModuleBrowserTreeItem.OnDoubleClickc             C   s#   t  j j |  j d d    d k S)Nr2   z.pyr3   )r
   r   r4   r   )r   r   r   r   IsExpandable^   s    z"ModuleBrowserTreeItem.IsExpandablec             C   s  t  j j |  j  \ } } t  j j |  \ } } t  j j |  d k rO g  Sy  t j | | g t j  } Wn t	 k
 r g  SYn Xg  } i  |  _
 x | j   D] \ } } | j | k r | }	 t | d  rp| j rpg  }
 xp | j D]e } t |  t d  k r| } n1 | j } | j | j k rEd | j | f } n  |
 j |  q W|	 d d j |
  }	 n  | j | j |	 f  | |  j
 |	 <q q W| j   g  } x! | D] \ } }	 | j |	  qW| S)Nz.pysuper z%s.%sz(%s)z, )r
   r   splitr   splitextr4   r   Zreadmodule_exsysImportErrorr.   itemsmodulehasattrr9   typer	   r/   r   linenosort)r   dirr   r	   Zextdictr?   keyclsZsupersZsupZsnamelistr#   r   r   r   r,   a   s<     				
z!ModuleBrowserTreeItem.listclassesN)
r%   r&   r'   r   r)   r+   r1   r7   r8   r,   r   r   r   r   r$   E   s   r$   c               @   sd   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 S)r-   c             C   sr   | |  _  | |  _ | |  _ y |  j |  j  |  _ Wn! t t f k
 rU d  |  _ Yn Xt |  j t j  |  _	 d  S)N)
r	   r.   r   rH   
IndexErrorKeyError
isinstancer   ZFunction
isfunction)r   r	   r.   r   r   r   r   r      s    			zClassBrowserTreeItem.__init__c             C   s'   |  j  r d |  j d Sd |  j Sd  S)Nzdef z(...)zclass )rN   r	   )r   r   r   r   r)      s    	zClassBrowserTreeItem.GetTextc             C   s   |  j  r d Sd Sd  S)Nr*   Zfolder)rN   )r   r   r   r   r+      s    	z ClassBrowserTreeItem.GetIconNamec             C   s9   |  j  r5 y |  j  j SWq5 t k
 r1 d SYq5 Xn  d  S)NF)rH   methodsAttributeError)r   r   r   r   r8      s
    	z!ClassBrowserTreeItem.IsExpandablec             C   sS   |  j  s g  Sg  } x9 |  j   D]+ } t | |  j  |  j  } | j |  q  W| S)N)rH   listmethodsMethodBrowserTreeItemr   r/   )r   r0   r	   r#   r   r   r   r1      s    	zClassBrowserTreeItem.GetSubListc             C   s`   t  j j |  j  s d  St j j |  j  } t |  j d  r\ |  j j	 } | j
 |  n  d  S)NrC   )r
   r   r5   r   r   r   r6   rA   rH   rC   gotoline)r   editrC   r   r   r   r7      s    z"ClassBrowserTreeItem.OnDoubleClickc             C   s   |  j  s g  Sg  } x3 |  j  j j   D] \ } } | j | | f  q& W| j   g  } x! | D] \ } } | j |  q` W| S)N)rH   rO   r?   r/   rD   )r   r?   r	   rC   rJ   r#   r   r   r   rQ      s    	
z ClassBrowserTreeItem.listmethodsN)
r%   r&   r'   r   r)   r+   r8   r1   r7   rQ   r   r   r   r   r-      s   
	r-   c               @   sL   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d S)rR   c             C   s   | |  _  | |  _ | |  _ d  S)N)r	   rH   r   )r   r	   rH   r   r   r   r   r      s    		zMethodBrowserTreeItem.__init__c             C   s   d |  j  d S)Nzdef z(...))r	   )r   r   r   r   r)      s    zMethodBrowserTreeItem.GetTextc             C   s   d S)Nr*   r   )r   r   r   r   r+      s    z!MethodBrowserTreeItem.GetIconNamec             C   s   d S)Nr   r   )r   r   r   r   r8      s    z"MethodBrowserTreeItem.IsExpandablec             C   sL   t  j j |  j  s d  St j j |  j  } | j |  j j	 |  j
  d  S)N)r
   r   r5   r   r   r   r6   rS   rH   rO   r	   )r   rT   r   r   r   r7      s    z#MethodBrowserTreeItem.OnDoubleClickN)r%   r&   r'   r   r)   r+   r8   r7   r   r   r   r   rR      s
   rR   c             C   s   y
 t  } WnO t k
 r[ t j d } t j d d   rJ t j d } n t j d } Yn Xt j j |  \ } } t j j |  d } t j	 |   } t
 | | | g d d |  j   d  S)Nr   r   r   T)__file__	NameErrorr=   argvr
   r   r;   r<   r   ZPyShellFileListr   Zmainloop)parentr   rE   r	   r   r   r   r   _class_browser   s    
rY   __main__)run)__doc__r
   r=   r   Zidlelibr   Zidlelib.WindowListr   Zidlelib.TreeWidgetr   r   r   Zidlelib.configHandlerr   r   r$   r-   rR   rY   r%   Zidlelib.idle_test.htestr[   r   r   r   r   <module>   s   /=<