objdictgen/nodemanager.py
changeset 299 506f9700b9fb
parent 268 8a21eb5bdedc
child 327 b904d9a99e28
--- a/objdictgen/nodemanager.py	Tue Oct 02 10:32:11 2007 +0200
+++ b/objdictgen/nodemanager.py	Tue Oct 02 14:06:30 2007 +0200
@@ -265,6 +265,7 @@
             node = load(file)
             file.close()
             self.CurrentNode = node
+            self.CurrentNode.SetNodeID(0)
             # Add a new buffer and defining current state
             index = self.AddNodeBuffer(self.CurrentNode.Copy(), True)
             self.SetCurrentFilePath(filepath)
@@ -297,6 +298,19 @@
         # Verify if it's not forced that the current node is saved before closing it
         if self.UndoBuffers[self.NodeIndex].IsCurrentSaved() or ignore:
             self.RemoveNodeBuffer(self.NodeIndex)
+            if len(self.UndoBuffers) > 0:
+                previousindexes = [idx for idx in self.UndoBuffers.keys() if idx < self.NodeIndex]
+                nextindexes = [idx for idx in self.UndoBuffers.keys() if idx > self.NodeIndex]
+                if len(previousindexes) > 0:
+                    previousindexes.sort()
+                    self.NodeIndex = previousindexes[-1]
+                elif len(nextindexes) > 0:
+                    nextindexes.sort()
+                    self.NodeIndex = nextindexes[0]
+                else:
+                    self.NodeIndex = None
+            else:
+                self.NodeIndex = None
             return True
         return False
 
@@ -374,9 +388,13 @@
         # Informations about entry
         infos = self.GetEntryInfos(index)
         length = self.CurrentNode.GetEntry(index, 0)
+        if "nbmin" in infos:
+            nbmin = infos["nbmin"]
+        else:
+            nbmin = 1
         # Entry is a record, or is an array of manufacturer specific
         if infos["struct"] & OD_IdenticalSubindexes or 0x2000 <= index <= 0x5FFF and infos["struct"] & OD_IdenticalSubindexes:
-            for i in xrange(min(number, length - 1)):
+            for i in xrange(min(number, length - nbmin)):
                 self.RemoveCurrentVariable(index, length - i)
             self.BufferCurrentNode()
 
@@ -463,7 +481,12 @@
                         default = subentry_infos["default"]
                     else:
                         default = self.GetTypeDefaultValue(subentry_infos["type"])
-                    node.AddEntry(index, 1, default)
+                    node.AddEntry(index, value = [])
+                    if "nbmin" in subentry_infos:
+                        for i in xrange(subentry_infos["nbmin"]):
+                            node.AddEntry(index, i + 1, default)
+                    else:
+                        node.AddEntry(index, 1, default)
                 # Second case entry is a record
                 else:
                     i = 1
@@ -493,6 +516,23 @@
 
 
     """
+    Reset an subentry from current node to its default value
+    """
+    def SetCurrentEntryToDefault(self, index, subindex, node = None):
+        disable_buffer = node != None
+        if node == None:
+            node = self.CurrentNode
+        if node.IsEntry(index, subindex):
+            subentry_infos = self.GetSubentryInfos(index, subindex)
+            if "default" in subentry_infos:
+                default = subentry_infos["default"]
+            else:
+                default = self.GetTypeDefaultValue(subentry_infos["type"])
+            node.SetEntry(index, subindex, default)
+            if not disable_buffer:
+                self.BufferCurrentNode()
+
+    """
     Remove an entry from current node. Analize the index to perform the correct
     method
     """
@@ -653,7 +693,9 @@
                         type = node.GetEntry(type)[1]
                     if dic[type] == 0:
                         try:
-                            if value.startswith("0x"):
+                            if value.startswith("$NODEID"):
+                                value = "\"%s\""%value
+                            elif value.startswith("0x"):
                                 value = int(value, 16)
                             else:
                                 value = int(value)
@@ -896,9 +938,9 @@
             return self.CurrentNode.IsEntry(index)
         return False
     
-    def GetCurrentEntry(self, index, subIndex = None):
-        if self.CurrentNode:
-            return self.CurrentNode.GetEntry(index, subIndex)
+    def GetCurrentEntry(self, index, subIndex = None, compute = True):
+        if self.CurrentNode:
+            return self.CurrentNode.GetEntry(index, subIndex, compute)
         return None
     
     def GetCurrentParamsEntry(self, index, subIndex = None):
@@ -947,7 +989,7 @@
             entry_infos = node.GetEntryInfos(index)
             data = []
             editors = []
-            values = node.GetEntry(index)
+            values = node.GetEntry(index, compute = False)
             params = node.GetParamsEntry(index)
             if type(values) == ListType:
                 for i, value in enumerate(values):
@@ -1015,8 +1057,11 @@
                         if result:
                             values = result.groups()
                             if values[0] == "UNSIGNED":
-                                format = "0x%0" + str(int(values[1])/4) + "X"
-                                dic["value"] = format%dic["value"]
+                                try:
+                                    format = "0x%0" + str(int(values[1])/4) + "X"
+                                    dic["value"] = format%dic["value"]
+                                except:
+                                    pass
                                 editor["value"] = "string"
                             if values[0] == "INTEGER":
                                 editor["value"] = "number"