from pymol import cmd
import Tkinter as tk
import Pmw
from pmg_tk.startup.ProMol import promolglobals as glb
Pmw.initialise()

# ADD RADIO BUTTONS
# Create and add radio buttons to the GUI
def radioAdd(frame, pos, orient, cmd, label, btn_labels, gridrow,
         gridcol, cspan, rspan, gridstick):
    labels = btn_labels     #the list of labels passed in by the user

    # create the radio button
    newRadio = Pmw.RadioSelect(frame, labelpos = pos, labelmargin = 0,
                    buttontype = 'radiobutton',
                    orient = orient,
                    label_text = label,
                    command = cmd)
     # add it to the gui
    newRadio.grid(row = gridrow, column = gridcol, columnspan = cspan,
             rowspan = rspan, sticky = gridstick, padx = 5)

    # add text to the buttons
    for text in labels:
        newRadio.add(text)
        newRadio.setvalue(labels[0])

def showaminopic():
    dimension = glb.GUI.toolbox['picdimension'].get()
    text = glb.GUI.toolbox['aminoimage'].get().lower()
    try:
        amino = glb.AminoHashTable[text][3].upper()
        glb.GUI.toolbox['aminocanvas'].create_image(0, 0,
            image=glb.Photos['%s%s' % (amino, dimension)], anchor=tk.NW)
    except KeyError:
        pass

def dis(event):
    cmd.wizard('Distance')

