Home | History | Annotate | Download | only in idlelib
      1 import os
      2 from Tkinter import *
      3 import tkMessageBox
      4 
      5 
      6 class FileList:
      7 
      8     # N.B. this import overridden in PyShellFileList.
      9     from idlelib.EditorWindow import EditorWindow
     10 
     11     def __init__(self, root):
     12         self.root = root
     13         self.dict = {}
     14         self.inversedict = {}
     15         self.vars = {} # For EditorWindow.getrawvar (shared Tcl variables)
     16 
     17     def open(self, filename, action=None):
     18         assert filename
     19         filename = self.canonize(filename)
     20         if os.path.isdir(filename):
     21             # This can happen when bad filename is passed on command line:
     22             tkMessageBox.showerror(
     23                 "File Error",
     24                 "%r is a directory." % (filename,),
     25                 master=self.root)
     26             return None
     27         key = os.path.normcase(filename)
     28         if key in self.dict:
     29             edit = self.dict[key]
     30             edit.top.wakeup()
     31             return edit
     32         if action:
     33             # Don't create window, perform 'action', e.g. open in same window
     34             return action(filename)
     35         else:
     36             return self.EditorWindow(self, filename, key)
     37 
     38     def gotofileline(self, filename, lineno=None):
     39         edit = self.open(filename)
     40         if edit is not None and lineno is not None:
     41             edit.gotoline(lineno)
     42 
     43     def new(self, filename=None):
     44         return self.EditorWindow(self, filename)
     45 
     46     def close_all_callback(self, *args, **kwds):
     47         for edit in self.inversedict.keys():
     48             reply = edit.close()
     49             if reply == "cancel":
     50                 break
     51         return "break"
     52 
     53     def unregister_maybe_terminate(self, edit):
     54         try:
     55             key = self.inversedict[edit]
     56         except KeyError:
     57             print "Don't know this EditorWindow object.  (close)"
     58             return
     59         if key:
     60             del self.dict[key]
     61         del self.inversedict[edit]
     62         if not self.inversedict:
     63             self.root.quit()
     64 
     65     def filename_changed_edit(self, edit):
     66         edit.saved_change_hook()
     67         try:
     68             key = self.inversedict[edit]
     69         except KeyError:
     70             print "Don't know this EditorWindow object.  (rename)"
     71             return
     72         filename = edit.io.filename
     73         if not filename:
     74             if key:
     75                 del self.dict[key]
     76             self.inversedict[edit] = None
     77             return
     78         filename = self.canonize(filename)
     79         newkey = os.path.normcase(filename)
     80         if newkey == key:
     81             return
     82         if newkey in self.dict:
     83             conflict = self.dict[newkey]
     84             self.inversedict[conflict] = None
     85             tkMessageBox.showerror(
     86                 "Name Conflict",
     87                 "You now have multiple edit windows open for %r" % (filename,),
     88                 master=self.root)
     89         self.dict[newkey] = edit
     90         self.inversedict[edit] = newkey
     91         if key:
     92             try:
     93                 del self.dict[key]
     94             except KeyError:
     95                 pass
     96 
     97     def canonize(self, filename):
     98         if not os.path.isabs(filename):
     99             try:
    100                 pwd = os.getcwd()
    101             except os.error:
    102                 pass
    103             else:
    104                 filename = os.path.join(pwd, filename)
    105         return os.path.normpath(filename)
    106 
    107 
    108 def _test():
    109     from idlelib.EditorWindow import fixwordbreaks
    110     import sys
    111     root = Tk()
    112     fixwordbreaks(root)
    113     root.withdraw()
    114     flist = FileList(root)
    115     if sys.argv[1:]:
    116         for filename in sys.argv[1:]:
    117             flist.open(filename)
    118     else:
    119         flist.new()
    120     if flist.inversedict:
    121         root.mainloop()
    122 
    123 if __name__ == '__main__':
    124     _test()
    125