objdictgen/objdictedit.py
changeset 715 5795fb789230
parent 614 9b1fe0532d0d
child 778 9edaa9d21cf9
equal deleted inserted replaced
690:1c2cb6088050 715:5795fb789230
    71 loc.AddCatalog(domain)
    71 loc.AddCatalog(domain)
    72 
    72 
    73 if __name__ == '__main__':
    73 if __name__ == '__main__':
    74     __builtin__.__dict__['_'] = wx.GetTranslation
    74     __builtin__.__dict__['_'] = wx.GetTranslation
    75 
    75 
    76 from node import OD_Subindex, OD_MultipleSubindexes, OD_IdenticalSubindexes, OD_IdenticalIndexes
       
    77 
       
    78 from nodemanager import *
    76 from nodemanager import *
       
    77 from nodeeditor import NodeEditorTemplate
    79 from subindextable import *
    78 from subindextable import *
    80 from commondialogs import *
    79 from commondialogs import *
    81 from doc_index.DS301_index import *
    80 from doc_index.DS301_index import *
    82 
    81 
    83 try:
    82 try:
   165 [ID_OBJDICTEDITADDMENUSDOSERVER, ID_OBJDICTEDITADDMENUSDOCLIENT, 
   164 [ID_OBJDICTEDITADDMENUSDOSERVER, ID_OBJDICTEDITADDMENUSDOCLIENT, 
   166  ID_OBJDICTEDITADDMENUPDOTRANSMIT, ID_OBJDICTEDITADDMENUPDORECEIVE, 
   165  ID_OBJDICTEDITADDMENUPDOTRANSMIT, ID_OBJDICTEDITADDMENUPDORECEIVE, 
   167  ID_OBJDICTEDITADDMENUMAPVARIABLE, ID_OBJDICTEDITADDMENUUSERTYPE, 
   166  ID_OBJDICTEDITADDMENUMAPVARIABLE, ID_OBJDICTEDITADDMENUUSERTYPE, 
   168 ] = [wx.NewId() for _init_coll_AddMenu_Items in range(6)]
   167 ] = [wx.NewId() for _init_coll_AddMenu_Items in range(6)]
   169 
   168 
   170 class objdictedit(wx.Frame):
   169 class objdictedit(wx.Frame, NodeEditorTemplate):
       
   170     
       
   171     EDITMENU_ID = ID_OBJDICTEDITEDITMENUOTHERPROFILE
       
   172     
   171     def _init_coll_MenuBar_Menus(self, parent):
   173     def _init_coll_MenuBar_Menus(self, parent):
   172         if self.ModeSolo:
   174         if self.ModeSolo:
   173             parent.Append(menu=self.FileMenu, title=_('File'))
   175             parent.Append(menu=self.FileMenu, title=_('File'))
   174         parent.Append(menu=self.EditMenu, title=_('Edit'))
   176         parent.Append(menu=self.EditMenu, title=_('Edit'))
   175         parent.Append(menu=self.AddMenu, title=_('Add'))
   177         parent.Append(menu=self.AddMenu, title=_('Add'))
   326               parent=self, style=wx.ST_SIZEGRIP)
   328               parent=self, style=wx.ST_SIZEGRIP)
   327         self._init_coll_HelpBar_Fields(self.HelpBar)
   329         self._init_coll_HelpBar_Fields(self.HelpBar)
   328         self.SetStatusBar(self.HelpBar)
   330         self.SetStatusBar(self.HelpBar)
   329 
   331 
   330     def __init__(self, parent, manager = None, filesOpen = []):
   332     def __init__(self, parent, manager = None, filesOpen = []):
   331         self.ModeSolo = manager == None
   333         if manager is None:
       
   334             NodeEditorTemplate.__init__(self, NodeManager(), self, True)
       
   335         else:
       
   336             NodeEditorTemplate.__init__(self, manager, self, False)
   332         self._init_ctrls(parent)
   337         self._init_ctrls(parent)
   333         self.HtmlFrameOpened = []
   338         self.HtmlFrameOpened = []
   334         self.BusId = None
       
   335         self.Closing = False
       
   336         
   339         
   337         icon = wx.Icon(os.path.join(ScriptDirectory,"networkedit.ico"),wx.BITMAP_TYPE_ICO)
   340         icon = wx.Icon(os.path.join(ScriptDirectory,"networkedit.ico"),wx.BITMAP_TYPE_ICO)
   338         self.SetIcon(icon)
   341         self.SetIcon(icon)
   339         
   342         
   340         if self.ModeSolo:
   343         if self.ModeSolo:
   341             self.Manager = NodeManager()
       
   342             for filepath in filesOpen:
   344             for filepath in filesOpen:
   343                 result = self.Manager.OpenFileInCurrent(os.path.abspath(filepath))
   345                 result = self.Manager.OpenFileInCurrent(os.path.abspath(filepath))
   344                 if isinstance(result, (IntType, LongType)):
   346                 if isinstance(result, (IntType, LongType)):
   345                     new_editingpanel = EditingPanel(self.FileOpened, self, self.Manager)
   347                     new_editingpanel = EditingPanel(self.FileOpened, self, self.Manager)
   346                     new_editingpanel.SetIndex(result)
   348                     new_editingpanel.SetIndex(result)
   347                     self.FileOpened.AddPage(new_editingpanel, "")
   349                     self.FileOpened.AddPage(new_editingpanel, "")
   348         else:
   350         else:
   349             self.Manager = manager
       
   350             for index in self.Manager.GetBufferIndexes():
   351             for index in self.Manager.GetBufferIndexes():
   351                 new_editingpanel = EditingPanel(self.FileOpened, self, self.Manager)
   352                 new_editingpanel = EditingPanel(self.FileOpened, self, self.Manager)
   352                 new_editingpanel.SetIndex(index)
   353                 new_editingpanel.SetIndex(index)
   353                 self.FileOpened.AddPage(new_editingpanel, "")
   354                 self.FileOpened.AddPage(new_editingpanel, "")
   354         
   355         
   366         self.RefreshBufferState()
   367         self.RefreshBufferState()
   367         self.RefreshProfileMenu()
   368         self.RefreshProfileMenu()
   368         self.RefreshTitle()
   369         self.RefreshTitle()
   369         self.RefreshMainMenu()
   370         self.RefreshMainMenu()
   370 
   371 
   371     def SetBusId(self, bus_id):
       
   372         self.BusId = bus_id
       
   373 
       
   374     def GetBusId(self):
       
   375         return self.BusId
       
   376 
       
   377     def IsClosing(self):
       
   378         return self.Closing
       
   379 
       
   380     def OnAddSDOServerMenu(self, event):
       
   381         self.Manager.AddSDOServerToCurrent()
       
   382         self.RefreshBufferState()
       
   383         self.RefreshCurrentIndexList()
       
   384         
       
   385     def OnAddSDOClientMenu(self, event):
       
   386         self.Manager.AddSDOClientToCurrent()
       
   387         self.RefreshBufferState()
       
   388         self.RefreshCurrentIndexList()
       
   389         
       
   390     def OnAddPDOTransmitMenu(self, event):
       
   391         self.Manager.AddPDOTransmitToCurrent()
       
   392         self.RefreshBufferState()
       
   393         self.RefreshCurrentIndexList()
       
   394         
       
   395     def OnAddPDOReceiveMenu(self, event):
       
   396         self.Manager.AddPDOReceiveToCurrent()
       
   397         self.RefreshBufferState()
       
   398         self.RefreshCurrentIndexList()
       
   399         
       
   400     def OnAddMapVariableMenu(self, event):
       
   401         self.AddMapVariable()
       
   402         
       
   403     def OnAddUserTypeMenu(self, event):
       
   404         self.AddUserType()
       
   405         
       
   406     def OnFileSelectedChanged(self, event):
   372     def OnFileSelectedChanged(self, event):
   407         if not self.Closing:
   373         if not self.Closing:
   408             selected = event.GetSelection()
   374             selected = event.GetSelection()
   409             # At init selected = -1
   375             # At init selected = -1
   410             if selected >= 0:
   376             if selected >= 0:
   504         if self.FileOpened.GetPageCount() > 0:
   470         if self.FileOpened.GetPageCount() > 0:
   505             self.SetTitle(_("Objdictedit - %s")%self.Manager.GetCurrentFilename())
   471             self.SetTitle(_("Objdictedit - %s")%self.Manager.GetCurrentFilename())
   506         else:
   472         else:
   507             self.SetTitle(_("Objdictedit"))
   473             self.SetTitle(_("Objdictedit"))
   508 
   474 
   509     def OnRefreshMenu(self, event):
       
   510         self.RefreshCurrentIndexList()
       
   511         
       
   512     def RefreshCurrentIndexList(self):
   475     def RefreshCurrentIndexList(self):
   513         selected = self.FileOpened.GetSelection()
   476         selected = self.FileOpened.GetSelection()
   514         window = self.FileOpened.GetPage(selected)
   477         window = self.FileOpened.GetPage(selected)
   515         window.RefreshIndexList()
   478         window.RefreshIndexList()
   516 
   479 
   517     def RefreshStatusBar(self):
   480     def RefreshStatusBar(self):
   518         selected = self.FileOpened.GetSelection()
   481         selected = self.FileOpened.GetSelection()
   519         if selected >= 0:
   482         if selected >= 0:
   520             window = self.FileOpened.GetPage(selected)
   483             window = self.FileOpened.GetPage(selected)
   521             selection = window.GetSelection()
   484             self.SetStatusBarText(window.GetSelection(), self.Manager)
   522             if selection:
       
   523                 index, subIndex = selection
       
   524                 if self.Manager.IsCurrentEntry(index):
       
   525                     self.HelpBar.SetStatusText(_("Index: 0x%04X")%index, 0)
       
   526                     self.HelpBar.SetStatusText(_("Subindex: 0x%02X")%subIndex, 1)
       
   527                     entryinfos = self.Manager.GetEntryInfos(index)
       
   528                     name = entryinfos["name"]
       
   529                     category = _("Optional")
       
   530                     if entryinfos["need"]:
       
   531                         category = _("Mandatory")
       
   532                     struct = "VAR"
       
   533                     number = ""
       
   534                     if entryinfos["struct"] & OD_IdenticalIndexes:
       
   535                         number = _(" possibly defined %d times")%entryinfos["nbmax"]
       
   536                     if entryinfos["struct"] & OD_IdenticalSubindexes:
       
   537                         struct = "REC"
       
   538                     elif entryinfos["struct"] & OD_MultipleSubindexes:
       
   539                         struct = "ARRAY"
       
   540                     text = _("%s: %s entry of struct %s%s.")%(name,category,struct,number)
       
   541                     self.HelpBar.SetStatusText(text, 2)
       
   542                 else:
       
   543                     for i in xrange(3):
       
   544                         self.HelpBar.SetStatusText("", i)
       
   545             else:
       
   546                 for i in xrange(3):
       
   547                     self.HelpBar.SetStatusText("", i)
       
   548 
   485 
   549     def RefreshMainMenu(self):
   486     def RefreshMainMenu(self):
   550         if self.FileOpened.GetPageCount() > 0:
   487         if self.FileOpened.GetPageCount() > 0:
   551             if self.ModeSolo:
   488             if self.ModeSolo:
   552                 self.MenuBar.EnableTop(1, True)
   489                 self.MenuBar.EnableTop(1, True)
   579             self.EditMenu.Enable(wx.ID_REDO, redo)
   516             self.EditMenu.Enable(wx.ID_REDO, redo)
   580         else:
   517         else:
   581             self.EditMenu.Enable(wx.ID_UNDO, False)
   518             self.EditMenu.Enable(wx.ID_UNDO, False)
   582             self.EditMenu.Enable(wx.ID_REDO, False)
   519             self.EditMenu.Enable(wx.ID_REDO, False)
   583 
   520 
   584     def RefreshProfileMenu(self):
       
   585         profile = self.Manager.GetCurrentProfileName()
       
   586         edititem = self.EditMenu.FindItemById(ID_OBJDICTEDITEDITMENUOTHERPROFILE)
       
   587         if edititem:
       
   588             length = self.AddMenu.GetMenuItemCount()
       
   589             for i in xrange(length-6):
       
   590                 additem = self.AddMenu.FindItemByPosition(6)
       
   591                 self.AddMenu.Delete(additem.GetId())
       
   592             if profile not in ("None", "DS-301"):
       
   593                 edititem.SetText(_("%s Profile")%profile)
       
   594                 edititem.Enable(True)
       
   595                 self.AddMenu.AppendSeparator()
       
   596                 for text, indexes in self.Manager.GetCurrentSpecificMenu():
       
   597                     new_id = wx.NewId()
       
   598                     self.AddMenu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=text)
       
   599                     self.Bind(wx.EVT_MENU, self.GetProfileCallBack(text), id=new_id)
       
   600             else:
       
   601                 edititem.SetText(_("Other Profile"))
       
   602                 edititem.Enable(False)
       
   603         
       
   604 
       
   605 #-------------------------------------------------------------------------------
   521 #-------------------------------------------------------------------------------
   606 #                            Buffer Functions
   522 #                            Buffer Functions
   607 #-------------------------------------------------------------------------------
   523 #-------------------------------------------------------------------------------
   608 
   524 
   609     def RefreshBufferState(self):
   525     def RefreshBufferState(self):
   610         fileopened = self.Manager.GetAllFilenames()
   526         fileopened = self.Manager.GetAllFilenames()
   611         for idx, filename in enumerate(fileopened):
   527         for idx, filename in enumerate(fileopened):
   612             self.FileOpened.SetPageText(idx, filename)
   528             self.FileOpened.SetPageText(idx, filename)
   613         self.RefreshEditMenu()
   529         self.RefreshEditMenu()
   614         self.RefreshTitle()
   530         self.RefreshTitle()
   615 
       
   616     def OnUndoMenu(self, event):
       
   617         self.Manager.LoadCurrentPrevious()
       
   618         self.RefreshCurrentIndexList()
       
   619         self.RefreshBufferState()
       
   620         
       
   621     def OnRedoMenu(self, event):
       
   622         self.Manager.LoadCurrentNext()
       
   623         self.RefreshCurrentIndexList()
       
   624         self.RefreshBufferState()
       
   625         
       
   626 
   531 
   627 #-------------------------------------------------------------------------------
   532 #-------------------------------------------------------------------------------
   628 #                         Load and Save Funtions
   533 #                         Load and Save Funtions
   629 #-------------------------------------------------------------------------------
   534 #-------------------------------------------------------------------------------
   630 
   535 
   826                 message = wx.MessageDialog(self, _("\"%s\" is not a valid folder!")%os.path.dirname(filepath), _("Error"), wx.OK|wx.ICON_ERROR)
   731                 message = wx.MessageDialog(self, _("\"%s\" is not a valid folder!")%os.path.dirname(filepath), _("Error"), wx.OK|wx.ICON_ERROR)
   827                 message.ShowModal()
   732                 message.ShowModal()
   828                 message.Destroy()
   733                 message.Destroy()
   829         dialog.Destroy()
   734         dialog.Destroy()
   830 
   735 
   831 #-------------------------------------------------------------------------------
       
   832 #                          Editing Profiles functions
       
   833 #-------------------------------------------------------------------------------
       
   834 
       
   835     def OnCommunicationMenu(self, event):
       
   836         dictionary,current = self.Manager.GetCurrentCommunicationLists()
       
   837         self.EditProfile(_("Edit DS-301 Profile"), dictionary, current)
       
   838     
       
   839     def OnOtherCommunicationMenu(self, event):
       
   840         dictionary,current = self.Manager.GetCurrentDS302Lists()
       
   841         self.EditProfile(_("Edit DS-302 Profile"), dictionary, current)
       
   842     
       
   843     def OnEditProfileMenu(self, event):
       
   844         title = _("Edit %s Profile")%self.Manager.GetCurrentProfileName()
       
   845         dictionary,current = self.Manager.GetCurrentProfileLists()
       
   846         self.EditProfile(title, dictionary, current)
       
   847     
       
   848     def EditProfile(self, title, dictionary, current):
       
   849         dialog = CommunicationDialog(self)
       
   850         dialog.SetTitle(title)
       
   851         dialog.SetIndexDictionary(dictionary)
       
   852         dialog.SetCurrentList(current)
       
   853         dialog.RefreshLists()
       
   854         if dialog.ShowModal() == wx.ID_OK:
       
   855             new_profile = dialog.GetCurrentList()
       
   856             addinglist = []
       
   857             removinglist = []
       
   858             for index in new_profile:
       
   859                 if index not in current:
       
   860                     addinglist.append(index)
       
   861             for index in current:
       
   862                 if index not in new_profile:
       
   863                     removinglist.append(index)
       
   864             self.Manager.ManageEntriesOfCurrent(addinglist, removinglist)
       
   865             self.Manager.BufferCurrentNode()
       
   866             self.RefreshBufferState()
       
   867             self.RefreshCurrentIndexList()
       
   868         dialog.Destroy()
       
   869 
       
   870     def GetProfileCallBack(self, text):
       
   871         def ProfileCallBack(event):
       
   872             self.Manager.AddSpecificEntryToCurrent(text)
       
   873             self.RefreshBufferState()
       
   874             self.RefreshCurrentIndexList()
       
   875         return ProfileCallBack
       
   876 
       
   877 #-------------------------------------------------------------------------------
       
   878 #                         Edit Node informations function
       
   879 #-------------------------------------------------------------------------------
       
   880 
       
   881     def OnNodeInfosMenu(self, event):
       
   882         dialog = NodeInfosDialog(self)
       
   883         name, id, type, description = self.Manager.GetCurrentNodeInfos()
       
   884         defaultstringsize = self.Manager.GetCurrentNodeDefaultStringSize()
       
   885         dialog.SetValues(name, id, type, description, defaultstringsize)
       
   886         if dialog.ShowModal() == wx.ID_OK:
       
   887             name, id, type, description, defaultstringsize = dialog.GetValues()
       
   888             self.Manager.SetCurrentNodeInfos(name, id, type, description)
       
   889             self.Manager.SetCurrentNodeDefaultStringSize(defaultstringsize)
       
   890             self.RefreshBufferState()
       
   891             self.RefreshProfileMenu()
       
   892             selected = self.FileOpened.GetSelection()
       
   893             if selected >= 0:
       
   894                 window = self.FileOpened.GetPage(selected)
       
   895                 window.RefreshTable()
       
   896 
       
   897 
       
   898 #-------------------------------------------------------------------------------
       
   899 #                           Add User Types and Variables
       
   900 #-------------------------------------------------------------------------------
       
   901         
       
   902     def AddMapVariable(self):
       
   903         index = self.Manager.GetCurrentNextMapIndex()
       
   904         if index:
       
   905             dialog = MapVariableDialog(self)
       
   906             dialog.SetIndex(index)
       
   907             if dialog.ShowModal() == wx.ID_OK:
       
   908                 index, name, struct, number = dialog.GetValues()
       
   909                 result = self.Manager.AddMapVariableToCurrent(index, name, struct, number)
       
   910                 if not isinstance(result, (StringType, UnicodeType)):
       
   911                     self.RefreshBufferState()
       
   912                     self.RefreshCurrentIndexList()
       
   913                 else:
       
   914                     message = wx.MessageDialog(self, result, _("Error"), wx.OK|wx.ICON_ERROR)
       
   915                     message.ShowModal()
       
   916                     message.Destroy()
       
   917             dialog.Destroy()
       
   918         else:
       
   919             message = wx.MessageDialog(self, result, _("No map variable index left!"), wx.OK|wx.ICON_ERROR)
       
   920             message.ShowModal()
       
   921             message.Destroy()
       
   922         
       
   923     def AddUserType(self):
       
   924         dialog = UserTypeDialog(self)
       
   925         dialog.SetTypeList(self.Manager.GetCustomisableTypes())
       
   926         if dialog.ShowModal() == wx.ID_OK:
       
   927             type, min, max, length = dialog.GetValues()
       
   928             result = self.Manager.AddUserTypeToCurrent(type, min, max, length)
       
   929             if not result:
       
   930                 self.RefreshBufferState()
       
   931                 self.RefreshCurrentIndexList()
       
   932             else:
       
   933                 message = wx.MessageDialog(self, result, _("Error"), wx.OK|wx.ICON_ERROR)
       
   934                 message.ShowModal()
       
   935                 message.Destroy()
       
   936         dialog.Destroy()
       
   937     
       
   938 
   736 
   939 #-------------------------------------------------------------------------------
   737 #-------------------------------------------------------------------------------
   940 #                               Exception Handler
   738 #                               Exception Handler
   941 #-------------------------------------------------------------------------------
   739 #-------------------------------------------------------------------------------
   942 
   740