B ý¤§ÇÙ:¬Vã@s0ddlZddlTddlmZmZddlmZddlmZdZ yej   ej   e ¡e ¡ZWnek rne ZYnXej  e¡r‚eZ nej  e ¡sœede fƒ‚e fdd „Zdd d „ZGd d „d ƒZGdd„dƒZGdd„deƒZGdd„dƒZdd„Zedkr,ddlmZeddddddlmZeeƒdS)éN)Ú*)ÚFrameÚ Scrollbar)ÚidleConf)Ú zoomheightZIconszcan't find icon directory (%r)c CsÔtƒ}ddl}| tj |d¡¡}| ¡g}d}}x’|D]Š}tj tj |¡¡d}t||d} |  | ¡t || ddd} | j ||dt ||d } | j |d|d|d}|d kr<|d }d}q 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ééûÿÿÿéNZunitsÚbreak) Z EventTypeZ MouseWheelZdeltaZ ButtonPressZnumÚtypeÚwidgetÚyviewZSCROLL)Úeventr)ZupÚlinesr!r!r"Ú wheel_event;s  r-c@s¾eZdZdd„Zdd„Zdd„Zd*dd „Zd+d d „Zd d „Zdd„Z d,dd„Z d-dd„Z d.dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd d!„Zd/d"d#„Zd0d$d%„Zd1d&d'„Zd2d(d)„ZdS)3ÚTreeNodecCs:||_||_||_d|_d|_g|_d|_|_i|_dS)NÚ collapsedF) ÚcanvasÚparentÚitemÚstateÚselectedÚchildrenÚxÚyÚ iconimages)Úselfr0r1r2r!r!r"Ú__init__Vs zTreeNode.__init__cCs6x*|jdd…D]}|j |¡| ¡qWd|_dS)N)r5ÚremoveÚdestroyr1)r9Úcr!r!r"r<`s  zTreeNode.destroycCsfy |j|Stk rYnXtj |¡\}}|p6d}tj t||¡}t|j|d}||j|<|S)Nz.gif)rr) r8ÚKeyErrorrrrrÚICONDIRrr0)r9rrZextÚfullnamer r!r!r"Ú geticonimagefs  zTreeNode.geticonimageNcCs:|jr dS| ¡d|_|j |j¡| ¡| ¡dS)NT)r4Ú deselectallr0ÚdeleteÚimage_idÚdrawiconÚdrawtext)r9r+r!r!r"ÚselectrszTreeNode.selectcCs2|js dSd|_|j |j¡| ¡| ¡dS)NF)r4r0rCrDrErF)r9r+r!r!r"Údeselect{s zTreeNode.deselectcCs|jr|j ¡n| ¡dS)N)r1rBÚ deselecttree)r9r!r!r"rBƒs zTreeNode.deselectallcCs*|jr| ¡x|jD] }| ¡qWdS)N)r4rHr5rI)r9Úchildr!r!r"rI‰s zTreeNode.deselecttreecCs*|jdkr| ¡n| ¡|j ¡dS)NÚexpandedr')r3ÚcollapseÚexpandr2Ú OnDoubleClick)r9r+r!r!r"Úflips    z TreeNode.flipcCs2|j ¡sdS|jdkr.d|_| ¡| ¡dS)NrK)r2Ú _IsExpandabler3ÚupdateÚview)r9r+r!r!r"rM—s   zTreeNode.expandcCs|jdkrd|_| ¡dS)Nr/)r3rQ)r9r+r!r!r"rLŸs zTreeNode.collapsec Cs®|jd}| ¡jd}||}|j d¡}|j ¡}|j |¡}||krV||krVdS|j |jd¡\}}} } ||krŽ||krŽ|||} n|} t| ƒ| } |j | ¡dS)NrérÚ scrollregion)r7Úlastvisiblechildr0ZcanvasyZ winfo_heightZ_getintsÚfloatZ yview_moveto) r9ÚtopZbottomZheightZ visible_topZvisible_heightZvisible_bottomÚx0Úy0Úx1Úy1Zfractionr!r!r"rR¤s     z TreeNode.viewcCs&|jr|jdkr|jd ¡S|SdS)NrKéÿÿÿÿ)r5r3rU)r9r!r!r"rUµszTreeNode.lastvisiblechildcCs€|jr|j ¡nj|jd}d|jd<|j ¡|j t¡| dd¡|j t¡\}}}}|jjdd||fd||jd<dS)NZcursorZwatchérr)rT)r1rQr0rCZALLÚdrawÚbboxÚ configure)r9Z oldcursorrXrYrZr[r!r!r"rQ»s      zTreeNode.updatecCsxd}|||_|_| ¡| ¡|jdkr4||S|jsz|j ¡}|sP|dSx(|D] }| |j ||¡}|j  |¡qVW|d}||}d} x²|jD]¨}|} |j j |d|d||ddd|  ||¡}|j  ¡r–|jdkrìd } |j} n d } |j} | | ¡} |j j|d| d| d } |j  | d | ¡|j  | d dd„¡q–W|j j |d|d|d| ddd} |j  | ¡|S)NérKrSré r]Zgray50)ÚfillZ minusnodeZplusnode)r z<1>z cSsdS)Nr!)r6r!r!r"ÚëózTreeNode.draw..r)r6r7rErFr3r5r2Ú _GetSubListÚ __class__r0rZ create_liner^rPrLrMrAÚ create_imageÚtag_bindZ tag_lower)r9r6r7ZdyÚsublistr2rJZcxZcyZcylastZiconnameÚcallbackr Úidr!r!r"r^ÈsD    "     z TreeNode.drawcCs~|jr |j ¡p|j ¡pd}n|j ¡p,d}| |¡}|jj|j|jd|d}||_ |j  |d|j ¡|j  |d|j ¡dS)NZ openfolderZfolderÚnw)Úanchorr z<1>z ) r4r2ÚGetSelectedIconNameÚ GetIconNamerAr0rhr6r7rDrirGrO)r9Z imagenamer rlr!r!r"rEòs   zTreeNode.drawiconc s¨ˆjdd}ˆjd}ˆj ¡}|r€ˆjj||d|d}ˆj |dˆj¡ˆj |dˆj¡ˆj  |¡\}}}}t |dƒd }ˆj  ¡pŒd } y ˆj Wnt k r¬Yn Xˆ ¡y ˆjWn*t k rêtˆj| d d d d ˆ_YnXt ¡} ˆjrˆj t | d¡¡nˆj t | d¡¡ˆjj||dˆjd}ˆj dˆj¡ˆj dˆj¡ˆj d‡fdd„¡ˆj d‡fdd„¡ˆj d‡fdd„¡|ˆ_dS)Nrar r$rm)rnrz<1>z éÈrz rr)rr ZpadxZpadyZhiliteZnormal)rnZwindowz cs t|ˆjƒS)N)r-r0)Úe)r9r!r"rdrez#TreeNode.drawtext..z cs t|ˆjƒS)N)r-r0)rr)r9r!r"rd rez cs t|ˆjƒS)N)r-r0)rr)r9r!r"rd!re)r6r7r2Ú GetLabelTextr0Z create_textrirGrOr_ÚmaxÚGetTextÚentryÚAttributeErrorÚ edit_finishr rrZ CurrentThemer4r`Z GetHighlightZ create_windowÚbindÚselect_or_editZtext_id) r9ZtextxZtextyZ labeltextrlrXrYrZr[rZthemer!)r9r"rFÿs@       zTreeNode.drawtextcCs*|jr|j ¡r| |¡n | |¡dS)N)r4r2Ú IsEditableÚeditrG)r9r+r!r!r"rz$s zTreeNode.select_or_editcCsrt|jdddd|_|j d|jd¡|j dt¡|jjdd|j ¡|j d|j ¡|j d|j ¡dS) Nrr )r ÚhighlightthicknessÚwidthrr&)Zipadxzz) ZEntryr rvÚinsertZselection_rangeZENDÚpackÚ focus_setryrxÚ edit_cancel)r9r+r!r!r"r|*s z TreeNode.editcCs|y|j}|`Wntk r"dSX| ¡}| ¡|rR||j ¡krR|j |¡|j ¡}||jd<| ¡|j   ¡dS)Nr) rvrwÚgetr<r2ruÚSetTextr rFr0r)r9r+rvrr!r!r"rx3s   zTreeNode.edit_finishcCsBy|j}|`Wntk r"dSX| ¡| ¡|j ¡dS)N)rvrwr<rFr0r)r9r+rvr!r!r"r‚BszTreeNode.edit_cancel)N)N)N)N)N)N)N)N)N)Ú__name__Ú __module__Ú __qualname__r:r<rArGrHrBrIrOrMrLrRrUrQr^rErFrzr|rxr‚r!r!r!r"r.Ts(      * %  r.c@steZdZdZdd„Zdd„Zdd„ZdZd d „Zd d „Z d d„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„ZdS)ÚTreeItemz‚Abstract class representing tree items. Methods should typically be overridden, otherwise a default action is used. cCsdS)z)Constructor. Do whatever you need to do.Nr!)r9r!r!r"r:VszTreeItem.__init__cCsdS)zReturn text string to display.Nr!)r9r!r!r"ruYszTreeItem.GetTextcCsdS)z>Return label text string to display in front of text (if any).Nr!)r9r!r!r"rs\szTreeItem.GetLabelTextNcCs|jdkr| ¡|_|jS)z%Do not override! Called by TreeNode.N)Ú expandableÚ IsExpandable)r9r!r!r"rPas  zTreeItem._IsExpandablecCsdS)z"Return whether there are subitems.r r!)r9r!r!r"rŠgszTreeItem.IsExpandablecCs"| ¡s gS| ¡}|sd|_|S)z%Do not override! Called by TreeNode.r)rŠÚ GetSubListr‰)r9rjr!r!r"rfks zTreeItem._GetSubListcCsdS)z-Return whether the item's text may be edited.Nr!)r9r!r!r"r{tszTreeItem.IsEditablecCsdS)z+Change the item's text (if it is editable).Nr!)r9rr!r!r"r„wszTreeItem.SetTextcCsdS)z-Return name of icon to be displayed normally.Nr!)r9r!r!r"rpzszTreeItem.GetIconNamecCsdS)z2Return name of icon to be displayed when selected.Nr!)r9r!r!r"ro}szTreeItem.GetSelectedIconNamecCsdS)z%Return list of items forming sublist.Nr!)r9r!r!r"r‹€szTreeItem.GetSubListcCsdS)z%Called on a double-click on the item.Nr!)r9r!r!r"rNƒszTreeItem.OnDoubleClick)r…r†r‡Ú__doc__r:rursr‰rPrŠrfr{r„rpror‹rNr!r!r!r"rˆMs rˆc@sHeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dS)Ú FileTreeItemz4Example TreeItem subclass -- browse the file system.cCs ||_dS)N)r)r9rr!r!r"r:szFileTreeItem.__init__cCstj |j¡p|jS)N)rrr)r9r!r!r"ruszFileTreeItem.GetTextcCstj |j¡dkS)NÚ)rrr)r9r!r!r"r{“szFileTreeItem.IsEditablecCsltj |j¡}tj ||¡}tj |¡tj |j¡kr:dSyt |j|¡||_Wntk rfYnXdS)N)rrÚdirnamerÚrenameÚOSError)r9rÚnewpathr!r!r"r„–s zFileTreeItem.SetTextcCs| ¡s dSdS)NÚpython)rŠ)r9r!r!r"rp¡szFileTreeItem.GetIconNamecCstj |j¡S)N)rrÚisdir)r9r!r!r"rŠ¥szFileTreeItem.IsExpandablecCsjyt |j¡}Wntk r$gSX|jtjjdg}x*|D]"}ttj |j|¡ƒ}| |¡q@W|S)N)Úkey) rÚlistdirrr‘rÚnormcaserrr)r9Únamesrjrr2r!r!r"r‹¨s zFileTreeItem.GetSubListN) r…r†r‡rŒr:rur{r„rprŠr‹r!r!r!r"r‰s rc@s<eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)ÚScrolledCanvascKshd|krd|d<||_t|ƒ|_|jjddd|jjdddt|jf|Ž|_|jjddddt|jdd |_ |j jddd dt|jd d d |_ |j jdddd|j j |jd<|jj |j d<|j j |jd<|jj |j d<|j d|j¡|j d|j¡|j d|j¡|j d|j¡|j dt¡|j dt¡|j dt¡|j d|j¡|j ¡dS)NZyscrollincrementrSrr )ZweightZnsew)r r ZstickyÚvbar)rZnseÚhbarZ horizontal)rZorientZewsZyscrollcommandZcommandZxscrollcommandz z zz z z z z )rrÚframeZ rowconfigureZcolumnconfigureZCanvasr0rrršr›Úsetr*ZxviewryÚpage_upÚ page_downÚunit_upÚ unit_downr-Ú zoom_heightr)r9rZoptsr!r!r"r:¹s2 zScrolledCanvas.__init__cCs|j dd¡dS)Nr\Úpager')r0Ú yview_scroll)r9r+r!r!r"ržÔszScrolledCanvas.page_upcCs|j dd¡dS)Nr r£r')r0r¤)r9r+r!r!r"rŸ×szScrolledCanvas.page_downcCs|j dd¡dS)Nr\Úunitr')r0r¤)r9r+r!r!r"r ÚszScrolledCanvas.unit_upcCs|j dd¡dS)Nr r¥r')r0r¤)r9r+r!r!r"r¡ÝszScrolledCanvas.unit_downcCst |j¡dS)Nr')rr¢r)r9r+r!r!r"r¢às zScrolledCanvas.zoom_heightN) r…r†r‡r:ržrŸr r¡r¢r!r!r!r"r™·s r™cCs†t|ƒ}tt| ¡ d¡dd…ƒ\}}| d|d|df¡t|dddd}|jjdd td t t ƒ}t |j d|ƒ}|  ¡dS) Nú+r z+%d+%dé2é¯Zwhiter)Zbgr}Z takefocusZboth)rMrcZside)ZToplevelÚmapÚintZgeometryÚsplitr™rœr€ZLEFTrr?r.r0rM)r1rWr6r7Zscr2Znoder!r!r"Ú _tree_widgetås r¬Ú__main__)Úmainzidlelib.idle_test.test_treerF)Ú verbosityÚexit)Úrun)N)rZtkinterZ tkinter.ttkrrZidlelib.configrZidlelibrr?rrrÚ__file__Z_icondirÚ NameErrorr”Ú RuntimeErrorr#r-r.rˆrr™r¬r…Zunittestr®Zidlelib.idle_test.htestr±r!r!r!r"Ús4       z<..