blob: b7818846b3d9d5fb6e63bf125802c1f77b79e97b [file] [log] [blame]
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001"Dialog to specify or edit the parameters for a user configured help source."
2
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00003import os
4
Steven M. Gava085eb1b2002-02-05 04:52:32 +00005from Tkinter import *
6import tkMessageBox
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00007import tkFileDialog
Steven M. Gava085eb1b2002-02-05 04:52:32 +00008
9class GetHelpSourceDialog(Toplevel):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000010 def __init__(self, parent, title, menuItem='', filePath=''):
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000011 """Get menu entry and url/ local file location for Additional Help
12
13 User selects a name for the Help resource and provides a web url
14 or a local file as its source. The user can enter a url or browse
15 for the file.
16
Steven M. Gava085eb1b2002-02-05 04:52:32 +000017 """
18 Toplevel.__init__(self, parent)
19 self.configure(borderwidth=5)
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000020 self.resizable(height=FALSE, width=FALSE)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000021 self.title(title)
22 self.transient(parent)
23 self.grab_set()
24 self.protocol("WM_DELETE_WINDOW", self.Cancel)
25 self.parent = parent
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000026 self.result = None
Steven M. Gava085eb1b2002-02-05 04:52:32 +000027 self.CreateWidgets()
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +000028 self.menu.set(menuItem)
29 self.path.set(filePath)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000030 self.withdraw() #hide while setting geometry
Steven M. Gava085eb1b2002-02-05 04:52:32 +000031 #needs to be done here so that the winfo_reqwidth is valid
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000032 self.update_idletasks()
33 #centre dialog over parent:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000034 self.geometry("+%d+%d" %
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000035 ((parent.winfo_rootx() + ((parent.winfo_width()/2)
36 -(self.winfo_reqwidth()/2)),
37 parent.winfo_rooty() + ((parent.winfo_height()/2)
38 -(self.winfo_reqheight()/2)))))
Steven M. Gava085eb1b2002-02-05 04:52:32 +000039 self.deiconify() #geometry set, unhide
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000040 self.bind('<Return>', self.Ok)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000041 self.wait_window()
42
43 def CreateWidgets(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000044 self.menu = StringVar(self)
45 self.path = StringVar(self)
46 self.fontSize = StringVar(self)
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000047 self.frameMain = Frame(self, borderwidth=2, relief=GROOVE)
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000048 self.frameMain.pack(side=TOP, expand=TRUE, fill=BOTH)
49 labelMenu = Label(self.frameMain, anchor=W, justify=LEFT,
50 text='Menu Item:')
51 self.entryMenu = Entry(self.frameMain, textvariable=self.menu,
52 width=30)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000053 self.entryMenu.focus_set()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000054 labelPath = Label(self.frameMain, anchor=W, justify=LEFT,
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000055 text='Help File Path: Enter URL or browse for file')
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000056 self.entryPath = Entry(self.frameMain, textvariable=self.path,
57 width=40)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000058 self.entryMenu.focus_set()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000059 labelMenu.pack(anchor=W, padx=5, pady=3)
60 self.entryMenu.pack(anchor=W, padx=5, pady=3)
61 labelPath.pack(anchor=W, padx=5, pady=3)
62 self.entryPath.pack(anchor=W, padx=5, pady=3)
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000063 browseButton = Button(self.frameMain, text='Browse', width=8,
64 command=self.browseFile)
65 browseButton.pack(pady=3)
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000066 frameButtons = Frame(self)
67 frameButtons.pack(side=BOTTOM, fill=X)
68 self.buttonOk = Button(frameButtons, text='OK',
69 width=8, default=ACTIVE, command=self.Ok)
70 self.buttonOk.grid(row=0, column=0, padx=5,pady=5)
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000071 self.buttonCancel = Button(frameButtons, text='Cancel',
72 width=8, command=self.Cancel)
73 self.buttonCancel.grid(row=0, column=1, padx=5, pady=5)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000074
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000075 def browseFile(self):
76 filetypes = [
77 ("HTML Files", "*.htm *.html", "TEXT"),
78 ("PDF Files", "*.pdf", "TEXT"),
79 ("Windows Help Files", "*.chm"),
80 ("Text Files", "*.txt", "TEXT"),
81 ("All Files", "*")]
82 path = self.path.get()
83 if path:
84 dir, base = os.path.split(path)
85 else:
86 base = None
87 if sys.platform.count('win') or sys.platform.count('nt'):
88 dir = os.path.join(os.path.dirname(sys.executable), 'Doc')
89 if not os.path.isdir(dir):
90 dir = os.getcwd()
91 else:
92 dir = os.getcwd()
93 opendialog = tkFileDialog.Open(parent=self, filetypes=filetypes)
94 file = opendialog.show(initialdir=dir, initialfile=base)
95 if file:
96 self.path.set(file)
Kurt B. Kaisere66675b2003-01-27 02:36:18 +000097
Steven M. Gava085eb1b2002-02-05 04:52:32 +000098 def MenuOk(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000099 "Simple validity check for a sensible menu item name"
100 menuOk = True
101 menu = self.menu.get()
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000102 menu.strip()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000103 if not menu:
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000104 tkMessageBox.showerror(title='Menu Item Error',
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000105 message='No menu item specified',
106 parent=self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000107 self.entryMenu.focus_set()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000108 menuOk = False
109 elif len(menu) > 30:
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000110 tkMessageBox.showerror(title='Menu Item Error',
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000111 message='Menu item too long:'
112 '\nLimit 30 characters.',
113 parent=self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000114 self.entryMenu.focus_set()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000115 menuOk = False
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000116 return menuOk
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000117
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000118 def PathOk(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000119 "Simple validity check for menu file path"
120 pathOk = True
121 path = self.path.get()
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000122 path.strip()
123 if not path: #no path specified
124 tkMessageBox.showerror(title='File Path Error',
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000125 message='No help file path specified.',
126 parent=self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000127 self.entryPath.focus_set()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000128 pathOk = False
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000129 elif path.startswith('www.') or path.startswith('http'):
130 pathOk = True
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000131 elif not os.path.exists(path):
132 tkMessageBox.showerror(title='File Path Error',
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000133 message='Help file path does not exist.',
134 parent=self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000135 self.entryPath.focus_set()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000136 pathOk = False
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000137 return pathOk
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000138
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000139 def Ok(self, event=None):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000140 if self.MenuOk() and self.PathOk():
141 self.result = (self.menu.get().strip(),
142 self.path.get().strip())
143 self.destroy()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000144
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000145 def Cancel(self, event=None):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000146 self.result = None
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000147 self.destroy()
148
149if __name__ == '__main__':
150 #test the dialog
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000151 root = Tk()
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000152 def run():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000153 keySeq = ''
154 dlg = GetHelpSourceDialog(root, 'Get Help Source')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000155 print dlg.result
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000156 Button(root,text='Dialog', command=run).pack()
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000157 root.mainloop()