⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 classbrowser.py

📁 java写的多功能文件编辑器
💻 PY
字号:
"A Python source code browser for Jext."## 06/14/2001 - 22:02:54#### A Python class/methods browser for Jext## Written in Python/Swing, using a modified pyclbr Python library## Based on ClassBrowser module from IDLE v0.8#### (C)2001 Romain Guy## romain.guy@jext.org## www.jext.org#### Jext & Java CLASSES##from org.jext import *from org.jext.event import *from java.lang import *from java.awt import *from java.awt.event import *from javax.swing import *from javax.swing.event import *from javax.swing.tree import *#### USED BY load() METHOD##import osimport pyclbrimport stringimport sys# SELECTIONclass SelectionHandler(TreeSelectionListener):  "handles tree selections"  def valueChanged(self, evt):    "called on selection change"    no = evt.getPath().getLastPathComponent().lineno    if no != -1:      textArea = __jext__.getTextArea()      lelement = textArea.getDocument().getDefaultRootElement().getElement(no - 1)      textArea.select(lelement.getStartOffset(), lelement.getEndOffset() - 1)# TREE NODESclass ClassNode(DefaultMutableTreeNode):  "a class or a method is represented by its name and its line number"  def __init__(self, name, lineno):    DefaultMutableTreeNode.__init__(self, name)    self.name = name    self.lineno = lineno# BROWSERclass ClassBrowser(JPanel, JextListener, Runnable):  "a Python source code browser for Jext"  def __init__(self):    JPanel.__init__(self, BorderLayout())    __jext__.addJextListener(self)    self.browserTree = JTree()    self.seeker = None    renderer = DefaultTreeCellRenderer()    renderer.setOpenIcon(Utilities.getIcon("images/tree_open.gif", __jext__.class))    renderer.setLeafIcon(Utilities.getIcon("images/tree_leaf.gif", __jext__.class))    renderer.setClosedIcon(Utilities.getIcon("images/tree_close.gif", __jext__.class))    renderer.setTextSelectionColor(GUIUtilities.parseColor(Jext.getProperty("vf.selectionColor")))    renderer.setBackgroundSelectionColor(self.browserTree.getBackground())    renderer.setBorderSelectionColor(self.browserTree.getBackground())    self.browserTree.setCellRenderer(renderer)    self.browserTree.putClientProperty("JTree.lineStyle", "Angled")    self.browserTree.setScrollsOnExpand(1);    selectionModel = DefaultTreeSelectionModel();    selectionModel.setSelectionMode(DefaultTreeSelectionModel.SINGLE_TREE_SELECTION);    self.browserTree.setSelectionModel(selectionModel);    self.load(__jext__.getTextArea())    self.browserTree.expandRow(0)    self.browserTree.setRootVisible(0)    self.browserTree.setShowsRootHandles(1)    self.browserTree.addTreeSelectionListener(SelectionHandler())    self.add(JScrollPane(self.browserTree), BorderLayout.CENTER)  # jext events  def jextEventFired(self, evt):    "handles events fired by Jext"    evtType = evt.getWhat()    # on selection    if evtType == JextEvent.TEXT_AREA_SELECTED or evtType == JextEvent.TEXT_AREA_OPENED or \       evtType == JextEvent.TEXT_AREA_CLOSED:      #if not evt.getJextFrame().getBatchMode():      self.load(evt.getTextArea())    # on textarea change    elif evtType == JextEvent.CHANGED_UPDATE or evtType == JextEvent.REMOVE_UPDATE or \         evtType == JextEvent.INSERT_UPDATE:      # threaded operation      if not self.seeker is None:        self.seeker.stop()        self.seeker = None      self.seeker = Thread(self)      self.seeker.start()  def run(self):    "waiting loop"    try:      Thread.sleep(400)    except:      pass    self.load(__jext__.getTextArea())  # browses the opened Python file and creates a list of classes and methods  def load(self, textArea):    "loads a new tree from a given text area"    # create tree root    root = DefaultMutableTreeNode("root")    browserTreeModel = DefaultTreeModel(root)    if textArea is None:      return    #textArea = __jext__.getTextArea()    # not a python file !    if textArea.getColorizingMode() != "python":      root.add(ClassNode("Not a python file !", -1))      self.browserTree.setModel(browserTreeModel)      return    # python file need to be saved    file = textArea.getCurrentFile()    dir = "."    if file == None:      file = textArea.getName() + ".py"    else:      dir, file = os.path.split(file)    name, ext = os.path.splitext(file)    pyclbr._modules = {}    #dic = pyclbr.readmodule_ex(name, [dir] + sys.path)    dic = pyclbr.readsource_ex(name, file, textArea.getText())    self.items = []    self.classes = {}    s = ''    for key, cl in dic.items():      if cl.module == name:        s = key        if cl.super:          supers = []          for sup in cl.super:            if type(sup) is type(''):              sname = sup            else:              sname = sup.name              if sup.module != cl.module:                sname = "%s.%s" % (sup.module, sname)            supers.append(sname)          s = s + "(%s)" % string.join(supers, ", ")        self.items.append((cl.lineno, s))        self.classes[s] = cl    self.items.sort()    node = None    for item, cname in self.items:      if isinstance(self.classes[cname], pyclbr.Function):        node = ClassNode("def " + cname + "()", item)      else:        node = ClassNode("class " + cname, item)        for name, lineno in self.classes[cname].methods.items():          node.add(ClassNode("def " + name + "()", lineno))        if node.getChildCount() == 0:          node.add(ClassNode("<none>", -1))      root.add(node)    self.browserTree.setModel(browserTreeModel)# MAIN ENTRY POINTdef main():  "main method"  # if the tab already exists  # we remove it then add it once more  tPane = __jext__.getVerticalTabbedPane()  if tPane.indexOfTab("PyBrowser") == -1:    tPane.addTab("PyBrowser", ClassBrowser())  else:    __jext__.removeJextListener(tPane.getComponentAt(tPane.indexOfTab("PyBrowser")))    tPane.removeTabAt(tPane.indexOfTab("PyBrowser"))if __name__ == '__main__':  main()  # End of classbrowser.py

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -