blob: f46ad7cd7e9e0e7bd101c209561cc71bc7879b91 [file] [log] [blame]
David Scherer7aced172000-08-15 01:13:23 +00001import os
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -04002
Georg Brandl14fc4272008-05-17 18:39:55 +00003from tkinter import *
4import tkinter.messagebox as tkMessageBox
David Scherer7aced172000-08-15 01:13:23 +00005
David Scherer7aced172000-08-15 01:13:23 +00006
7class FileList:
8
Kurt B. Kaiser2d7f6a02007-08-22 23:01:33 +00009 # N.B. this import overridden in PyShellFileList.
Terry Jan Reedy6fa5bdc2016-05-28 13:22:31 -040010 from idlelib.editor import EditorWindow
David Scherer7aced172000-08-15 01:13:23 +000011
12 def __init__(self, root):
13 self.root = root
14 self.dict = {}
15 self.inversedict = {}
16 self.vars = {} # For EditorWindow.getrawvar (shared Tcl variables)
17
David Scherer7aced172000-08-15 01:13:23 +000018 def open(self, filename, action=None):
19 assert filename
20 filename = self.canonize(filename)
21 if os.path.isdir(filename):
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000022 # This can happen when bad filename is passed on command line:
David Scherer7aced172000-08-15 01:13:23 +000023 tkMessageBox.showerror(
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000024 "File Error",
25 "%r is a directory." % (filename,),
David Scherer7aced172000-08-15 01:13:23 +000026 master=self.root)
27 return None
28 key = os.path.normcase(filename)
Guido van Rossum811c4e02006-08-22 15:45:46 +000029 if key in self.dict:
David Scherer7aced172000-08-15 01:13:23 +000030 edit = self.dict[key]
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000031 edit.top.wakeup()
David Scherer7aced172000-08-15 01:13:23 +000032 return edit
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000033 if action:
34 # Don't create window, perform 'action', e.g. open in same window
David Scherer7aced172000-08-15 01:13:23 +000035 return action(filename)
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000036 else:
Kurt B. Kaiser105f60e2007-09-06 04:03:04 +000037 edit = self.EditorWindow(self, filename, key)
38 if edit.good_load:
39 return edit
40 else:
41 edit._close()
42 return None
David Scherer7aced172000-08-15 01:13:23 +000043
Kurt B. Kaiserdf8a40f2001-07-14 04:45:32 +000044 def gotofileline(self, filename, lineno=None):
45 edit = self.open(filename)
46 if edit is not None and lineno is not None:
47 edit.gotoline(lineno)
48
Kurt B. Kaiserd2f48612003-06-05 02:34:04 +000049 def new(self, filename=None):
50 return self.EditorWindow(self, filename)
David Scherer7aced172000-08-15 01:13:23 +000051
Ronald Oussoren10e05e12010-12-07 15:28:10 +000052 def close_all_callback(self, *args, **kwds):
Guido van Rossumb5a755e2007-07-18 18:15:48 +000053 for edit in list(self.inversedict):
David Scherer7aced172000-08-15 01:13:23 +000054 reply = edit.close()
55 if reply == "cancel":
56 break
57 return "break"
58
Guido van Rossum8ce8a782007-11-01 19:42:39 +000059 def unregister_maybe_terminate(self, edit):
David Scherer7aced172000-08-15 01:13:23 +000060 try:
61 key = self.inversedict[edit]
62 except KeyError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000063 print("Don't know this EditorWindow object. (close)")
David Scherer7aced172000-08-15 01:13:23 +000064 return
65 if key:
66 del self.dict[key]
67 del self.inversedict[edit]
68 if not self.inversedict:
69 self.root.quit()
70
71 def filename_changed_edit(self, edit):
72 edit.saved_change_hook()
73 try:
74 key = self.inversedict[edit]
75 except KeyError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000076 print("Don't know this EditorWindow object. (rename)")
David Scherer7aced172000-08-15 01:13:23 +000077 return
78 filename = edit.io.filename
79 if not filename:
80 if key:
81 del self.dict[key]
82 self.inversedict[edit] = None
83 return
84 filename = self.canonize(filename)
85 newkey = os.path.normcase(filename)
86 if newkey == key:
87 return
Guido van Rossum811c4e02006-08-22 15:45:46 +000088 if newkey in self.dict:
David Scherer7aced172000-08-15 01:13:23 +000089 conflict = self.dict[newkey]
90 self.inversedict[conflict] = None
91 tkMessageBox.showerror(
92 "Name Conflict",
Walter Dörwald70a6b492004-02-12 17:35:32 +000093 "You now have multiple edit windows open for %r" % (filename,),
David Scherer7aced172000-08-15 01:13:23 +000094 master=self.root)
95 self.dict[newkey] = edit
96 self.inversedict[edit] = newkey
97 if key:
98 try:
99 del self.dict[key]
100 except KeyError:
101 pass
102
103 def canonize(self, filename):
104 if not os.path.isabs(filename):
105 try:
106 pwd = os.getcwd()
Andrew Svetlov786fbd82012-12-17 19:51:15 +0200107 except OSError:
David Scherer7aced172000-08-15 01:13:23 +0000108 pass
109 else:
110 filename = os.path.join(pwd, filename)
111 return os.path.normpath(filename)
112
113
Kurt B. Kaiserdf8a40f2001-07-14 04:45:32 +0000114def _test():
Terry Jan Reedy6fa5bdc2016-05-28 13:22:31 -0400115 from idlelib.editor import fixwordbreaks
David Scherer7aced172000-08-15 01:13:23 +0000116 import sys
117 root = Tk()
118 fixwordbreaks(root)
119 root.withdraw()
120 flist = FileList(root)
121 if sys.argv[1:]:
122 for filename in sys.argv[1:]:
123 flist.open(filename)
124 else:
125 flist.new()
126 if flist.inversedict:
127 root.mainloop()
128
129if __name__ == '__main__':
Kurt B. Kaiserdf8a40f2001-07-14 04:45:32 +0000130 _test()