# HG changeset patch # User lbessard # Date 1214473139 -7200 # Node ID 2ad3dedf6c6ae872adc96a907e38b2eb9f934d19 # Parent 305d75028630edce786f475703cb10d88e256f36 Segmentation Fault on closing fixed diff -r 305d75028630 -r 2ad3dedf6c6a objdictgen/networkedit.py --- a/objdictgen/networkedit.py Thu Jun 26 09:24:24 2008 +0200 +++ b/objdictgen/networkedit.py Thu Jun 26 11:38:59 2008 +0200 @@ -290,6 +290,7 @@ self._init_ctrls(parent) self.HtmlFrameOpened = [] self.BusId = None + self.Closing = False icon = wx.Icon(os.path.join(ScriptDirectory,"networkedit.ico"),wx.BITMAP_TYPE_ICO) self.SetIcon(icon) @@ -321,6 +322,9 @@ def GetBusId(self): return self.BusId + def IsClosing(self): + return self.Closing + def GetCurrentNodeId(self): selected = self.NetworkNodes.GetSelection() # At init selected = -1 @@ -331,6 +335,7 @@ return 0 def OnCloseFrame(self, event): + self.Closing = True if not self.ModeSolo and getattr(self, "_onclose", None) != None: self._onclose() event.Skip() @@ -377,13 +382,14 @@ event.Skip() def OnNodeSelectedChanged(self, event): - selected = event.GetSelection() - # At init selected = -1 - if selected >= 0: - window = self.NetworkNodes.GetPage(selected) - self.NodeList.SetCurrentSelected(window.GetIndex()) - wx.CallAfter(self.RefreshMainMenu) - wx.CallAfter(self.RefreshStatusBar) + if not self.Closing: + selected = event.GetSelection() + # At init selected = -1 + if selected >= 0: + window = self.NetworkNodes.GetPage(selected) + self.NodeList.SetCurrentSelected(window.GetIndex()) + wx.CallAfter(self.RefreshMainMenu) + wx.CallAfter(self.RefreshStatusBar) event.Skip() #------------------------------------------------------------------------------- @@ -563,94 +569,91 @@ self.NetworkNodes.AddPage(new_editingpanel, "") def RefreshStatusBar(self): - if self: - selected = self.NetworkNodes.GetSelection() - if self.HelpBar and selected >= 0: - window = self.NetworkNodes.GetPage(selected) - selection = window.GetSelection() - if selection: - index, subIndex = selection - if self.NodeList.IsCurrentEntry(index): - self.HelpBar.SetStatusText("Index: 0x%04X"%index, 0) - self.HelpBar.SetStatusText("Subindex: 0x%02X"%subIndex, 1) - entryinfos = self.NodeList.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.HelpBar.SetStatusText(text, 2) - else: - for i in xrange(3): - self.HelpBar.SetStatusText("", i) + selected = self.NetworkNodes.GetSelection() + if self.HelpBar and selected >= 0: + window = self.NetworkNodes.GetPage(selected) + selection = window.GetSelection() + if selection: + index, subIndex = selection + if self.NodeList.IsCurrentEntry(index): + self.HelpBar.SetStatusText("Index: 0x%04X"%index, 0) + self.HelpBar.SetStatusText("Subindex: 0x%02X"%subIndex, 1) + entryinfos = self.NodeList.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.HelpBar.SetStatusText(text, 2) else: for i in xrange(3): self.HelpBar.SetStatusText("", i) + else: + for i in xrange(3): + self.HelpBar.SetStatusText("", i) def RefreshMainMenu(self): - if self and self.MenuBar: - self.NetworkMenu.Enable(ID_NETWORKEDITNETWORKMENUBUILDMASTER, False) - if self.NodeList == None: - if self.ModeSolo: - self.MenuBar.EnableTop(1, False) + self.NetworkMenu.Enable(ID_NETWORKEDITNETWORKMENUBUILDMASTER, False) + if self.NodeList == None: + if self.ModeSolo: + self.MenuBar.EnableTop(1, False) + self.MenuBar.EnableTop(2, False) + self.MenuBar.EnableTop(3, False) + if self.FileMenu: + self.FileMenu.Enable(wx.ID_CLOSE, False) + self.FileMenu.Enable(wx.ID_SAVE, False) + else: + self.MenuBar.EnableTop(0, False) + self.MenuBar.EnableTop(1, False) + self.MenuBar.EnableTop(2, False) + else: + if self.ModeSolo: + self.MenuBar.EnableTop(1, True) + if self.FileMenu: + self.FileMenu.Enable(wx.ID_CLOSE, True) + self.FileMenu.Enable(wx.ID_SAVE, True) + if self.NetworkNodes.GetSelection() == 0: + self.MenuBar.EnableTop(2, True) + self.MenuBar.EnableTop(3, True) + else: + self.MenuBar.EnableTop(2, False) + self.MenuBar.EnableTop(3, False) + else: + self.MenuBar.EnableTop(0, True) + if self.NetworkNodes.GetSelection() == 0: + self.MenuBar.EnableTop(1, True) + self.MenuBar.EnableTop(2, True) + else: + self.MenuBar.EnableTop(1, False) self.MenuBar.EnableTop(2, False) - self.MenuBar.EnableTop(3, False) - if self.FileMenu: - self.FileMenu.Enable(wx.ID_CLOSE, False) - self.FileMenu.Enable(wx.ID_SAVE, False) - else: - self.MenuBar.EnableTop(0, False) - self.MenuBar.EnableTop(1, False) - self.MenuBar.EnableTop(2, False) - else: - if self.ModeSolo: - self.MenuBar.EnableTop(1, True) - if self.FileMenu: - self.FileMenu.Enable(wx.ID_CLOSE, True) - self.FileMenu.Enable(wx.ID_SAVE, True) - if self.NetworkNodes.GetSelection() == 0: - self.MenuBar.EnableTop(2, True) - self.MenuBar.EnableTop(3, True) - else: - self.MenuBar.EnableTop(2, False) - self.MenuBar.EnableTop(3, False) - else: - self.MenuBar.EnableTop(0, True) - if self.NetworkNodes.GetSelection() == 0: - self.MenuBar.EnableTop(1, True) - self.MenuBar.EnableTop(2, True) - else: - self.MenuBar.EnableTop(1, False) - self.MenuBar.EnableTop(2, False) def RefreshProfileMenu(self): - if self.EditMenu: - profile = self.Manager.GetCurrentProfileName() - edititem = self.EditMenu.FindItemById(ID_NETWORKEDITEDITMENUOTHERPROFILE) - if edititem: - length = self.AddMenu.GetMenuItemCount() - for i in xrange(length-6): - additem = self.AddMenu.FindItemByPosition(6) - self.AddMenu.Delete(additem.GetId()) - if profile not in ("None", "DS-301"): - edititem.SetText("%s Profile"%profile) - edititem.Enable(True) - self.AddMenu.AppendSeparator() - for text, indexes in self.Manager.GetCurrentSpecificMenu(): - new_id = wx.NewId() - self.AddMenu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=text) - self.Bind(wx.EVT_MENU, self.GetProfileCallBack(text), id=new_id) - else: - edititem.SetText("Other Profile") - edititem.Enable(False) + profile = self.Manager.GetCurrentProfileName() + edititem = self.EditMenu.FindItemById(ID_NETWORKEDITEDITMENUOTHERPROFILE) + if edititem: + length = self.AddMenu.GetMenuItemCount() + for i in xrange(length-6): + additem = self.AddMenu.FindItemByPosition(6) + self.AddMenu.Delete(additem.GetId()) + if profile not in ("None", "DS-301"): + edititem.SetText("%s Profile"%profile) + edititem.Enable(True) + self.AddMenu.AppendSeparator() + for text, indexes in self.Manager.GetCurrentSpecificMenu(): + new_id = wx.NewId() + self.AddMenu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=text) + self.Bind(wx.EVT_MENU, self.GetProfileCallBack(text), id=new_id) + else: + edititem.SetText("Other Profile") + edititem.Enable(False) def GetProfileCallBack(self, text): def ProfileCallBack(event): @@ -665,7 +668,7 @@ #------------------------------------------------------------------------------- def RefreshBufferState(self): - if self.NodeList: + if self.NodeList is not None: nodeID = self.Manager.GetCurrentNodeID() if nodeID != None: nodename = "0x%2.2X %s"%(nodeID, self.Manager.GetCurrentNodeName()) diff -r 305d75028630 -r 2ad3dedf6c6a objdictgen/objdictedit.py --- a/objdictgen/objdictedit.py Thu Jun 26 09:24:24 2008 +0200 +++ b/objdictgen/objdictedit.py Thu Jun 26 11:38:59 2008 +0200 @@ -289,6 +289,7 @@ self._init_ctrls(parent) self.HtmlFrameOpened = [] self.BusId = None + self.Closing = False icon = wx.Icon(os.path.join(ScriptDirectory,"networkedit.ico"),wx.BITMAP_TYPE_ICO) self.SetIcon(icon) @@ -308,10 +309,11 @@ new_editingpanel.SetIndex(index) self.FileOpened.AddPage(new_editingpanel, "") - window = self.FileOpened.GetPage(0) - if window: - self.Manager.ChangeCurrentNode(window.GetIndex()) - self.FileOpened.SetSelection(0) + if self.Manager.GetBufferNumber() > 0: + window = self.FileOpened.GetPage(0) + if window: + self.Manager.ChangeCurrentNode(window.GetIndex()) + self.FileOpened.SetSelection(0) if self.Manager.CurrentDS302Defined(): self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUDS302PROFILE, True) @@ -329,6 +331,9 @@ def GetBusId(self): return self.BusId + def IsClosing(self): + return self.Closing + def OnAddSDOServerMenu(self, event): self.Manager.AddSDOServerToCurrent() self.RefreshBufferState() @@ -362,15 +367,16 @@ event.Skip() def OnFileSelectedChanged(self, event): - selected = event.GetSelection() - # At init selected = -1 - if selected >= 0: - window = self.FileOpened.GetPage(selected) - if window: - self.Manager.ChangeCurrentNode(window.GetIndex()) - wx.CallAfter(self.RefreshBufferState) - self.RefreshStatusBar() - self.RefreshProfileMenu() + if not self.Closing: + selected = event.GetSelection() + # At init selected = -1 + if selected >= 0: + window = self.FileOpened.GetPage(selected) + if window: + self.Manager.ChangeCurrentNode(window.GetIndex()) + wx.CallAfter(self.RefreshBufferState) + self.RefreshStatusBar() + self.RefreshProfileMenu() event.Skip() def OnHelpDS301Menu(self, event): @@ -424,6 +430,7 @@ event.Skip() def OnCloseFrame(self, event): + self.Closing = True if not self.ModeSolo: if getattr(self, "_onclose", None) != None: self._onclose() @@ -433,10 +440,7 @@ answer = dialog.ShowModal() dialog.Destroy() if answer == wx.ID_YES: - self.Manager.ChangeCurrentNode(0) - for i in xrange(self.FileOpened.GetPageCount()): - window = self.FileOpened.GetPage(i) - self.Manager.ChangeCurrentNode(window.GetIndex()) + for i in xrange(self.Manager.GetBufferNumber()): if self.Manager.CurrentIsSaved(): self.Manager.CloseCurrent() else: @@ -444,10 +448,9 @@ self.Manager.CloseCurrent(True) event.Skip() elif answer == wx.ID_NO: - for i in xrange(self.FileOpened.GetPageCount()): - self.Manager.CloseCurrent(True) - wx.CallAfter(self.Close) event.Skip() + else: + event.Veto() else: event.Skip() @@ -471,97 +474,91 @@ window.RefreshIndexList() def RefreshStatusBar(self): - if self and self.HelpBar: - selected = self.FileOpened.GetSelection() - if selected >= 0: - window = self.FileOpened.GetPage(selected) - selection = window.GetSelection() - if selection: - index, subIndex = selection - if self.Manager.IsCurrentEntry(index): - self.HelpBar.SetStatusText("Index: 0x%04X"%index, 0) - self.HelpBar.SetStatusText("Subindex: 0x%02X"%subIndex, 1) - entryinfos = self.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.HelpBar.SetStatusText(text, 2) - else: - for i in xrange(3): - self.HelpBar.SetStatusText("", i) + selected = self.FileOpened.GetSelection() + if selected >= 0: + window = self.FileOpened.GetPage(selected) + selection = window.GetSelection() + if selection: + index, subIndex = selection + if self.Manager.IsCurrentEntry(index): + self.HelpBar.SetStatusText("Index: 0x%04X"%index, 0) + self.HelpBar.SetStatusText("Subindex: 0x%02X"%subIndex, 1) + entryinfos = self.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.HelpBar.SetStatusText(text, 2) else: for i in xrange(3): self.HelpBar.SetStatusText("", i) + else: + for i in xrange(3): + self.HelpBar.SetStatusText("", i) def RefreshMainMenu(self): - if self: - if self.FileOpened.GetPageCount() > 0: - if self.ModeSolo: - self.MenuBar.EnableTop(1, True) - self.MenuBar.EnableTop(2, True) - if self.FileMenu: - self.FileMenu.Enable(wx.ID_CLOSE, True) - self.FileMenu.Enable(wx.ID_SAVE, True) - self.FileMenu.Enable(wx.ID_SAVEAS, True) - self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUEXPORTEDS, True) - self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUEXPORTC, True) - else: - self.MenuBar.EnableTop(0, True) - self.MenuBar.EnableTop(1, True) - else: - if self.ModeSolo: - self.MenuBar.EnableTop(1, False) - self.MenuBar.EnableTop(2, False) - if self.FileMenu: - self.FileMenu.Enable(wx.ID_CLOSE, False) - self.FileMenu.Enable(wx.ID_SAVE, False) - self.FileMenu.Enable(wx.ID_SAVEAS, False) - self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUEXPORTEDS, False) - self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUEXPORTC, False) - else: - self.MenuBar.EnableTop(0, False) - self.MenuBar.EnableTop(1, False) + if self.FileOpened.GetPageCount() > 0: + if self.ModeSolo: + self.MenuBar.EnableTop(1, True) + self.MenuBar.EnableTop(2, True) + self.FileMenu.Enable(wx.ID_CLOSE, True) + self.FileMenu.Enable(wx.ID_SAVE, True) + self.FileMenu.Enable(wx.ID_SAVEAS, True) + self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUEXPORTEDS, True) + self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUEXPORTC, True) + else: + self.MenuBar.EnableTop(0, True) + self.MenuBar.EnableTop(1, True) + else: + if self.ModeSolo: + self.MenuBar.EnableTop(1, False) + self.MenuBar.EnableTop(2, False) + self.FileMenu.Enable(wx.ID_CLOSE, False) + self.FileMenu.Enable(wx.ID_SAVE, False) + self.FileMenu.Enable(wx.ID_SAVEAS, False) + self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUEXPORTEDS, False) + self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUEXPORTC, False) + else: + self.MenuBar.EnableTop(0, False) + self.MenuBar.EnableTop(1, False) def RefreshEditMenu(self): - if self.EditMenu: - if self.FileOpened.GetPageCount() > 0: - undo, redo = self.Manager.GetCurrentBufferState() - self.EditMenu.Enable(wx.ID_UNDO, undo) - self.EditMenu.Enable(wx.ID_REDO, redo) - else: - self.EditMenu.Enable(wx.ID_UNDO, False) - self.EditMenu.Enable(wx.ID_REDO, False) + if self.FileOpened.GetPageCount() > 0: + undo, redo = self.Manager.GetCurrentBufferState() + self.EditMenu.Enable(wx.ID_UNDO, undo) + self.EditMenu.Enable(wx.ID_REDO, redo) + else: + self.EditMenu.Enable(wx.ID_UNDO, False) + self.EditMenu.Enable(wx.ID_REDO, False) def RefreshProfileMenu(self): - if self.EditMenu: - profile = self.Manager.GetCurrentProfileName() - edititem = self.EditMenu.FindItemById(ID_OBJDICTEDITEDITMENUOTHERPROFILE) - if edititem: - length = self.AddMenu.GetMenuItemCount() - for i in xrange(length-6): - additem = self.AddMenu.FindItemByPosition(6) - self.AddMenu.Delete(additem.GetId()) - if profile not in ("None", "DS-301"): - edititem.SetText("%s Profile"%profile) - edititem.Enable(True) - self.AddMenu.AppendSeparator() - for text, indexes in self.Manager.GetCurrentSpecificMenu(): - new_id = wx.NewId() - self.AddMenu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=text) - self.Bind(wx.EVT_MENU, self.GetProfileCallBack(text), id=new_id) - else: - edititem.SetText("Other Profile") - edititem.Enable(False) + profile = self.Manager.GetCurrentProfileName() + edititem = self.EditMenu.FindItemById(ID_OBJDICTEDITEDITMENUOTHERPROFILE) + if edititem: + length = self.AddMenu.GetMenuItemCount() + for i in xrange(length-6): + additem = self.AddMenu.FindItemByPosition(6) + self.AddMenu.Delete(additem.GetId()) + if profile not in ("None", "DS-301"): + edititem.SetText("%s Profile"%profile) + edititem.Enable(True) + self.AddMenu.AppendSeparator() + for text, indexes in self.Manager.GetCurrentSpecificMenu(): + new_id = wx.NewId() + self.AddMenu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=text) + self.Bind(wx.EVT_MENU, self.GetProfileCallBack(text), id=new_id) + else: + edititem.SetText("Other Profile") + edititem.Enable(False) #------------------------------------------------------------------------------- @@ -752,7 +749,6 @@ dialog.Destroy() event.Skip() - def OnExportEDSMenu(self, event): dialog = wx.FileDialog(self, "Choose a file", os.getcwd(), self.Manager.GetCurrentNodeInfos()[0], "EDS files (*.eds)|*.eds|All files|*.*", wx.SAVE|wx.OVERWRITE_PROMPT|wx.CHANGE_DIR) if dialog.ShowModal() == wx.ID_OK: diff -r 305d75028630 -r 2ad3dedf6c6a objdictgen/subindextable.py --- a/objdictgen/subindextable.py Thu Jun 26 09:24:24 2008 +0200 +++ b/objdictgen/subindextable.py Thu Jun 26 11:38:59 2008 +0200 @@ -511,17 +511,20 @@ event.Skip() def OnPartListBoxClick(self, event): - self.SubindexGrid.SetGridCursor(0, 0) - self.RefreshIndexList() + if not self.ParentWindow.IsClosing(): + self.SubindexGrid.SetGridCursor(0, 0) + self.RefreshIndexList() event.Skip() def OnIndexListClick(self, event): - self.SubindexGrid.SetGridCursor(0, 0) - self.RefreshTable() + if not self.ParentWindow.IsClosing(): + self.SubindexGrid.SetGridCursor(0, 0) + self.RefreshTable() event.Skip() def OnSubindexGridSelectCell(self, event): - wx.CallAfter(self.ParentWindow.RefreshStatusBar) + if not self.ParentWindow.IsClosing(): + wx.CallAfter(self.ParentWindow.RefreshStatusBar) event.Skip() #-------------------------------------------------------------------------------