blob: 5816449caf5e695021c04665e243f2fd358dfe08 [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
Kurt B. Kaiser8aa23922004-07-15 04:54:57 +00004import sys
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00005
Georg Brandl6634bf22008-05-20 07:13:37 +00006from Tkinter import *
7import tkMessageBox
8import tkFileDialog
Steven M. Gava085eb1b2002-02-05 04:52:32 +00009
10class GetHelpSourceDialog(Toplevel):
Terry Jan Reedy62012fc2014-05-24 18:48:03 -040011 def __init__(self, parent, title, menuItem='', filePath='', _htest=False):
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000012 """Get menu entry and url/ local file location for Additional Help
13
14 User selects a name for the Help resource and provides a web url
15 or a local file as its source. The user can enter a url or browse
16 for the file.
17
Terry Jan Reedy62012fc2014-05-24 18:48:03 -040018 _htest - bool, change box location when running htest
Steven M. Gava085eb1b2002-02-05 04:52:32 +000019 """
20 Toplevel.__init__(self, parent)
21 self.configure(borderwidth=5)
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000022 self.resizable(height=FALSE, width=FALSE)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000023 self.title(title)
24 self.transient(parent)
25 self.grab_set()
26 self.protocol("WM_DELETE_WINDOW", self.Cancel)
27 self.parent = parent
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000028 self.result = None
Steven M. Gava085eb1b2002-02-05 04:52:32 +000029 self.CreateWidgets()
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +000030 self.menu.set(menuItem)
31 self.path.set(filePath)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000032 self.withdraw() #hide while setting geometry
Steven M. Gava085eb1b2002-02-05 04:52:32 +000033 #needs to be done here so that the winfo_reqwidth is valid
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000034 self.update_idletasks()
Terry Jan Reedy62012fc2014-05-24 18:48:03 -040035 #centre dialog over parent. below parent if running htest.
36 self.geometry(
37 "+%d+%d" % (
38 parent.winfo_rootx() +
39 (parent.winfo_width()/2 - self.winfo_reqwidth()/2),
40 parent.winfo_rooty() +
41 ((parent.winfo_height()/2 - self.winfo_reqheight()/2)
42 if not _htest else 150)))
Steven M. Gava085eb1b2002-02-05 04:52:32 +000043 self.deiconify() #geometry set, unhide
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000044 self.bind('<Return>', self.Ok)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000045 self.wait_window()
46
47 def CreateWidgets(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000048 self.menu = StringVar(self)
49 self.path = StringVar(self)
50 self.fontSize = StringVar(self)
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000051 self.frameMain = Frame(self, borderwidth=2, relief=GROOVE)
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000052 self.frameMain.pack(side=TOP, expand=TRUE, fill=BOTH)
53 labelMenu = Label(self.frameMain, anchor=W, justify=LEFT,
54 text='Menu Item:')
55 self.entryMenu = Entry(self.frameMain, textvariable=self.menu,
56 width=30)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000057 self.entryMenu.focus_set()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000058 labelPath = Label(self.frameMain, anchor=W, justify=LEFT,
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000059 text='Help File Path: Enter URL or browse for file')
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000060 self.entryPath = Entry(self.frameMain, textvariable=self.path,
61 width=40)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000062 self.entryMenu.focus_set()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000063 labelMenu.pack(anchor=W, padx=5, pady=3)
64 self.entryMenu.pack(anchor=W, padx=5, pady=3)
65 labelPath.pack(anchor=W, padx=5, pady=3)
66 self.entryPath.pack(anchor=W, padx=5, pady=3)
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000067 browseButton = Button(self.frameMain, text='Browse', width=8,
68 command=self.browseFile)
69 browseButton.pack(pady=3)
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000070 frameButtons = Frame(self)
71 frameButtons.pack(side=BOTTOM, fill=X)
72 self.buttonOk = Button(frameButtons, text='OK',
73 width=8, default=ACTIVE, command=self.Ok)
74 self.buttonOk.grid(row=0, column=0, padx=5,pady=5)
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000075 self.buttonCancel = Button(frameButtons, text='Cancel',
76 width=8, command=self.Cancel)
77 self.buttonCancel.grid(row=0, column=1, padx=5, pady=5)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000078
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000079 def browseFile(self):
80 filetypes = [
81 ("HTML Files", "*.htm *.html", "TEXT"),
82 ("PDF Files", "*.pdf", "TEXT"),
83 ("Windows Help Files", "*.chm"),
84 ("Text Files", "*.txt", "TEXT"),
85 ("All Files", "*")]
86 path = self.path.get()
87 if path:
88 dir, base = os.path.split(path)
89 else:
90 base = None
Kurt B. Kaiser8aa23922004-07-15 04:54:57 +000091 if sys.platform[:3] == 'win':
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000092 dir = os.path.join(os.path.dirname(sys.executable), 'Doc')
93 if not os.path.isdir(dir):
94 dir = os.getcwd()
95 else:
96 dir = os.getcwd()
97 opendialog = tkFileDialog.Open(parent=self, filetypes=filetypes)
98 file = opendialog.show(initialdir=dir, initialfile=base)
99 if file:
100 self.path.set(file)
Kurt B. Kaisere66675b2003-01-27 02:36:18 +0000101
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000102 def MenuOk(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000103 "Simple validity check for a sensible menu item name"
104 menuOk = True
105 menu = self.menu.get()
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000106 menu.strip()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000107 if not menu:
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000108 tkMessageBox.showerror(title='Menu Item Error',
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000109 message='No menu item specified',
110 parent=self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000111 self.entryMenu.focus_set()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000112 menuOk = False
113 elif len(menu) > 30:
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000114 tkMessageBox.showerror(title='Menu Item Error',
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000115 message='Menu item too long:'
116 '\nLimit 30 characters.',
117 parent=self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000118 self.entryMenu.focus_set()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000119 menuOk = False
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000120 return menuOk
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000121
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000122 def PathOk(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000123 "Simple validity check for menu file path"
124 pathOk = True
125 path = self.path.get()
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000126 path.strip()
127 if not path: #no path specified
128 tkMessageBox.showerror(title='File Path Error',
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000129 message='No help file path specified.',
130 parent=self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000131 self.entryPath.focus_set()
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000132 pathOk = False
Georg Brandlb2afe852006-06-09 20:43:48 +0000133 elif path.startswith(('www.', 'http')):
Kurt B. Kaiser8aa23922004-07-15 04:54:57 +0000134 pass
135 else:
136 if path[:5] == 'file:':
137 path = path[5:]
138 if not os.path.exists(path):
139 tkMessageBox.showerror(title='File Path Error',
140 message='Help file path does not exist.',
141 parent=self)
142 self.entryPath.focus_set()
143 pathOk = False
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000144 return pathOk
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000145
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000146 def Ok(self, event=None):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000147 if self.MenuOk() and self.PathOk():
148 self.result = (self.menu.get().strip(),
149 self.path.get().strip())
Kurt B. Kaiser8aa23922004-07-15 04:54:57 +0000150 if sys.platform == 'darwin':
151 path = self.result[1]
Georg Brandlb2afe852006-06-09 20:43:48 +0000152 if path.startswith(('www', 'file:', 'http:')):
Kurt B. Kaiser8aa23922004-07-15 04:54:57 +0000153 pass
154 else:
155 # Mac Safari insists on using the URI form for local files
Ronald Oussoren19bebf22006-05-26 08:41:25 +0000156 self.result = list(self.result)
Kurt B. Kaiser8aa23922004-07-15 04:54:57 +0000157 self.result[1] = "file://" + path
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000158 self.destroy()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000159
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000160 def Cancel(self, event=None):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000161 self.result = None
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000162 self.destroy()
163
164if __name__ == '__main__':
Terry Jan Reedy62012fc2014-05-24 18:48:03 -0400165 from idlelib.idle_test.htest import run
166 run(GetHelpSourceDialog)