1 from types import * |
|
2 |
|
3 import wx |
|
4 |
|
5 from node import OD_Subindex, OD_MultipleSubindexes, OD_IdenticalSubindexes, OD_IdenticalIndexes |
|
6 from commondialogs import * |
|
7 |
|
8 class NodeEditorTemplate: |
|
9 |
|
10 EDITMENU_ID = None |
|
11 |
|
12 def __init__(self, manager, frame, mode_solo): |
|
13 self.Manager = manager |
|
14 self.Frame = frame |
|
15 self.ModeSolo = mode_solo |
|
16 |
|
17 self.BusId = None |
|
18 self.Closing = False |
|
19 |
|
20 def SetBusId(self, bus_id): |
|
21 self.BusId = bus_id |
|
22 |
|
23 def GetBusId(self): |
|
24 return self.BusId |
|
25 |
|
26 def IsClosing(self): |
|
27 return self.Closing |
|
28 |
|
29 def OnAddSDOServerMenu(self, event): |
|
30 self.Manager.AddSDOServerToCurrent() |
|
31 self.RefreshBufferState() |
|
32 self.RefreshCurrentIndexList() |
|
33 |
|
34 def OnAddSDOClientMenu(self, event): |
|
35 self.Manager.AddSDOClientToCurrent() |
|
36 self.RefreshBufferState() |
|
37 self.RefreshCurrentIndexList() |
|
38 |
|
39 def OnAddPDOTransmitMenu(self, event): |
|
40 self.Manager.AddPDOTransmitToCurrent() |
|
41 self.RefreshBufferState() |
|
42 self.RefreshCurrentIndexList() |
|
43 |
|
44 def OnAddPDOReceiveMenu(self, event): |
|
45 self.Manager.AddPDOReceiveToCurrent() |
|
46 self.RefreshBufferState() |
|
47 self.RefreshCurrentIndexList() |
|
48 |
|
49 def OnAddMapVariableMenu(self, event): |
|
50 self.AddMapVariable() |
|
51 |
|
52 def OnAddUserTypeMenu(self, event): |
|
53 self.AddUserType() |
|
54 |
|
55 def OnRefreshMenu(self, event): |
|
56 self.RefreshCurrentIndexList() |
|
57 |
|
58 def RefreshCurrentIndexList(self): |
|
59 pass |
|
60 |
|
61 def RefreshStatusBar(self): |
|
62 pass |
|
63 |
|
64 def SetStatusBarText(self, selection, manager): |
|
65 if selection: |
|
66 index, subIndex = selection |
|
67 if manager.IsCurrentEntry(index): |
|
68 self.Frame.HelpBar.SetStatusText(_("Index: 0x%04X")%index, 0) |
|
69 self.Frame.HelpBar.SetStatusText(_("Subindex: 0x%02X")%subIndex, 1) |
|
70 entryinfos = manager.GetEntryInfos(index) |
|
71 name = entryinfos["name"] |
|
72 category = _("Optional") |
|
73 if entryinfos["need"]: |
|
74 category = _("Mandatory") |
|
75 struct = "VAR" |
|
76 number = "" |
|
77 if entryinfos["struct"] & OD_IdenticalIndexes: |
|
78 number = _(" possibly defined %d times")%entryinfos["nbmax"] |
|
79 if entryinfos["struct"] & OD_IdenticalSubindexes: |
|
80 struct = "REC" |
|
81 elif entryinfos["struct"] & OD_MultipleSubindexes: |
|
82 struct = "ARRAY" |
|
83 text = _("%s: %s entry of struct %s%s.")%(name,category,struct,number) |
|
84 self.Frame.HelpBar.SetStatusText(text, 2) |
|
85 else: |
|
86 for i in xrange(3): |
|
87 self.Frame.HelpBar.SetStatusText("", i) |
|
88 else: |
|
89 for i in xrange(3): |
|
90 self.Frame.HelpBar.SetStatusText("", i) |
|
91 |
|
92 def RefreshProfileMenu(self): |
|
93 if self.EDITMENU_ID is not None: |
|
94 profile = self.Manager.GetCurrentProfileName() |
|
95 edititem = self.Frame.EditMenu.FindItemById(self.EDITMENU_ID) |
|
96 if edititem: |
|
97 length = self.Frame.AddMenu.GetMenuItemCount() |
|
98 for i in xrange(length-6): |
|
99 additem = self.Frame.AddMenu.FindItemByPosition(6) |
|
100 self.Frame.AddMenu.Delete(additem.GetId()) |
|
101 if profile not in ("None", "DS-301"): |
|
102 edititem.SetText(_("%s Profile")%profile) |
|
103 edititem.Enable(True) |
|
104 self.Frame.AddMenu.AppendSeparator() |
|
105 for text, indexes in self.Manager.GetCurrentSpecificMenu(): |
|
106 new_id = wx.NewId() |
|
107 self.Frame.AddMenu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=text) |
|
108 self.Frame.Bind(wx.EVT_MENU, self.GetProfileCallBack(text), id=new_id) |
|
109 else: |
|
110 edititem.SetText(_("Other Profile")) |
|
111 edititem.Enable(False) |
|
112 |
|
113 #------------------------------------------------------------------------------- |
|
114 # Buffer Functions |
|
115 #------------------------------------------------------------------------------- |
|
116 |
|
117 def RefreshBufferState(self): |
|
118 pass |
|
119 |
|
120 def OnUndoMenu(self, event): |
|
121 self.Manager.LoadCurrentPrevious() |
|
122 self.RefreshCurrentIndexList() |
|
123 self.RefreshBufferState() |
|
124 |
|
125 def OnRedoMenu(self, event): |
|
126 self.Manager.LoadCurrentNext() |
|
127 self.RefreshCurrentIndexList() |
|
128 self.RefreshBufferState() |
|
129 |
|
130 #------------------------------------------------------------------------------- |
|
131 # Editing Profiles functions |
|
132 #------------------------------------------------------------------------------- |
|
133 |
|
134 def OnCommunicationMenu(self, event): |
|
135 dictionary,current = self.Manager.GetCurrentCommunicationLists() |
|
136 self.EditProfile(_("Edit DS-301 Profile"), dictionary, current) |
|
137 |
|
138 def OnOtherCommunicationMenu(self, event): |
|
139 dictionary,current = self.Manager.GetCurrentDS302Lists() |
|
140 self.EditProfile(_("Edit DS-302 Profile"), dictionary, current) |
|
141 |
|
142 def OnEditProfileMenu(self, event): |
|
143 title = _("Edit %s Profile") % self.Manager.GetCurrentProfileName() |
|
144 dictionary,current = self.Manager.GetCurrentProfileLists() |
|
145 self.EditProfile(title, dictionary, current) |
|
146 |
|
147 def EditProfile(self, title, dictionary, current): |
|
148 dialog = CommunicationDialog(self.Frame) |
|
149 dialog.SetTitle(title) |
|
150 dialog.SetIndexDictionary(dictionary) |
|
151 dialog.SetCurrentList(current) |
|
152 dialog.RefreshLists() |
|
153 if dialog.ShowModal() == wx.ID_OK: |
|
154 new_profile = dialog.GetCurrentList() |
|
155 addinglist = [] |
|
156 removinglist = [] |
|
157 for index in new_profile: |
|
158 if index not in current: |
|
159 addinglist.append(index) |
|
160 for index in current: |
|
161 if index not in new_profile: |
|
162 removinglist.append(index) |
|
163 self.Manager.ManageEntriesOfCurrent(addinglist, removinglist) |
|
164 self.Manager.BufferCurrentNode() |
|
165 self.RefreshBufferState() |
|
166 |
|
167 dialog.Destroy() |
|
168 |
|
169 def GetProfileCallBack(self, text): |
|
170 def ProfileCallBack(event): |
|
171 self.Manager.AddSpecificEntryToCurrent(text) |
|
172 self.RefreshBufferState() |
|
173 self.RefreshCurrentIndexList() |
|
174 return ProfileCallBack |
|
175 |
|
176 #------------------------------------------------------------------------------- |
|
177 # Edit Node informations function |
|
178 #------------------------------------------------------------------------------- |
|
179 |
|
180 def OnNodeInfosMenu(self, event): |
|
181 dialog = NodeInfosDialog(self.Frame) |
|
182 name, id, type, description = self.Manager.GetCurrentNodeInfos() |
|
183 defaultstringsize = self.Manager.GetCurrentNodeDefaultStringSize() |
|
184 dialog.SetValues(name, id, type, description, defaultstringsize) |
|
185 if dialog.ShowModal() == wx.ID_OK: |
|
186 name, id, type, description, defaultstringsize = dialog.GetValues() |
|
187 self.Manager.SetCurrentNodeInfos(name, id, type, description) |
|
188 self.Manager.SetCurrentNodeDefaultStringSize(defaultstringsize) |
|
189 self.RefreshBufferState() |
|
190 self.RefreshCurrentIndexList() |
|
191 self.RefreshProfileMenu() |
|
192 |
|
193 #------------------------------------------------------------------------------- |
|
194 # Add User Types and Variables |
|
195 #------------------------------------------------------------------------------- |
|
196 |
|
197 def AddMapVariable(self): |
|
198 index = self.Manager.GetCurrentNextMapIndex() |
|
199 if index: |
|
200 dialog = MapVariableDialog(self.Frame) |
|
201 dialog.SetIndex(index) |
|
202 if dialog.ShowModal() == wx.ID_OK: |
|
203 result = self.Manager.AddMapVariableToCurrent(*dialog.GetValues()) |
|
204 if not isinstance(result, (StringType, UnicodeType)): |
|
205 self.RefreshBufferState() |
|
206 self.RefreshCurrentIndexList() |
|
207 else: |
|
208 self.ShowErrorMessage(result) |
|
209 dialog.Destroy() |
|
210 else: |
|
211 self.ShowErrorMessage(_("No map variable index left!")) |
|
212 |
|
213 def AddUserType(self): |
|
214 dialog = UserTypeDialog(self) |
|
215 dialog.SetTypeList(self.Manager.GetCustomisableTypes()) |
|
216 if dialog.ShowModal() == wx.ID_OK: |
|
217 result = self.Manager.AddUserTypeToCurrent(*dialog.GetValues()) |
|
218 if not isinstance(result, (StringType, UnicodeType)): |
|
219 self.RefreshBufferState() |
|
220 self.RefreshCurrentIndexList() |
|
221 else: |
|
222 self.ShowErrorMessage(result) |
|
223 dialog.Destroy() |
|
224 |
|
225 def ShowErrorMessage(self, message): |
|
226 message = wx.MessageDialog(self.Frame, message, _("Error"), wx.OK|wx.ICON_ERROR) |
|
227 message.ShowModal() |
|
228 message.Destroy() |
|