--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/objdictgen/nodeeditor.py Thu Feb 09 20:39:46 2012 +0100
@@ -0,0 +1,226 @@
+import wx
+
+from node import OD_Subindex, OD_MultipleSubindexes, OD_IdenticalSubindexes, OD_IdenticalIndexes
+from commondialogs import *
+
+class NodeEditorTemplate:
+
+ EDITMENU_ID = None
+
+ def __init__(self, manager, frame, mode_solo):
+ self.Manager = manager
+ self.Frame = frame
+ self.ModeSolo = mode_solo
+
+ self.BusId = None
+ self.Closing = False
+
+ def SetBusId(self, bus_id):
+ self.BusId = bus_id
+
+ def GetBusId(self):
+ return self.BusId
+
+ def IsClosing(self):
+ return self.Closing
+
+ def OnAddSDOServerMenu(self, event):
+ self.Manager.AddSDOServerToCurrent()
+ self.RefreshBufferState()
+ self.RefreshCurrentIndexList()
+
+ def OnAddSDOClientMenu(self, event):
+ self.Manager.AddSDOClientToCurrent()
+ self.RefreshBufferState()
+ self.RefreshCurrentIndexList()
+
+ def OnAddPDOTransmitMenu(self, event):
+ self.Manager.AddPDOTransmitToCurrent()
+ self.RefreshBufferState()
+ self.RefreshCurrentIndexList()
+
+ def OnAddPDOReceiveMenu(self, event):
+ self.Manager.AddPDOReceiveToCurrent()
+ self.RefreshBufferState()
+ self.RefreshCurrentIndexList()
+
+ def OnAddMapVariableMenu(self, event):
+ self.AddMapVariable()
+
+ def OnAddUserTypeMenu(self, event):
+ self.AddUserType()
+
+ def OnRefreshMenu(self, event):
+ self.RefreshCurrentIndexList()
+
+ def RefreshCurrentIndexList(self):
+ pass
+
+ def RefreshStatusBar(self):
+ pass
+
+ def SetStatusBarText(self, selection, manager):
+ if selection:
+ index, subIndex = selection
+ if manager.IsCurrentEntry(index):
+ self.Frame.HelpBar.SetStatusText(_("Index: 0x%04X")%index, 0)
+ self.Frame.HelpBar.SetStatusText(_("Subindex: 0x%02X")%subIndex, 1)
+ entryinfos = manager.GetEntryInfos(index)
+ name = entryinfos["name"]
+ category = _("Optional")
+ if entryinfos["need"]:
+ category = _("Mandatory")
+ struct = "VAR"
+ number = ""
+ if entryinfos["struct"] & OD_IdenticalIndexes:
+ number = _(" possibly defined %d times")%entryinfos["nbmax"]
+ if entryinfos["struct"] & OD_IdenticalSubindexes:
+ struct = "REC"
+ elif entryinfos["struct"] & OD_MultipleSubindexes:
+ struct = "ARRAY"
+ text = _("%s: %s entry of struct %s%s.")%(name,category,struct,number)
+ self.Frame.HelpBar.SetStatusText(text, 2)
+ else:
+ for i in xrange(3):
+ self.Frame.HelpBar.SetStatusText("", i)
+ else:
+ for i in xrange(3):
+ self.Frame.HelpBar.SetStatusText("", i)
+
+ def RefreshProfileMenu(self):
+ if self.EDITMENU_ID is not None:
+ profile = self.Manager.GetCurrentProfileName()
+ edititem = self.Frame.EditMenu.FindItemById(self.EDITMENU_ID)
+ if edititem:
+ length = self.Frame.AddMenu.GetMenuItemCount()
+ for i in xrange(length-6):
+ additem = self.Frame.AddMenu.FindItemByPosition(6)
+ self.Frame.AddMenu.Delete(additem.GetId())
+ if profile not in ("None", "DS-301"):
+ edititem.SetText(_("%s Profile")%profile)
+ edititem.Enable(True)
+ self.Frame.AddMenu.AppendSeparator()
+ for text, indexes in self.Manager.GetCurrentSpecificMenu():
+ new_id = wx.NewId()
+ self.Frame.AddMenu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=text)
+ self.Frame.Bind(wx.EVT_MENU, self.GetProfileCallBack(text), id=new_id)
+ else:
+ edititem.SetText(_("Other Profile"))
+ edititem.Enable(False)
+
+#-------------------------------------------------------------------------------
+# Buffer Functions
+#-------------------------------------------------------------------------------
+
+ def RefreshBufferState(self):
+ pass
+
+ def OnUndoMenu(self, event):
+ self.Manager.LoadCurrentPrevious()
+ self.RefreshCurrentIndexList()
+ self.RefreshBufferState()
+
+ def OnRedoMenu(self, event):
+ self.Manager.LoadCurrentNext()
+ self.RefreshCurrentIndexList()
+ self.RefreshBufferState()
+
+#-------------------------------------------------------------------------------
+# Editing Profiles functions
+#-------------------------------------------------------------------------------
+
+ def OnCommunicationMenu(self, event):
+ dictionary,current = self.Manager.GetCurrentCommunicationLists()
+ self.EditProfile(_("Edit DS-301 Profile"), dictionary, current)
+
+ def OnOtherCommunicationMenu(self, event):
+ dictionary,current = self.Manager.GetCurrentDS302Lists()
+ self.EditProfile(_("Edit DS-302 Profile"), dictionary, current)
+
+ def OnEditProfileMenu(self, event):
+ title = _("Edit %s Profile") % self.Manager.GetCurrentProfileName()
+ dictionary,current = self.Manager.GetCurrentProfileLists()
+ self.EditProfile(title, dictionary, current)
+
+ def EditProfile(self, title, dictionary, current):
+ dialog = CommunicationDialog(self.Frame)
+ dialog.SetTitle(title)
+ dialog.SetIndexDictionary(dictionary)
+ dialog.SetCurrentList(current)
+ dialog.RefreshLists()
+ if dialog.ShowModal() == wx.ID_OK:
+ new_profile = dialog.GetCurrentList()
+ addinglist = []
+ removinglist = []
+ for index in new_profile:
+ if index not in current:
+ addinglist.append(index)
+ for index in current:
+ if index not in new_profile:
+ removinglist.append(index)
+ self.Manager.ManageEntriesOfCurrent(addinglist, removinglist)
+ self.Manager.BufferCurrentNode()
+ self.RefreshBufferState()
+
+ dialog.Destroy()
+
+ def GetProfileCallBack(self, text):
+ def ProfileCallBack(event):
+ self.Manager.AddSpecificEntryToCurrent(text)
+ self.RefreshBufferState()
+ self.RefreshCurrentIndexList()
+ return ProfileCallBack
+
+#-------------------------------------------------------------------------------
+# Edit Node informations function
+#-------------------------------------------------------------------------------
+
+ def OnNodeInfosMenu(self, event):
+ dialog = NodeInfosDialog(self.Frame)
+ name, id, type, description = self.Manager.GetCurrentNodeInfos()
+ defaultstringsize = self.Manager.GetCurrentNodeDefaultStringSize()
+ dialog.SetValues(name, id, type, description, defaultstringsize)
+ if dialog.ShowModal() == wx.ID_OK:
+ name, id, type, description, defaultstringsize = dialog.GetValues()
+ self.Manager.SetCurrentNodeInfos(name, id, type, description)
+ self.Manager.SetCurrentNodeDefaultStringSize(defaultstringsize)
+ self.RefreshBufferState()
+ self.RefreshCurrentIndexList()
+ self.RefreshProfileMenu()
+
+#-------------------------------------------------------------------------------
+# Add User Types and Variables
+#-------------------------------------------------------------------------------
+
+ def AddMapVariable(self):
+ index = self.Manager.GetCurrentNextMapIndex()
+ if index:
+ dialog = MapVariableDialog(self.Frame)
+ dialog.SetIndex(index)
+ if dialog.ShowModal() == wx.ID_OK:
+ result = self.Manager.AddMapVariableToCurrent(*dialog.GetValues())
+ if not isinstance(result, (StringType, UnicodeType)):
+ self.RefreshBufferState()
+ self.RefreshCurrentIndexList()
+ else:
+ self.ShowErrorMessage(result)
+ dialog.Destroy()
+ else:
+ self.ShowErrorMessage(_("No map variable index left!"))
+
+ def AddUserType(self):
+ dialog = UserTypeDialog(self)
+ dialog.SetTypeList(self.Manager.GetCustomisableTypes())
+ if dialog.ShowModal() == wx.ID_OK:
+ result = self.Manager.AddUserTypeToCurrent(*dialog.GetValues())
+ if not isinstance(result, (StringType, UnicodeType)):
+ self.RefreshBufferState()
+ self.RefreshCurrentIndexList()
+ else:
+ self.ShowErrorMessage(result)
+ dialog.Destroy()
+
+ def ShowErrorMessage(self, message):
+ message = wx.MessageDialog(self.Frame, message, _("Error"), wx.OK|wx.ICON_ERROR)
+ message.ShowModal()
+ message.Destroy()