/Lib/idlelib/FileList.py

http://unladen-swallow.googlecode.com/ · Python · 124 lines · 107 code · 14 blank · 3 comment · 30 complexity · 20bdb24b30f5e8013de1e0af5529a19e MD5 · raw file

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