summaryrefslogtreecommitdiff
path: root/Lib/idlelib/filelist.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/idlelib/filelist.py')
-rw-r--r--Lib/idlelib/filelist.py130
1 files changed, 130 insertions, 0 deletions
diff --git a/Lib/idlelib/filelist.py b/Lib/idlelib/filelist.py
new file mode 100644
index 0000000000..f46ad7cd7e
--- /dev/null
+++ b/Lib/idlelib/filelist.py
@@ -0,0 +1,130 @@
+import os
+
+from tkinter import *
+import tkinter.messagebox as tkMessageBox
+
+
+class FileList:
+
+ # N.B. this import overridden in PyShellFileList.
+ from idlelib.editor import EditorWindow
+
+ 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 key in self.dict:
+ 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:
+ edit = self.EditorWindow(self, filename, key)
+ if edit.good_load:
+ return edit
+ else:
+ edit._close()
+ return None
+
+ 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, *args, **kwds):
+ for edit in list(self.inversedict):
+ 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 newkey in self.dict:
+ 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 OSError:
+ pass
+ else:
+ filename = os.path.join(pwd, filename)
+ return os.path.normpath(filename)
+
+
+def _test():
+ from idlelib.editor 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()