objdictgen/nodeeditor.py
changeset 715 5795fb789230
child 745 0bd84a528133
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/objdictgen/nodeeditor.py	Thu Feb 09 20:37:25 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()