def loadmapps(event):
    root = Tk()
    group = Pmw.Group(root, tag_text='Electron Density Mapping')#And a new group
    group.grid(row=0, column=0, padx=0, pady=0, sticky=NW)
    interior = group.interior()
    framemesh = Frame(interior)
    framemesh.grid(row=2, column=0, padx=0, pady=2, sticky=W)
    framesurf = Frame(interior)
    framesurf.grid(row=4, column=0, padx=0, pady=2, sticky=W)
    framedots = Frame(interior)
    framedots.grid(row=3, column=0, padx=0, pady=2, sticky=W)
    framemeshsel = Frame(interior)
    framemeshsel.grid(row=2, column=1, padx=0, pady=2, sticky=W)
    framedotsel = Frame(interior)
    framedotsel.grid(row=3, column=1, padx=0, pady=2, sticky=W)
    framesurfsel = Frame(interior)
    framesurfsel.grid(row=4, column=1, padx=0, pady=2, sticky=W)
    framenameit = Frame(interior)
    framenameit.grid(row=0, column=1, padx=0, pady=2, sticky=SW)
    framepdbname = Frame(interior)
    framepdbname.grid(row=1, column=1, padx=0, pady=2, sticky=SW)
    framemapper = Frame(interior)
    framemapper.grid(row=4, column=2, padx=0, pady=2, sticky=W)
    imesh = Button (framemesh)#Mesh Button
    imesh.grid(row=2, column=0, padx=0, pady=2, sticky=W)
    imesh.configure(text="Mesh")
    imesh.configure(width="10")
    nameit = Entry (framenameit, width = 8)#Name Object Entry
    nameit.grid(row=0, column=1, padx=0, pady=0, sticky=SW)
    pdbname = Entry (framepdbname, width = 8)#Map Filename Entry
    pdbname.grid(row=1, column=1, padx=0, pady=0, sticky=SW)
    labelno = Label(interior, text = 'Name Object:')#Label for Object
    labelno.grid(row=0, column=0, padx=0, pady=0, sticky=SW)
    labelid = Label(interior, text = 'Map Filename:')#Label for Filename
    labelid.grid(row=1, column=0, padx=0, pady=0, sticky=SW)
    ehelp = Button (interior)
    ehelp.grid(row=5, column=0, padx=0, pady=2, sticky=W)
    ehelp.configure(text="Help")
    ehelp.configure(width="10")
    getmapper = Entry(interior, width = 4)
    getmapper.grid(row=3, column=2, padx=2, pady=2, sticky=SW)
    loadbtn = Button(interior, text = "Load Map")
    loadbtn.grid(row=5, column=2, padx=4, pady=2, sticky=W)
    def loadccp4(event):      
        file = askopenfilename(defaultextension=".ccp4", initialdir=glb.HOME)
        if len(file)>0:
            cmd.load(file)
        interior.mainloop()
    loadbtn.bind('<Button-1>', loadccp4)
    #go to upsalla website for maps
    def getmap():
        import webbrowser
        webbrowser.open('http://eds.bmc.uu.se/cgi-bin/eds/gen_maps_zip.pl?pdbCode='+ getmapper.get())
    mapper = Button (framemapper)
    mapper.grid(row=4, column=2, padx=0, pady=5, sticky=W)
    mapper.configure(text="Get Map")
    mapper.configure(width="10")
    
    labelcon = Label(interior, text = 'Input PDB code')
    labelcon.grid(row=2, column=2, padx=0, pady=2, sticky=SW)
    framecontour1 = Frame(interior)
    framecontour1.grid(row=1, column=2, padx=0, pady=0, sticky=NW)
    contour1  = Scale(framecontour1, width =8)
    contour1.configure(troughcolor="#ffffff")
    contour1.configure(length="65")
    contour1.configure(orient="horizontal")
    contour1.configure(resolution="0.05")
    contour1.configure(to="4.0")
    contour1.grid(row=1, column=2, padx=0, pady=0, sticky=NW)
    contour1.set(1.0)
    
    mapper.bind('<Button-1>', getmap)
    
    
    def elhelp(event):
        import webbrowser
        webbrowser.open(glb.pathmaker('EDMHelp.htm'))
    ehelp.bind('<Button-1>', elhelp)
     #---isomesh function
    def emesh(event):
        delcrea()
        try:
            if len(nameit.get()) < 1:
                
                
                showinfo("Error", 'Enter a name for the object')
                interior.mainloop()
            elif len(pdbname.get()) < 1:
                
                
                showinfo('Error', "Enter the Map Filename")
                interior.mainloop()
            
            else:
                cmd.isomesh(nameit.get(),pdbname.get(), contour1.get())
        except:
            
            
            showinfo("Error", 'No map is present')
            interior.mainloop()

    
    
    imesh.bind('<Button-1>', emesh)
    idot = Button (framedots)
    idot.grid(row=3, column=0, padx=0, pady=5, sticky=W)
    idot.configure(text="Dots")
    idot.configure(width="10")
    #Isodot function
    def edot(event):
        delcrea()
        try:
            if len(nameit.get()) < 1:    
                showinfo("Error", 'Enter a name for the object')
                interior.mainloop()
            elif len(pdbname.get()) < 1:    
                showinfo('Error', "Enter the Map Filename")
                interior.mainloop()
            else:
                cmd.isodot(nameit.get(), pdbname.get(), contour1.get())
        except: 
            showinfo("Error", 'No map is present')
            interior.mainloop()
    idot.bind('<Button-1>', edot)
    isurf = Button(framesurf)
    isurf.grid(row=2, column=1, padx=0, pady=5, sticky=W)
    isurf.configure(text="Surface")
    isurf.configure(width="10")
    #Isosurface function
    def esurf(event):
        delcrea()
        try:
            if len(nameit.get()) < 1:
                
                
                showinfo("Error", 'Enter a name for the object')
                interior.mainloop()
            elif len(pdbname.get()) < 1:
                
                
                showinfo('Error', "Enter the Map Filename")
                interior.mainloop()
            else:
                cmd.isosurface(nameit.get(), pdbname.get(), contour1.get())
        except:
            
            
            showinfo("Error", 'No map is present')
            interior.mainloop()
    
    isurf.bind('<Button-1>', esurf)



