• Facebook
  • Twitter
  • Reddit
  • StumbleUpon
  • Digg
  • email

#! /usr/bin/env python
 
import AUTOCommands
import Tkinter
import Pmw
import runAUTO
import plotter
import os
import tkSimpleDialog
import sys
import AUTOclui
import AUTOutil
 
class AUTOMessageBar(Pmw.MessageBar):
    def printMessage(self,text):
        self.helpmessage(text)
 
class AUTOGUIComponent:
    def __init__(self,messageFunc=None,textFunc=None):
        self.messageFunc = messageFunc
        self.textFunc = textFunc
 
    def create(self,messageFunc=None,textFunc=None,runner=None):
        pass
 
    def _getArgs(self,command):
        args = tkSimpleDialog.askstring("Args for command","Args")
        self._queueCommand(args,command)
 
    def _queueCommand(self,args,command):
        name = command.__name__
        if args is not None:
            sys.stdout.write(name+"("+args+")\n")
        else:
            sys.stdout.write(name+"()\n")
        eval("command(%s)"%args)
        sys.stdout.write(sys.ps1)
        sys.stdout.flush()
        if self.textFunc is not None:
            self.textFunc(name+"("+args+")\n")
            self.textFunc(str(output))
            self.textFunc(sys.ps1)
        self.messageFunc(name+"("+args+")\n")
 
 
class AUTOSimpleGUIComponent(Tkinter.Frame,AUTOGUIComponent):
    def __init__(self,parent=None,messageFunc=None,textFunc=None,**kw):
        Tkinter.Frame.__init__(self,parent,**kw)
        AUTOGUIComponent.__init__(self,messageFunc,textFunc)
        self.default = None
        self.create()
 
    def create(self,messageFunc=None,textFunc=None,runner=None):
        keys = AUTOCommands.__dict__.keys()
        self.simple()
 
    def simple(self,keys):
        self.addSimpleCommands([AUTOCommands])
 
    def addSimpleCommands(self,moduleList):
        self.defaultEntry = Pmw.EntryField(self,
                                           labelpos = 'w',
                                           label_text = 'Default name:',
                                           validate = None,
                                           command = self.__setDefault)
        self.defaultEntry.grid(row=0,columnspan=2)
        for module in moduleList:
            keys = list(module.__dict__)
            keys.sort()
            i = 0
            for key in keys:
                # Check to see if it is a command
                cmd = getattr(module,key)
                if (hasattr(cmd,"fun") and hasattr(cmd,"type") and
                    cmd.type==AUTOCommands.SIMPLE):
                    button = Tkinter.Button(self,text=cmd.shortName,
                                            command=lambda c=cmd.fun:
                                                self._getArgs(c))
                    button.grid(row=i/2 + 1,column=i%2)
                    i = i + 1
 
    def __setDefault(self):
        self.default = self.defaultEntry.get()
 
    def _getArgs(self,command):
        if self.default is None:
            self.default = tkSimpleDialog.askstring("Default Name","Name")
            self.defaultEntry.setentry(self.default)
        self._queueCommand(self.default,command)
 
 
class AUTOExpertGUIComponent(Pmw.MenuBar,AUTOGUIComponent):
    def __init__(self,parent=None,messageFunc=None,textFunc=None,**kw):
        Pmw.MenuBar.__init__(self,parent,**kw)
        AUTOGUIComponent.__init__(self,messageFunc,textFunc)
        self.create()
 
    def create(self):
        if self.textFunc is not None:
            self.textFunc(sys.ps1)
        keys = AUTOCommands.__dict__.keys()
 
        self.expert(keys)
 
    def expert(self,keys):
        baseList = []
        for key in keys:
            # Check to see if it is a command
            cmd = getattr(AUTOCommands,key)
            if hasattr(cmd,"fun"):
                bases = cmd.__bases__
                for base in bases:
                    if base not in baseList:
                        baseList.append(base)
 
        for base in baseList:
            if len(base.__name__) > 7 and base.__name__[:7] == "command":
                self.addmenu(base.__name__[7:],'Commands which inherit from %s'%base.__name__)
            else:
                self.addmenu(base.__name__,'Commands which inherit from %s'%base.__name__)
        self.addExpertCommands([AUTOCommands])
 
    def addExpertCommands(self,moduleList):
        for module in moduleList:
            keys = list(module.__dict__)
            keys.sort()
            for key in keys:
                # Check to see if it is a command
                cmd = getattr(module,key)
                if hasattr(cmd,"fun"):
                    f = cmd.fun
                    name = cmd.__bases__[0].__name__
                    if len(name) > 7:
                        name = name[7:]
                    self.addmenuitem(name, 'command', key, label=key,
                                     command=lambda c=f: self._getArgs(c))
 
 
class AUTOBody(Pmw.ScrolledText):
    def printOutput(self,text):
        self.insert("end",text)
 
 
class AUTOgui:
    def __init__(self,type="simple"):
        root=Tkinter.Toplevel()
 
 
        # Create the message bar        
        messagebar = AUTOMessageBar(root,
                                    entry_width = 40,
                                    entry_relief='groove',
                                    labelpos = 'w',
                                    label_text = 'Status:')
        messagebar.pack(fill = 'x', padx = 10, pady = 10,side="bottom")
 
        # Create the body
        #body   = AUTOBody(root)
        #body.pack(fill="both",expand=1)
 
        if type=="simple":
            self.interface = AUTOSimpleGUIComponent(root,messagebar.printMessage)
        else:
            balloon = Pmw.Balloon(root)
            self.interface = AUTOExpertGUIComponent(root,messagebar.printMessage,
                                                    hull_relief = 'raised',
                                                    hull_borderwidth = 1,
                                                    balloon = balloon)
        self.interface.pack(fill = 'x',side="top")
 
 
#    def addCommands(self,moduleList):
#        self.interface.addCommands(moduleList)