blob: 04fcd8cf9a9aa2f9665805c1207aae49389ba2cc [file] [log] [blame]
Steven M. Gava813b56e2002-01-24 05:59:05 +00001"""
2Dialog that allows user to specify a new config file section name.
3Used to get new highlight theme and keybinding set names.
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -04004The 'return value' for the dialog, used two placed in configDialog.py,
5is the .result attribute set in the Ok and Cancel methods.
Steven M. Gava813b56e2002-01-24 05:59:05 +00006"""
Georg Brandl6634bf22008-05-20 07:13:37 +00007from Tkinter import *
8import tkMessageBox
Steven M. Gava813b56e2002-01-24 05:59:05 +00009class GetCfgSectionNameDialog(Toplevel):
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040010 def __init__(self, parent, title, message, used_names):
Steven M. Gava813b56e2002-01-24 05:59:05 +000011 """
12 message - string, informational message to display
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040013 used_names - string collection, names already in use for validity check
Steven M. Gava813b56e2002-01-24 05:59:05 +000014 """
15 Toplevel.__init__(self, parent)
16 self.configure(borderwidth=5)
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040017 self.resizable(height=FALSE, width=FALSE)
Steven M. Gava813b56e2002-01-24 05:59:05 +000018 self.title(title)
19 self.transient(parent)
20 self.grab_set()
21 self.protocol("WM_DELETE_WINDOW", self.Cancel)
22 self.parent = parent
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040023 self.message = message
24 self.used_names = used_names
25 self.create_widgets()
26 self.withdraw() #hide while setting geometry
Steven M. Gava813b56e2002-01-24 05:59:05 +000027 self.update_idletasks()
28 #needs to be done here so that the winfo_reqwidth is valid
29 self.messageInfo.config(width=self.frameMain.winfo_reqwidth())
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040030 self.geometry(
31 "+%d+%d" % (
32 parent.winfo_rootx() +
33 (parent.winfo_width()/2 - self.winfo_reqwidth()/2),
34 parent.winfo_rooty() +
35 (parent.winfo_height()/2 - self.winfo_reqheight()/2)
36 ) ) #centre dialog over parent
37 self.deiconify() #geometry set, unhide
Steven M. Gava813b56e2002-01-24 05:59:05 +000038 self.wait_window()
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040039 def create_widgets(self):
40 self.name = StringVar(self.parent)
41 self.fontSize = StringVar(self.parent)
42 self.frameMain = Frame(self, borderwidth=2, relief=SUNKEN)
43 self.frameMain.pack(side=TOP, expand=TRUE, fill=BOTH)
44 self.messageInfo = Message(self.frameMain, anchor=W, justify=LEFT,
45 padx=5, pady=5, text=self.message) #,aspect=200)
46 entryName = Entry(self.frameMain, textvariable=self.name, width=30)
Steven M. Gava813b56e2002-01-24 05:59:05 +000047 entryName.focus_set()
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040048 self.messageInfo.pack(padx=5, pady=5) #, expand=TRUE, fill=BOTH)
49 entryName.pack(padx=5, pady=5)
50 frameButtons = Frame(self, pady=2)
51 frameButtons.pack(side=BOTTOM)
52 self.buttonOk = Button(frameButtons, text='Ok',
53 width=8, command=self.Ok)
54 self.buttonOk.pack(side=LEFT, padx=5)
55 self.buttonCancel = Button(frameButtons, text='Cancel',
56 width=8, command=self.Cancel)
57 self.buttonCancel.pack(side=RIGHT, padx=5)
Steven M. Gava813b56e2002-01-24 05:59:05 +000058
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040059 def name_ok(self):
60 ''' After stripping entered name, check that it is a sensible
61 ConfigParser file section name. Return it if it is, '' if not.
62 '''
63 name = self.name.get().strip()
Steven M. Gava813b56e2002-01-24 05:59:05 +000064 if not name: #no name specified
65 tkMessageBox.showerror(title='Name Error',
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000066 message='No name specified.', parent=self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000067 elif len(name)>30: #name too long
Steven M. Gava813b56e2002-01-24 05:59:05 +000068 tkMessageBox.showerror(title='Name Error',
Steven M. Gava085eb1b2002-02-05 04:52:32 +000069 message='Name too long. It should be no more than '+
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000070 '30 characters.', parent=self)
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040071 name = ''
72 elif name in self.used_names:
Steven M. Gava813b56e2002-01-24 05:59:05 +000073 tkMessageBox.showerror(title='Name Error',
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000074 message='This name is already in use.', parent=self)
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040075 name = ''
76 return name
Steven M. Gava813b56e2002-01-24 05:59:05 +000077 def Ok(self, event=None):
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040078 name = self.name_ok()
79 if name:
80 self.result = name
Steven M. Gava813b56e2002-01-24 05:59:05 +000081 self.destroy()
Steven M. Gava813b56e2002-01-24 05:59:05 +000082 def Cancel(self, event=None):
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040083 self.result = ''
Steven M. Gava813b56e2002-01-24 05:59:05 +000084 self.destroy()
Steven M. Gava813b56e2002-01-24 05:59:05 +000085if __name__ == '__main__':
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040086 import unittest
87 unittest.main('idlelib.idle_test.test_config_name', verbosity=2, exit=False)
88
89 # also human test the dialog
90 root = Tk()
Steven M. Gava813b56e2002-01-24 05:59:05 +000091 def run():
Steven M. Gava813b56e2002-01-24 05:59:05 +000092 dlg=GetCfgSectionNameDialog(root,'Get Name',
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040093 "After the text entered with [Ok] is stripped, <nothing>, "
94 "'abc', or more that 30 chars are errors. "
95 "Close with a valid entry (printed), [Cancel], or [X]",
96 {'abc'})
Steven M. Gava813b56e2002-01-24 05:59:05 +000097 print dlg.result
Terry Jan Reedy8d6834a2013-06-05 14:24:42 -040098 Message(root, text='').pack() # will be needed for oher dialog tests
99 Button(root, text='Click to begin dialog test', command=run).pack()
Steven M. Gava813b56e2002-01-24 05:59:05 +0000100 root.mainloop()