
WW                 @   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 d a 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  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   sX   | s t  j j a | |  _ t j j | d |  j d  |  _ | |  _	 |  j
 |  d S)zH
        _htest - bool, change box when location running htest.
        r   z.pyN)r   flistopen	file_opennameospathjoinfile_htestinit)selfr	   r   r   r    r   A/afs/.cs/s/python-3.5.2/amd64_ubu14/lib/python3.5/ClassBrowser.py__init__   s    	#	zClassBrowser.__init__Nc             C   s   |  j  j   |  j j   d  S)N)topZdestroynode)r   eventr   r   r   close)   s    zClassBrowser.closec             C   s5  | |  _  t j j   t | j  |  _ } | j d |  j  | j	 d |  j  |  j
 r | j d | j j   | j j   d f  |  j   | j   t j   } 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   Znormal
backgroundbgZhighlightthicknessr   Z	takefocus   expandfillZboth)r	   pyclbrZ_modulesclearr   rootr   protocolr   bindr   ZgeometryZwinfo_rootxZwinfo_rootysettitleZ	focus_setr   ZCurrentThemeZGetHighlightr   frame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&   D   s    zClassBrowser.settitlec             C   s   t  |  j  S)N)ModuleBrowserTreeItemr   )r   r   r   r   r)   H   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   M   s    zModuleBrowserTreeItem.__init__c             C   s   t  j j |  j  S)N)r   r   basenamer   )r   r   r   r   GetTextP   s    zModuleBrowserTreeItem.GetTextc             C   s   d S)Npythonr   )r   r   r   r   GetIconNameS   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   
GetSubListV   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	   r
   )r   r   r   r   OnDoubleClick]   s
    %z#ModuleBrowserTreeItem.OnDoubleClickc             C   s#   t  j j |  j d d    d k S)Nr:   z.pyr;   )r   r   r<   r   )r   r   r   r   IsExpandabled   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  rj| j rjg  }
 xm | j D]b } t |  t d  k r| } n. | j } | j | j k rBd | j | f } |
 j |  q W|	 d d j |
  }	 | j | j |	 f  | |  j
 |	 <q W| j   g  } x! | D] \ } }	 | j |	  qW| S)Nz.pysuper z%s.%sz(%s)z, )r   r   splitr   splitextr<   r!   Zreadmodule_exsysImportErrorr6   itemsmodulehasattrr@   typer   r7   r   linenosort)r   dirr   r   extdictrF   keyclsZsuperssupZsnamelistr+   r   r   r   r4   g   s<     				
z!ModuleBrowserTreeItem.listclassesN)
r-   r.   r/   r   r1   r3   r9   r>   r?   r4   r   r   r   r   r,   K   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)r5   c             C   sr   | |  _  | |  _ | |  _ y |  j |  j  |  _ Wn! t t f k
 rU d  |  _ Yn Xt |  j t j  |  _	 d  S)N)
r   r6   r   rP   
IndexErrorKeyError
isinstancer!   ZFunction
isfunction)r   r   r6   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 )rW   r   )r   r   r   r   r1      s    	zClassBrowserTreeItem.GetTextc             C   s   |  j  r d Sd Sd  S)Nr2   Zfolder)rW   )r   r   r   r   r3      s    	z ClassBrowserTreeItem.GetIconNamec             C   s6   |  j  r2 y |  j  j SWn t k
 r1 d SYn Xd  S)NF)rP   methodsAttributeError)r   r   r   r   r?      s
    	z!ClassBrowserTreeItem.IsExpandablec             C   sS   |  j  s g  Sg  } x9 |  j   D]+ } t | |  j  |  j  } | j |  q  W| S)N)rP   listmethodsMethodBrowserTreeItemr   r7   )r   r8   r   r+   r   r   r   r9      s    	zClassBrowserTreeItem.GetSubListc             C   sW   t  j j |  j  s d  St |  j  } t |  j d  rS |  j j } | j |  d  S)NrJ   )	r   r   r=   r   r   rH   rP   rJ   gotoline)r   editrJ   r   r   r   r>      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)rP   rX   rF   r7   rK   )r   rF   r   rJ   rS   r+   r   r   r   rZ      s    	
z ClassBrowserTreeItem.listmethodsN)
r-   r.   r/   r   r1   r3   r?   r9   r>   rZ   r   r   r   r   r5      s   
	r5   c               @   sL   e  Z 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   rP   r   )r   r   rP   r   r   r   r   r      s    		zMethodBrowserTreeItem.__init__c             C   s   d |  j  d S)Nzdef z(...))r   )r   r   r   r   r1      s    zMethodBrowserTreeItem.GetTextc             C   s   d S)Nr2   r   )r   r   r   r   r3      s    z!MethodBrowserTreeItem.GetIconNamec             C   s   d S)Nr   r   )r   r   r   r   r?      s    z"MethodBrowserTreeItem.IsExpandablec             C   sF   t  j j |  j  s d  St |  j  } | j |  j j |  j  d  S)N)	r   r   r=   r   r   r\   rP   rX   r   )r   r]   r   r   r   r>      s    z#MethodBrowserTreeItem.OnDoubleClickN)r-   r.   r/   r   r1   r3   r?   r>   r   r   r   r   r[      s
   r[   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	 |   } | j
 a t | | | g d d d  S)Nr   r   r   T)__file__	NameErrorrD   argvr   r   rB   rC   r   ZPyShellFileListr
   r   r   )parentr   rL   r   r	   r   r   r   _class_browser   s    
	rb   __main__)run)__doc__r   rD   r!   Zidlelibr   Zidlelib.WindowListr   Zidlelib.TreeWidgetr   r   r   Zidlelib.configHandlerr   r   r   r,   r5   r[   rb   r-   Zidlelib.idle_test.htestrd   r   r   r   r   <module>   s    2=<