16b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi"""
26b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi File:
36b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi JetCtrls.py
46b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
56b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Contents and purpose:
66b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Auditions a jet file to simulate interactive music functions
76b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
86b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Copyright (c) 2008 Android Open Source Project
96b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Licensed under the Apache License, Version 2.0 (the "License");
116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi you may not use this file except in compliance with the License.
126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi You may obtain a copy of the License at
136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi      http://www.apache.org/licenses/LICENSE-2.0
156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Unless required by applicable law or agreed to in writing, software
176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi distributed under the License is distributed on an "AS IS" BASIS,
186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi See the License for the specific language governing permissions and
206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi limitations under the License.
216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi"""
226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviimport wx
246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviimport sys
256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom wx.lib.mixins.listctrl import CheckListCtrlMixin, ListCtrlAutoWidthMixin, ColumnSorterMixin
276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom JetUtils import *
286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom JetDefs import *
296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetSpin(wx.SpinCtrl):
316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Spin control """
326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__(self, parent, id=-1,value=wx.EmptyString,pos=wx.DefaultPosition,size=wx.DefaultSize,style=wx.SP_ARROW_KEYS,min=0,max=100,initial=0):
336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        wx.SpinCtrl.__init__(self, parent, id=id,value=value,pos=(pos[0]-MacOffset(),pos[1]),size=size,style=style,min=min,max=max,initial=initial)
346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetValue(self, val):
366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        try:
376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if type(val).__name__=='str':
386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.SpinCtrl.SetValue(self, int(val))
396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            else:
406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.SpinCtrl.SetValue(self, val)
416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        except:
426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            wx.SpinCtrl.SetValue(self, 0)
436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetSpinOneBased(JetSpin):
456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Spin control that's one based """
466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__(self, parent, id=-1,value=wx.EmptyString,pos=wx.DefaultPosition,size=wx.DefaultSize,style=wx.SP_ARROW_KEYS,min=0,max=100,initial=0):
476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        wx.SpinCtrl.__init__(self, parent, id=id,value=value,pos=(pos[0]-MacOffset(),pos[1]),size=size,style=style,min=min,max=max,initial=initial)
486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetValue(self, val):
506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        try:
516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if type(val).__name__=='str':
526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.SpinCtrl.SetValue(self, int(val) + 1)
536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            else:
546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.SpinCtrl.SetValue(self, val + 1)
556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        except:
566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            wx.SpinCtrl.SetValue(self, 1)
576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetValue(self):
596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        val = wx.SpinCtrl.GetValue(self)
606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        val = val - 1
616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return val
626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetCheckBox(wx.CheckBox):
646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Checkbox control """
656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__(self, parent, id=-1,label=wx.EmptyString,pos=wx.DefaultPosition,size=wx.DefaultSize):
666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        wx.CheckBox.__init__(self, parent, id=id, label=label, pos=pos, size=size)
676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetValue(self, val):
696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        try:
706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if type(val).__name__=='str':
716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if val == 'True':
726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    val = True
736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                else:
746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    val = False
756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.CheckBox.SetValue(self, val)
766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            else:
776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.CheckBox.SetValue(self, val)
786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        except:
796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            wx.CheckBox.SetValue(self, False)
806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetRadioButton(wx.RadioButton):
826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Radio button control """
836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__(self, parent, id=-1,label=wx.EmptyString,pos=wx.DefaultPosition,size=wx.DefaultSize):
846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        wx.RadioButton.__init__(self, parent, id=id, label=label, pos=pos, size=size)
856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetValue(self, val):
876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        try:
886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if type(val).__name__=='str':
896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if val == 'True':
906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    val = True
916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                else:
926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    val = False
936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.RadioButton.SetValue(self, val)
946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            else:
956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.RadioButton.SetValue(self, val)
966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        except:
976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            wx.RadioButton.SetValue(self, False)
986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetListCtrl(wx.ListCtrl, ListCtrlAutoWidthMixin, ColumnSorterMixin):
1006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ List control """
1016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__(self, parent, id=-1, pos=wx.DefaultPosition, size=wx.DefaultSize):
1026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        wx.ListCtrl.__init__(self, parent, id, pos=pos, size=size, style=wx.LC_REPORT | wx.SUNKEN_BORDER)
1036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        ListCtrlAutoWidthMixin.__init__(self)
1046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iCol = 0
1056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iWidth = 0
1066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.OnSortOrderChangedAlert = None
1076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iInitialized = False
1086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def AddCol(self, title, width):
1106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.InsertColumn(self.iCol, title)
1116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if width > 0:
1126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.SetColumnWidth(self.iCol, width)
1136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        else:
1146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            width = self.GetColumnWidth(self.iCol)
1156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iCol += 1
1166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iWidth = self.iWidth + width
1176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetSize((self.iWidth + 10, -1))
1186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def AddRows(self, values):
1206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for value in values:
1216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            iCol = 0
1226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for row in value:
1236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if iCol == 0:
1246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    index = self.InsertStringItem(sys.maxint, row)
1256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                else:
1266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.SetStringItem(index, iCol, row)
1276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                iCol = iCol + 1
1286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
1306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetListCtrl(self):
1316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return self
1326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def InitSorting(self, cols):
1346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if not self.iInitialized:
1356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            ColumnSorterMixin.__init__(self, cols)
1366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.iInitialized = True
1376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnSortOrderChanged(self):
1396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.OnSortOrderChangedAlert is not None:
1406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.OnSortOrderChangedAlert()
1416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __OnColClick(self, evt):
1436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        oldCol = self._col
1446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self._col = col = evt.GetColumn()
1456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self._colSortFlag[col] = int(not self._colSortFlag[col])
1466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.OnSortOrderChanged()
1476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetCheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin, ColumnSorterMixin):
1496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ List control with checkboxes on each line """
1506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__(self, parent, id=-1, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.LC_REPORT | wx.SUNKEN_BORDER):
1516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        wx.ListCtrl.__init__(self, parent, id, pos=pos, size=size, style=style)
1526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        CheckListCtrlMixin.__init__(self)
1536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        ListCtrlAutoWidthMixin.__init__(self)
1546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iCol = 0
1566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iWidth = 0
1576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.OnSortOrderChangedAlert = None
1586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iInitialized = False
1596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def AddCol(self, title, width):
1616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.InsertColumn(self.iCol, title)
1626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if width > 0:
1636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.SetColumnWidth(self.iCol, width)
1646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        else:
1656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            width = self.GetColumnWidth(self.iCol)
1666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iCol += 1
1676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iWidth = self.iWidth + width
1686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetSize((self.iWidth + 10, -1))
1696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnCheckItem(self, index, flag):
1716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if hasattr(self, 'BindCheckBoxFct'):
1726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.BindCheckBoxFct(index, flag)
1736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def BindCheckBox(self, fct):
1756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.BindCheckBoxFct = fct
1766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def AddRows(self, values):
1786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for value in values:
1796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            iCol = 0
1806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for row in value:
1816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if iCol == 0:
1826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    index = self.InsertStringItem(sys.maxint, row)
1836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                else:
1846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.SetStringItem(index, iCol, row)
1856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                iCol = iCol + 1
1866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
1886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetListCtrl(self):
1896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return self
1906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def InitSorting(self, cols):
1926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if not self.iInitialized:
1936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            ColumnSorterMixin.__init__(self, cols)
1946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.iInitialized = True
1956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnSortOrderChanged(self):
1976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.OnSortOrderChangedAlert is not None:
1986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.OnSortOrderChangedAlert()
1996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __OnColClick(self, evt):
2016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        oldCol = self._col
2026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self._col = col = evt.GetColumn()
2036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self._colSortFlag[col] = int(not self._colSortFlag[col])
2046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.OnSortOrderChanged()
2056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetTrackCtrl(JetCheckListCtrl):
2076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ List control specifically designed to show tracks in midi file """
2086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__(self, parent, id=-1, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.LC_REPORT | wx.SUNKEN_BORDER):
2096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        wx.ListCtrl.__init__(self, parent, id, pos=pos, size=size, style=style)
2106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        CheckListCtrlMixin.__init__(self)
2116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        ListCtrlAutoWidthMixin.__init__(self)
2126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iCol = 0
2146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iWidth = 0
2156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.muteFlags = 0
2166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetValue(self, muteFlags):
2186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.muteFlags = muteFlags
2196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetValue(self):
2216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return self.muteFlags
2226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def CheckTracks(self, muteFlags):
2246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        num = self.GetItemCount()
2256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for iRow in range(num):
2266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            track_num = self.GetTrackNumber(iRow)
2276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.CheckItem(iRow, GetMute(track_num, muteFlags))
2286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def AddTrackRow(self, track, loadEmpty=False):
2306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if loadEmpty or not track.empty:
2316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            index = self.InsertStringItem(sys.maxint, str(track.track))
2326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.SetStringItem(index, 1, str(track.channel))
2336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.SetStringItem(index, 2, str(track.name))
2346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetTrackNumber(self, index):
2366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return getColumnValue(self, index, 0)
2376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetFileCombo():
2396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Combo box with file open button """
2406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__(self, parent, pos=(0,0), size=(200,-1), title='Open File', spec='*.*', id=-1):
2416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.spec = spec
2426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.title = title
2436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.EventFire = False
2446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        BUTWIDTH = 20
2456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        BORDER = 5
2466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        w = size[0] - (BUTWIDTH + BORDER)
2476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        col = pos[0] + w + BORDER
2486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.cmb = wx.ComboBox(parent, id, "", pos=(pos[0]-MacOffset(),pos[1]), size=(w, -1), style=wx.CB_DROPDOWN)
2506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btn = wx.Button(parent, -1, "...", pos=(col, pos[1]+MacOffset()), size=(BUTWIDTH,self.cmb.GetSize()[1]))
2516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btn.Bind(wx.EVT_BUTTON, self.OnBrowse, self.btn)
2526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnBrowse(self, event):
2546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        os = __import__('os')
2556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        defDir = IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, self.spec, 'str', str(os.getcwd()))
2566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if OsWindows():
2576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            defDir = defDir.replace('/','\\')
2586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        else:
2596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            defDir = defDir.replace('\\', '/')
2606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        dlg = wx.FileDialog(None, self.title, defDir, '', self.spec, wx.FD_OPEN)
2626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        ret = dlg.ShowModal()
2636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if ret == wx.ID_OK:
2646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            IniSetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, self.spec, str(FileJustPath(dlg.GetPath())))
2656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            val = dlg.GetPath()
2666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.Append(val)
2686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.cmb.SetValue(val)
2696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if self.EventFire:
2716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                SendEvent(self.cmb, wx.EVT_COMBOBOX.evtType[0])
2726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        dlg.Destroy()
2736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetEventFire(self, fire):
2756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.EventFire = fire
2766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetValue(self):
2786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return StrNoneChk(self.cmb.GetValue())
2796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetValue(self, val):
2816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        try:
2826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.cmb.SetValue(val)
2836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        except:
2846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            pass
2856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def Append(self, val):
2876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        try:
2886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.cmb.Append(val)
2896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        except:
2906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            pass
2916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetFocus(self):
2936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.cmb.SetFocus()
2946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetListValues(self, list):
2966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.cmb.AppendItems(list)
2976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def Enable(self, enable):
2996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.cmb.Enable(enable)
3006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btn.Enable(enable)
3016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetHelpText(self, Lbl):
3036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.cmb.SetHelpText(Lbl)
3046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btn.SetHelpText(Lbl)
3056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetFileText():
3076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Capture a filename with a button to browse for a file """
3086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__(self, parent, pos=(0,0), size=(200,-1), title='Open File', spec='*.*', id=-1):
3096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.spec = spec
3106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.title = title
3116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        BUTWIDTH = 20
3126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        BORDER = 5
3136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        w = size[0] - (BUTWIDTH + BORDER)
3146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        col = pos[0] + w + BORDER
3156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.txt = wx.TextCtrl(parent, id, "", pos=(pos[0]-MacOffset(),pos[1]), size=(w, -1))
3176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btn = wx.Button(parent, -1, "...", pos=(col, pos[1]), size=(BUTWIDTH,self.txt.GetSize()[1]))
3186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btn.Bind(wx.EVT_BUTTON, self.OnBrowse, self.btn)
3196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnBrowse(self, event):
3216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        os = __import__('os')
3226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        defDir = IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, self.spec, 'str', str(os.getcwd()))
3236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if OsWindows():
3246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            defDir = defDir.replace('/','\\')
3256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        else:
3266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            defDir = defDir.replace('\\', '/')
3276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        dlg = wx.FileDialog(None, self.title, defDir, '', self.spec, wx.FD_OPEN)
3296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        ret = dlg.ShowModal()
3306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if ret == wx.ID_OK:
3316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            IniSetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, self.spec, str(FileJustPath(dlg.GetPath())))
3326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            val = dlg.GetPath()
3336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.txt.SetValue(val)
3346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        dlg.Destroy()
3356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetValue(self):
3376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return StrNoneChk(self.txt.GetValue())
3386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetValue(self, val):
3406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        try:
3416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.txt.SetValue(val)
3426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        except:
3436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            pass
3446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def Append(self, val):
3466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        try:
3476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.txt.Append(val)
3486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        except:
3496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            pass
3506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetFocus(self):
3526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.txt.SetFocus()
3536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def Enable(self, enable):
3556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.txt.Enable(enable)
3566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btn.Enable(enable)
3576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetHelpText(self, Lbl):
3596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.txt.SetHelpText(Lbl)
3606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.btn.SetHelpText(Lbl)
3616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trividef YesNo(title, question, default):
3636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Simple Yes/No question box """
3646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    dlg = wx.MessageDialog(None, question, title, wx.YES_NO | wx.ICON_QUESTION)
3656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    if dlg.ShowModal() == wx.ID_YES:
3666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        result = True
3676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    else:
3686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        result = False
3696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    dlg.Destroy()
3706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    return result
3716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trividef YesNoCancel(title, question, default):
3736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Simple Yes/No question box """
3746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    dlg = wx.MessageDialog(None, question, title, wx.YES_NO | wx.CANCEL | wx.ICON_QUESTION)
3756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    result = dlg.ShowModal()
3766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    dlg.Destroy()
3776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    return result
3786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trividef ErrorMsg(title, message):
3806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Dipslay an error message """
3816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    dlg = wx.MessageDialog(None, message, title, wx.ICON_ERROR)
3826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    dlg.ShowModal()
3836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    dlg.Destroy()
3846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trividef InfoMsg(title, message):
3866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Displays an informational message """
3876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    dlg = wx.MessageDialog(None, message, title, wx.ICON_INFORMATION)
3886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    dlg.ShowModal()
3896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    dlg.Destroy()
3906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass TimeCtrl(wx.Frame):
3926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Combination of controls to capture measure, beat, tick times """
3936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__(self, parent, pos=(0,0), minimums=(1,1,0), maximums=(999,4,480), value=JetDefs.MBT_DEFAULT, ctlName=''):
3946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        wx.Frame.__init__(self, parent, -1)
3956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.ChangeCallbackFct = None
3976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.ctlName = ctlName
3986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.mx = maximums
3996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.mn = minimums
4006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.maxTicks = 0
4016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iCtrl = 0
4026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        p1 = pos[0]
4036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        top = pos[1] + MacOffset()
4046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        w1 = 30
4056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time = (wx.TextCtrl(parent, -1, str(value[0]), pos=(p1, top), size=(w1, -1), style=wx.TE_NOHIDESEL),
4066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.TextCtrl(parent, -1, str(value[1]), pos=(p1 + (w1 + 3), top), size=(w1, -1), style=wx.TE_NOHIDESEL),
4076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                wx.TextCtrl(parent, -1, str(value[2]), pos=(p1 + (w1 + 3) *2, top), size=(w1, -1), style=wx.TE_NOHIDESEL),
4086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                )
4096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        h = self.time[2].GetSize().height
4106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        w = self.time[2].GetSize().width + self.time[2].GetPosition().x + 8
4116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.spin = wx.SpinButton(parent, -1, (w, top), (h*2/3, h), wx.SP_VERTICAL)
4136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.spin.SetValue(1)
4146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.spin.SetRange(-999,999)
4156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.spin.Bind(wx.EVT_SPIN_UP, self.OnSpinUp, self.spin)
4176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.spin.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown, self.spin)
4186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[0].Bind(wx.EVT_SET_FOCUS, self.OnFocusMeasure, self.time[0] )
4206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[1].Bind(wx.EVT_SET_FOCUS, self.OnFocusBeat, self.time[1] )
4216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[2].Bind(wx.EVT_SET_FOCUS, self.OnFocusTick, self.time[2] )
4226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[0].Bind(wx.EVT_KILL_FOCUS, self.OnChangeVal, self.time[0] )
4246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[1].Bind(wx.EVT_KILL_FOCUS, self.OnChangeVal, self.time[1] )
4256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[2].Bind(wx.EVT_KILL_FOCUS, self.OnChangeVal, self.time[2] )
4266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SetValue(value)
4286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def UnBindKillFocus(self):
4306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[0].Unbind(wx.EVT_KILL_FOCUS, self.time[0])
4316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[1].Unbind(wx.EVT_KILL_FOCUS, self.time[1])
4326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[2].Unbind(wx.EVT_KILL_FOCUS, self.time[2])
4336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetChangeCallbackFct(self, ChangeCallbackFct):
4356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.ChangeCallbackFct = ChangeCallbackFct
4366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnChangeVal(self, event=None):
4386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if not OsWindows():
4396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[self.iCtrl].SetSelection(-1,-1)
4406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if int(self.time[self.iCtrl].GetValue()) > self.mx[self.iCtrl]:
4416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[self.iCtrl].SetValue(str(self.mx[self.iCtrl]))
4426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if int(self.time[self.iCtrl].GetValue()) < self.mn[self.iCtrl]:
4436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[self.iCtrl].SetValue(str(self.mn[self.iCtrl]))
4446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.ChangeCallbackFct is not None:
4456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.ChangeCallbackFct()
4466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if event is not None:
4476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            event.Skip()
4486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnSpinUp(self, event):
4506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if int(self.time[self.iCtrl].GetValue()) < self.mx[self.iCtrl]:
4516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[self.iCtrl].SetValue(str(int(self.time[self.iCtrl].GetValue()) + 1))
4526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.OnChangeVal()
4536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnSpinDown(self, event):
4556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if int(self.time[self.iCtrl].GetValue()) > self.mn[self.iCtrl]:
4566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[self.iCtrl].SetValue(str(int(self.time[self.iCtrl].GetValue()) - 1))
4576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.OnChangeVal()
4586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnFocusMeasure(self, event):
4606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iCtrl = 0
4616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnFocusBeat(self, event):
4636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iCtrl = 1
4646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def OnFocusTick(self, event):
4666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.iCtrl = 2
4676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetValue(self, mbt):
4696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        try:
4706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if type(mbt).__name__=='str' or type(mbt).__name__=='unicode':
4716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                mbt = ConvertStrTimeToTuple(mbt)
4726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            mbt = mbtFct(mbt, 1)
4736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[0].SetValue(str(mbt[0]))
4746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[1].SetValue(str(mbt[1]))
4756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[2].SetValue(str(mbt[2]))
4766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        except:
4776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[0].SetValue(str(self.mn[0]))
4786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[1].SetValue(str(self.mn[1]))
4796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[2].SetValue(str(self.mn[2]))
4806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if not OsWindows():
4816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[0].SetSelection(-1,-1)
4826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[1].SetSelection(-1,-1)
4836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.time[2].SetSelection(-1,-1)
4846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetValue(self, typ='str'):
4866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        try:
4876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if typ == 'str':
4886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                ret = "%d:%d:%d" % (int(self.time[0].GetValue()), int(self.time[1].GetValue()), int(self.time[2].GetValue()))
4896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            else:
4906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                ret = (int(self.time[0].GetValue()), int(self.time[1].GetValue()), int(self.time[2].GetValue()))
4916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        except:
4926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            ret = self.minimums
4936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return mbtFct(ret, -1)
4946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def Enable(self, enable):
4966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[0].Enable(enable)
4976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[1].Enable(enable)
4986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[2].Enable(enable)
4996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.spin.Enable(enable)
5006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetFocus(self):
5026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[0].SetFocus()
5036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetMaxMbt(self, m, b, t):
5056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.mx = (m,b,t)
5066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetMaxMbt(self):
5086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return "%d:%d:%d" % self.mx
5096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetMinMbt(self, m, b, t):
5116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.mn = (m,b,t)
5126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetMaxTicks(self, maxTicks):
5146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.maxTicks = maxTicks
5156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetMaxTicks(self):
5176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return self.maxTicks
5186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SetHelpText(self, Lbl):
5206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.spin.SetHelpText(Lbl)
5216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[0].SetHelpText(Lbl)
5226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[1].SetHelpText(Lbl)
5236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.time[2].SetHelpText(Lbl)
5246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetMeasure(self):
5266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return int(self.time[0].GetValue())
5276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetBeat(self):
5296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return int(self.time[1].GetValue())
5306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetTick(self):
5326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return int(self.time[2].GetValue())
5336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviif __name__ == '__main__':
5356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Test code for controls """
5366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    class TestFrame(wx.Frame):
5376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        def __init__(self, parent, id, title):
5386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            wx.Frame.__init__(self, parent, id, title, size=(350, 220))
5396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            panel = wx.Panel(self, -1)
5416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.tc = TimeCtrl(panel, pos=(30, 20), maximums=(25, 4, 120), value=(2, 3, 4))
5436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            #tc.Enable(True)
5446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            #tc.SetValue((2,3,4))
5456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            #tc.SetValue("1:2:3")
5466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            #print(tc.GetValue())
5476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            js = JetSpin(panel, -1, pos=(30, 100))
5496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            js.SetValue("1")
5506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            #js.SetValue(1)
5516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            #fl = JetFileCombo(panel)
5536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            wx.EVT_CLOSE(self, self.OnClose)
5556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.Centre()
5576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.Show(True)
5586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        def OnClose(self, event):
5606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.tc.UnBindKillFocus()
5616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.Destroy()
5626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    app = wx.App(None)
5646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    TestFrame(None, -1, 'TestFrame')
5656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    app.MainLoop()
5666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
568