#!/usr/bin/env python
#coding=utf-8

import wx
import sysmenu

class testframe(wx.Frame, sysmenu.mixSysMenu):
    def __init__(self, parent, id, *args, **kwds):
        wx.Frame.__init__(self, parent, id, *args, **kwds)
        
        pan = wx.Panel(self, -1)
        sz = wx.BoxSizer(wx.VERTICAL)
        pan.SetSizer(sz)
        
        szItems = wx.StaticBoxSizer(wx.StaticBox(pan, -1, "Options added to system menu"), wx.HORIZONTAL)
        sz.Add(szItems, 2, wx.EXPAND|wx.ALL, 3)
        
        # Options List
        self.ItemList = wx.ListBox(pan, -1, size=wx.Size(200,-1))
        szItems.Add(self.ItemList, 2, wx.EXPAND)
                   
        szStates = wx.BoxSizer(wx.VERTICAL)
        szItems.Add(szStates)
        
        self.Checked = wx.CheckBox(pan, -1, "Checked")
        szStates.Add(self.Checked, 0, wx.ALL, 3)
        
        self.Disabled = wx.CheckBox(pan, -1, "Disabled")
        szStates.Add(self.Disabled, 0, wx.ALL, 3)
        
        szButtons = wx.BoxSizer(wx.HORIZONTAL)
        sz.Add(szButtons, 0, wx.ALL, 3)
        
        self.BtnAppend = wx.Button(pan, -1, "Append Menu Item")
        szButtons.Add(self.BtnAppend, 0, wx.ALL, 3)
        
        self.BtnRemove = wx.Button(pan, -1, "Remove Menu Item")
        szButtons.Add(self.BtnRemove, 0, wx.ALL, 3)
        
        self.Message = wx.StaticText(pan, -1, size=wx.Size(-1, 30))
        sz.Add(self.Message, 0, wx.ALL, 6)
        
        sz.SetSizeHints(self)
        self.Layout()
        
        # Bind Events
        self.ItemList.Bind(wx.EVT_LISTBOX, self.OnListItems)
        self.Checked.Bind(wx.EVT_CHECKBOX, self.OnStates)
        self.Disabled.Bind(wx.EVT_CHECKBOX, self.OnStates)
        self.BtnAppend.Bind(wx.EVT_BUTTON, self.OnAppendItem)
        self.BtnRemove.Bind(wx.EVT_BUTTON, self.OnRemoveItem)
                    
        # Add optiones to sysmenu
        self.SysMenuAddSeparator()
        idOption1 = wx.NewId()
        self.SysMenuAppendItem("Custom option 1", idOption1, self.OnMenu)
        self.SysMenuSetState(idOption1, sysmenu.MF_CHECKED)      
        self.SysMenuAppendItem("Custom option 2", None, self.OnMenu)
        
        self.RefreshList()
        
    def RefreshList(self):
        items = self.SysMenuGetItemsList()
        print items
        self.ItemList.Clear()
        for item in items:
            self.ItemList.Append(item[1], item[0])
        if items:
            self.ItemList.SetSelection(0)
            self.OnListItems(None)
        
    def OnListItems(self, evt):
        itemid = self.ItemList.GetClientData(self.ItemList.GetSelection())
        self.Checked.SetValue(self.SysMenuGetState(itemid, sysmenu.MF_CHECKED))
        self.Disabled.SetValue(self.SysMenuGetState(itemid, sysmenu.MF_GRAYED))
    
    def OnStates(self, evt):
        itemid = self.ItemList.GetClientData(self.ItemList.GetSelection())
        checked = sysmenu.MF_CHECKED if self.Checked.GetValue() else sysmenu.MF_UNCHECKED
        disabled = sysmenu.MF_GRAYED if self.Disabled.GetValue() else sysmenu.MF_ENABLED
        self.SysMenuSetState(itemid, checked|disabled)            
    
    def OnAppendItem(self, evt):
        dlg = wx.TextEntryDialog(self, "Item text:", "Add new Item", '', style = wx.OK | wx.CANCEL)
        if dlg.ShowModal() == wx.ID_CANCEL:
            return
        text = dlg.GetValue()
        dlg.Destroy()
        if text:
            self.SysMenuAppendItem(text, None, self.OnMenu)
            self.RefreshList()
            
    def OnRemoveItem(self, evt):
        if self.ItemList.GetSelection() == wx.NOT_FOUND:
            return
        itemid = self.ItemList.GetClientData(self.ItemList.GetSelection())
        self.SysMenuDeleteItem(itemid)
        self.RefreshList()
    


        
    def OnMenu(self, ItemId):
        msg = "Click on:'%s', ItemId:%s, \nChecked:%s, Disabled:%s" % \
                (self.SysMenuGetMenuString(ItemId),
                ItemId,
                self.SysMenuGetState(ItemId, sysmenu.MF_CHECKED),
                self.SysMenuGetState(ItemId, sysmenu.MF_GRAYED))
        self.Message.SetLabel(msg)

    
    
# --- Start App ---
app = wx.App(0)
f = testframe(None, -1)
f.Show()
app.MainLoop()