blob: ec837f810c30e9f76981be6e622e339fce2c66ce [file] [log] [blame]
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +00001"""Simple text browser for IDLE
2
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00003"""
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +00004
Georg Brandl6634bf22008-05-20 07:13:37 +00005from Tkinter import *
6import tkMessageBox
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00007
8class TextViewer(Toplevel):
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +00009 """A simple text viewer dialog for IDLE
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000010
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000011 """
Terry Jan Reedy62012fc2014-05-24 18:48:03 -040012 def __init__(self, parent, title, text, modal=True, _htest=False):
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000013 """Show the given text in a scrollable window with a 'close' button
14
Terry Jan Reedy562495a2014-06-05 03:38:28 -040015 If modal option set to False, user can interact with other windows,
16 otherwise they will be unable to interact with other windows until
17 the textview window is closed.
18
19 _htest - bool; change box location when running htest.
Steven M. Gavad721c482001-07-31 10:46:53 +000020 """
21 Toplevel.__init__(self, parent)
22 self.configure(borderwidth=5)
Terry Jan Reedy62012fc2014-05-24 18:48:03 -040023 # place dialog below parent if running htest
Terry Jan Reedyc0a053e2015-10-11 22:07:25 -040024 self.geometry("=%dx%d+%d+%d" % (750, 500,
Terry Jan Reedy62012fc2014-05-24 18:48:03 -040025 parent.winfo_rootx() + 10,
26 parent.winfo_rooty() + (10 if not _htest else 100)))
Steven M. Gavad721c482001-07-31 10:46:53 +000027 #elguavas - config placeholders til config stuff completed
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000028 self.bg = '#ffffff'
29 self.fg = '#000000'
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000030
Steven M. Gavad721c482001-07-31 10:46:53 +000031 self.CreateWidgets()
32 self.title(title)
Steven M. Gavad721c482001-07-31 10:46:53 +000033 self.protocol("WM_DELETE_WINDOW", self.Ok)
34 self.parent = parent
35 self.textView.focus_set()
36 #key bindings for this dialog
37 self.bind('<Return>',self.Ok) #dismiss dialog
38 self.bind('<Escape>',self.Ok) #dismiss dialog
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000039 self.textView.insert(0.0, text)
Steven M. Gavad721c482001-07-31 10:46:53 +000040 self.textView.config(state=DISABLED)
Terry Jan Reedyadb87e22012-02-05 15:10:55 -050041
Tal Einat894940b2018-08-02 10:21:49 +030042 self.is_modal = modal
43 if self.is_modal:
Terry Jan Reedyadb87e22012-02-05 15:10:55 -050044 self.transient(parent)
45 self.grab_set()
46 self.wait_window()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000047
Steven M. Gavad721c482001-07-31 10:46:53 +000048 def CreateWidgets(self):
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000049 frameText = Frame(self, relief=SUNKEN, height=700)
Steven M. Gavad721c482001-07-31 10:46:53 +000050 frameButtons = Frame(self)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000051 self.buttonOk = Button(frameButtons, text='Close',
52 command=self.Ok, takefocus=FALSE)
53 self.scrollbarView = Scrollbar(frameText, orient=VERTICAL,
54 takefocus=FALSE, highlightthickness=0)
55 self.textView = Text(frameText, wrap=WORD, highlightthickness=0,
56 fg=self.fg, bg=self.bg)
Steven M. Gavad721c482001-07-31 10:46:53 +000057 self.scrollbarView.config(command=self.textView.yview)
58 self.textView.config(yscrollcommand=self.scrollbarView.set)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000059 self.buttonOk.pack()
Steven M. Gavad721c482001-07-31 10:46:53 +000060 self.scrollbarView.pack(side=RIGHT,fill=Y)
61 self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH)
62 frameButtons.pack(side=BOTTOM,fill=X)
63 frameText.pack(side=TOP,expand=TRUE,fill=BOTH)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000064
Steven M. Gavad721c482001-07-31 10:46:53 +000065 def Ok(self, event=None):
Tal Einat894940b2018-08-02 10:21:49 +030066 if self.is_modal:
67 self.grab_release()
Steven M. Gavad721c482001-07-31 10:46:53 +000068 self.destroy()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000069
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000070
Terry Jan Reedyadb87e22012-02-05 15:10:55 -050071def view_text(parent, title, text, modal=True):
72 return TextViewer(parent, title, text, modal)
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000073
Terry Jan Reedyadb87e22012-02-05 15:10:55 -050074def view_file(parent, title, filename, encoding=None, modal=True):
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000075 try:
76 if encoding:
77 import codecs
78 textFile = codecs.open(filename, 'r')
79 else:
80 textFile = open(filename, 'r')
81 except IOError:
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000082 tkMessageBox.showerror(title='File Load Error',
83 message='Unable to load file %r .' % filename,
84 parent=parent)
Benjamin Peterson95d95552016-06-21 23:12:54 -070085 except UnicodeDecodeError as err:
86 showerror(title='Unicode Decode Error',
87 message=str(err),
88 parent=parent)
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000089 else:
Terry Jan Reedyadb87e22012-02-05 15:10:55 -050090 return view_text(parent, title, textFile.read(), modal)
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000091
92
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000093if __name__ == '__main__':
Terry Jan Reedy562495a2014-06-05 03:38:28 -040094 import unittest
95 unittest.main('idlelib.idle_test.test_textview', verbosity=2, exit=False)
Terry Jan Reedy62012fc2014-05-24 18:48:03 -040096 from idlelib.idle_test.htest import run
97 run(TextViewer)