blob: eb60274156ee1af4993a59b517e82368c4575e14 [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
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000024 self.geometry("=%dx%d+%d+%d" % (625, 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
42 if modal:
43 self.transient(parent)
44 self.grab_set()
45 self.wait_window()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000046
Steven M. Gavad721c482001-07-31 10:46:53 +000047 def CreateWidgets(self):
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000048 frameText = Frame(self, relief=SUNKEN, height=700)
Steven M. Gavad721c482001-07-31 10:46:53 +000049 frameButtons = Frame(self)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000050 self.buttonOk = Button(frameButtons, text='Close',
51 command=self.Ok, takefocus=FALSE)
52 self.scrollbarView = Scrollbar(frameText, orient=VERTICAL,
53 takefocus=FALSE, highlightthickness=0)
54 self.textView = Text(frameText, wrap=WORD, highlightthickness=0,
55 fg=self.fg, bg=self.bg)
Steven M. Gavad721c482001-07-31 10:46:53 +000056 self.scrollbarView.config(command=self.textView.yview)
57 self.textView.config(yscrollcommand=self.scrollbarView.set)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000058 self.buttonOk.pack()
Steven M. Gavad721c482001-07-31 10:46:53 +000059 self.scrollbarView.pack(side=RIGHT,fill=Y)
60 self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH)
61 frameButtons.pack(side=BOTTOM,fill=X)
62 frameText.pack(side=TOP,expand=TRUE,fill=BOTH)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000063
Steven M. Gavad721c482001-07-31 10:46:53 +000064 def Ok(self, event=None):
65 self.destroy()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000066
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000067
Terry Jan Reedyadb87e22012-02-05 15:10:55 -050068def view_text(parent, title, text, modal=True):
69 return TextViewer(parent, title, text, modal)
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000070
Terry Jan Reedyadb87e22012-02-05 15:10:55 -050071def view_file(parent, title, filename, encoding=None, modal=True):
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000072 try:
73 if encoding:
74 import codecs
75 textFile = codecs.open(filename, 'r')
76 else:
77 textFile = open(filename, 'r')
78 except IOError:
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000079 tkMessageBox.showerror(title='File Load Error',
80 message='Unable to load file %r .' % filename,
81 parent=parent)
82 else:
Terry Jan Reedyadb87e22012-02-05 15:10:55 -050083 return view_text(parent, title, textFile.read(), modal)
Kurt B. Kaiserd5f49102007-10-04 02:53:07 +000084
85
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000086if __name__ == '__main__':
Terry Jan Reedy562495a2014-06-05 03:38:28 -040087 import unittest
88 unittest.main('idlelib.idle_test.test_textview', verbosity=2, exit=False)
Terry Jan Reedy62012fc2014-05-24 18:48:03 -040089 from idlelib.idle_test.htest import run
90 run(TextViewer)