diff options
Diffstat (limited to 'Lib/idlelib/config_help.py')
| -rw-r--r-- | Lib/idlelib/config_help.py | 170 | 
1 files changed, 170 insertions, 0 deletions
| diff --git a/Lib/idlelib/config_help.py b/Lib/idlelib/config_help.py new file mode 100644 index 0000000..cde8118 --- /dev/null +++ b/Lib/idlelib/config_help.py @@ -0,0 +1,170 @@ +"Dialog to specify or edit the parameters for a user configured help source." + +import os +import sys + +from tkinter import * +import tkinter.messagebox as tkMessageBox +import tkinter.filedialog as tkFileDialog + +class GetHelpSourceDialog(Toplevel): +    def __init__(self, parent, title, menuItem='', filePath='', _htest=False): +        """Get menu entry and url/ local file location for Additional Help + +        User selects a name for the Help resource and provides a web url +        or a local file as its source.  The user can enter a url or browse +        for the file. + +        _htest - bool, change box location when running htest +        """ +        Toplevel.__init__(self, parent) +        self.configure(borderwidth=5) +        self.resizable(height=FALSE, width=FALSE) +        self.title(title) +        self.transient(parent) +        self.grab_set() +        self.protocol("WM_DELETE_WINDOW", self.cancel) +        self.parent = parent +        self.result = None +        self.create_widgets() +        self.menu.set(menuItem) +        self.path.set(filePath) +        self.withdraw() #hide while setting geometry +        #needs to be done here so that the winfo_reqwidth is valid +        self.update_idletasks() +        #centre dialog over parent. below parent if running htest. +        self.geometry( +                "+%d+%d" % ( +                    parent.winfo_rootx() + +                    (parent.winfo_width()/2 - self.winfo_reqwidth()/2), +                    parent.winfo_rooty() + +                    ((parent.winfo_height()/2 - self.winfo_reqheight()/2) +                    if not _htest else 150))) +        self.deiconify() #geometry set, unhide +        self.bind('<Return>', self.ok) +        self.wait_window() + +    def create_widgets(self): +        self.menu = StringVar(self) +        self.path = StringVar(self) +        self.fontSize = StringVar(self) +        self.frameMain = Frame(self, borderwidth=2, relief=GROOVE) +        self.frameMain.pack(side=TOP, expand=TRUE, fill=BOTH) +        labelMenu = Label(self.frameMain, anchor=W, justify=LEFT, +                          text='Menu Item:') +        self.entryMenu = Entry(self.frameMain, textvariable=self.menu, +                               width=30) +        self.entryMenu.focus_set() +        labelPath = Label(self.frameMain, anchor=W, justify=LEFT, +                          text='Help File Path: Enter URL or browse for file') +        self.entryPath = Entry(self.frameMain, textvariable=self.path, +                               width=40) +        self.entryMenu.focus_set() +        labelMenu.pack(anchor=W, padx=5, pady=3) +        self.entryMenu.pack(anchor=W, padx=5, pady=3) +        labelPath.pack(anchor=W, padx=5, pady=3) +        self.entryPath.pack(anchor=W, padx=5, pady=3) +        browseButton = Button(self.frameMain, text='Browse', width=8, +                              command=self.browse_file) +        browseButton.pack(pady=3) +        frameButtons = Frame(self) +        frameButtons.pack(side=BOTTOM, fill=X) +        self.buttonOk = Button(frameButtons, text='OK', +                               width=8, default=ACTIVE,  command=self.ok) +        self.buttonOk.grid(row=0, column=0, padx=5,pady=5) +        self.buttonCancel = Button(frameButtons, text='Cancel', +                                   width=8, command=self.cancel) +        self.buttonCancel.grid(row=0, column=1, padx=5, pady=5) + +    def browse_file(self): +        filetypes = [ +            ("HTML Files", "*.htm *.html", "TEXT"), +            ("PDF Files", "*.pdf", "TEXT"), +            ("Windows Help Files", "*.chm"), +            ("Text Files", "*.txt", "TEXT"), +            ("All Files", "*")] +        path = self.path.get() +        if path: +            dir, base = os.path.split(path) +        else: +            base = None +            if sys.platform[:3] == 'win': +                dir = os.path.join(os.path.dirname(sys.executable), 'Doc') +                if not os.path.isdir(dir): +                    dir = os.getcwd() +            else: +                dir = os.getcwd() +        opendialog = tkFileDialog.Open(parent=self, filetypes=filetypes) +        file = opendialog.show(initialdir=dir, initialfile=base) +        if file: +            self.path.set(file) + +    def menu_ok(self): +        "Simple validity check for a sensible menu item name" +        menu_ok = True +        menu = self.menu.get() +        menu.strip() +        if not menu: +            tkMessageBox.showerror(title='Menu Item Error', +                                   message='No menu item specified', +                                   parent=self) +            self.entryMenu.focus_set() +            menu_ok = False +        elif len(menu) > 30: +            tkMessageBox.showerror(title='Menu Item Error', +                                   message='Menu item too long:' +                                           '\nLimit 30 characters.', +                                   parent=self) +            self.entryMenu.focus_set() +            menu_ok = False +        return menu_ok + +    def path_ok(self): +        "Simple validity check for menu file path" +        path_ok = True +        path = self.path.get() +        path.strip() +        if not path: #no path specified +            tkMessageBox.showerror(title='File Path Error', +                                   message='No help file path specified.', +                                   parent=self) +            self.entryPath.focus_set() +            path_ok = False +        elif path.startswith(('www.', 'http')): +            pass +        else: +            if path[:5] == 'file:': +                path = path[5:] +            if not os.path.exists(path): +                tkMessageBox.showerror(title='File Path Error', +                                       message='Help file path does not exist.', +                                       parent=self) +                self.entryPath.focus_set() +                path_ok = False +        return path_ok + +    def ok(self, event=None): +        if self.menu_ok() and self.path_ok(): +            self.result = (self.menu.get().strip(), +                           self.path.get().strip()) +            if sys.platform == 'darwin': +                path = self.result[1] +                if path.startswith(('www', 'file:', 'http:', 'https:')): +                    pass +                else: +                    # Mac Safari insists on using the URI form for local files +                    self.result = list(self.result) +                    self.result[1] = "file://" + path +            self.destroy() + +    def cancel(self, event=None): +        self.result = None +        self.destroy() + +if __name__ == '__main__': +    import unittest +    unittest.main('idlelib.idle_test.test_config_help', +                   verbosity=2, exit=False) + +    from idlelib.idle_test.htest import run +    run(GetHelpSourceDialog) | 
