/Lib/idlelib/FileList.py
http://unladen-swallow.googlecode.com/ · Python · 124 lines · 107 code · 14 blank · 3 comment · 30 complexity · 20bdb24b30f5e8013de1e0af5529a19e MD5 · raw file
- import os
- from Tkinter import *
- import tkMessageBox
- class FileList:
- from EditorWindow import EditorWindow # class variable, may be overridden
- # e.g. by PyShellFileList
- def __init__(self, root):
- self.root = root
- self.dict = {}
- self.inversedict = {}
- self.vars = {} # For EditorWindow.getrawvar (shared Tcl variables)
- def open(self, filename, action=None):
- assert filename
- filename = self.canonize(filename)
- if os.path.isdir(filename):
- # This can happen when bad filename is passed on command line:
- tkMessageBox.showerror(
- "File Error",
- "%r is a directory." % (filename,),
- master=self.root)
- return None
- key = os.path.normcase(filename)
- if self.dict.has_key(key):
- edit = self.dict[key]
- edit.top.wakeup()
- return edit
- if action:
- # Don't create window, perform 'action', e.g. open in same window
- return action(filename)
- else:
- return self.EditorWindow(self, filename, key)
- def gotofileline(self, filename, lineno=None):
- edit = self.open(filename)
- if edit is not None and lineno is not None:
- edit.gotoline(lineno)
- def new(self, filename=None):
- return self.EditorWindow(self, filename)
- def close_all_callback(self, event):
- for edit in self.inversedict.keys():
- reply = edit.close()
- if reply == "cancel":
- break
- return "break"
- def unregister_maybe_terminate(self, edit):
- try:
- key = self.inversedict[edit]
- except KeyError:
- print "Don't know this EditorWindow object. (close)"
- return
- if key:
- del self.dict[key]
- del self.inversedict[edit]
- if not self.inversedict:
- self.root.quit()
- def filename_changed_edit(self, edit):
- edit.saved_change_hook()
- try:
- key = self.inversedict[edit]
- except KeyError:
- print "Don't know this EditorWindow object. (rename)"
- return
- filename = edit.io.filename
- if not filename:
- if key:
- del self.dict[key]
- self.inversedict[edit] = None
- return
- filename = self.canonize(filename)
- newkey = os.path.normcase(filename)
- if newkey == key:
- return
- if self.dict.has_key(newkey):
- conflict = self.dict[newkey]
- self.inversedict[conflict] = None
- tkMessageBox.showerror(
- "Name Conflict",
- "You now have multiple edit windows open for %r" % (filename,),
- master=self.root)
- self.dict[newkey] = edit
- self.inversedict[edit] = newkey
- if key:
- try:
- del self.dict[key]
- except KeyError:
- pass
- def canonize(self, filename):
- if not os.path.isabs(filename):
- try:
- pwd = os.getcwd()
- except os.error:
- pass
- else:
- filename = os.path.join(pwd, filename)
- return os.path.normpath(filename)
- def _test():
- from EditorWindow import fixwordbreaks
- import sys
- root = Tk()
- fixwordbreaks(root)
- root.withdraw()
- flist = FileList(root)
- if sys.argv[1:]:
- for filename in sys.argv[1:]:
- flist.open(filename)
- else:
- flist.new()
- if flist.inversedict:
- root.mainloop()
- if __name__ == '__main__':
- _test()