JetDialogs.py revision 8872ef327bd0a801363edf1c6ce8df0b74e51c8d
115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek"""
215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek File:
315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek JetDialogs.py
415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek Contents and purpose:
615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek Dialog boxes used in JetCreator
715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek Copyright (c) 2008 Android Open Source Project
915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
1015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek Licensed under the Apache License, Version 2.0 (the "License");
1115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek you may not use this file except in compliance with the License.
1215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek You may obtain a copy of the License at
1315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
1415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek      http://www.apache.org/licenses/LICENSE-2.0
1515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
1615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek Unless required by applicable law or agreed to in writing, software
1715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek distributed under the License is distributed on an "AS IS" BASIS,
1815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek See the License for the specific language governing permissions and
2015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek limitations under the License.
2115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek"""
2215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
2315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekimport wx
2415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekimport thread
2515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekimport wx.lib.newevent
2615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
2715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetDefs import *
2815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetCtrls import *
2915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetFile import *
3015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetUtils import *
3115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetPreview import *
3215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetSegGraph import *
3315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom eas import *
3415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetStatusEvent import *
3515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
3615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel KlimekPLAY_SEGMENT = 1
3715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel KlimekPLAY_MIDI = 2
3815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
3915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekclass JetEdit():
409a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg    """ Class used to build dialog box controls from the definitions in JetDefs """
419a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg    def __init__(self, panel, ctrlList, callbackClass):
4215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        LBL_OFFSET = 15
4315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
449a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg        ctrls = getattr(JetDefs, ctrlList)
459a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg        self.ctrls = {}
4615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        for Lbl, Text, Row, Col, Len, Min, Max, Id, Lst, Fct, Enabled, HelpText in ctrls:
4715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            try:
4815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                iDisplayLbl = True
4915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                if Text[0:3] == "btn":
5015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    self.ctrls[Text] = wx.Button(panel, Id, Lbl, wx.Point(Col, Row), size=Len)
5115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    if Fct > "":
5215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text].Bind(wx.EVT_BUTTON, getattr(callbackClass, Fct), self.ctrls[Text], id=Id)
5315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    if Id == wx.ID_OK:
5415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text].SetDefault()
5515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    iDisplayLbl = False
5615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                else:
5715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    if Text[0:3] == "txt":
5815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = wx.TextCtrl(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET +3), wx.Size(Len,-1))
5915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:4] == "spn1":
6015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = JetSpinOneBased(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), min=Min, max=Max)
6115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:3] == "spn":
6215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = JetSpin(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), min=Min, max=Max)
6315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:3] == "cmb":
6415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = wx.ComboBox(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), Lst, wx.CB_DROPDOWN | wx.CB_READONLY )
6515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text].SetValue(Lst[0])
6615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        if Fct > "":
6715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                            self.ctrls[Text].Bind(wx.EVT_COMBOBOX, getattr(callbackClass, Fct), self.ctrls[Text])
6815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:2] == "tm":
6915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = TimeCtrl(panel, pos=(Col, Row + LBL_OFFSET), ctlName=Text)
7015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:7] == "filecmb":
7115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = JetFileCombo(panel, pos=(Col, Row + LBL_OFFSET), size=wx.Size(Len,-1), title=Lbl, spec=Lst, id=Id)
7215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:7] == "filetxt":
7315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = JetFileText(panel, pos=(Col, Row + LBL_OFFSET), size=wx.Size(Len,-1), title=Lbl, spec=Lst, id=Id)
7415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:2] == "fr":
7515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = wx.StaticBox(parent=panel, id=wx.ID_ANY, label=Lbl, pos=(Row, Col), size=Len)
7615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        iDisplayLbl = False
7715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:3] == "chk":
7815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = JetCheckBox(panel, Id, label=Lbl, pos=(Col, Row), size=wx.Size(Len,-1))
7915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        iDisplayLbl = False
8015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        if Fct > "":
8115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                            self.ctrls[Text].Bind(wx.EVT_CHECKBOX , getattr(callbackClass, Fct), self.ctrls[Text])
8215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:6] == "rdobox":
8315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = wx.RadioBox(panel, Id, label=Lbl, pos=(Col, Row), size=Len, choices=Lst, majorDimension=1, style=wx.RA_SPECIFY_COLS)
8415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        iDisplayLbl = False
8515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        if Fct > "":
8615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                            self.ctrls[Text].Bind(wx.EVT_RADIOBOX , getattr(callbackClass, Fct), self.ctrls[Text])
8715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:3] == "opt":
8815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = JetRadioButton(panel, Id, label=Lbl, pos=(Col, Row), size=wx.Size(Len,-1))
8915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        iDisplayLbl = False
9015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text].SetValue(Lst)
9115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        if Fct > "":
9215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                            self.ctrls[Text].Bind(wx.EVT_RADIOBUTTON , getattr(callbackClass, Fct), self.ctrls[Text])
9315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:3] == "lst":
9415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = wx.ListBox(panel, Id, pos=(Col, Row), size=Len)
9515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        iDisplayLbl = False
9615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:4] == "grd2":
9715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = JetTrackCtrl(panel, Id, pos=(Col, Row + LBL_OFFSET), size=Len, style=wx.LC_REPORT | wx.SUNKEN_BORDER)
9815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        iDisplayLbl = True
9915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:3] == "grd":
10015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = JetListCtrl(panel, Id, pos=(Col, Row), size=Len)
10115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        iDisplayLbl = False
10215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:5] == "graph":
10315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = SegmentGraph(panel, pos=(Col, Row), size=Len)
10415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        iDisplayLbl = False
10515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:3] == "hlp":
10615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = wx.ContextHelpButton(panel, Id, pos=(Col, Row))
10715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        iDisplayLbl = False
10815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:3] == "lbl":
10915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = wx.StaticText(panel, Id, Lbl, wx.Point(Col, Row), size=wx.Size(Len[0],Len[1]))
11015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        iDisplayLbl = False
11115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    elif Text[0:3] == "box":
11215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        self.ctrls[Text] = wx.StaticBox(panel, wx.ID_ANY, Lbl, pos=(Col, Row), size=Len)
11315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                        iDisplayLbl = False
11415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
11515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                if iDisplayLbl:
11615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    self.ctrls[Lbl] = wx.StaticText(panel, Id, Lbl, wx.Point(Col, Row))
11715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                if not Enabled:
11815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    self.ctrls[Text].Enable(False)
11915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
12015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                helpText = IniGetValue(JetDefs.JETCREATOR_HLP, ctrlList, Lbl)
12115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                if helpText > "":
12215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                    self.ctrls[Text].SetHelpText(helpText)
12315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
12415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            #except AttributeError:
12515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                #No stub function for testing
12615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                #print("def " + Fct + "(self, event): pass")
12715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            except:
12815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek                raise
12915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
13015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    def GetValue(self, fld):
13115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        """ Gets the value of a control """
13215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        return self.ctrls[fld].GetValue()
13315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
13415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    def SetValue(self, fld, val):
13515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        """ Sets the value of a control """
13615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.ctrls[fld].SetValue(val)
13715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
13815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekclass JetOpen(wx.Dialog):
13915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    """ Opens a jet definition file """
14015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    def __init__(self):
14115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        wx.Dialog.__init__(self, None, -1, JetDefs.DLG_JETOPEN)
14215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.fileName = ""
14315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.je = JetEdit(self, "JETOPEN_CTRLS", self)
14415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        fileList = GetRecentJetFiles()
14515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.je.ctrls[JetDefs.F_JLIST].AppendItems(fileList)
14615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        if len(fileList) > 0:
14715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            self.je.ctrls[JetDefs.F_JFILE].SetValue(fileList[0])
14815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnOpen)
14915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.Bind(wx.EVT_LISTBOX, self.OnClick)
15015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.SetSize(JetDefs.JETOPEN_SIZE)
15115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.CenterOnParent()
15222d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek
15322d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek    def OnJetImport(self, event):
15422d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek        """ Exit the dialog with flag to import """
15522d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek        self.EndModal(JetDefs.ID_JET_IMPORT)
15622d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek
15722d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek    def OnClick(self, event):
15822d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek        """ Clicking on item in listbox """
15922d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek        sValue = self.je.ctrls[JetDefs.F_JLIST].GetString(self.je.ctrls[JetDefs.F_JLIST].GetSelection())
16022d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek        self.je.ctrls[JetDefs.F_JFILE].SetValue(sValue)
16122d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek
16215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    def OnOpen(self, event):
16315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        """ Double clicking on item in listbox """
16415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        sValue = self.je.ctrls[JetDefs.F_JLIST].GetString(self.je.ctrls[JetDefs.F_JLIST].GetSelection())
16515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.je.ctrls[JetDefs.F_JFILE].SetValue(sValue)
16615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        if self.Validate():
16715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            self.fileName = self.je.ctrls[JetDefs.F_JFILE].GetValue()
16815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            AppendRecentJetFile(self.fileName)
16915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            self.EndModal(JetDefs.ID_JET_OPEN)
17015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
17115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    def OnOk(self, event):
17215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        """ Clicking the ok button """
17315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        if self.Validate():
17415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            self.fileName = self.je.ctrls[JetDefs.F_JFILE].GetValue()
17515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            AppendRecentJetFile(self.fileName)
17615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            self.EndModal(JetDefs.ID_JET_OPEN)
17715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
17815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    def OnNew(self, event):
17915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        """ Exit the dialog with flag to create new blank jet file """
18015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.EndModal(JetDefs.ID_JET_NEW)
18115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
18215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    def Validate(self):
18315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        """ Validates the filename """
18415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        if len(self.je.ctrls[JetDefs.F_JFILE].GetValue()) == 0:
18515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            InfoMsg("Jet Filename", "The Jet filename is blank.")
18615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            self.je.ctrls[JetDefs.F_JFILE].SetFocus()
18715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            return False
18815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        if not FileExists(self.je.ctrls[JetDefs.F_JFILE].GetValue()):
18915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            InfoMsg("MIDI File", "The file does not exist.")
19015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            self.je.ctrls[JetDefs.F_JFILE].SetFocus()
19115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek            return False
19215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        return True
19315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
19415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekclass JetPreferences(wx.Dialog):
19515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    """ Preferences dialog box """
19615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    def __init__(self):
19715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        wx.Dialog.__init__(self, None, -1, JetDefs.DLG_PREFERENCES)
19815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
19915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.je = JetEdit(self, "PREFERENCES_CTRLS", self)
20015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.SetSize(JetDefs.PREFERENCES_SIZE)
20115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.CenterOnParent()
20215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
20315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    def OnOk(self, event):
20415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.EndModal(wx.ID_OK)
20515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
20615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    def GetValue(self, fld):
20715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        return self.je.ctrls[fld].GetValue()
20815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
20915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    def SetValue(self, fld, val):
21015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.je.ctrls[fld].SetValue(val)
21115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
21215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek
21315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekclass JetAbout(wx.Dialog):
21415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    """ About dialog box """
21515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek    def __init__(self):
21615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        wx.Dialog.__init__(self, None, -1, JetDefs.DLG_ABOUT)
21715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        img = __import__('img_splash')
21815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        bmp = img.getBitmap()
21915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        b = wx.StaticBitmap(self, -1, bmp)
22015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek        self.SetSize((bmp.GetWidth(), bmp.GetHeight()))
221        self.CenterOnParent()
222        s = __import__('sys')
223        print(s.platform)
224
225    def OnOk(self, event):
226        self.EndModal(wx.ID_OK)
227
228    def GetValue(self, fld):
229        return self.je.ctrls[fld].GetValue()
230
231    def SetValue(self, fld, val):
232        self.je.ctrls[fld].SetValue(val)
233
234
235class JetPropertiesDialog(wx.Dialog):
236    """ Properties dialog box """
237    def __init__(self):
238        wx.Dialog.__init__(self, None, -1, JetDefs.DLG_PROPERTIES)
239        self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
240        self.je = JetEdit(self, "JET_PROPERTIES_CTRLS", self)
241        self.SetSize(JetDefs.JET_PROPERTIES_SIZE)
242        self.CenterOnParent()
243
244    def OnOk(self, event):
245        self.EndModal(wx.ID_OK)
246
247    def GetValue(self, fld):
248        return self.je.ctrls[fld].GetValue()
249
250    def SetValue(self, fld, val):
251        self.je.ctrls[fld].SetValue(val)
252
253
254class JetErrors(wx.Dialog):
255    """ Errors dialog box """
256    def __init__(self, title):
257        wx.Dialog.__init__(self, None, -1, title)
258        self.je = JetEdit(self, "ERRORDLG", self)
259        self.SetSize(JetDefs.ERRORDLG_SIZE)
260        self.CenterOnParent()
261
262    def OnOk(self, event):
263        self.EndModal(wx.ID_OK)
264
265    def SetErrors(self, errors):
266        self.je.ctrls[JetDefs.F_ERRGRID].AddCol("Error", JetDefs.ERRORCOLW)
267        self.je.ctrls[JetDefs.F_ERRGRID].AddCol("Description", JetDefs.ERRORCOLW)
268        self.je.ctrls[JetDefs.F_ERRGRID].AddRows(errors)
269
270
271class SegEdit(wx.Dialog):
272    """ Dialog box to edit segments """
273    def __init__(self, title, currentJetConfigFile):
274        wx.Dialog.__init__(self, None, -1, title)
275        self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
276        self.currentJetConfigFile = currentJetConfigFile
277        self.je = JetEdit(self, "SEGDLG_CTRLS", self)
278        self.je.ctrls[JetDefs.F_MIDIFILE].cmb.Bind(wx.EVT_KILL_FOCUS, self.OnMidiChanged)
279        self.je.ctrls[JetDefs.F_MIDIFILE].cmb.Bind(wx.EVT_COMBOBOX, self.OnMidiChanged)
280        self.je.ctrls[JetDefs.F_MIDIFILE].SetEventFire(True)
281        self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK)
282        self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL)
283        self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME)
284        self.je.ctrls[JetDefs.F_MUTEFLAGS].BindCheckBox(self.OnEventChecked)
285        self.je.ctrls[JetDefs.F_START].SetChangeCallbackFct(self.UpdateGraph)
286        self.je.ctrls[JetDefs.F_END].SetChangeCallbackFct(self.UpdateGraph)
287        self.je.ctrls[JetDefs.F_DISPEMPTYTRACKS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_DISPEMPTYTRACKS, JetDefs.F_DISPEMPTYTRACKS, 'bool', 'False'))
288        self.je.ctrls[JetDefs.F_GRAPHLABELS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'))
289        self.je.ctrls[JetDefs.F_GRAPHCLIPS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'))
290        self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True'))
291        self.replicatePrefix = ""
292        self.lstReplicate = []
293        self.chkReplaceMatching = False
294
295        EVT_JET_STATUS(self, self.OnJetStatusUpdate)
296        wx.EVT_CLOSE(self, self.OnClose)
297
298        self.Player = None
299        self.segment = None
300        self.graphSegment = None
301        self.jetevents = []
302        self.lastMidiFile = ""
303        self.lastMidiInfo = None
304        self.playMode = PLAY_SEGMENT
305        self.graphMode = PLAY_MIDI
306        self.SetSize(JetDefs.SEGDLG_SIZE)
307        self.CenterOnParent()
308
309    def OnClose(self, event):
310        """ Closing the dialog box """
311        self.ShutdownPlayer()
312        self.je.ctrls[JetDefs.F_START].UnBindKillFocus()
313        self.je.ctrls[JetDefs.F_END].UnBindKillFocus()
314        self.EndModal(wx.ID_CANCEL)
315
316    def ShutdownPlayer(self):
317        """ Shutdown player flag """
318        if self.Player is not None:
319            self.Player.SetKeepPlayingFlag(False)
320
321    def OnMidiChanged(self, event):
322        """ When new midi file selected, get its info """
323        self.UpdateMaxMbt()
324        event.Skip()
325
326    def UpdateMaxMbt(self):
327        """ Get midi info in thread so UI smoother """
328        thread.start_new_thread(self.UpdateMaxMbtThread, ())
329
330    def UpdateMaxMbtThread(self):
331        """ Thread to get midi file info """
332        if self.je.ctrls[JetDefs.F_MIDIFILE].GetValue() == self.lastMidiFile:
333            return
334        self.lastMidiFile = self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()
335        self.lastMidiInfo = GetMidiInfo(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue())
336        wx.PostEvent(self, JetStatusEvent(JetDefs.PST_MIDI_INFO, self.lastMidiInfo))
337
338    def GetValue(self, fld):
339        """ Gets a control value """
340        return self.je.ctrls[fld].GetValue()
341
342    def SetValue(self, fld, val):
343        """ Sets a control value """
344        self.je.ctrls[fld].SetValue(val)
345        if self.je.ctrls[fld] == self.je.ctrls[JetDefs.F_MIDIFILE]:
346            self.UpdateMaxMbt()
347
348    def OnOk(self, event):
349        """ Exits dialog box """
350        self.ShutdownPlayer()
351        if self.Validate():
352            self.je.ctrls[JetDefs.F_START].UnBindKillFocus()
353            self.je.ctrls[JetDefs.F_END].UnBindKillFocus()
354            self.EndModal(wx.ID_OK)
355
356    def Validate(self):
357        """ Validates the control values before exiting """
358        if not CompareMbt(self.je.ctrls[JetDefs.F_START].GetValue(), self.je.ctrls[JetDefs.F_END].GetValue()):
359            InfoMsg("Start/End", "The segment starting and ending times are illogical.")
360            self.je.ctrls[JetDefs.F_START].SetFocus()
361            return False
362        if len(self.je.ctrls[JetDefs.F_SEGNAME].GetValue()) == 0:
363            InfoMsg("Segment Name", "The segment must have a name.")
364            self.je.ctrls[JetDefs.F_SEGNAME].SetFocus()
365            return False
366        if len(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()) == 0:
367            InfoMsg("MIDI File", "The segment must have a midi file selected.")
368            self.je.ctrls[JetDefs.F_MIDIFILE].SetFocus()
369            return False
370        if not FileExists(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()):
371            InfoMsg("MIDI File", "The MIDI file does not exist.")
372            self.je.ctrls[JetDefs.F_MIDIFILE].SetFocus()
373            return False
374        if len(self.je.ctrls[JetDefs.F_DLSFILE].GetValue()) > 0:
375            if not FileExists(self.je.ctrls[JetDefs.F_DLSFILE].GetValue()):
376                InfoMsg("DLS File", "The DLS file does not exist.")
377                self.je.ctrls[JetDefs.F_DLSFILE].SetFocus()
378                return False
379        self.je.ctrls[JetDefs.F_MUTEFLAGS].SetValue(ComputeMuteFlagsFromList(self.je.ctrls[JetDefs.F_MUTEFLAGS]))
380        return True
381
382    def SetSegment(self, mode):
383        """ Builds the segment info for graphing """
384        if mode == PLAY_SEGMENT:
385            jetevents = self.jetevents
386            segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME),
387                                 self.GetValue(JetDefs.F_MIDIFILE),
388                                 self.GetValue(JetDefs.F_START),
389                                 self.GetValue(JetDefs.F_END),
390                                 JetDefs.MBT_ZEROSTR,
391                                 self.GetValue(JetDefs.F_SEGNAME),
392                                 self.GetValue(JetDefs.F_QUANTIZE),
393                                 jetevents,
394                                 self.GetValue(JetDefs.F_DLSFILE),
395                                 None,
396                                 self.GetValue(JetDefs.F_TRANSPOSE),
397                                 self.GetValue(JetDefs.F_REPEAT),
398                                 self.GetValue(JetDefs.F_MUTEFLAGS))
399        else:
400            jetevents = []
401            segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME),
402                                 self.GetValue(JetDefs.F_MIDIFILE),
403                                 JetDefs.MBT_ZEROSTR,
404                                 self.lastMidiInfo.endMbtStr,
405                                 JetDefs.MBT_ZEROSTR,
406                                 self.GetValue(JetDefs.F_SEGNAME),
407                                 self.GetValue(JetDefs.F_QUANTIZE),
408                                 jetevents,
409                                 self.GetValue(JetDefs.F_DLSFILE),
410                                 None,
411                                 0,
412                                 0,
413                                 0)
414        return segment
415
416    def OnEventChecked(self, index, checked):
417        """ Track is checked so mute or unmute it """
418        if self.Player is not None:
419            trackNum = self.je.ctrls[JetDefs.F_MUTEFLAGS].GetTrackNumber(index)
420            self.Player.SetMuteFlag(trackNum, checked)
421
422    def OnPlay(self, event):
423        """ Play the segment button pressed """
424        if self.je.ctrls[JetDefs.F_PLAY].GetLabel() == JetDefs.BUT_STOP:
425            self.Player.SetKeepPlayingFlag(False)
426            return
427
428        if not self.Validate():
429            return
430
431        self.playMode = PLAY_SEGMENT
432        self.graphSegment = self.SetSegment(self.graphMode)
433        self.UpdateGraph()
434        self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAY], self.SetSegment(self.playMode))
435        self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self)
436        self.PlayerThread = thread.start_new_thread(self.Player .Start, ())
437
438    def OnPlayMidi(self, event):
439        """ Play the whole midi file pressed """
440        if self.je.ctrls[JetDefs.F_PLAYMIDI].GetLabel() == JetDefs.BUT_STOP:
441            self.Player.SetKeepPlayingFlag(False)
442            return
443
444        if not self.Validate():
445            return
446
447        self.playMode = PLAY_MIDI
448        self.graphSegment = self.SetSegment(self.graphMode)
449        self.UpdateGraph()
450        self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAYMIDI], self.SetSegment(self.playMode))
451        self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self)
452        self.PlayerThread = thread.start_new_thread(self.Player .Start, ())
453
454    def OnSetGraphType(self, event):
455        """ Sets the type of graph """
456        self.SetGraphType(event.GetInt())
457
458    def SetGraphType(self, iMode):
459        """ Sets the type of graph """
460        if iMode == 1:
461            self.graphMode = PLAY_SEGMENT
462        else:
463            self.graphMode = PLAY_MIDI
464        self.graphSegment = self.SetSegment(self.graphMode)
465        self.UpdateGraph()
466
467    def OnGraphUpdate(self, evt):
468        """ Calls graph control to draw """
469        self.je.ctrls[JetDefs.F_GRAPH].DoDrawing()
470
471    def UpdateGraph(self):
472        """ Updates values for graph control """
473        if self.graphMode == PLAY_SEGMENT:
474            self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(self.graphSegment, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True'))
475        else:
476            if self.playMode == PLAY_SEGMENT:
477                iMidiMode = True
478            else:
479                iMidiMode = False
480            self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(self.graphSegment,(self.GetValue(JetDefs.F_SEGNAME), self.GetValue(JetDefs.F_START), self.GetValue(JetDefs.F_END)), iMidiMode, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True'))
481
482    def OnJetStatusUpdate(self, evt):
483        """ All UI needed by thread must be called via Postevent or OS X crashes """
484        if evt.mode == JetDefs.PST_UPD_LOCATION:
485            self.je.ctrls[JetDefs.F_GRAPH].UpdateLocation(evt.data)
486        elif evt.mode == JetDefs.PST_PLAY:
487            if self.playMode == PLAY_SEGMENT:
488                self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_STOP)
489                self.je.ctrls[JetDefs.F_PLAYMIDI].Enabled = False
490            else:
491                self.je.ctrls[JetDefs.F_RDOGRAPH].Enabled = False
492                self.je.ctrls[JetDefs.F_PLAYMIDI].SetLabel(JetDefs.BUT_STOP)
493                self.je.ctrls[JetDefs.F_PLAY].Enabled = False
494
495            self.je.ctrls[JetDefs.F_PAUSE].Enabled = True
496            self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE)
497        elif evt.mode == JetDefs.PST_DONE:
498            self.je.ctrls[JetDefs.F_RDOGRAPH].Enabled = True
499            if self.playMode == PLAY_SEGMENT:
500                self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_PLAYSEG)
501                self.je.ctrls[JetDefs.F_PLAYMIDI].Enabled = True
502            else:
503                self.je.ctrls[JetDefs.F_PLAYMIDI].SetLabel(JetDefs.BUT_PLAYMIDI)
504                self.je.ctrls[JetDefs.F_PLAY].Enabled = True
505
506            self.je.ctrls[JetDefs.F_PAUSE].Enabled = False
507            self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE)
508        elif evt.mode == JetDefs.PST_PAUSE:
509            self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_RESUME)
510        elif evt.mode == JetDefs.PST_RESUME:
511            self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE)
512        elif evt.mode == JetDefs.PST_MIDI_INFO:
513            ClearRowSelections(self.je.ctrls[JetDefs.F_MUTEFLAGS])
514            self.md = evt.data
515            if self.md.err == 0:
516                self.je.ctrls[JetDefs.F_END].SetMaxMbt(self.md.maxMeasures+1,self.md.maxBeats,self.md.maxTicks)
517                if self.je.ctrls[JetDefs.F_END].GetValue() == JetDefs.MBT_ZEROSTR:
518                    self.je.ctrls[JetDefs.F_END].SetValue((self.md.maxMeasures,0,0))
519                self.je.ctrls[JetDefs.F_START].SetMaxMbt(self.md.maxMeasures+1,self.md.maxBeats,self.md.maxTicks)
520                self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems()
521                loadEmpty = IniGetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, 'bool', 'False')
522                for track in self.md.trackList:
523                    self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track, loadEmpty)
524                self.je.ctrls[JetDefs.F_MUTEFLAGS].CheckTracks(self.je.ctrls[JetDefs.F_MUTEFLAGS].GetValue())
525                self.graphSegment = self.SetSegment(self.graphMode)
526                self.UpdateGraph()
527
528    def OnSetTrackDisplayOption(self, evt):
529        IniSetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, self.je.ctrls[JetDefs.F_DISPEMPTYTRACKS].GetValue())
530        loadEmpty = IniGetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, 'bool', 'False')
531        if self.md is not None:
532            self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems()
533            if self.md.err == 0:
534                for track in self.md.trackList:
535                    self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track, loadEmpty)
536
537    def OnPause(self, evt):
538        """ Pauses the playback """
539        self.Player.Pause()
540
541    def OnSetGraphOptions(self, evt):
542        """ Sets graph options """
543        IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, self.je.ctrls[JetDefs.F_GRAPHLABELS].GetValue())
544        IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].GetValue())
545        IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, self.je.ctrls[JetDefs.F_GRAPHCLIPS].GetValue())
546        self.UpdateGraph()
547
548    def OnReplicate(self, evt):
549        dlg = JetReplicate("Replicate Segment")
550        dlg.SetValue(JetDefs.F_RPREPLACE, True)
551        dlg.SetName(self.GetValue(JetDefs.F_SEGNAME))
552        dlg.event_type = "SEGMENT"
553        dlg.event_max = self.je.ctrls[JetDefs.F_START].GetMaxMbt()
554        dlg.length = MbtDifference(ConvertStrTimeToTuple(self.GetValue(JetDefs.F_START)), ConvertStrTimeToTuple(self.GetValue(JetDefs.F_END)))
555        result = dlg.ShowModal()
556        if result == wx.ID_OK:
557            self.replicatePrefix = dlg.GetValue(JetDefs.F_RPPREFIX)
558            self.lstReplicate = dlg.lstReplicate
559            self.chkReplaceMatching = dlg.GetValue(JetDefs.F_RPREPLACE)
560            self.EndModal(wx.ID_OK)
561        else:
562            dlg.Destroy()
563
564class EventEdit(wx.Dialog):
565    """ Event edit dialog box """
566    def __init__(self, title, currentJetConfigFile):
567        wx.Dialog.__init__(self, None, -1, title)
568        self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
569        self.title = title
570        self.currentJetConfigFile = currentJetConfigFile
571        self.je = JetEdit(self, "EVTDLG_CTRLS", self)
572        self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK)
573        self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL)
574        self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME)
575        self.je.ctrls[JetDefs.F_ESTART].SetChangeCallbackFct(self.UpdateGraph)
576        self.je.ctrls[JetDefs.F_EEND].SetChangeCallbackFct(self.UpdateGraph)
577        self.je.ctrls[JetDefs.F_GRAPHLABELS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'))
578        self.je.ctrls[JetDefs.F_GRAPHCLIPS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'))
579        self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True'))
580        EVT_JET_STATUS(self, self.OnJetStatusUpdate)
581        self.segment = None
582        self.Player = None
583        self.event_id = 1
584        self.replicatePrefix = ""
585        self.lstReplicate = []
586        self.chkReplaceMatching = False
587
588        wx.EVT_CLOSE(self, self.OnClose)
589        self.SetSize(JetDefs.EVTDLG_SIZE)
590        self.CenterOnParent()
591
592    def OnGraphUpdate(self, evt):
593        """ Calls the graph module to update the graph """
594        self.je.ctrls[JetDefs.F_GRAPH].DoDrawing()
595
596    def OnJetStatusUpdate(self, evt):
597        """ Updates to UI needed by play thread come through here otherwise OS X crashes """
598        if evt.mode == JetDefs.PST_UPD_LOCATION:
599            self.je.ctrls[JetDefs.F_GRAPH].UpdateLocation(evt.data)
600        elif evt.mode == JetDefs.PST_PLAY:
601            self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE)
602            self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_STOP)
603            self.je.ctrls[JetDefs.F_PAUSE].Enabled = True
604            self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enabled = True
605            self.je.ctrls[JetDefs.F_EMUTEBUT].Enabled = True
606        elif evt.mode == JetDefs.PST_DONE:
607            self.je.ctrls[JetDefs.F_EMUTEBUT].SetLabel(JetDefs.BUT_UNMUTE)
608            self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_PLAY)
609            self.je.ctrls[JetDefs.F_PAUSE].Enabled = False
610            self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE)
611            self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enabled = False
612            self.je.ctrls[JetDefs.F_EMUTEBUT].Enabled = False
613        elif evt.mode == JetDefs.PST_PAUSE:
614            self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_RESUME)
615        elif evt.mode == JetDefs.PST_RESUME:
616            self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE)
617
618    def OnPause(self, evt):
619        """ Pause the player """
620        self.Player.Pause()
621
622    def UpdateGraph(self):
623        """ Called back from player thread to update the graph """
624        if len(self.segment.jetevents) == 0:
625            self.segment.jetevents.append(JetEvent(self.je.ctrls[JetDefs.F_ENAME].GetValue(),
626                                                   self.je.ctrls[JetDefs.F_ETYPE].GetValue(),
627                                                   1,
628                                                   self.je.ctrls[JetDefs.F_ETRACK].GetValue(),
629                                                   self.je.ctrls[JetDefs.F_ECHANNEL].GetValue(),
630                                                   self.je.ctrls[JetDefs.F_ESTART].GetValue(),
631                                                   self.je.ctrls[JetDefs.F_EEND].GetValue()))
632
633        self.segment.jetevents[0].event_name = self.je.ctrls[JetDefs.F_ENAME].GetValue()
634        self.segment.jetevents[0].event_type = self.je.ctrls[JetDefs.F_ETYPE].GetValue()
635        self.segment.jetevents[0].event_start = self.je.ctrls[JetDefs.F_ESTART].GetValue()
636        self.segment.jetevents[0].event_end = self.je.ctrls[JetDefs.F_EEND].GetValue()
637        self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(self.segment, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True'))
638
639    def OnClose(self, event):
640        """ Called when dialog is closed """
641        self.ShutdownPlayer()
642        self.je.ctrls[JetDefs.F_ESTART].UnBindKillFocus()
643        self.je.ctrls[JetDefs.F_EEND].UnBindKillFocus()
644        self.EndModal(wx.ID_CANCEL)
645
646    def ShutdownPlayer(self):
647        """ Sets flag to kill play loop """
648        if self.Player is not None:
649            self.Player.SetKeepPlayingFlag(False)
650
651    def GetValue(self, fld):
652        """ Gets the value of a control """
653        return self.je.ctrls[fld].GetValue()
654
655    def SetValue(self, fld, val):
656        """ Sets the value of a control """
657        self.je.ctrls[fld].SetValue(val)
658
659    def SetEventId(self):
660        """ Sets the eventid value """
661        if self.title == JetDefs.MAIN_ADDEVENTTITLE:
662            iNextEventId = -1
663            for evt in self.segment.jetevents:
664                if evt.event_type == JetDefs.E_CLIP:
665                    if iNextEventId < evt.event_id:
666                        iNextEventId = evt.event_id
667            self.je.ctrls[JetDefs.F_EEVENTID].SetValue(iNextEventId + 1)
668
669    def OnEventSelect(self, event=None):
670        """ Adjusts the dialog box controls for various types of events """
671        eType = self.je.ctrls[JetDefs.F_ETYPE].GetValue()
672        if eType == JetDefs.E_EOS:
673            self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_EOS)
674            self.je.ctrls[JetDefs.F_ENAME].Enable(False)
675            self.je.ctrls[JetDefs.F_ESTART].Enable(False)
676            self.je.ctrls[JetDefs.F_EEND].Enable(True)
677            self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(False)
678            self.je.ctrls[JetDefs.F_EEVENTID].Enable(False)
679        elif eType == JetDefs.E_CLIP:
680            if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0 or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_EOS or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_APP:
681                self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_CLIP)
682            self.je.ctrls[JetDefs.F_ENAME].Enable(True)
683            self.je.ctrls[JetDefs.F_ESTART].Enable(True)
684            self.je.ctrls[JetDefs.F_EEND].Enable(True)
685            self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(True)
686            self.je.ctrls[JetDefs.F_EEVENTID].Enable(True)
687            self.je.ctrls[JetDefs.F_EEVENTID].SetRange(JetDefs.EVENTID_MIN, JetDefs.EVENTID_MAX)
688            if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() < JetDefs.EVENTID_MIN:
689                self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.EVENTID_MIN)
690            if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() > JetDefs.EVENTID_MAX:
691                self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.EVENTID_MAX)
692            self.SetEventId()
693        elif eType == JetDefs.E_APP:
694            if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0 or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_EOS:
695                self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_APP)
696            self.je.ctrls[JetDefs.F_ENAME].Enable(True)
697            self.je.ctrls[JetDefs.F_ESTART].Enable(True)
698            self.je.ctrls[JetDefs.F_EEND].Enable(False)
699            self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(False)
700            self.je.ctrls[JetDefs.F_EEVENTID].Enable(True)
701            self.je.ctrls[JetDefs.F_EEVENTID].SetRange(JetDefs.APPCONTROLLERID_MIN, JetDefs.APPCONTROLLERID_MAX)
702            if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() < JetDefs.APPCONTROLLERID_MIN:
703                self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.APPCONTROLLERID_MIN)
704            if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() > JetDefs.APPCONTROLLERID_MAX:
705                self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.APPCONTROLLERID_MAX)
706
707    def OnOk(self, event):
708        """ Exits the dialog box """
709        self.ShutdownPlayer()
710        if self.Validate():
711            self.je.ctrls[JetDefs.F_ESTART].UnBindKillFocus()
712            self.je.ctrls[JetDefs.F_EEND].UnBindKillFocus()
713            self.EndModal(wx.ID_OK)
714
715    def Validate(self):
716        """ Validates the control values prior to exiting """
717        if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0:
718            InfoMsg("Event Name", "The event must have a name.")
719            self.je.ctrls[JetDefs.F_ENAME].SetFocus()
720            return False
721        if len(self.je.ctrls[JetDefs.F_ETYPE].GetValue()) == 0:
722            InfoMsg("Event Name", "The event type must be selected.")
723            self.je.ctrls[JetDefs.F_ETYPE].SetFocus()
724            return False
725        if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_CLIP:
726            if not CompareMbt(self.je.ctrls[JetDefs.F_ESTART].GetValue(), self.je.ctrls[JetDefs.F_EEND].GetValue()):
727                InfoMsg("Start/End", "The event starting and ending times are illogical.")
728                self.je.ctrls[JetDefs.F_ESTART].SetFocus()
729                return False
730            if MbtVal(self.je.ctrls[JetDefs.F_ESTART].GetValue()) < MbtVal(self.je.ctrls[JetDefs.F_START].GetValue()):
731                InfoMsg("Event Starting Time", "The event starting time is illogical.")
732                self.je.ctrls[JetDefs.F_ESTART].SetFocus()
733                return False
734            if MbtVal(self.je.ctrls[JetDefs.F_EEND].GetValue()) > MbtVal(self.je.ctrls[JetDefs.F_END].GetValue()):
735                InfoMsg("Event Ending Time", "The event ending time is illogical.")
736                self.je.ctrls[JetDefs.F_ESTART].SetFocus()
737                return False
738        if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_APP:
739            self.je.ctrls[JetDefs.F_EEND].SetValue(self.je.ctrls[JetDefs.F_ESTART].GetValue())
740        if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_EOS:
741            self.je.ctrls[JetDefs.F_ESTART].SetValue(self.je.ctrls[JetDefs.F_EEND].GetValue())
742        return True
743
744    def SetSegment(self, segment):
745        """ Sets the segment values, then calls the graph update """
746        self.segment = segment
747        md = GetMidiInfo(segment.filename)
748        if md.err == 0:
749            self.SetValue(JetDefs.F_SEGNAME, segment.segname)
750            self.SetValue(JetDefs.F_MUTEFLAGS, segment.mute_flags)
751            self.SetValue(JetDefs.F_MIDIFILE, segment.filename)
752            self.SetValue(JetDefs.F_DLSFILE, segment.dlsfile)
753            self.SetValue(JetDefs.F_START, segment.start)
754            self.SetValue(JetDefs.F_END, segment.end)
755            self.SetValue(JetDefs.F_QUANTIZE, segment.quantize)
756            self.SetValue(JetDefs.F_TRANSPOSE, segment.transpose)
757            self.SetValue(JetDefs.F_REPEAT, segment.repeat)
758            maxMeasures = abs(int(self.je.ctrls[JetDefs.F_END].GetValue('int')[0]))
759            self.je.ctrls[JetDefs.F_EEND].SetMaxMbt(maxMeasures+1,md.maxBeats,md.maxTicks)
760            self.je.ctrls[JetDefs.F_ESTART].SetMaxMbt(maxMeasures+1,md.maxBeats,md.maxTicks)
761            minMeasures = abs(int(self.je.ctrls[JetDefs.F_START].GetValue('int')[0]))
762            self.je.ctrls[JetDefs.F_EEND].SetMinMbt(minMeasures+1,0,0)
763            self.je.ctrls[JetDefs.F_ESTART].SetMinMbt(minMeasures+1,0,0)
764            self.je.ctrls[JetDefs.F_END].GetValue('int')
765            self.je.ctrls[JetDefs.F_ETRACK].SetRange(1, md.maxTracks)
766            self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems()
767            for track in md.trackList:
768                self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track)
769            self.je.ctrls[JetDefs.F_MUTEFLAGS].CheckTracks(self.je.ctrls[JetDefs.F_MUTEFLAGS].GetValue())
770            self.je.ctrls[JetDefs.F_MUTEFLAGS].SetTextColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT))
771        self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(segment, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True'))
772
773    def OnPlay(self, event):
774        """ Plays the segment allowing interaction with events """
775        if self.je.ctrls[JetDefs.F_PLAY].GetLabel() == JetDefs.BUT_STOP:
776            self.Player.SetKeepPlayingFlag(False)
777            return
778
779        if not self.Validate():
780            return
781
782        jetevents = []
783        jetevents.append(JetEvent(self.GetValue(JetDefs.F_ENAME), self.GetValue(JetDefs.F_ETYPE),
784                                  self.event_id, int(self.GetValue(JetDefs.F_ETRACK)),
785                                  int(self.GetValue(JetDefs.F_ECHANNEL)),
786                                  self.GetValue(JetDefs.F_ESTART), self.GetValue(JetDefs.F_EEND)))
787
788        segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME),
789                             self.GetValue(JetDefs.F_MIDIFILE),
790                             self.GetValue(JetDefs.F_START),
791                             self.GetValue(JetDefs.F_END),
792                             JetDefs.MBT_ZEROSTR,
793                             self.GetValue(JetDefs.F_SEGNAME),
794                             self.GetValue(JetDefs.F_QUANTIZE),
795                             jetevents,
796                             self.GetValue(JetDefs.F_DLSFILE),
797                             None,
798                             self.GetValue(JetDefs.F_TRANSPOSE),
799                             self.GetValue(JetDefs.F_REPEAT),
800                             self.GetValue(JetDefs.F_MUTEFLAGS))
801
802        self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAY], segment)
803        self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self)
804        self.je.ctrls[JetDefs.F_GRAPH].ClickCallbackFct = self.GraphTriggerClip
805        self.Player.trigger_button = self.je.ctrls[JetDefs.F_ETRIGGERBUT]
806        self.Player.mute_button = self.je.ctrls[JetDefs.F_EMUTEBUT]
807        thread.start_new_thread(self.Player .Start, ())
808
809    def GraphTriggerClip(self, sClipName, iEventId):
810        """ Triggers a clip via graph """
811        if self.Player is not None:
812            self.Player.GraphTriggerClip(sClipName, iEventId)
813
814    def OnMute(self, event):
815        """ Mutes a track """
816        if self.Player is not None:
817            self.Player.MuteTrackViaButton(self.je.ctrls[JetDefs.F_EMUTEBUT],
818                                           int(self.je.ctrls[JetDefs.F_ETRACK].GetValue()))
819
820    def OnTriggerClip(self, event):
821        """ Triggers a clip """
822        if self.Player is not None:
823            self.Player.TriggerClip(self.event_id)
824
825    def OnSetGraphOptions(self, evt):
826        """ Sets graph options """
827        IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, self.je.ctrls[JetDefs.F_GRAPHLABELS].GetValue())
828        IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].GetValue())
829        IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, self.je.ctrls[JetDefs.F_GRAPHCLIPS].GetValue())
830        self.UpdateGraph()
831
832    def OnReplicate(self, evt):
833        dlg = JetReplicate("Replicate Event")
834        dlg.SetValue(JetDefs.F_RPREPLACE, True)
835        dlg.SetName(self.GetValue(JetDefs.F_ENAME))
836        dlg.event_type = self.GetValue(JetDefs.F_ETYPE)
837        dlg.event_max = self.segment.end
838        dlg.length = MbtDifference(ConvertStrTimeToTuple(self.GetValue(JetDefs.F_ESTART)), ConvertStrTimeToTuple(self.GetValue(JetDefs.F_EEND)))
839        result = dlg.ShowModal()
840        if result == wx.ID_OK:
841            self.replicatePrefix = dlg.GetValue(JetDefs.F_RPPREFIX)
842            self.lstReplicate = dlg.lstReplicate
843            self.chkReplaceMatching = dlg.GetValue(JetDefs.F_RPREPLACE)
844            self.EndModal(wx.ID_OK)
845        else:
846            dlg.Destroy()
847
848class JetReplicate(wx.Dialog):
849    """ Replicate dialog box """
850    def __init__(self, title):
851        wx.Dialog.__init__(self, None, -1, title)
852        self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
853        self.je = JetEdit(self, "REPLICATE_CTRLS", self)
854
855        self.je.ctrls[JetDefs.F_RPINCREMENT].SetMinMbt(0,0,0)
856        self.je.ctrls[JetDefs.F_RPINCREMENT].SetValue((-1,-1,-1))
857        self.je.ctrls[JetDefs.F_RPNUMBER].SetValue(1)
858        for title, width, fld in JetDefs.REPLICATE_GRID:
859            self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddCol(title, width)
860        self.lstReplicate = []
861
862        self.SetSize(JetDefs.REPLICATE_SIZE)
863        self.CenterOnParent()
864
865    def OnOk(self, event):
866        self.EndModal(wx.ID_OK)
867
868    def GetValue(self, fld):
869        return self.je.ctrls[fld].GetValue()
870
871    def SetValue(self, fld, val):
872        self.je.ctrls[fld].SetValue(val)
873
874    def SetName(self, name):
875        for i in range(len(name), 1, -1):
876            if not name[i-1].isdigit() and name[i-1] <> ' ':
877                break
878            else:
879                name = name[0:i-1]
880        self.SetValue(JetDefs.F_RPPREFIX, name)
881
882    def Validate(self):
883        if self.GetValue(JetDefs.F_RPPREFIX) == '':
884            InfoMsg("Message", "Prefix is required.")
885            return False
886        return True
887
888    def OnPreview(self, event):
889        if not self.Validate():
890            return
891        start = MbtVal(self.GetValue(JetDefs.F_ESTART))
892        max = MbtVal(self.event_max)
893        increment = MbtVal((self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure(), self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat(), self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick()))
894
895        self.lstReplicate = []
896        iTo = int(self.GetValue(JetDefs.F_RPNUMBER))
897        for i in range(iTo):
898            evt_name = "%s %.2d" % (self.GetValue(JetDefs.F_RPPREFIX), i)
899            s_ticks = start + (i * increment)
900            s_mbt = TicksToMbt(s_ticks)
901            evt_start =  "%d:%d:%d" % (s_mbt[0]+1, s_mbt[1]+1, s_mbt[2])
902            if self.event_type == JetDefs.E_CLIP or self.event_type == "SEGMENT":
903                e_ticks = s_ticks + self.length
904                e_mbt = TicksToMbt(e_ticks)
905                evt_end = "%d:%d:%d" % (e_mbt[0]+1, e_mbt[1]+1, e_mbt[2])
906            else:
907                e_ticks = s_ticks
908                evt_end = evt_start
909            if s_ticks <= max and e_ticks <= max:
910                self.lstReplicate.append((evt_name, evt_start, evt_end))
911
912        self.je.ctrls[JetDefs.F_RPGRDPREVIEW].DeleteAllItems()
913        self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddRows(self.lstReplicate)
914
915class JetMove(wx.Dialog):
916    """ Move events dialog box """
917    def __init__(self, title):
918        wx.Dialog.__init__(self, None, -1, title)
919        self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
920        self.je = JetEdit(self, "MOVE_CTRLS", self)
921
922        self.je.ctrls[JetDefs.F_RPINCREMENT].SetMinMbt(-999,-4,-480)
923        self.je.ctrls[JetDefs.F_RPINCREMENT].SetValue((-1,-1,-1))
924        for title, width, fld in JetDefs.REPLICATE_GRID:
925            self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddCol(title, width)
926        self.lstMove = []
927        self.lstMoveMbt = []
928        self.lstMoveItems = []
929
930        self.SetSize(JetDefs.REPLICATE_SIZE)
931        self.CenterOnParent()
932
933    def OnOk(self, event):
934        self.EndModal(wx.ID_OK)
935
936    def GetValue(self, fld):
937        return self.je.ctrls[fld].GetValue()
938
939    def SetValue(self, fld, val):
940        self.je.ctrls[fld].SetValue(val)
941
942    def OnPreview(self, event):
943        increment = MbtVal((abs(self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure()), abs(self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat()), abs(self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick())))
944        if self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure() < 0 or self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat() < 0 or self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick() < 0:
945            increment = 0 - increment
946        self.lstMove = []
947        self.lstMoveMbt = []
948        for itm in self.lstMoveItems:
949            max = MbtVal(itm[3])
950            evt_name = itm[0]
951            start = MbtVal(itm[1])
952            s_ticks = start + increment
953
954            s_mbt = TicksToMbt(s_ticks)
955            evt_start =  "%d:%d:%d" % (s_mbt[0]+1, s_mbt[1]+1, s_mbt[2])
956            evt_start_save = "%d:%d:%d" % s_mbt
957
958            end = MbtVal(itm[2])
959            e_ticks = end + increment
960            e_mbt = TicksToMbt(e_ticks)
961            evt_end = "%d:%d:%d" % (e_mbt[0]+1, e_mbt[1]+1, e_mbt[2])
962            evt_end_save = "%d:%d:%d" % e_mbt
963
964            if s_ticks <= max and e_ticks <= max and s_ticks >= 0 and e_ticks >= 0:
965                self.lstMove.append((evt_name, evt_start, evt_end))
966                self.lstMoveMbt.append((evt_name, evt_start_save, evt_end_save))
967
968        self.je.ctrls[JetDefs.F_RPGRDPREVIEW].DeleteAllItems()
969        self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddRows(self.lstMove)
970
971if __name__ == '__main1__':
972    """ Test dialogs """
973    app = wx.PySimpleApp()
974
975    #dlg = JetOpen()
976    #dlg = JetPropertiesDialog()
977    #dlg = ExportDialog("Export Jet File")
978    #dlg = JetAbout()
979
980    dlg = JetReplicate("Replicate Event")
981    dlg.SetValue(JetDefs.F_RPREPLACE, True)
982    dlg.event_max = "5:0:0"
983    dlg.event_type = JetDefs.E_APP
984    dlg.length = 480
985    dlg.SetName("abc 02")
986    result = dlg.ShowModal()
987    if result == wx.ID_OK:
988        print("OK")
989
990    dlg.Destroy()
991
992if __name__ == '__main1__':
993    """ Test Segment dialog """
994    app = wx.PySimpleApp()
995
996    helpProvider = wx.SimpleHelpProvider()
997    wx.HelpProvider_Set(helpProvider)
998
999    dlg = SegEdit("Segments", JetDefs.UNTITLED_FILE)
1000    dlg.SetValue(JetDefs.F_SEGNAME, "Test Segment Name")
1001    dlg.SetValue(JetDefs.F_MIDIFILE, '/Users/BHruska/JetContent/jenn_Burning Line.mid')
1002    dlg.SetValue(JetDefs.F_MIDIFILE, 'C:/_Data/JetCreator/JetDemo1/jenn_Burning Line.mid')
1003    dlg.SetValue(JetDefs.F_DLSFILE, '')
1004    dlg.SetValue(JetDefs.F_START, '4:0:0')
1005    dlg.SetValue(JetDefs.F_END, '8:0:0')
1006    dlg.SetValue(JetDefs.F_QUANTIZE, 6)
1007
1008    result = dlg.ShowModal()
1009    dlg.Destroy()
1010
1011if __name__ == '__main__':
1012    """ Test Event dialog """
1013    app = wx.PySimpleApp()
1014
1015    jetevents = []
1016
1017    segment = JetSegment("Test Segment Name", 'C:/_Data/JetCreator/JetDemo1/jenn_Burning Line.mid',
1018                            '0:0:0', '4:0:0', None,
1019                            "Test Segment Name", 6, jetevents,
1020                            '', None, 0,0,3)
1021
1022    dlg = EventEdit("Event Edit", JetDefs.UNTITLED_FILE)
1023    dlg.SetValue(JetDefs.F_ENAME, "Test Event Name")
1024    dlg.SetValue(JetDefs.F_ETYPE, "TriggerClip")
1025    dlg.SetSegment(segment)
1026
1027    result = dlg.ShowModal()
1028    dlg.Destroy()
1029
1030
1031
1032