#! /usr/bin/python
from globals import *

#---------------------------------------------------------------------------

class GridMenu(wxGrid):
    def __init__(self, menu, parent, id, pos, options, title):
        wxGrid.__init__(self, parent, id, pos=pos, style=wxSIMPLE_BORDER)
        self.menu = menu
        self.parent = parent
        self.CreateGrid(len(options),1)
        self.EnableDragGridSize(false)
        self.EnableEditing(false)
        self.EnableGridLines(false)
        self.SetColLabelAlignment(wxCENTRE, wxCENTRE)
        self.SetRowLabelSize(0)
        self.SetColLabelSize(self.GetRowSize(0))
        self.SetColLabelValue(0,title)
        for i in range(len(options)):
            self.SetCellValue(i,0,options[i][0])
        self.SetColSize(0,192)
        self.SetSize((194,100))
        self.SetFocus()

        EVT_GRID_CELL_LEFT_CLICK(self,self.OnMouse)
        EVT_KEY_DOWN(self, self.OnKeyDown)

    def OnMouse(self, evt):
        print 'mouse %s - %s' % (self.GetId(),evt.GetRow())
        self.menu.Selected(self.GetId(),evt.GetRow())
        evt.Skip()

    def OnKeyDown(self, evt):
        if evt.KeyCode() == 13 or evt.KeyCode() == 9:
            self.menu.Selected(self.GetId(),self.GetGridCursorRow())
            wxCallAfter(self.SetGridCursor,self.GetGridCursorRow(),0)
        elif evt.KeyCode() == 27:
            wxCallAfter(self.menu.Delete)
        evt.Skip()

#---------------------------------------------------------------------------

class ListMenu(wxListCtrl):
    def __init__(self, menu, parent, id, pos, options, title):
        wxListCtrl.__init__(self, parent, id, pos=pos, size=(200,len(options)*29),
            style=wxLC_REPORT|wxSIMPLE_BORDER)
        self.menu = menu
        self.parent = parent

        self.InsertColumn(0, title)
        self.SetColumnWidth(0, 200)
        for i in range(len(options)):
            self.InsertStringItem(i,options[i][0])
        self.SetItemState(0, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED)
        self.SetFocus()

        EVT_LIST_KEY_DOWN(self, id, self.OnKeyDown)
        EVT_LIST_ITEM_ACTIVATED(self, id, self.OnItemActivated)

    def OnKeyDown(self,evt):
        if evt.GetKeyCode() == 9:
            self.menu.Selected(self.GetId(),evt.m_itemIndex)
        elif evt.GetKeyCode() == 27:
            wxCallAfter(self.menu.Delete)
        evt.Skip()

    def OnItemActivated(self, evt):
        self.menu.Selected(self.GetId(),evt.m_itemIndex)

#---------------------------------------------------------------------------

if sys.platform == 'win32':
    Menu = GridMenu
else:
    Menu = ListMenu

#---------------------------------------------------------------------------

class MyMenu:
    def __init__(self, parent,name, title):
        self.parent = parent
        try:
            self.options = file('../menus/%s' % name).readlines()
            for i in range(len(self.options)):
                self.options[i] = self.options[i][:-1].split('\t')
        except:
            opt1 = ['Setup menu','m','setup']
            opt2 = ['Transaction menu','m','trans']
            opt3 = ['Reports menu','m','reports']
            self.options = [opt1,opt2,opt3]
        parent.menu_no += 1
        self.menu = Menu(self,parent, parent.menu_no+1000,
            (parent.menu_no*50+10,parent.menu_no*30+10), self.options, title)
        parent.menus.append(self)

    def Selected(self,id,opt_no):
        if id-1000 < self.parent.menu_no:
            for i in range(self.parent.menu_no, id-1000, -1):
                self.parent.menus[i].menu.Destroy()
                del self.parent.menus[i]
                self.parent.menu_no -= 1
        opt = self.options[opt_no]
        if opt[1] == 'm':
            wxCallAfter(MyMenu,self.parent, opt[2], opt[0])
        else:
            imp = __import__(opt[2],globals(),locals(),[opt[2]])  # 1=module 2=class
            class_ = getattr(imp,opt[2])
            # instantiate wxFrame, pass it self and its id so that it can call Closed at end
            self.app = class_(self.parent,opt[2])
            self.parent.progs[opt[2]] = self.app
            self.app.frame.Show(true)

    def Delete(self):
        if self.parent.menu_no:
            self.menu.Destroy()
            del self.parent.menus[self.parent.menu_no]
            self.parent.menu_no -= 1
            self.parent.menus[self.parent.menu_no].menu.SetFocus()
        else:
            self.parent.frame.Close()

#---------------------------------------------------------------------------

class MyPanel(wxPanel):
    def __init__(self, frame):
        wxPanel.__init__(self, frame, -1)
        self.frame = frame
        self.progs = {}
        self.menus = []
        self.menu_no = -1
        MyMenu(self,'mainmenu','Main menu')
 
    def Closed(self,prog):
        del self.progs[prog]

#---------------------------------------------------------------------------

class MyFrame(wxFrame):
    def __init__(self, parent, id, title):
        wxFrame.__init__(self, parent, id, title,
                         wxPoint(100, 100), wxSize(360, 240))
        self.panel = MyPanel(self)
        self.CentreOnScreen()

        EVT_CLOSE(self,self.OnCloseWindow)
        
    def OnCloseWindow(self, event):
        if len(self.panel.progs):
            print 'programs still open'
        else:
            self.Destroy()

#---------------------------------------------------------------------------

class MyApp(wxApp):
    def OnInit(self):
        frame = MyFrame(NULL, -1, "Main Menu")
        frame.Show(true)
        self.SetTopWindow(frame)
        return true

#---------------------------------------------------------------------------

def run():
    app = MyApp(0)     # Create an instance of the application class
    app.MainLoop()     # Tell it to start processing events

if __name__ == '__main__':
    run()