#----------Electron Density Map on only Selection------------------------
    labelcon = Label(interior, text = '  Contour')
    labelcon.grid(row=0, column=2, padx=0, pady=2, sticky=SW)
    imesh1 = Button (framemeshsel)
    imesh1.grid(row=4, column=0, padx=0, pady=5, sticky=W)
    imesh1.configure(text="Mesh Select")
    imesh1.configure(width="10")
    #isomesh on only selection
    
    def emesh1(*args):
        delcrea()
        try:
            if len(nameit.get()) < 1:
                
                
                showinfo("Error", 'Enter a name for the object')
                interior.mainloop()
            elif len(pdbname.get()) < 1:
                
                
                showinfo('Error', "Enter the Map Filename")
                interior.mainloop()
            
            else:
                cmd.isomesh(nameit.get(),pdbname.get(), contour1.get(), ('sele'))
        except:
            cmd.orient('all')
            
            
            showinfo("Error", 'No map is present\n Or there is no selection ("sele")')
            interior.mainloop()
    cmd.extend('emesh1',emesh1)
    imesh1.bind('<Button-1>', emesh1)
    idot1 = Button (framedotsel)
    idot1.grid(row=5, column=0, padx=0, pady=2, sticky=W)
    idot1.configure(text="Dots Select")
    idot1.configure(width="10")
    #isodot on only selection
    def edot1(event):
        delcrea()
        try:
            if len(nameit.get()) < 1:                
                showinfo("Error", 'Enter a name for the object')
                interior.mainloop()
            elif len(pdbname.get()) < 1:                
                showinfo('Error', "Enter the Map Filename")
                interior.mainloop()
            else:
                cmd.isodot(nameit.get(), pdbname.get(), contour1.get(), ('sele'))
        except:
            cmd.orient('all')            
            showinfo("Error", 'No map is present\n Or there is no selection ("sele")')
            interior.mainloop()
    
    
    idot1.bind('<Button-1>', edot1)
    isurf1 = Button(framesurfsel)
    isurf1.grid(row=4, column=1, padx=0, pady=2, sticky=W)
    isurf1.configure(text="Surface Select")
    isurf1.configure(width="12")
    #isosurface on only selection
    def esurf1(event):
        delcrea()
        try:
            if len(nameit.get()) < 1:
                
                
                showinfo("Error", 'Enter a name for the object')
                interior.mainloop()
            elif len(pdbname.get()) < 1:
                
                
                showinfo('Error', "Enter the Map Filename")
                interior.mainloop()
            
            else:
                cmd.isosurface(nameit.get(), pdbname.get(), contour1.get(), ('sele'))
        except:
            cmd.orient('all')
            
            
            showinfo("Error", 'No map is present\n Or there is no selection ("sele")')
            interior.mainloop()
    
    isurf1.bind('<Button-1>', esurf1)
    
    
    frame = Frame(interior)
    frame.grid(row=5, column=1, padx=0, pady=0, sticky=SW)
    doublemapbtn = Button(frame, text = 'Double resolution')
    doublemapbtn.grid(row=5, column=1, padx=0, pady=3, sticky=SW)
    
    balloon = Pmw.Balloon(interior)
    balloon.bind(frame, "Please be patient.\nButton should only be used once.\nPyMol will close if used twice.")
    
    #doubles map resolution (permanent because Pymol has errors associated
    #with halving the map resolution)
    def doublemapres(*args):
        try:
            cmd.map_double(pdbname.get(), '1')
        
        except:
            
            
            showinfo("Error", 'No map is present')
            interior.mainloop()
    doublemapbtn.bind('<Button-1>', doublemapres)
    cmd.extend('doublemapres',doublemapres)
    # 99 red balloons, floating in a summer sky
    balloon1 = Pmw.Balloon(interior)
    balloon1.bind(framemesh, "Display entire map as a mesh.")
    balloon2 = Pmw.Balloon(interior)
    balloon2.bind(framedots, "Display entire map as dots.")
    balloon3 = Pmw.Balloon(interior)
    balloon3.bind(framesurf, "Display entire map as surface.")
    balloon5 = Pmw.Balloon(interior)
    balloon5.bind(framemeshsel, "Must have PDB loaded.\n Display mesh on only selected residues (sele).")
    balloon6 = Pmw.Balloon(interior)
    balloon6.bind(framedotsel, "Must have PDB loaded.\n Display dots on only selected residues (sele).")
    balloon7 = Pmw.Balloon(interior)
    balloon7.bind(framesurfsel, "Must have PDB loaded.\n Display surface on only selected residues (sele).")
    balloon8 = Pmw.Balloon(interior)
    balloon8.bind(framenameit, "After loading map, must name the object\n to allow for more than one map instance.")
    balloon9 = Pmw.Balloon(interior)
    balloon9.bind(framepdbname, "After loading map, must enter filename\n of map to be viewed for PyMol to use it.")
    balloon10 = Pmw.Balloon(interior)
    balloon10.bind(framemapper, "View Help button for information on getting maps.")
    balloon11 = Pmw.Balloon(interior)
    balloon11.bind(framecontour1, "After altering countour click again\n on map view of choice for change to occur.")