Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | """ |
2 | Dialog that allows user to specify a new config file section name. | |
3 | Used to get new highlight theme and keybinding set names. | |
4 | """ | |
5 | from Tkinter import * | |
6 | import tkMessageBox | |
7 | ||
8 | class GetCfgSectionNameDialog(Toplevel): | |
9 | def __init__(self,parent,title,message,usedNames): | |
10 | """ | |
11 | message - string, informational message to display | |
12 | usedNames - list, list of names already in use for validity check | |
13 | """ | |
14 | Toplevel.__init__(self, parent) | |
15 | self.configure(borderwidth=5) | |
16 | self.resizable(height=FALSE,width=FALSE) | |
17 | self.title(title) | |
18 | self.transient(parent) | |
19 | self.grab_set() | |
20 | self.protocol("WM_DELETE_WINDOW", self.Cancel) | |
21 | self.parent = parent | |
22 | self.message=message | |
23 | self.usedNames=usedNames | |
24 | self.result='' | |
25 | self.CreateWidgets() | |
26 | self.withdraw() #hide while setting geometry | |
27 | 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()) | |
30 | self.geometry("+%d+%d" % | |
31 | ((parent.winfo_rootx()+((parent.winfo_width()/2) | |
32 | -(self.winfo_reqwidth()/2)), | |
33 | parent.winfo_rooty()+((parent.winfo_height()/2) | |
34 | -(self.winfo_reqheight()/2)) )) ) #centre dialog over parent | |
35 | self.deiconify() #geometry set, unhide | |
36 | self.wait_window() | |
37 | ||
38 | def CreateWidgets(self): | |
39 | self.name=StringVar(self) | |
40 | self.fontSize=StringVar(self) | |
41 | self.frameMain = Frame(self,borderwidth=2,relief=SUNKEN) | |
42 | self.frameMain.pack(side=TOP,expand=TRUE,fill=BOTH) | |
43 | self.messageInfo=Message(self.frameMain,anchor=W,justify=LEFT,padx=5,pady=5, | |
44 | text=self.message)#,aspect=200) | |
45 | entryName=Entry(self.frameMain,textvariable=self.name,width=30) | |
46 | entryName.focus_set() | |
47 | self.messageInfo.pack(padx=5,pady=5)#,expand=TRUE,fill=BOTH) | |
48 | entryName.pack(padx=5,pady=5) | |
49 | frameButtons=Frame(self) | |
50 | frameButtons.pack(side=BOTTOM,fill=X) | |
51 | self.buttonOk = Button(frameButtons,text='Ok', | |
52 | width=8,command=self.Ok) | |
53 | self.buttonOk.grid(row=0,column=0,padx=5,pady=5) | |
54 | self.buttonCancel = Button(frameButtons,text='Cancel', | |
55 | width=8,command=self.Cancel) | |
56 | self.buttonCancel.grid(row=0,column=1,padx=5,pady=5) | |
57 | ||
58 | def NameOk(self): | |
59 | #simple validity check for a sensible | |
60 | #ConfigParser file section name | |
61 | nameOk=1 | |
62 | name=self.name.get() | |
63 | name.strip() | |
64 | if not name: #no name specified | |
65 | tkMessageBox.showerror(title='Name Error', | |
66 | message='No name specified.', parent=self) | |
67 | nameOk=0 | |
68 | elif len(name)>30: #name too long | |
69 | tkMessageBox.showerror(title='Name Error', | |
70 | message='Name too long. It should be no more than '+ | |
71 | '30 characters.', parent=self) | |
72 | nameOk=0 | |
73 | elif name in self.usedNames: | |
74 | tkMessageBox.showerror(title='Name Error', | |
75 | message='This name is already in use.', parent=self) | |
76 | nameOk=0 | |
77 | return nameOk | |
78 | ||
79 | def Ok(self, event=None): | |
80 | if self.NameOk(): | |
81 | self.result=self.name.get().strip() | |
82 | self.destroy() | |
83 | ||
84 | def Cancel(self, event=None): | |
85 | self.result='' | |
86 | self.destroy() | |
87 | ||
88 | if __name__ == '__main__': | |
89 | #test the dialog | |
90 | root=Tk() | |
91 | def run(): | |
92 | keySeq='' | |
93 | dlg=GetCfgSectionNameDialog(root,'Get Name', | |
94 | 'The information here should need to be word wrapped. Test.') | |
95 | print dlg.result | |
96 | Button(root,text='Dialog',command=run).pack() | |
97 | root.mainloop() |