"""
Dialog that allows user to specify or edit the parameters for a user configured
help source.
"""
from Tkinter import *
import tkMessageBox
import os

class GetHelpSourceDialog(Toplevel):
    def __init__(self,parent,title,menuItem='',filePath=''):
        """
        menuItem - string, the menu item to edit, if any
        filePath - string, the help file path to edit, if any
        """
        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.CreateWidgets()
        self.menu.set(menuItem)
        self.path.set(filePath)
        self.withdraw() #hide while setting geometry
        self.update_idletasks()
        #needs to be done here so that the winfo_reqwidth is valid
        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)) )) ) #centre dialog over parent
        self.deiconify() #geometry set, unhide
        self.wait_window()

    def CreateWidgets(self):
        self.menu=StringVar(self)
        self.path=StringVar(self)
        self.fontSize=StringVar(self)
        self.frameMain = Frame(self,borderwidth=2,relief=SUNKEN)
        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:')
        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)
        frameButtons=Frame(self)
        frameButtons.pack(side=BOTTOM,fill=X)
        self.buttonOk = Button(frameButtons,text='Ok',
                width=8,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 MenuOk(self):
        #simple validity check for a sensible
        #menu item name
        menuOk=1
        menu=self.menu.get()
        menu.strip()
        if not menu: #no menu item specified
            tkMessageBox.showerror(title='Menu Item Error',
                    message='No menu item specified.')
            self.entryMenu.focus_set()
            menuOk=0
        elif len(menu)>30: #menu item name too long
            tkMessageBox.showerror(title='Menu Item Error',
                    message='Menu item too long. It should be no more '+
                    'than 30 characters.')
            self.entryMenu.focus_set()
            menuOk=0
        return menuOk

    def PathOk(self):
        #simple validity check for menu file path
        pathOk=1
        path=self.path.get()
        path.strip()
        if not path: #no path specified
            tkMessageBox.showerror(title='File Path Error',
                    message='No help file path specified.')
            self.entryPath.focus_set()
            pathOk=0
        elif not os.path.exists(path):
            tkMessageBox.showerror(title='File Path Error',
                    message='Help file path does not exist.')
            self.entryPath.focus_set()
            pathOk=0
        return pathOk

    def Ok(self, event=None):
        if self.MenuOk():
            if self.PathOk():
                self.result=( self.menu.get().strip(),self.path.get().strip() )
                self.destroy()

    def Cancel(self, event=None):
        self.result=None
        self.destroy()

if __name__ == '__main__':
    #test the dialog
    root=Tk()
    def run():
        keySeq=''
        dlg=GetHelpSourceDialog(root,'Get Help Source')
        print dlg.result
    Button(root,text='Dialog',command=run).pack()
    root.mainloop()
