objdictgen/commondialogs.py
changeset 205 dac0f9b4e3f8
child 206 6787754b251b
equal deleted inserted replaced
204:44ce74232ccb 205:dac0f9b4e3f8
       
     1 #!/usr/bin/env python
       
     2 # -*- coding: utf-8 -*-
       
     3 
       
     4 #This file is part of CanFestival, a library implementing CanOpen Stack. 
       
     5 #
       
     6 #Copyright (C): Edouard TISSERANT, Francis DUPIN and Laurent BESSARD
       
     7 #
       
     8 #See COPYING file for copyrights details.
       
     9 #
       
    10 #This library is free software; you can redistribute it and/or
       
    11 #modify it under the terms of the GNU Lesser General Public
       
    12 #License as published by the Free Software Foundation; either
       
    13 #version 2.1 of the License, or (at your option) any later version.
       
    14 #
       
    15 #This library is distributed in the hope that it will be useful,
       
    16 #but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    17 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       
    18 #Lesser General Public License for more details.
       
    19 #
       
    20 #You should have received a copy of the GNU Lesser General Public
       
    21 #License along with this library; if not, write to the Free Software
       
    22 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
       
    23 
       
    24 from wxPython.wx import *
       
    25 from wxPython.grid import *
       
    26 import wx
       
    27 
       
    28 import os
       
    29 
       
    30 #-------------------------------------------------------------------------------
       
    31 #                          Editing Communication Dialog
       
    32 #-------------------------------------------------------------------------------
       
    33 
       
    34 
       
    35 [wxID_COMMUNICATIONDIALOG, wxID_COMMUNICATIONDIALOGMAINPANEL,
       
    36  wxID_COMMUNICATIONDIALOGPOSSIBLEINDEXES, wxID_COMMUNICATIONDIALOGCURRENTINDEXES,
       
    37  wxID_COMMUNICATIONDIALOGSELECT, wxID_COMMUNICATIONDIALOGUNSELECT, 
       
    38  wxID_COMMUNICATIONDIALOGSTATICTEXT1, wxID_COMMUNICATIONDIALOGSTATICTEXT2
       
    39 ] = [wx.NewId() for _init_ctrls in range(8)]
       
    40 
       
    41 class CommunicationDialog(wx.Dialog):
       
    42     def _init_coll_flexGridSizer1_Items(self, parent):
       
    43         # generated method, don't edit
       
    44 
       
    45         parent.AddWindow(self.MainPanel, 0, border=0, flag=0)
       
    46 
       
    47     def _init_sizers(self):
       
    48         # generated method, don't edit
       
    49         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
       
    50 
       
    51         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
       
    52 
       
    53         self.SetSizer(self.flexGridSizer1)
       
    54 
       
    55     def _init_ctrls(self, prnt):
       
    56         # generated method, don't edit
       
    57         wx.Dialog.__init__(self, id=wxID_COMMUNICATIONDIALOG,
       
    58               name='CommunicationDialog', parent=prnt, pos=wx.Point(234, 216),
       
    59               size=wx.Size(726, 437), style=wx.DEFAULT_DIALOG_STYLE,
       
    60               title='Edit Communication Profile')
       
    61         self.SetClientSize(wx.Size(726, 437))
       
    62 
       
    63         self.MainPanel = wx.Panel(id=wxID_COMMUNICATIONDIALOGMAINPANEL,
       
    64               name='MainPanel', parent=self, pos=wx.Point(0, 0),
       
    65               size=wx.Size(688, 382), style=wx.TAB_TRAVERSAL)
       
    66         self.MainPanel.SetAutoLayout(True)
       
    67 
       
    68         self.PossibleIndexes = wx.ListBox(choices=[],
       
    69               id=wxID_COMMUNICATIONDIALOGPOSSIBLEINDEXES,
       
    70               name='PossibleIndexes', parent=self.MainPanel, pos=wx.Point(40,
       
    71               48), size=wx.Size(280, 320), style=wxLB_EXTENDED)
       
    72         self.PossibleIndexes.Bind(wx.EVT_LEFT_DCLICK, self.OnPossibleIndexesDClick,
       
    73               id=wxID_COMMUNICATIONDIALOGPOSSIBLEINDEXES)
       
    74 
       
    75         self.CurrentIndexes = wx.ListBox(choices=[],
       
    76               id=wxID_COMMUNICATIONDIALOGCURRENTINDEXES, name='CurrentIndexes',
       
    77               parent=self.MainPanel, pos=wx.Point(400, 48), size=wx.Size(280,
       
    78               320), style=wxLB_EXTENDED)
       
    79         self.CurrentIndexes.Bind(wx.EVT_LEFT_DCLICK, self.OnCurrentIndexesDClick,
       
    80               id=wxID_COMMUNICATIONDIALOGCURRENTINDEXES)
       
    81 
       
    82         self.Select = wx.Button(id=wxID_COMMUNICATIONDIALOGSELECT, label='>>',
       
    83               name='Select', parent=self.MainPanel, pos=wx.Point(345, 136),
       
    84               size=wx.Size(32, 32), style=0)
       
    85         self.Select.Bind(wx.EVT_BUTTON, self.OnSelectButton,
       
    86               id=wxID_COMMUNICATIONDIALOGSELECT)
       
    87 
       
    88         self.Unselect = wx.Button(id=wxID_COMMUNICATIONDIALOGUNSELECT,
       
    89               label='<<', name='Unselect', parent=self.MainPanel,
       
    90               pos=wx.Point(345, 216), size=wx.Size(32, 30), style=0)
       
    91         self.Unselect.Bind(wx.EVT_BUTTON, self.OnUnselectButton,
       
    92               id=wxID_COMMUNICATIONDIALOGUNSELECT)
       
    93 
       
    94         self.staticText1 = wx.StaticText(id=wxID_COMMUNICATIONDIALOGSTATICTEXT1,
       
    95               label='Possible Profile Indexes:', name='staticText1',
       
    96               parent=self.MainPanel, pos=wx.Point(40, 24), size=wx.Size(156,
       
    97               17), style=0)
       
    98 
       
    99         self.staticText2 = wx.StaticText(id=wxID_COMMUNICATIONDIALOGSTATICTEXT2,
       
   100               label='Current Profile Indexes:', name='staticText2',
       
   101               parent=self.MainPanel, pos=wx.Point(400, 24), size=wx.Size(152,
       
   102               17), style=0)
       
   103 
       
   104         self._init_sizers()
       
   105 
       
   106     def __init__(self, parent):
       
   107         self._init_ctrls(parent)
       
   108         self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL)
       
   109         self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_CENTER)
       
   110         self.AllList = []
       
   111         self.CurrentList = []
       
   112         self.IndexDictionary = {}
       
   113 
       
   114     def SetIndexDictionary(self, dictionary):
       
   115         self.IndexDictionary = dictionary
       
   116         
       
   117     def SetCurrentList(self, list):
       
   118         self.CurrentList = []
       
   119         self.CurrentList.extend(list)
       
   120         self.CurrentList.sort()
       
   121         
       
   122     def GetCurrentList(self):
       
   123         return self.CurrentList
       
   124         
       
   125     def RefreshLists(self):
       
   126         self.PossibleIndexes.Clear()
       
   127         self.CurrentIndexes.Clear()
       
   128         self.AllList = []
       
   129         for index in self.IndexDictionary.iterkeys():
       
   130             if index not in self.CurrentList:
       
   131                 self.AllList.append(index)
       
   132         self.AllList.sort()
       
   133         for index in self.AllList:
       
   134             self.PossibleIndexes.Append("0x%04X   %s"%(index, self.IndexDictionary[index][0]))
       
   135         for index in self.CurrentList:
       
   136             if index in self.IndexDictionary:
       
   137                 self.CurrentIndexes.Append("0x%04X   %s"%(index, self.IndexDictionary[index][0]))
       
   138 
       
   139     def OnPossibleIndexesDClick(self, event):
       
   140         self.SelectPossible()
       
   141         event.Skip()
       
   142 
       
   143     def OnCurrentIndexesDClick(self, event):
       
   144         self.UnselectCurrent()
       
   145         event.Skip()
       
   146 
       
   147     def OnSelectButton(self, event):
       
   148         self.SelectPossible()
       
   149         event.Skip()
       
   150 
       
   151     def OnUnselectButton(self, event):
       
   152         self.UnselectCurrent()
       
   153         event.Skip()
       
   154 
       
   155     def SelectPossible(self):
       
   156         selected = self.PossibleIndexes.GetSelections()
       
   157         for i in selected:
       
   158             self.CurrentList.append(self.AllList[i])
       
   159         self.CurrentList.sort()
       
   160         self.RefreshLists()
       
   161 
       
   162     def UnselectCurrent(self):
       
   163         selected = self.CurrentIndexes.GetSelections()
       
   164         for i in selected:
       
   165             if not self.IndexDictionary[self.CurrentList[i]][1]:
       
   166                 self.CurrentList.pop(i)
       
   167         self.CurrentList.sort()
       
   168         self.RefreshLists()
       
   169 
       
   170 
       
   171 
       
   172 #-------------------------------------------------------------------------------
       
   173 #                          Create Map Variable Dialog
       
   174 #-------------------------------------------------------------------------------
       
   175 
       
   176 
       
   177 [wxID_MAPVARIABLEDIALOG, wxID_MAPVARIABLEDIALOGINDEX, 
       
   178  wxID_MAPVARIABLEDIALOGINDEXNAME, wxID_MAPVARIABLEDIALOGMAINPANEL, 
       
   179  wxID_MAPVARIABLEDIALOGNUMBER, wxID_MAPVARIABLEDIALOGRADIOBUTTON1, 
       
   180  wxID_MAPVARIABLEDIALOGRADIOBUTTON2, wxID_MAPVARIABLEDIALOGRADIOBUTTON3, 
       
   181  wxID_MAPVARIABLEDIALOGSTATICTEXT1, wxID_MAPVARIABLEDIALOGSTATICTEXT2, 
       
   182  wxID_MAPVARIABLEDIALOGSTATICTEXT3, wxID_MAPVARIABLEDIALOGSTATICTEXT4, 
       
   183 ] = [wx.NewId() for _init_ctrls in range(12)]
       
   184 
       
   185 class MapVariableDialog(wx.Dialog):
       
   186     def _init_coll_flexGridSizer1_Items(self, parent):
       
   187         # generated method, don't edit
       
   188 
       
   189         parent.AddWindow(self.MainPanel, 0, border=0, flag=0)
       
   190 
       
   191     def _init_sizers(self):
       
   192         # generated method, don't edit
       
   193         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
       
   194 
       
   195         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
       
   196 
       
   197         self.SetSizer(self.flexGridSizer1)
       
   198 
       
   199     def _init_ctrls(self, prnt):
       
   200         # generated method, don't edit
       
   201         wx.Dialog.__init__(self, id=wxID_MAPVARIABLEDIALOG,
       
   202               name='CommunicationDialog', parent=prnt, pos=wx.Point(376, 223),
       
   203               size=wx.Size(444, 186), style=wx.DEFAULT_DIALOG_STYLE,
       
   204               title='Add Map Variable')
       
   205         self.SetClientSize(wx.Size(444, 186))
       
   206 
       
   207         self.MainPanel = wx.Panel(id=wxID_MAPVARIABLEDIALOGMAINPANEL,
       
   208               name='MainPanel', parent=self, pos=wx.Point(0, 0),
       
   209               size=wx.Size(431, 142), style=wx.TAB_TRAVERSAL)
       
   210         self.MainPanel.SetAutoLayout(True)
       
   211 
       
   212         self.staticText1 = wx.StaticText(id=wxID_MAPVARIABLEDIALOGSTATICTEXT1,
       
   213               label='Index:', name='staticText1', parent=self.MainPanel,
       
   214               pos=wx.Point(24, 24), size=wx.Size(156, 17), style=0)
       
   215 
       
   216         self.Index = wx.TextCtrl(id=wxID_MAPVARIABLEDIALOGINDEX, name='Index',
       
   217               parent=self.MainPanel, pos=wx.Point(24, 48), size=wx.Size(152,
       
   218               25), style=0, value='0x2000')
       
   219 
       
   220         self.staticText3 = wx.StaticText(id=wxID_MAPVARIABLEDIALOGSTATICTEXT3,
       
   221               label='Name:', name='staticText3', parent=self.MainPanel,
       
   222               pos=wx.Point(24, 80), size=wx.Size(47, 17), style=0)
       
   223 
       
   224         self.IndexName = wx.TextCtrl(id=wxID_MAPVARIABLEDIALOGINDEXNAME,
       
   225               name='IndexName', parent=self.MainPanel, pos=wx.Point(24, 104),
       
   226               size=wx.Size(152, 24), style=0, value='Undefined')
       
   227 
       
   228         self.staticText2 = wx.StaticText(id=wxID_MAPVARIABLEDIALOGSTATICTEXT2,
       
   229               label='Type:', name='staticText2', parent=self.MainPanel,
       
   230               pos=wx.Point(208, 24), size=wx.Size(38, 17), style=0)
       
   231 
       
   232         self.radioButton1 = wx.RadioButton(id=wxID_MAPVARIABLEDIALOGRADIOBUTTON1,
       
   233               label='VAR', name='radioButton1', parent=self.MainPanel,
       
   234               pos=wx.Point(208, 48), size=wx.Size(72, 24), style=wxRB_GROUP)
       
   235         self.radioButton1.SetValue(True)
       
   236         self.radioButton1.Bind(wx.EVT_RADIOBUTTON, self.OnRadioButton1Click,
       
   237               id=wxID_MAPVARIABLEDIALOGRADIOBUTTON1)
       
   238 
       
   239         self.radioButton2 = wx.RadioButton(id=wxID_MAPVARIABLEDIALOGRADIOBUTTON2,
       
   240               label='ARRAY', name='radioButton2', parent=self.MainPanel,
       
   241               pos=wx.Point(208, 72), size=wx.Size(80, 24), style=wxRB_SINGLE)
       
   242         self.radioButton2.SetValue(False)
       
   243         self.radioButton2.Bind(wx.EVT_RADIOBUTTON, self.OnRadioButton2Click,
       
   244               id=wxID_MAPVARIABLEDIALOGRADIOBUTTON2)
       
   245 
       
   246         self.radioButton3 = wx.RadioButton(id=wxID_MAPVARIABLEDIALOGRADIOBUTTON3,
       
   247               label='REC', name='radioButton3', parent=self.MainPanel,
       
   248               pos=wx.Point(208, 96), size=wx.Size(96, 24), style=wxRB_SINGLE)
       
   249         self.radioButton3.SetValue(False)
       
   250         self.radioButton3.Bind(wx.EVT_RADIOBUTTON, self.OnRadioButton3Click,
       
   251               id=wxID_MAPVARIABLEDIALOGRADIOBUTTON3)
       
   252 
       
   253         self.staticText4 = wx.StaticText(id=wxID_MAPVARIABLEDIALOGSTATICTEXT4,
       
   254               label='Number:', name='staticText4', parent=self.MainPanel,
       
   255               pos=wx.Point(312, 80), size=wx.Size(88, 16), style=0)
       
   256 
       
   257         self.Number = wx.TextCtrl(id=wxID_MAPVARIABLEDIALOGNUMBER,
       
   258               name='Number', parent=self.MainPanel, pos=wx.Point(312, 104),
       
   259               size=wx.Size(112, 24), style=wx.TE_RIGHT, value='0')
       
   260 
       
   261         self._init_sizers()
       
   262 
       
   263     def __init__(self, parent):
       
   264         self._init_ctrls(parent)
       
   265         self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL)
       
   266         self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_CENTER)
       
   267         self.staticText4.Enable(False)
       
   268         self.Number.Enable(False)
       
   269         
       
   270         EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK)
       
   271 
       
   272     def SetIndex(self, index):
       
   273         self.Index.SetValue("0x%04X"%index)
       
   274 
       
   275     def OnOK(self, event):
       
   276         error = []
       
   277         try:
       
   278             int(self.Index.GetValue(), 16)
       
   279         except:
       
   280             error.append("Index")
       
   281         if self.radioButton2.GetValue() or self.radioButton3.GetValue():
       
   282             try:
       
   283                 int(self.Number.GetValue())
       
   284             except:
       
   285                 error.append("Number")
       
   286         if len(error) > 0:
       
   287             text = ""
       
   288             if len(error) > 1:
       
   289                 suffix = "s"
       
   290             else:
       
   291                 suffix = ""
       
   292             for i, item in enumerate(error):
       
   293                 if i == 0:
       
   294                     text += item
       
   295                 elif i == len(error) - 1:
       
   296                     text += " and %s"%item
       
   297                 else:
       
   298                     text += ", %s"%item
       
   299             message = wxMessageDialog(self, "Form isn't valid. %s must be integer%s!"%(text,suffix), "Error", wxOK|wxICON_ERROR)
       
   300             message.ShowModal()
       
   301             message.Destroy()
       
   302         else:
       
   303             self.EndModal(wxID_OK)
       
   304 
       
   305     def GetValues(self):
       
   306         name = self.IndexName.GetValue()
       
   307         index = int(self.Index.GetValue(), 16)
       
   308         if self.radioButton1.GetValue():
       
   309             struct = 1
       
   310             number = None
       
   311         elif self.radioButton2.GetValue():
       
   312             struct = 3
       
   313             number = int(self.Number.GetValue())
       
   314         elif self.radioButton3.GetValue():
       
   315             struct = 7
       
   316             number = int(self.Number.GetValue())
       
   317         return index, name, struct, number
       
   318 
       
   319     def OnRadioButton1Click(self, event):
       
   320         self.EnableNumberTyping(False)
       
   321         event.Skip()
       
   322 
       
   323     def OnRadioButton2Click(self, event):
       
   324         self.EnableNumberTyping(True)
       
   325         event.Skip()
       
   326 
       
   327     def OnRadioButton3Click(self, event):
       
   328         self.EnableNumberTyping(True)
       
   329         event.Skip()
       
   330 
       
   331     def EnableNumberTyping(self, enable):
       
   332         self.staticText4.Enable(enable)
       
   333         self.Number.Enable(enable)
       
   334 
       
   335 
       
   336 #-------------------------------------------------------------------------------
       
   337 #                          Create User Type Dialog
       
   338 #-------------------------------------------------------------------------------
       
   339 
       
   340 
       
   341 [wxID_USERTYPEDIALOG, wxID_USERTYPEDIALOGLENGTH, wxID_USERTYPEDIALOGMAINPANEL, 
       
   342  wxID_USERTYPEDIALOGMAX, wxID_USERTYPEDIALOGMIN, 
       
   343  wxID_USERTYPEDIALOGSTATICBOX1, wxID_USERTYPEDIALOGSTATICTEXT1, 
       
   344  wxID_USERTYPEDIALOGSTATICTEXT2, wxID_USERTYPEDIALOGSTATICTEXT3, 
       
   345  wxID_USERTYPEDIALOGSTATICTEXT4, wxID_USERTYPEDIALOGTYPE, 
       
   346 ] = [wx.NewId() for _init_ctrls in range(11)]
       
   347 
       
   348 class UserTypeDialog(wx.Dialog):
       
   349     def _init_coll_flexGridSizer1_Items(self, parent):
       
   350         # generated method, don't edit
       
   351 
       
   352         parent.AddWindow(self.MainPanel, 0, border=0, flag=0)
       
   353 
       
   354     def _init_sizers(self):
       
   355         # generated method, don't edit
       
   356         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
       
   357 
       
   358         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
       
   359 
       
   360         self.SetSizer(self.flexGridSizer1)
       
   361 
       
   362     def _init_ctrls(self, prnt):
       
   363         # generated method, don't edit
       
   364         wx.Dialog.__init__(self, id=wxID_USERTYPEDIALOG, name='UserTypeDialog',
       
   365               parent=prnt, pos=wx.Point(376, 223), size=wx.Size(444, 228),
       
   366               style=wx.DEFAULT_DIALOG_STYLE, title='Add User Type')
       
   367         self.SetClientSize(wx.Size(444, 228))
       
   368 
       
   369         self.MainPanel = wx.Panel(id=wxID_USERTYPEDIALOGMAINPANEL,
       
   370               name='MainPanel', parent=self, pos=wx.Point(0, 0),
       
   371               size=wx.Size(431, 182), style=wx.TAB_TRAVERSAL)
       
   372         self.MainPanel.SetAutoLayout(True)
       
   373 
       
   374         self.staticText1 = wx.StaticText(id=wxID_USERTYPEDIALOGSTATICTEXT1,
       
   375               label='Type:', name='staticText1', parent=self.MainPanel,
       
   376               pos=wx.Point(24, 24), size=wx.Size(156, 17), style=0)
       
   377 
       
   378         self.Type = wx.Choice(choices=[], id=wxID_USERTYPEDIALOGTYPE,
       
   379               name='Type', parent=self.MainPanel, pos=wx.Point(24, 48),
       
   380               size=wx.Size(160, 24), style=0)
       
   381         self.Type.Bind(wx.EVT_CHOICE, self.OnTypeChoice,
       
   382               id=wxID_USERTYPEDIALOGTYPE)
       
   383 
       
   384         self.staticBox1 = wx.StaticBox(id=wxID_USERTYPEDIALOGSTATICBOX1,
       
   385               label='Values', name='staticBox1', parent=self.MainPanel,
       
   386               pos=wx.Point(200, 24), size=wx.Size(224, 144), style=0)
       
   387 
       
   388         self.staticText2 = wx.StaticText(id=wxID_USERTYPEDIALOGSTATICTEXT2,
       
   389               label='Minimum:', name='staticText2', parent=self.MainPanel,
       
   390               pos=wx.Point(216, 48), size=wx.Size(67, 17), style=0)
       
   391 
       
   392         self.Min = wx.TextCtrl(id=wxID_USERTYPEDIALOGMIN, name='Min',
       
   393               parent=self.MainPanel, pos=wx.Point(296, 48), size=wx.Size(112,
       
   394               24), style=wx.TE_RIGHT, value='0')
       
   395 
       
   396         self.staticText3 = wx.StaticText(id=wxID_USERTYPEDIALOGSTATICTEXT3,
       
   397               label='Maximum:', name='staticText3', parent=self.MainPanel,
       
   398               pos=wx.Point(216, 88), size=wx.Size(71, 17), style=0)
       
   399 
       
   400         self.Max = wx.TextCtrl(id=wxID_USERTYPEDIALOGMAX, name='Max',
       
   401               parent=self.MainPanel, pos=wx.Point(296, 88), size=wx.Size(112,
       
   402               25), style=wx.TE_RIGHT, value='0')
       
   403 
       
   404         self.staticText4 = wx.StaticText(id=wxID_USERTYPEDIALOGSTATICTEXT4,
       
   405               label='Length:', name='staticText4', parent=self.MainPanel,
       
   406               pos=wx.Point(216, 128), size=wx.Size(52, 17), style=0)
       
   407 
       
   408         self.Length = wx.TextCtrl(id=wxID_USERTYPEDIALOGLENGTH, name='Length',
       
   409               parent=self.MainPanel, pos=wx.Point(296, 128), size=wx.Size(112,
       
   410               25), style=wx.TE_RIGHT, value='0')
       
   411 
       
   412         self._init_sizers()
       
   413 
       
   414     def __init__(self, parent):
       
   415         self._init_ctrls(parent)
       
   416         self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL)
       
   417         self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_CENTER)
       
   418         self.TypeDictionary = {}
       
   419 
       
   420         EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK)
       
   421 
       
   422     def OnOK(self, event):
       
   423         error = []
       
   424         good = True
       
   425         firstmessage = ""
       
   426         secondmessage = ""
       
   427         name = self.Type.GetStringSelection()
       
   428         if name != "":
       
   429             valuetype = self.TypeDictionary[name][1]
       
   430             if valuetype == 0:
       
   431                 try:
       
   432                     int(self.Min.GetValue(), 16)
       
   433                 except:
       
   434                     error.append("Minimum")
       
   435                     good = False
       
   436                 try:
       
   437                     int(self.Max.GetValue(), 16)
       
   438                 except:
       
   439                     error.append("Maximum")
       
   440                     good = False
       
   441             elif valuetype == 1:
       
   442                 try:
       
   443                     int(self.Length.GetValue(), 16)
       
   444                 except:
       
   445                     error.append("Length")
       
   446                     good = False
       
   447             if len(error) > 0:
       
   448                 secondmessage = ". "
       
   449                 for i, item in enumerate(error):
       
   450                     if i == 0:
       
   451                         secondmessage += item
       
   452                     elif i == len(error) - 1:
       
   453                         secondmessage += " and %s"%item
       
   454                     else:
       
   455                         secondmessage += ", %s"%item
       
   456                 secondmessage += " must be integer"
       
   457                 if len(error) > 1:
       
   458                     secondmessage += "s"
       
   459         else:
       
   460             firstmessage = ". A type must be selected"
       
   461             good = False
       
   462         if not good:
       
   463             message = wxMessageDialog(self, "Form isn't valid%s%s%s!"%(firstmessage,secondmessage), "Error", wxOK|wxICON_ERROR)
       
   464             message.ShowModal()
       
   465             message.Destroy()
       
   466             self.Name.SetFocus()
       
   467         else:
       
   468             self.EndModal(wxID_OK)
       
   469 
       
   470     def SetValues(self, min = None, max = None, length = None):
       
   471         if min != None:
       
   472             self.Min.SetValue(str(min))
       
   473         if max != None:
       
   474             self.Max.SetValue(str(max))
       
   475         if length != None:
       
   476             self.Length.SetValue(str(length))
       
   477 
       
   478     def SetTypeList(self, typedic, type = None):
       
   479         self.Type.Clear()
       
   480         list = []
       
   481         for index, (name, valuetype) in typedic.iteritems():
       
   482             self.TypeDictionary[name] = (index, valuetype)
       
   483             list.append((index, name))
       
   484         list.sort()
       
   485         for index, name in list:
       
   486             self.Type.Append(name)
       
   487         if type != None:
       
   488             self.Type.SetStringSelection(typedic[type][0])
       
   489         self.RefreshValues()
       
   490 
       
   491     def OnTypeChoice(self, event):
       
   492         self.RefreshValues()
       
   493         event.Skip()
       
   494     
       
   495     def RefreshValues(self):
       
   496         name = self.Type.GetStringSelection()
       
   497         if name != "":
       
   498             valuetype = self.TypeDictionary[name][1]
       
   499             if valuetype == 0:
       
   500                 self.staticText2.Enable(True)
       
   501                 self.staticText3.Enable(True)
       
   502                 self.staticText4.Enable(False)
       
   503                 self.Min.Enable(True)
       
   504                 self.Max.Enable(True)
       
   505                 self.Length.Enable(False)
       
   506             elif valuetype == 1:
       
   507                 self.staticText2.Enable(False)
       
   508                 self.staticText3.Enable(False)
       
   509                 self.staticText4.Enable(True)
       
   510                 self.Min.Enable(False)
       
   511                 self.Max.Enable(False)
       
   512                 self.Length.Enable(True)
       
   513         else:
       
   514             self.staticText2.Enable(False)
       
   515             self.staticText3.Enable(False)
       
   516             self.staticText4.Enable(False)
       
   517             self.Min.Enable(False)
       
   518             self.Max.Enable(False)
       
   519             self.Length.Enable(False)
       
   520 
       
   521     def GetValues(self):
       
   522         name = self.Type.GetStringSelection()
       
   523         type = self.TypeDictionary[name][0]
       
   524         min = int(self.Min.GetValue())
       
   525         max = int(self.Max.GetValue())
       
   526         length = int(self.Length.GetValue())
       
   527         return type, min, max, length
       
   528 
       
   529 
       
   530 
       
   531 #-------------------------------------------------------------------------------
       
   532 #                          Editing Node Infos Dialog
       
   533 #-------------------------------------------------------------------------------
       
   534 
       
   535 
       
   536 [wxID_NODEINFOSDIALOG, wxID_NODEINFOSDIALOGMAINPANEL, 
       
   537  wxID_NODEINFOSDIALOGNAME, wxID_NODEINFOSDIALOGNODEID, 
       
   538  wxID_NODEINFOSDIALOGDESCRIPTION, wxID_NODEINFOSDIALOGSTATICTEXT1, 
       
   539  wxID_NODEINFOSDIALOGSTATICTEXT2, wxID_NODEINFOSDIALOGSTATICTEXT3, 
       
   540  wxID_NODEINFOSDIALOGSTATICTEXT4, wxID_NODEINFOSDIALOGTYPE, 
       
   541 ] = [wx.NewId() for _init_ctrls in range(10)]
       
   542 
       
   543 class NodeInfosDialog(wx.Dialog):
       
   544     def _init_coll_flexGridSizer1_Items(self, parent):
       
   545         # generated method, don't edit
       
   546 
       
   547         parent.AddWindow(self.MainPanel, 0, border=0, flag=0)
       
   548 
       
   549     def _init_sizers(self):
       
   550         # generated method, don't edit
       
   551         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
       
   552 
       
   553         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
       
   554 
       
   555         self.SetSizer(self.flexGridSizer1)
       
   556 
       
   557     def _init_ctrls(self, prnt):
       
   558         # generated method, don't edit
       
   559         wx.Dialog.__init__(self, id=wxID_NODEINFOSDIALOG,
       
   560               name='NodeInfosDialog', parent=prnt, pos=wx.Point(376, 223),
       
   561               size=wx.Size(300, 300), style=wx.DEFAULT_DIALOG_STYLE,
       
   562               title='Node Infos')
       
   563         self.SetClientSize(wx.Size(300, 300))
       
   564 
       
   565         self.MainPanel = wx.Panel(id=wxID_NODEINFOSDIALOGMAINPANEL,
       
   566               name='MainPanel', parent=self, pos=wx.Point(0, 0),
       
   567               size=wx.Size(280, 264), style=wx.TAB_TRAVERSAL)
       
   568         self.MainPanel.SetAutoLayout(True)
       
   569 
       
   570         self.staticText1 = wx.StaticText(id=wxID_NODEINFOSDIALOGSTATICTEXT1,
       
   571               label='Name:', 
       
   572               name='staticText1', parent=self.MainPanel,
       
   573               pos=wx.Point(24, 24), size=wx.Size(156, 17), style=0)
       
   574 
       
   575         self.Name = wx.TextCtrl(id=wxID_NODEINFOSDIALOGNAME, name='Name',
       
   576               parent=self.MainPanel, pos=wx.Point(24, 48), size=wx.Size(250,
       
   577               25), style=0, value='')
       
   578 
       
   579         self.staticText2 = wx.StaticText(id=wxID_NODEINFOSDIALOGSTATICTEXT2,
       
   580               label='Node ID:', name='staticText2', parent=self.MainPanel,
       
   581               pos=wx.Point(24, 80), size=wx.Size(67, 17), style=0)
       
   582 
       
   583         self.NodeID = wx.TextCtrl(id=wxID_NODEINFOSDIALOGNODEID, name='NodeID',
       
   584               parent=self.MainPanel, pos=wx.Point(24, 104), size=wx.Size(250,
       
   585               25), style=wx.TE_RIGHT, value='')
       
   586 
       
   587         self.staticText3 = wx.StaticText(id=wxID_NODEINFOSDIALOGSTATICTEXT3,
       
   588               label='Type:', name='staticText3', parent=self.MainPanel,
       
   589               pos=wx.Point(24, 136), size=wx.Size(71, 17), style=0)
       
   590 
       
   591         self.Type = wx.Choice(choices=[], id=wxID_NODEINFOSDIALOGTYPE,
       
   592               name='Type', parent=self.MainPanel, pos=wx.Point(24, 160),
       
   593               size=wx.Size(250, 25), style=0)
       
   594 
       
   595         self.staticText4 = wx.StaticText(id=wxID_NODEINFOSDIALOGSTATICTEXT4,
       
   596               label='Description:', name='staticText4', parent=self.MainPanel,
       
   597               pos=wx.Point(24, 192), size=wx.Size(71, 17), style=0)
       
   598 
       
   599         self.Description = wx.TextCtrl(id=wxID_NODEINFOSDIALOGDESCRIPTION, 
       
   600               name='Description', parent=self.MainPanel, pos=wx.Point(24, 216), 
       
   601               size=wx.Size(250, 25), style=0, value='')
       
   602 
       
   603         self._init_sizers()
       
   604 
       
   605     def __init__(self, parent):
       
   606         self._init_ctrls(parent)
       
   607         self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL)
       
   608         self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_CENTER)
       
   609         self.Type.Append("master")
       
   610         self.Type.Append("slave")
       
   611 
       
   612         EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK)
       
   613 
       
   614     def OnOK(self, event):
       
   615         name = self.Name.GetValue()
       
   616         message = ""
       
   617         if name != "":
       
   618             good = not name[0].isdigit()
       
   619             for item in name.split("_"):
       
   620                 good &= item.isalnum()
       
   621             if not good:
       
   622                 message = "Node name can't be undefined or start with a digit and must be composed of alphanumerical characters or underscore!"
       
   623         if message != "":
       
   624             try:
       
   625                 nodeid = int(self.NodeID.GetValue(), 16)
       
   626             except:
       
   627                 message = "Node ID must be integer!"
       
   628         if message != "":
       
   629             message = wxMessageDialog(self, message, "ERROR", wxOK|wxICON_ERROR)
       
   630             message.ShowModal()
       
   631             message.Destroy()
       
   632             self.Name.SetFocus()
       
   633         else:
       
   634             self.EndModal(wxID_OK)
       
   635     
       
   636     def SetValues(self, name, id, type, description):
       
   637         self.Name.SetValue(name)
       
   638         self.NodeID.SetValue("0x%02X"%id)
       
   639         self.Type.SetStringSelection(type)
       
   640         self.Description.SetValue(description)
       
   641 
       
   642     def GetValues(self):
       
   643         name = self.Name.GetValue()
       
   644         nodeid = int(self.NodeID.GetValue(), 16)
       
   645         type = self.Type.GetStringSelection()
       
   646         description = self.Description.GetValue()
       
   647         return name, nodeid, type, description
       
   648 
       
   649 
       
   650 
       
   651 #-------------------------------------------------------------------------------
       
   652 #                          Create New Node Dialog
       
   653 #-------------------------------------------------------------------------------
       
   654 
       
   655 
       
   656 [wxID_CREATENODEDIALOG, wxID_CREATENODEDIALOGEMERGENCY, 
       
   657  wxID_CREATENODEDIALOGGENSYNC, wxID_CREATENODEDIALOGMAINPANEL, 
       
   658  wxID_CREATENODEDIALOGNAME, wxID_CREATENODEDIALOGNMT_HEARTBEAT, 
       
   659  wxID_CREATENODEDIALOGNMT_NODEGUARDING, wxID_CREATENODEDIALOGNMT_NONE, 
       
   660  wxID_CREATENODEDIALOGNODEID, wxID_CREATENODEDIALOGPROFILE, 
       
   661  wxID_CREATENODEDIALOGSAVECONFIG, wxID_CREATENODEDIALOGSTATICTEXT1, 
       
   662  wxID_CREATENODEDIALOGSTATICTEXT2, wxID_CREATENODEDIALOGSTATICTEXT3, 
       
   663  wxID_CREATENODEDIALOGSTATICTEXT4, wxID_CREATENODEDIALOGSTATICTEXT5, 
       
   664  wxID_CREATENODEDIALOGSTATICTEXT6, wxID_CREATENODEDIALOGSTATICTEXT7,
       
   665  wxID_CREATENODEDIALOGSTOREEDS, wxID_CREATENODEDIALOGDESCRIPTION,
       
   666  wxID_CREATENODEDIALOGTYPE, 
       
   667 ] = [wx.NewId() for _init_ctrls in range(21)]
       
   668 
       
   669 class CreateNodeDialog(wx.Dialog):
       
   670     def _init_coll_flexGridSizer1_Items(self, parent):
       
   671         # generated method, don't edit
       
   672 
       
   673         parent.AddWindow(self.MainPanel, 0, border=0, flag=0)
       
   674 
       
   675     def _init_sizers(self):
       
   676         # generated method, don't edit
       
   677         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
       
   678 
       
   679         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
       
   680 
       
   681         self.SetSizer(self.flexGridSizer1)
       
   682 
       
   683     def _init_ctrls(self, prnt):
       
   684         # generated method, don't edit
       
   685         wx.Dialog.__init__(self, id=wxID_CREATENODEDIALOG,
       
   686               name='CreateNodeDialog', parent=prnt, pos=wx.Point(376, 223),
       
   687               size=wx.Size(451, 376), style=wx.DEFAULT_DIALOG_STYLE,
       
   688               title='Create a new Node')
       
   689         self.SetClientSize(wx.Size(451, 376))
       
   690 
       
   691         self.MainPanel = wx.Panel(id=wxID_CREATENODEDIALOGMAINPANEL,
       
   692               name='MainPanel', parent=self, pos=wx.Point(0, 0),
       
   693               size=wx.Size(440, 278), style=wx.TAB_TRAVERSAL)
       
   694         self.MainPanel.SetAutoLayout(True)
       
   695 
       
   696         self.staticText1 = wx.StaticText(id=wxID_CREATENODEDIALOGSTATICTEXT1,
       
   697               label='Name:', name='staticText1', parent=self.MainPanel,
       
   698               pos=wx.Point(24, 24), size=wx.Size(156, 17), style=0)
       
   699 
       
   700         self.staticText2 = wx.StaticText(id=wxID_CREATENODEDIALOGSTATICTEXT2,
       
   701               label='Node ID:', name='staticText2', parent=self.MainPanel,
       
   702               pos=wx.Point(24, 80), size=wx.Size(67, 17), style=0)
       
   703 
       
   704         self.staticText3 = wx.StaticText(id=wxID_CREATENODEDIALOGSTATICTEXT3,
       
   705               label='Type:', name='staticText3', parent=self.MainPanel,
       
   706               pos=wx.Point(24, 136), size=wx.Size(71, 17), style=0)
       
   707 
       
   708         self.Type = wx.Choice(choices=[], id=wxID_CREATENODEDIALOGTYPE,
       
   709               name='Type', parent=self.MainPanel, pos=wx.Point(24, 160),
       
   710               size=wx.Size(200, 24), style=0)
       
   711 
       
   712         self.Name = wx.TextCtrl(id=wxID_CREATENODEDIALOGNAME, name='Name',
       
   713               parent=self.MainPanel, pos=wx.Point(24, 48), size=wx.Size(200,
       
   714               25), style=0, value='')
       
   715 
       
   716         self.NodeID = wx.TextCtrl(id=wxID_CREATENODEDIALOGNODEID, name='NodeID',
       
   717               parent=self.MainPanel, pos=wx.Point(24, 104), size=wx.Size(200,
       
   718               25), style=wx.TE_RIGHT, value='')
       
   719 
       
   720         self.staticText4 = wx.StaticText(id=wxID_CREATENODEDIALOGSTATICTEXT4,
       
   721               label='Profile:', name='staticText4', parent=self.MainPanel,
       
   722               pos=wx.Point(24, 192), size=wx.Size(47, 17), style=0)
       
   723 
       
   724         self.Profile = wx.Choice(choices=[], id=wxID_CREATENODEDIALOGPROFILE,
       
   725               name='Profile', parent=self.MainPanel, pos=wx.Point(24, 216),
       
   726               size=wx.Size(200, 24), style=0)
       
   727         self.Profile.Bind(wx.EVT_CHOICE, self.OnProfileChoice,
       
   728               id=wxID_CREATENODEDIALOGPROFILE)
       
   729 
       
   730         self.staticText5 = wx.StaticText(id=wxID_CREATENODEDIALOGSTATICTEXT5,
       
   731               label='Network Management:', name='staticText5',
       
   732               parent=self.MainPanel, pos=wx.Point(256, 24), size=wx.Size(152,
       
   733               16), style=0)
       
   734 
       
   735         self.NMT_None = wx.RadioButton(id=wxID_CREATENODEDIALOGNMT_NONE,
       
   736               label='None', name='NMT_None', parent=self.MainPanel,
       
   737               pos=wx.Point(256, 40), size=wx.Size(114, 24), style=0)
       
   738         self.NMT_None.SetValue(True)
       
   739 
       
   740         self.NMT_NodeGuarding = wx.RadioButton(id=wxID_CREATENODEDIALOGNMT_NODEGUARDING,
       
   741               label='Node Guarding', name='NMT_NodeGuarding',
       
   742               parent=self.MainPanel, pos=wx.Point(256, 64), size=wx.Size(128,
       
   743               24), style=0)
       
   744         self.NMT_NodeGuarding.SetValue(False)
       
   745 
       
   746         self.NMT_Heartbeat = wx.RadioButton(id=wxID_CREATENODEDIALOGNMT_HEARTBEAT,
       
   747               label='Heartbeat', name='NMT_Heartbeat', parent=self.MainPanel,
       
   748               pos=wx.Point(256, 88), size=wx.Size(114, 24), style=0)
       
   749         self.NMT_Heartbeat.SetValue(False)
       
   750 
       
   751         self.staticText6 = wx.StaticText(id=wxID_CREATENODEDIALOGSTATICTEXT6,
       
   752               label='Options:', name='staticText6', parent=self.MainPanel,
       
   753               pos=wx.Point(256, 128), size=wx.Size(72, 17), style=0)
       
   754 
       
   755         self.DS302 = wx.CheckBox(id=wxID_CREATENODEDIALOGGENSYNC,
       
   756               label='DS-302 Profile', name='DS302', parent=self.MainPanel,
       
   757               pos=wx.Point(256, 144), size=wx.Size(128, 24), style=0)
       
   758         self.DS302.SetValue(False)
       
   759         #self.DS302.Enable(False)
       
   760 
       
   761         self.GenSYNC = wx.CheckBox(id=wxID_CREATENODEDIALOGGENSYNC,
       
   762               label='Generate SYNC', name='GenSYNC', parent=self.MainPanel,
       
   763               pos=wx.Point(256, 168), size=wx.Size(128, 24), style=0)
       
   764         self.GenSYNC.SetValue(False)
       
   765 
       
   766         self.Emergency = wx.CheckBox(id=wxID_CREATENODEDIALOGEMERGENCY,
       
   767               label='Emergency support', name='Emergency',
       
   768               parent=self.MainPanel, pos=wx.Point(256, 192), size=wx.Size(152,
       
   769               24), style=0)
       
   770         self.Emergency.SetValue(False)
       
   771         self.Emergency.Enable(False)
       
   772 
       
   773         self.SaveConfig = wx.CheckBox(id=wxID_CREATENODEDIALOGSAVECONFIG,
       
   774               label='Save Configuration', name='SaveConfig',
       
   775               parent=self.MainPanel, pos=wx.Point(256, 216), size=wx.Size(152,
       
   776               24), style=0)
       
   777         self.SaveConfig.SetValue(False)
       
   778         self.SaveConfig.Enable(False)
       
   779 
       
   780 #        self.StoreEDS = wx.CheckBox(id=wxID_CREATENODEDIALOGSTOREEDS,
       
   781 #              label='Store EDS', name='StoreEDS', parent=self.MainPanel,
       
   782 #              pos=wx.Point(256, 240), size=wx.Size(144, 24), style=0)
       
   783 #        self.StoreEDS.SetValue(False)
       
   784 
       
   785         self.staticText7 = wx.StaticText(id=wxID_CREATENODEDIALOGSTATICTEXT7,
       
   786               label='Description:', name='staticText7', parent=self.MainPanel,
       
   787               pos=wx.Point(24, 248), size=wx.Size(71, 17), style=0)
       
   788 
       
   789         self.Description = wx.TextCtrl(id=wxID_CREATENODEDIALOGDESCRIPTION, 
       
   790               name='Description', parent=self.MainPanel, pos=wx.Point(24, 272), 
       
   791               size=wx.Size(400, 25), style=0, value='')
       
   792 
       
   793         self._init_sizers()
       
   794 
       
   795     def __init__(self, parent):
       
   796         self._init_ctrls(parent)
       
   797         self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL)
       
   798         self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_CENTER)
       
   799         self.NodeID.SetValue("0x00")
       
   800         self.Type.Append("master")
       
   801         self.Type.Append("slave")
       
   802         self.Type.SetStringSelection("slave")
       
   803         self.Description.SetValue("")
       
   804         self.ListProfile = {"None" : ""}
       
   805         self.Profile.Append("None")
       
   806         self.Directory = os.path.join(ScriptDirectory, "config")
       
   807         listfiles = os.listdir(self.Directory)
       
   808         listfiles.sort()
       
   809         for item in listfiles:
       
   810             name, extend = os.path.splitext(item)
       
   811             if os.path.isfile(os.path.join(self.Directory, item)) and extend == ".prf" and name != "DS-302":
       
   812                 self.ListProfile[name] = os.path.join(self.Directory, item)
       
   813                 self.Profile.Append(name)
       
   814         self.Profile.Append("Other")
       
   815         self.Profile.SetStringSelection("None")
       
   816         self.Name.SetFocus()
       
   817         
       
   818         EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK)
       
   819 
       
   820     def OnOK(self, event):
       
   821         name = self.Name.GetValue()
       
   822         message = ""
       
   823         if name != "":
       
   824             good = not name[0].isdigit()
       
   825             for item in name.split("_"):
       
   826                 good &= item.isalnum()
       
   827             if not good:
       
   828                 message = "Node name can't be undefined or start with a digit and must be composed of alphanumerical characters or underscore!"
       
   829         if message != "":
       
   830             try:
       
   831                 nodeid = int(self.NodeID.GetValue(), 16)
       
   832             except:
       
   833                 message = "Node ID must be an integer!"
       
   834         if message != "":
       
   835             message = wxMessageDialog(self, message, "ERROR", wxOK|wxICON_ERROR)
       
   836             message.ShowModal()
       
   837             message.Destroy()
       
   838             self.Name.SetFocus()
       
   839         else:
       
   840             self.EndModal(wxID_OK)
       
   841 
       
   842     def GetValues(self):
       
   843         name = self.Name.GetValue()
       
   844         nodeid = 0
       
   845         if self.NodeID.GetValue() != "":
       
   846             nodeid = int(self.NodeID.GetValue(), 16)
       
   847         type = self.Type.GetStringSelection()
       
   848         description = self.Description.GetValue()
       
   849         return name, nodeid, type, description
       
   850 
       
   851     def GetProfile(self):
       
   852         name = self.Profile.GetStringSelection()
       
   853         return name, self.ListProfile[name]
       
   854 
       
   855     def GetNMTManagement(self):
       
   856         if self.NMT_None.GetValue():
       
   857             return "None"
       
   858         elif self.NMT_NodeGuarding.GetValue():
       
   859             return "NodeGuarding"
       
   860         elif self.NMT_Heartbeat.GetValue():
       
   861             return "Heartbeat"
       
   862         return None
       
   863     
       
   864     def GetOptions(self):
       
   865         options = []
       
   866         if self.DS302.GetValue():
       
   867             options.append("DS302")
       
   868         if self.GenSYNC.GetValue():
       
   869             options.append("GenSYNC")
       
   870         if self.Emergency.GetValue():
       
   871             options.append("Emergency")
       
   872         if self.SaveConfig.GetValue():
       
   873             options.append("SaveConfig")
       
   874 #        if self.StoreEDS.GetValue():
       
   875 #            options.append("StoreEDS")
       
   876         return options
       
   877 
       
   878     def OnProfileChoice(self, event):
       
   879         if self.Profile.GetStringSelection() == "Other":
       
   880             dialog = wxFileDialog(self, "Choose a file", self.Directory, "",  "OD Profile files (*.prf)|*.prf|All files|*.*", wxOPEN|wxCHANGE_DIR)
       
   881             dialog.ShowModal()
       
   882             filepath = dialog.GetPath()
       
   883             dialog.Destroy()
       
   884             if os.path.isfile(filepath):
       
   885                 name = os.path.splitext(os.path.basename(filepath))[0]
       
   886                 self.ListProfile[name] = filepath
       
   887                 length = self.Profile.GetCount()
       
   888                 self.Profile.Insert(name, length - 2)
       
   889                 self.Profile.SetStringSelection(name)
       
   890             else:
       
   891                 self.Profile.SetStringSelection("None")
       
   892         event.Skip()
       
   893 
       
   894 
       
   895 #-------------------------------------------------------------------------------
       
   896 #                            ADD Slave to NodeList Dialog
       
   897 #-------------------------------------------------------------------------------
       
   898 
       
   899 [wxID_ADDSLAVEDIALOG, wxID_ADDSLAVEDIALOGMAINPANEL, wxID_ADDSLAVEDIALOGSLAVENAME, 
       
   900  wxID_ADDSLAVEDIALOGSLAVENODEID, wxID_ADDSLAVEDIALOGEDSFILE, 
       
   901  wxID_ADDSLAVEDIALOGIMPORTEDS, wxID_ADDSLAVEDIALOGSTATICTEXT1, 
       
   902  wxID_ADDSLAVEDIALOGSTATICTEXT2, wxID_ADDSLAVEDIALOGSTATICTEXT3, 
       
   903 ] = [wx.NewId() for _init_ctrls in range(9)]
       
   904 
       
   905 class AddSlaveDialog(wx.Dialog):
       
   906     def _init_coll_flexGridSizer1_Items(self, parent):
       
   907         # generated method, don't edit
       
   908 
       
   909         parent.AddWindow(self.MainPanel, 0, border=0, flag=0)
       
   910 
       
   911     def _init_sizers(self):
       
   912         # generated method, don't edit
       
   913         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
       
   914 
       
   915         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
       
   916 
       
   917         self.SetSizer(self.flexGridSizer1)
       
   918 
       
   919     def _init_ctrls(self, prnt):
       
   920         # generated method, don't edit
       
   921         wx.Dialog.__init__(self, id=wxID_ADDSLAVEDIALOG,
       
   922               name='AddSlaveDialog', parent=prnt, pos=wx.Point(376, 223),
       
   923               size=wx.Size(300, 250), style=wx.DEFAULT_DIALOG_STYLE,
       
   924               title='Add a slave to nodelist')
       
   925         self.SetClientSize(wx.Size(300, 250))
       
   926 
       
   927         self.MainPanel = wx.Panel(id=wxID_ADDSLAVEDIALOGMAINPANEL,
       
   928               name='MainPanel', parent=self, pos=wx.Point(0, 0),
       
   929               size=wx.Size(350, 250), style=wx.TAB_TRAVERSAL)
       
   930         self.MainPanel.SetAutoLayout(True)
       
   931 
       
   932         self.staticText1 = wx.StaticText(id=wxID_ADDSLAVEDIALOGSTATICTEXT1,
       
   933               label='Slave Name:', name='staticText1', parent=self.MainPanel,
       
   934               pos=wx.Point(24, 24), size=wx.Size(150, 17), style=0)
       
   935 
       
   936         self.SlaveName = wx.TextCtrl(id=wxID_ADDSLAVEDIALOGSLAVENAME,
       
   937               name='SlaveName', parent=self.MainPanel, pos=wx.Point(24, 48), 
       
   938               size=wx.Size(250, 24), style=0)
       
   939 
       
   940         self.staticText2 = wx.StaticText(id=wxID_ADDSLAVEDIALOGSTATICTEXT2,
       
   941               label='Slave Node ID:', name='staticText2', parent=self.MainPanel,
       
   942               pos=wx.Point(24, 80), size=wx.Size(150, 17), style=0)
       
   943 
       
   944         self.SlaveNodeID = wx.TextCtrl(id=wxID_ADDSLAVEDIALOGSLAVENODEID,
       
   945               name='SlaveName', parent=self.MainPanel, pos=wx.Point(24, 104), 
       
   946               size=wx.Size(250, 24), style=wxALIGN_RIGHT)
       
   947 
       
   948         self.staticText3 = wx.StaticText(id=wxID_ADDSLAVEDIALOGSTATICTEXT3,
       
   949               label='EDS File:', name='staticText3', parent=self.MainPanel,
       
   950               pos=wx.Point(24, 136), size=wx.Size(155, 17), style=0)
       
   951 
       
   952         self.EDSFile = wx.Choice(id=wxID_ADDSLAVEDIALOGEDSFILE,
       
   953               name='EDSFile', parent=self.MainPanel, pos=wx.Point(24, 160),
       
   954               size=wx.Size(145, 24), style=0)
       
   955         
       
   956         self.ImportEDS = wxButton(id=wxID_ADDSLAVEDIALOGIMPORTEDS, label='Import EDS',
       
   957               name='ImportEDS', parent=self.MainPanel, pos=wx.Point(174, 160),
       
   958               size=wx.Size(100, 32), style=0)
       
   959         self.ImportEDS.Bind(wx.EVT_BUTTON, self.OnImportEDSButton,
       
   960               id=wxID_ADDSLAVEDIALOGIMPORTEDS)
       
   961         
       
   962         self._init_sizers()
       
   963 
       
   964     def __init__(self, parent):
       
   965         self._init_ctrls(parent)
       
   966         self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL|wxCENTRE)
       
   967         self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_RIGHT)
       
   968         
       
   969         self.SlaveNodeID.SetValue("0x00")
       
   970         
       
   971         EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK)
       
   972     
       
   973     def OnOK(self, event):
       
   974         error = []
       
   975         if self.SlaveName.GetValue() == "":
       
   976             error.append("Slave Name")
       
   977         if self.SlaveNodeID.GetValue() == "":
       
   978             error.append("Slave Node ID")
       
   979         if self.EDSFile.GetStringSelection() == "":
       
   980             error.append("EDS File")
       
   981         if len(error) > 0:
       
   982             text = ""
       
   983             for i, item in enumerate(error):
       
   984                 if i == 0:
       
   985                     text += item
       
   986                 elif i == len(error) - 1:
       
   987                     text += " and %s"%item
       
   988                 else:
       
   989                     text += ", %s"%item 
       
   990             message = wxMessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wxOK|wxICON_ERROR)
       
   991             message.ShowModal()
       
   992             message.Destroy()
       
   993         else:
       
   994             try:
       
   995                 nodeid = self.SlaveNodeID.GetValue()
       
   996                 if nodeid.find("x") != -1:
       
   997                     nodeid = int(nodeid, 16)
       
   998                 else:
       
   999                     nodeid = int(nodeid)
       
  1000             except:
       
  1001                 message = wxMessageDialog(self, "Slave Node ID must be a value in decimal or hexadecimal!", "Error", wxOK|wxICON_ERROR)
       
  1002                 message.ShowModal()
       
  1003                 message.Destroy()
       
  1004                 return
       
  1005             if not 0 <= nodeid <= 127:
       
  1006                 message = wxMessageDialog(self, "Slave Node ID must be between 0 and 127!", "Error", wxOK|wxICON_ERROR)
       
  1007                 message.ShowModal()
       
  1008                 message.Destroy()
       
  1009             elif nodeid == 0 or nodeid in self.NodeList.SlaveNodes.keys():
       
  1010                 message = wxMessageDialog(self, "A Node with this ID already exist in the network!", "Error", wxOK|wxICON_ERROR)
       
  1011                 message.ShowModal()
       
  1012                 message.Destroy()
       
  1013             else:
       
  1014                 self.EndModal(wxID_OK)
       
  1015 
       
  1016     def OnImportEDSButton(self, event):
       
  1017         dialog = wxFileDialog(self, "Choose an EDS file", os.getcwd(), "",  "EDS files (*.eds)|*.eds|All files|*.*", wxOPEN|wxCHANGE_DIR)
       
  1018         if dialog.ShowModal() == wxID_OK:
       
  1019             filepath = dialog.GetPath()
       
  1020             if os.path.isfile(filepath):
       
  1021                 result = self.NodeList.ImportEDSFile(filepath)
       
  1022                 if result:
       
  1023                     message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR)
       
  1024                     message.ShowModal()
       
  1025                     message.Destroy()
       
  1026         dialog.Destroy()
       
  1027         self.RefreshEDSFile()
       
  1028         event.Skip()
       
  1029 
       
  1030     def RefreshEDSFile(self):
       
  1031         selection = self.EDSFile.GetStringSelection()
       
  1032         self.EDSFile.Clear()
       
  1033         for option in self.NodeList.EDSNodes.keys():
       
  1034             self.EDSFile.Append(option)
       
  1035         if self.EDSFile.FindString(selection) != wxNOT_FOUND:
       
  1036             self.EDSFile.SetStringSelection(selection)
       
  1037     
       
  1038     def SetNodeList(self, nodelist):
       
  1039         self.NodeList = nodelist
       
  1040         self.RefreshEDSFile()
       
  1041     
       
  1042     def GetValues(self):
       
  1043         values = {}
       
  1044         values["slaveName"] = self.SlaveName.GetValue()
       
  1045         nodeid = self.SlaveNodeID.GetValue()
       
  1046         if nodeid.find("x") != -1:
       
  1047             values["slaveNodeID"] = int(nodeid, 16)
       
  1048         else:
       
  1049             values["slaveNodeID"] = int(nodeid)
       
  1050         values["edsFile"] = self.EDSFile.GetStringSelection()
       
  1051         return values