blob: cde8118fe6b9d7a487971caa3405541414ac0d5a [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 Brandl14fc4272008-05-17 18:39:55 +00006from tkinter import *
7import tkinter.messagebox as tkMessageBox
8import tkinter.filedialog as tkFileDialog
Steven M. Gava085eb1b2002-02-05 04:52:32 +00009
10class GetHelpSourceDialog(Toplevel):
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -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 Reedy1b392ff2014-05-24 18:48:18 -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()
Terry Jan Reedyc64d9422016-05-15 01:30:47 -040026 self.protocol("WM_DELETE_WINDOW", self.cancel)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000027 self.parent = parent
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000028 self.result = None
Terry Jan Reedyc64d9422016-05-15 01:30:47 -040029 self.create_widgets()
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 Reedy1b392ff2014-05-24 18:48:18 -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
Terry Jan Reedyc64d9422016-05-15 01:30:47 -040044 self.bind('<Return>', self.ok)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000045 self.wait_window()
46
Terry Jan Reedyc64d9422016-05-15 01:30:47 -040047 def create_widgets(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,
Terry Jan Reedyc64d9422016-05-15 01:30:47 -040068 command=self.browse_file)
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000069 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',
Terry Jan Reedyc64d9422016-05-15 01:30:47 -040073 width=8, default=ACTIVE, command=self.ok)
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000074 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',
Terry Jan Reedyc64d9422016-05-15 01:30:47 -040076 width=8, command=self.cancel)
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000077 self.buttonCancel.grid(row=0, column=1, padx=5, pady=5)
Steven M. Gava085eb1b2002-02-05 04:52:32 +000078
Terry Jan Reedyc64d9422016-05-15 01:30:47 -040079 def browse_file(self):
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +000080 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
Terry Jan Reedyc64d9422016-05-15 01:30:47 -0400102 def menu_ok(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000103 "Simple validity check for a sensible menu item name"
Terry Jan Reedyc64d9422016-05-15 01:30:47 -0400104 menu_ok = True
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000105 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()
Terry Jan Reedyc64d9422016-05-15 01:30:47 -0400112 menu_ok = False
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000113 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()
Terry Jan Reedyc64d9422016-05-15 01:30:47 -0400119 menu_ok = False
120 return menu_ok
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000121
Terry Jan Reedyc64d9422016-05-15 01:30:47 -0400122 def path_ok(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000123 "Simple validity check for menu file path"
Terry Jan Reedyc64d9422016-05-15 01:30:47 -0400124 path_ok = True
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000125 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()
Terry Jan Reedyc64d9422016-05-15 01:30:47 -0400132 path_ok = False
Thomas Wouters0e3f5912006-08-11 14:57:12 +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()
Terry Jan Reedyc64d9422016-05-15 01:30:47 -0400143 path_ok = False
144 return path_ok
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000145
Terry Jan Reedyc64d9422016-05-15 01:30:47 -0400146 def ok(self, event=None):
147 if self.menu_ok() and self.path_ok():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000148 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]
Terry Jan Reedycd65a032016-05-15 13:25:23 -0400152 if path.startswith(('www', 'file:', 'http:', 'https:')):
Kurt B. Kaiser8aa23922004-07-15 04:54:57 +0000153 pass
154 else:
155 # Mac Safari insists on using the URI form for local files
Thomas Wouters477c8d52006-05-27 19:21:47 +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
Terry Jan Reedyc64d9422016-05-15 01:30:47 -0400160 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 Reedyc64d9422016-05-15 01:30:47 -0400165 import unittest
166 unittest.main('idlelib.idle_test.test_config_help',
167 verbosity=2, exit=False)
168
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -0400169 from idlelib.idle_test.htest import run
170 run(GetHelpSourceDialog)