objdictgen/nodeeditortemplate.py
changeset 778 9edaa9d21cf9
parent 745 0bd84a528133
equal deleted inserted replaced
776:30ced15f996f 778:9edaa9d21cf9
       
     1 from types import *
       
     2 
       
     3 import wx
       
     4 
       
     5 from node import OD_Subindex, OD_MultipleSubindexes, OD_IdenticalSubindexes, OD_IdenticalIndexes
       
     6 from commondialogs import *
       
     7 
       
     8 class NodeEditorTemplate:
       
     9     
       
    10     EDITMENU_ID = None
       
    11     
       
    12     def __init__(self, manager, frame, mode_solo):
       
    13         self.Manager = manager
       
    14         self.Frame = frame
       
    15         self.ModeSolo = mode_solo
       
    16         
       
    17         self.BusId = None
       
    18         self.Closing = False
       
    19     
       
    20     def SetBusId(self, bus_id):
       
    21         self.BusId = bus_id
       
    22 
       
    23     def GetBusId(self):
       
    24         return self.BusId
       
    25 
       
    26     def IsClosing(self):
       
    27         return self.Closing
       
    28     
       
    29     def OnAddSDOServerMenu(self, event):
       
    30         self.Manager.AddSDOServerToCurrent()
       
    31         self.RefreshBufferState()
       
    32         self.RefreshCurrentIndexList()
       
    33         
       
    34     def OnAddSDOClientMenu(self, event):
       
    35         self.Manager.AddSDOClientToCurrent()
       
    36         self.RefreshBufferState()
       
    37         self.RefreshCurrentIndexList()
       
    38         
       
    39     def OnAddPDOTransmitMenu(self, event):
       
    40         self.Manager.AddPDOTransmitToCurrent()
       
    41         self.RefreshBufferState()
       
    42         self.RefreshCurrentIndexList()
       
    43         
       
    44     def OnAddPDOReceiveMenu(self, event):
       
    45         self.Manager.AddPDOReceiveToCurrent()
       
    46         self.RefreshBufferState()
       
    47         self.RefreshCurrentIndexList()
       
    48         
       
    49     def OnAddMapVariableMenu(self, event):
       
    50         self.AddMapVariable()
       
    51         
       
    52     def OnAddUserTypeMenu(self, event):
       
    53         self.AddUserType()
       
    54     
       
    55     def OnRefreshMenu(self, event):
       
    56         self.RefreshCurrentIndexList()
       
    57         
       
    58     def RefreshCurrentIndexList(self):
       
    59         pass
       
    60     
       
    61     def RefreshStatusBar(self):
       
    62         pass
       
    63     
       
    64     def SetStatusBarText(self, selection, manager):
       
    65         if selection:
       
    66             index, subIndex = selection
       
    67             if manager.IsCurrentEntry(index):
       
    68                 self.Frame.HelpBar.SetStatusText(_("Index: 0x%04X")%index, 0)
       
    69                 self.Frame.HelpBar.SetStatusText(_("Subindex: 0x%02X")%subIndex, 1)
       
    70                 entryinfos = manager.GetEntryInfos(index)
       
    71                 name = entryinfos["name"]
       
    72                 category = _("Optional")
       
    73                 if entryinfos["need"]:
       
    74                     category = _("Mandatory")
       
    75                 struct = "VAR"
       
    76                 number = ""
       
    77                 if entryinfos["struct"] & OD_IdenticalIndexes:
       
    78                     number = _(" possibly defined %d times")%entryinfos["nbmax"]
       
    79                 if entryinfos["struct"] & OD_IdenticalSubindexes:
       
    80                     struct = "REC"
       
    81                 elif entryinfos["struct"] & OD_MultipleSubindexes:
       
    82                     struct = "ARRAY"
       
    83                 text = _("%s: %s entry of struct %s%s.")%(name,category,struct,number)
       
    84                 self.Frame.HelpBar.SetStatusText(text, 2)
       
    85             else:
       
    86                 for i in xrange(3):
       
    87                     self.Frame.HelpBar.SetStatusText("", i)
       
    88         else:
       
    89             for i in xrange(3):
       
    90                 self.Frame.HelpBar.SetStatusText("", i)
       
    91     
       
    92     def RefreshProfileMenu(self):
       
    93         if self.EDITMENU_ID is not None:
       
    94             profile = self.Manager.GetCurrentProfileName()
       
    95             edititem = self.Frame.EditMenu.FindItemById(self.EDITMENU_ID)
       
    96             if edititem:
       
    97                 length = self.Frame.AddMenu.GetMenuItemCount()
       
    98                 for i in xrange(length-6):
       
    99                     additem = self.Frame.AddMenu.FindItemByPosition(6)
       
   100                     self.Frame.AddMenu.Delete(additem.GetId())
       
   101                 if profile not in ("None", "DS-301"):
       
   102                     edititem.SetText(_("%s Profile")%profile)
       
   103                     edititem.Enable(True)
       
   104                     self.Frame.AddMenu.AppendSeparator()
       
   105                     for text, indexes in self.Manager.GetCurrentSpecificMenu():
       
   106                         new_id = wx.NewId()
       
   107                         self.Frame.AddMenu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=text)
       
   108                         self.Frame.Bind(wx.EVT_MENU, self.GetProfileCallBack(text), id=new_id)
       
   109                 else:
       
   110                     edititem.SetText(_("Other Profile"))
       
   111                     edititem.Enable(False)
       
   112         
       
   113 #-------------------------------------------------------------------------------
       
   114 #                            Buffer Functions
       
   115 #-------------------------------------------------------------------------------
       
   116 
       
   117     def RefreshBufferState(self):
       
   118         pass
       
   119 
       
   120     def OnUndoMenu(self, event):
       
   121         self.Manager.LoadCurrentPrevious()
       
   122         self.RefreshCurrentIndexList()
       
   123         self.RefreshBufferState()
       
   124         
       
   125     def OnRedoMenu(self, event):
       
   126         self.Manager.LoadCurrentNext()
       
   127         self.RefreshCurrentIndexList()
       
   128         self.RefreshBufferState()
       
   129 
       
   130 #-------------------------------------------------------------------------------
       
   131 #                          Editing Profiles functions
       
   132 #-------------------------------------------------------------------------------
       
   133 
       
   134     def OnCommunicationMenu(self, event):
       
   135         dictionary,current = self.Manager.GetCurrentCommunicationLists()
       
   136         self.EditProfile(_("Edit DS-301 Profile"), dictionary, current)
       
   137     
       
   138     def OnOtherCommunicationMenu(self, event):
       
   139         dictionary,current = self.Manager.GetCurrentDS302Lists()
       
   140         self.EditProfile(_("Edit DS-302 Profile"), dictionary, current)
       
   141     
       
   142     def OnEditProfileMenu(self, event):
       
   143         title = _("Edit %s Profile") % self.Manager.GetCurrentProfileName()
       
   144         dictionary,current = self.Manager.GetCurrentProfileLists()
       
   145         self.EditProfile(title, dictionary, current)
       
   146     
       
   147     def EditProfile(self, title, dictionary, current):
       
   148         dialog = CommunicationDialog(self.Frame)
       
   149         dialog.SetTitle(title)
       
   150         dialog.SetIndexDictionary(dictionary)
       
   151         dialog.SetCurrentList(current)
       
   152         dialog.RefreshLists()
       
   153         if dialog.ShowModal() == wx.ID_OK:
       
   154             new_profile = dialog.GetCurrentList()
       
   155             addinglist = []
       
   156             removinglist = []
       
   157             for index in new_profile:
       
   158                 if index not in current:
       
   159                     addinglist.append(index)
       
   160             for index in current:
       
   161                 if index not in new_profile:
       
   162                     removinglist.append(index)
       
   163             self.Manager.ManageEntriesOfCurrent(addinglist, removinglist)
       
   164             self.Manager.BufferCurrentNode()
       
   165             self.RefreshBufferState()
       
   166             
       
   167         dialog.Destroy()
       
   168 
       
   169     def GetProfileCallBack(self, text):
       
   170         def ProfileCallBack(event):
       
   171             self.Manager.AddSpecificEntryToCurrent(text)
       
   172             self.RefreshBufferState()
       
   173             self.RefreshCurrentIndexList()
       
   174         return ProfileCallBack
       
   175 
       
   176 #-------------------------------------------------------------------------------
       
   177 #                         Edit Node informations function
       
   178 #-------------------------------------------------------------------------------
       
   179 
       
   180     def OnNodeInfosMenu(self, event):
       
   181         dialog = NodeInfosDialog(self.Frame)
       
   182         name, id, type, description = self.Manager.GetCurrentNodeInfos()
       
   183         defaultstringsize = self.Manager.GetCurrentNodeDefaultStringSize()
       
   184         dialog.SetValues(name, id, type, description, defaultstringsize)
       
   185         if dialog.ShowModal() == wx.ID_OK:
       
   186             name, id, type, description, defaultstringsize = dialog.GetValues()
       
   187             self.Manager.SetCurrentNodeInfos(name, id, type, description)
       
   188             self.Manager.SetCurrentNodeDefaultStringSize(defaultstringsize)
       
   189             self.RefreshBufferState()
       
   190             self.RefreshCurrentIndexList()
       
   191             self.RefreshProfileMenu()
       
   192 
       
   193 #-------------------------------------------------------------------------------
       
   194 #                           Add User Types and Variables
       
   195 #-------------------------------------------------------------------------------
       
   196         
       
   197     def AddMapVariable(self):
       
   198         index = self.Manager.GetCurrentNextMapIndex()
       
   199         if index:
       
   200             dialog = MapVariableDialog(self.Frame)
       
   201             dialog.SetIndex(index)
       
   202             if dialog.ShowModal() == wx.ID_OK:
       
   203                 result = self.Manager.AddMapVariableToCurrent(*dialog.GetValues())
       
   204                 if not isinstance(result, (StringType, UnicodeType)):
       
   205                     self.RefreshBufferState()
       
   206                     self.RefreshCurrentIndexList()
       
   207                 else:
       
   208                     self.ShowErrorMessage(result)
       
   209             dialog.Destroy()
       
   210         else:
       
   211             self.ShowErrorMessage(_("No map variable index left!"))
       
   212         
       
   213     def AddUserType(self):
       
   214         dialog = UserTypeDialog(self)
       
   215         dialog.SetTypeList(self.Manager.GetCustomisableTypes())
       
   216         if dialog.ShowModal() == wx.ID_OK:
       
   217             result = self.Manager.AddUserTypeToCurrent(*dialog.GetValues())
       
   218             if not isinstance(result, (StringType, UnicodeType)):
       
   219                 self.RefreshBufferState()
       
   220                 self.RefreshCurrentIndexList()
       
   221             else:
       
   222                 self.ShowErrorMessage(result)
       
   223         dialog.Destroy()
       
   224 
       
   225     def ShowErrorMessage(self, message):
       
   226         message = wx.MessageDialog(self.Frame, message, _("Error"), wx.OK|wx.ICON_ERROR)
       
   227         message.ShowModal()
       
   228         message.Destroy()