|
1 #!/usr/bin/env python |
|
2 # -*- coding: utf-8 -*- |
|
3 |
|
4 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor |
|
5 #based on the plcopen standard. |
|
6 # |
|
7 #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD |
|
8 # |
|
9 #See COPYING file for copyrights details. |
|
10 # |
|
11 #This library is free software; you can redistribute it and/or |
|
12 #modify it under the terms of the GNU General Public |
|
13 #License as published by the Free Software Foundation; either |
|
14 #version 2.1 of the License, or (at your option) any later version. |
|
15 # |
|
16 #This library is distributed in the hope that it will be useful, |
|
17 #but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
18 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
19 #General Public License for more details. |
|
20 # |
|
21 #You should have received a copy of the GNU General Public |
|
22 #License along with this library; if not, write to the Free Software |
|
23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
24 |
|
25 import wx |
|
26 import wx.grid |
|
27 import wx.gizmos |
|
28 from plcopen.structures import GetDataTypeRange, IEC_KEYWORDS |
|
29 |
|
30 if wx.VERSION >= (2, 8, 0): |
|
31 import wx.aui |
|
32 |
|
33 class MDIDataTypeEditor(wx.aui.AuiMDIChildFrame): |
|
34 def __init__(self, parent, tagname, window, controler): |
|
35 wx.aui.AuiMDIChildFrame.__init__(self, parent, -1, title = "") |
|
36 |
|
37 sizer = wx.BoxSizer(wx.HORIZONTAL) |
|
38 |
|
39 self.Viewer = DataTypeEditor(self, tagname, window, controler) |
|
40 |
|
41 sizer.AddWindow(self.Viewer, 1, border=0, flag=wx.GROW) |
|
42 |
|
43 self.SetSizer(sizer) |
|
44 |
|
45 def GetViewer(self): |
|
46 return self.Viewer |
|
47 |
|
48 #------------------------------------------------------------------------------- |
|
49 # Configuration Editor class |
|
50 #------------------------------------------------------------------------------- |
|
51 |
|
52 [ID_DATATYPEEDITOR, ID_DATATYPEEDITORSTATICBOX, |
|
53 ID_DATATYPEEDITORDERIVATIONTYPE, ID_DATATYPEEDITORDIRECTLYPANEL, |
|
54 ID_DATATYPEEDITORSUBRANGEPANEL, ID_DATATYPEEDITORDIRECTLYBASETYPE, |
|
55 ID_DATATYPEEDITORSUBRANGEBASETYPE, ID_DATATYPEEDITORSUBRANGEMINIMUM, |
|
56 ID_DATATYPEEDITORSUBRANGEMAXIMUM, ID_DATATYPEEDITORDIRECTLYINITIALVALUE, |
|
57 ID_DATATYPEEDITORSUBRANGEINITIALVALUE, ID_DATATYPEEDITORENUMERATEDPANEL, |
|
58 ID_DATATYPEEDITORENUMERATEDVALUES, ID_DATATYPEEDITORENUMERATEDINITIALVALUE, |
|
59 ID_DATATYPEEDITORARRAYPANEL, ID_DATATYPEEDITORARRAYBASETYPE, |
|
60 ID_DATATYPEEDITORARRAYDIMENSIONS, ID_DATATYPEEDITORARRAYINITIALVALUE, |
|
61 ID_DATATYPEEDITORSTATICTEXT1, ID_DATATYPEEDITORSTATICTEXT2, |
|
62 ID_DATATYPEEDITORSTATICTEXT3, ID_DATATYPEEDITORSTATICTEXT4, |
|
63 ID_DATATYPEEDITORSTATICTEXT5, ID_DATATYPEEDITORSTATICTEXT6, |
|
64 ID_DATATYPEEDITORSTATICTEXT7, ID_DATATYPEEDITORSTATICTEXT8, |
|
65 ID_DATATYPEEDITORSTATICTEXT9, ID_DATATYPEEDITORSTATICTEXT10, |
|
66 ] = [wx.NewId() for _init_ctrls in range(28)] |
|
67 |
|
68 class DataTypeEditor(wx.Panel): |
|
69 |
|
70 def _init_coll_MainSizer_Items(self, parent): |
|
71 parent.AddSizer(self.TopSizer, 0, border=5, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT) |
|
72 parent.AddSizer(self.TypeInfosSizer, 0, border=5, flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT) |
|
73 |
|
74 def _init_coll_MainSizer_Growables(self, parent): |
|
75 parent.AddGrowableCol(0) |
|
76 parent.AddGrowableRow(1) |
|
77 |
|
78 def _init_coll_TopSizer_Items(self, parent): |
|
79 parent.AddWindow(self.staticText1, 0, border=5, flag=wx.GROW|wx.LEFT) |
|
80 parent.AddWindow(self.DerivationType, 0, border=0, flag=wx.GROW) |
|
81 |
|
82 def _init_coll_TypeInfosSizer_Items(self, parent): |
|
83 parent.AddWindow(self.DirectlyPanel, 1, border=0, flag=wx.ALL) |
|
84 parent.AddWindow(self.SubrangePanel, 1, border=0, flag=wx.ALL) |
|
85 parent.AddWindow(self.EnumeratedPanel, 1, border=0, flag=wx.GROW|wx.ALL) |
|
86 parent.AddWindow(self.ArrayPanel, 1, border=0, flag=wx.ALL) |
|
87 |
|
88 def _init_coll_DirectlyPanelSizer_Items(self, parent): |
|
89 parent.AddWindow(self.staticText2, 1, border=5, flag=wx.GROW|wx.ALL) |
|
90 parent.AddWindow(self.DirectlyBaseType, 1, border=5, flag=wx.GROW|wx.ALL) |
|
91 parent.AddWindow(self.staticText3, 1, border=5, flag=wx.GROW|wx.ALL) |
|
92 parent.AddWindow(self.DirectlyInitialValue, 1, border=5, flag=wx.GROW|wx.ALL) |
|
93 |
|
94 def _init_coll_SubrangePanelSizer_Items(self, parent): |
|
95 parent.AddWindow(self.staticText4, 1, border=5, flag=wx.GROW|wx.ALL) |
|
96 parent.AddWindow(self.SubrangeBaseType, 1, border=5, flag=wx.GROW|wx.ALL) |
|
97 parent.AddWindow(self.staticText5, 1, border=5, flag=wx.GROW|wx.ALL) |
|
98 parent.AddWindow(self.SubrangeInitialValue, 1, border=5, flag=wx.GROW|wx.ALL) |
|
99 parent.AddWindow(self.staticText6, 1, border=5, flag=wx.GROW|wx.ALL) |
|
100 parent.AddWindow(self.SubrangeMinimum, 1, border=5, flag=wx.GROW|wx.ALL) |
|
101 parent.AddWindow(wx.Size(0, 0), 1, border=5, flag=wx.GROW|wx.ALL) |
|
102 parent.AddWindow(wx.Size(0, 0), 1, border=5, flag=wx.GROW|wx.ALL) |
|
103 parent.AddWindow(self.staticText7, 1, border=5, flag=wx.GROW|wx.ALL) |
|
104 parent.AddWindow(self.SubrangeMaximum, 1, border=5, flag=wx.GROW|wx.ALL) |
|
105 |
|
106 def _init_coll_EnumeratedPanelSizer_Items(self, parent): |
|
107 parent.AddWindow(self.EnumeratedValues, 2, border=5, flag=wx.GROW|wx.ALL) |
|
108 parent.AddWindow(self.staticText8, 1, border=5, flag=wx.GROW|wx.ALL) |
|
109 parent.AddWindow(self.EnumeratedInitialValue, 1, border=5, flag=wx.ALL) |
|
110 |
|
111 def _init_coll_ArrayPanelSizer_Items(self, parent): |
|
112 parent.AddSizer(self.ArrayPanelLeftSizer, 0, border=0, flag=wx.GROW) |
|
113 parent.AddSizer(self.ArrayPanelRightSizer, 0, border=0, flag=wx.GROW) |
|
114 parent.AddWindow(self.ArrayDimensions, 0, border=5, flag=wx.GROW|wx.ALL) |
|
115 |
|
116 def _init_coll_ArrayPanelSizer_Growables(self, parent): |
|
117 parent.AddGrowableCol(0) |
|
118 parent.AddGrowableCol(1) |
|
119 parent.AddGrowableRow(1) |
|
120 |
|
121 def _init_coll_ArrayPanelLeftSizer_Items(self, parent): |
|
122 parent.AddWindow(self.staticText9, 1, border=5, flag=wx.GROW|wx.ALL) |
|
123 parent.AddWindow(self.ArrayBaseType, 1, border=5, flag=wx.GROW|wx.ALL) |
|
124 |
|
125 def _init_coll_ArrayPanelRightSizer_Items(self, parent): |
|
126 parent.AddWindow(self.staticText10, 1, border=5, flag=wx.GROW|wx.ALL) |
|
127 parent.AddWindow(self.ArrayInitialValue, 1, border=5, flag=wx.GROW|wx.ALL) |
|
128 |
|
129 def _init_sizers(self): |
|
130 self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) |
|
131 self.TopSizer = wx.BoxSizer(wx.HORIZONTAL) |
|
132 self.TypeInfosSizer = wx.StaticBoxSizer(self.staticbox, wx.HORIZONTAL) |
|
133 self.DirectlyPanelSizer = wx.BoxSizer(wx.HORIZONTAL) |
|
134 self.SubrangePanelSizer = wx.GridSizer(cols=4, hgap=0, rows=3, vgap=0) |
|
135 self.EnumeratedPanelSizer = wx.BoxSizer(wx.HORIZONTAL) |
|
136 self.ArrayPanelSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=2, vgap=0) |
|
137 self.ArrayPanelLeftSizer = wx.BoxSizer(wx.HORIZONTAL) |
|
138 self.ArrayPanelRightSizer = wx.BoxSizer(wx.HORIZONTAL) |
|
139 |
|
140 self._init_coll_MainSizer_Items(self.MainSizer) |
|
141 self._init_coll_MainSizer_Growables(self.MainSizer) |
|
142 self._init_coll_TopSizer_Items(self.TopSizer) |
|
143 self._init_coll_TypeInfosSizer_Items(self.TypeInfosSizer) |
|
144 self._init_coll_DirectlyPanelSizer_Items(self.DirectlyPanelSizer) |
|
145 self._init_coll_SubrangePanelSizer_Items(self.SubrangePanelSizer) |
|
146 self._init_coll_EnumeratedPanelSizer_Items(self.EnumeratedPanelSizer) |
|
147 self._init_coll_ArrayPanelSizer_Items(self.ArrayPanelSizer) |
|
148 self._init_coll_ArrayPanelSizer_Growables(self.ArrayPanelSizer) |
|
149 self._init_coll_ArrayPanelLeftSizer_Items(self.ArrayPanelLeftSizer) |
|
150 self._init_coll_ArrayPanelRightSizer_Items(self.ArrayPanelRightSizer) |
|
151 |
|
152 self.SetSizer(self.MainSizer) |
|
153 self.DirectlyPanel.SetSizer(self.DirectlyPanelSizer) |
|
154 self.SubrangePanel.SetSizer(self.SubrangePanelSizer) |
|
155 self.EnumeratedPanel.SetSizer(self.EnumeratedPanelSizer) |
|
156 self.ArrayPanel.SetSizer(self.ArrayPanelSizer) |
|
157 |
|
158 def _init_ctrls(self, prnt): |
|
159 wx.Panel.__init__(self, id=ID_DATATYPEEDITOR, name='', parent=prnt, |
|
160 size=wx.Size(0, 0), style=wx.SUNKEN_BORDER) |
|
161 |
|
162 self.staticbox = wx.StaticBox(id=ID_DATATYPEEDITORSTATICBOX, |
|
163 label='Type infos:', name='staticBox1', parent=self, |
|
164 pos=wx.Point(0, 0), size=wx.Size(0, 0), style=0) |
|
165 |
|
166 self.staticText1 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT1, |
|
167 label='Derivation Type:', name='staticText1', parent=self, |
|
168 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
|
169 |
|
170 self.DerivationType = wx.Choice(id=ID_DATATYPEEDITORDERIVATIONTYPE, |
|
171 name='DerivationType', parent=self, pos=wx.Point(0, 0), |
|
172 size=wx.Size(200, 24), style=0) |
|
173 self.Bind(wx.EVT_CHOICE, self.OnDerivationTypeChanged, id=ID_DATATYPEEDITORDERIVATIONTYPE) |
|
174 |
|
175 # Panel for Directly derived data types |
|
176 |
|
177 self.DirectlyPanel = wx.Panel(id=ID_DATATYPEEDITORDIRECTLYPANEL, |
|
178 name='DirectlyPanel', parent=self, pos=wx.Point(0, 0), |
|
179 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
|
180 |
|
181 self.staticText2 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT2, |
|
182 label='Base Type:', name='staticText2', parent=self.DirectlyPanel, |
|
183 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
|
184 |
|
185 self.DirectlyBaseType = wx.Choice(id=ID_DATATYPEEDITORDIRECTLYBASETYPE, |
|
186 name='DirectlyBaseType', parent=self.DirectlyPanel, pos=wx.Point(0, 0), |
|
187 size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL) |
|
188 self.Bind(wx.EVT_CHOICE, self.OnInfosChanged, id=ID_DATATYPEEDITORDIRECTLYBASETYPE) |
|
189 |
|
190 self.staticText3 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT3, |
|
191 label='Initial Value:', name='staticText3', parent=self.DirectlyPanel, |
|
192 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
|
193 |
|
194 self.DirectlyInitialValue = wx.TextCtrl(id=ID_DATATYPEEDITORDIRECTLYINITIALVALUE, |
|
195 name='DirectlyInitialValue', parent=self.DirectlyPanel, pos=wx.Point(0, 0), |
|
196 size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER) |
|
197 self.Bind(wx.EVT_TEXT_ENTER, self.OnInfosChanged, id=ID_DATATYPEEDITORDIRECTLYINITIALVALUE) |
|
198 |
|
199 # Panel for Subrange data types |
|
200 |
|
201 self.SubrangePanel = wx.Panel(id=ID_DATATYPEEDITORSUBRANGEPANEL, |
|
202 name='SubrangePanel', parent=self, pos=wx.Point(0, 0), |
|
203 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
|
204 |
|
205 self.staticText4 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT4, |
|
206 label='Base Type:', name='staticText4', parent=self.SubrangePanel, |
|
207 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
|
208 |
|
209 self.SubrangeBaseType = wx.Choice(id=ID_DATATYPEEDITORSUBRANGEBASETYPE, |
|
210 name='SubrangeBaseType', parent=self.SubrangePanel, pos=wx.Point(0, 0), |
|
211 size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL) |
|
212 self.Bind(wx.EVT_CHOICE, self.OnSubrangeBaseTypeChanged, id=ID_DATATYPEEDITORSUBRANGEBASETYPE) |
|
213 |
|
214 self.staticText5 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT5, |
|
215 label='Initial Value:', name='staticText5', parent=self.SubrangePanel, |
|
216 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
|
217 |
|
218 self.SubrangeInitialValue = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEINITIALVALUE, |
|
219 name='SubrangeInitialValue', parent=self.SubrangePanel, pos=wx.Point(0, 0), |
|
220 size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL) |
|
221 self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, id=ID_DATATYPEEDITORSUBRANGEINITIALVALUE) |
|
222 |
|
223 self.staticText6 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT6, |
|
224 label='Minimum:', name='staticText6', parent=self.SubrangePanel, |
|
225 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
|
226 |
|
227 self.SubrangeMinimum = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEMINIMUM, |
|
228 name='SubrangeMinimum', parent=self.SubrangePanel, pos=wx.Point(0, 0), |
|
229 size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL) |
|
230 self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, id=ID_DATATYPEEDITORSUBRANGEMINIMUM) |
|
231 |
|
232 self.staticText7 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT7, |
|
233 label='Maximum:', name='staticText7', parent=self.SubrangePanel, |
|
234 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
|
235 |
|
236 self.SubrangeMaximum = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEMAXIMUM, |
|
237 name='SubrangeMaximum', parent=self.SubrangePanel, pos=wx.Point(0, 0), |
|
238 size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL) |
|
239 self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, id=ID_DATATYPEEDITORSUBRANGEMAXIMUM) |
|
240 |
|
241 # Panel for Enumerated data types |
|
242 |
|
243 self.EnumeratedPanel = wx.Panel(id=ID_DATATYPEEDITORENUMERATEDPANEL, |
|
244 name='EnumeratedPanel', parent=self, pos=wx.Point(0, 0), |
|
245 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
|
246 |
|
247 self.EnumeratedValues = wx.gizmos.EditableListBox(id=ID_DATATYPEEDITORENUMERATEDVALUES, |
|
248 name='EnumeratedValues', parent=self.EnumeratedPanel, label="Values:", pos=wx.Point(0, 0), |
|
249 size=wx.Size(0, 0), style=wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE) |
|
250 self.EnumeratedValues.GetListCtrl().Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnEnumeratedValueEndEdit) |
|
251 self.EnumeratedValues.GetNewButton().Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged) |
|
252 self.EnumeratedValues.GetDelButton().Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged) |
|
253 self.EnumeratedValues.GetUpButton().Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged) |
|
254 self.EnumeratedValues.GetDownButton().Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged) |
|
255 |
|
256 self.staticText8 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT8, |
|
257 label='Initial Value:', name='staticText8', parent=self.EnumeratedPanel, |
|
258 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
|
259 |
|
260 self.EnumeratedInitialValue = wx.Choice(id=ID_DATATYPEEDITORENUMERATEDINITIALVALUE, |
|
261 name='EnumeratedInitialValue', parent=self.EnumeratedPanel, pos=wx.Point(0, 0), |
|
262 size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER) |
|
263 self.Bind(wx.EVT_CHOICE, self.OnInfosChanged, id=ID_DATATYPEEDITORENUMERATEDINITIALVALUE) |
|
264 |
|
265 # Panel for Array data types |
|
266 |
|
267 self.ArrayPanel = wx.Panel(id=ID_DATATYPEEDITORARRAYPANEL, |
|
268 name='ArrayPanel', parent=self, pos=wx.Point(0, 0), |
|
269 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
|
270 |
|
271 self.staticText9 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT9, |
|
272 label='Base Type:', name='staticText9', parent=self.ArrayPanel, |
|
273 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
|
274 |
|
275 self.ArrayBaseType = wx.Choice(id=ID_DATATYPEEDITORARRAYBASETYPE, |
|
276 name='SubrangeBaseType', parent=self.ArrayPanel, pos=wx.Point(0, 0), |
|
277 size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL) |
|
278 self.Bind(wx.EVT_CHOICE, self.OnInfosChanged, id=ID_DATATYPEEDITORARRAYBASETYPE) |
|
279 |
|
280 self.ArrayDimensions = wx.gizmos.EditableListBox(id=ID_DATATYPEEDITORARRAYDIMENSIONS, |
|
281 name='ArrayDimensions', parent=self.ArrayPanel, label="Dimensions:", pos=wx.Point(0, 0), |
|
282 size=wx.Size(0, 24), style=wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE) |
|
283 self.ArrayDimensions.GetListCtrl().Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnDimensionsChanged) |
|
284 self.ArrayDimensions.GetNewButton().Bind(wx.EVT_BUTTON, self.OnDimensionsChanged) |
|
285 self.ArrayDimensions.GetDelButton().Bind(wx.EVT_BUTTON, self.OnDimensionsChanged) |
|
286 self.ArrayDimensions.GetUpButton().Bind(wx.EVT_BUTTON, self.OnDimensionsChanged) |
|
287 self.ArrayDimensions.GetDownButton().Bind(wx.EVT_BUTTON, self.OnDimensionsChanged) |
|
288 |
|
289 self.staticText10 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT10, |
|
290 label='Initial Value:', name='staticText10', parent=self.ArrayPanel, |
|
291 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
|
292 |
|
293 self.ArrayInitialValue = wx.TextCtrl(id=ID_DATATYPEEDITORARRAYINITIALVALUE, |
|
294 name='ArrayInitialValue', parent=self.ArrayPanel, pos=wx.Point(0, 0), |
|
295 size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER) |
|
296 self.Bind(wx.EVT_TEXT_ENTER, self.OnInfosChanged, id=ID_DATATYPEEDITORARRAYINITIALVALUE) |
|
297 |
|
298 self._init_sizers() |
|
299 |
|
300 def __init__(self, parent, tagname, window, controler): |
|
301 self._init_ctrls(parent) |
|
302 |
|
303 self.DerivationType.Append("Directly") |
|
304 self.DerivationType.Append("Subrange") |
|
305 self.DerivationType.Append("Enumerated") |
|
306 self.DerivationType.Append("Array") |
|
307 self.SubrangePanel.Hide() |
|
308 self.EnumeratedPanel.Hide() |
|
309 self.ArrayPanel.Hide() |
|
310 self.CurrentPanel = "Directly" |
|
311 |
|
312 self.ParentWindow = window |
|
313 self.Controler = controler |
|
314 self.TagName = tagname |
|
315 |
|
316 def OnEnumeratedValueEndEdit(self, event): |
|
317 text = event.GetText() |
|
318 if text.upper() in [string.upper() for string in self.EnumeratedValues.GetStrings()]: |
|
319 message = wx.MessageDialog(self, "\"%s\" value already defined!"%text, "Error", wx.OK|wx.ICON_ERROR) |
|
320 message.ShowModal() |
|
321 message.Destroy() |
|
322 event.Veto() |
|
323 elif text.upper() in IEC_KEYWORDS: |
|
324 message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%text, "Error", wx.OK|wx.ICON_ERROR) |
|
325 message.ShowModal() |
|
326 message.Destroy() |
|
327 else: |
|
328 wx.CallAfter(self.RefreshEnumeratedValues) |
|
329 wx.CallAfter(self.RefreshTypeInfos) |
|
330 event.Skip() |
|
331 |
|
332 def OnEnumeratedValuesChanged(self, event): |
|
333 wx.CallAfter(self.RefreshEnumeratedValues) |
|
334 wx.CallAfter(self.RefreshTypeInfos) |
|
335 event.Skip() |
|
336 |
|
337 def SetTagName(self, tagname): |
|
338 self.TagName = tagname |
|
339 |
|
340 def GetTagName(self): |
|
341 return self.TagName |
|
342 |
|
343 def IsViewing(self, tagname): |
|
344 return self.TagName == tagname |
|
345 |
|
346 def SetMode(self, mode): |
|
347 pass |
|
348 |
|
349 def ResetBuffer(self): |
|
350 pass |
|
351 |
|
352 def RefreshView(self): |
|
353 self.DirectlyBaseType.Clear() |
|
354 self.ArrayBaseType.Clear() |
|
355 for datatype in self.Controler.GetDataTypes(self.TagName): |
|
356 self.DirectlyBaseType.Append(datatype) |
|
357 self.ArrayBaseType.Append(datatype) |
|
358 self.DirectlyBaseType.SetSelection(0) |
|
359 self.SubrangeBaseType.Clear() |
|
360 words = self.TagName.split("::") |
|
361 for base_type in self.Controler.GetSubrangeTypes(): |
|
362 self.SubrangeBaseType.Append(base_type) |
|
363 self.SubrangeBaseType.SetSelection(0) |
|
364 self.RefreshBoundsRange() |
|
365 type_infos = self.Controler.GetDataTypeInfos(self.TagName) |
|
366 if type_infos is not None: |
|
367 self.DerivationType.SetStringSelection(type_infos["type"]) |
|
368 if type_infos["type"] == "Directly": |
|
369 self.DirectlyBaseType.SetStringSelection(type_infos["base_type"]) |
|
370 self.DirectlyInitialValue.SetValue(type_infos["initial"]) |
|
371 elif type_infos["type"] == "Subrange": |
|
372 self.SubrangeBaseType.SetStringSelection(type_infos["base_type"]) |
|
373 self.RefreshBoundsRange() |
|
374 self.SubrangeMinimum.SetValue(type_infos["min"]) |
|
375 self.SubrangeMaximum.SetValue(type_infos["max"]) |
|
376 self.RefreshSubrangeInitialValueRange() |
|
377 if type_infos["initial"] != "": |
|
378 self.SubrangeInitialValue.SetValue(int(type_infos["initial"])) |
|
379 else: |
|
380 self.SubrangeInitialValue.SetValue(type_infos["min"]) |
|
381 elif type_infos["type"] == "Enumerated": |
|
382 self.EnumeratedValues.SetStrings(type_infos["values"]) |
|
383 self.RefreshEnumeratedValues() |
|
384 self.EnumeratedInitialValue.SetStringSelection(type_infos["initial"]) |
|
385 elif type_infos["type"] == "Array": |
|
386 self.ArrayBaseType.SetStringSelection(type_infos["base_type"]) |
|
387 self.ArrayDimensions.SetStrings(type_infos["dimensions"]) |
|
388 self.ArrayInitialValue.SetValue(type_infos["initial"]) |
|
389 self.RefreshDisplayedInfos() |
|
390 |
|
391 def OnDerivationTypeChanged(self, event): |
|
392 self.RefreshDisplayedInfos() |
|
393 self.RefreshTypeInfos() |
|
394 event.Skip() |
|
395 |
|
396 def OnInfosChanged(self, event): |
|
397 self.RefreshTypeInfos() |
|
398 event.Skip() |
|
399 |
|
400 def OnSubrangeBaseTypeChanged(self, event): |
|
401 self.RefreshBoundsRange() |
|
402 self.RefreshTypeInfos() |
|
403 event.Skip() |
|
404 |
|
405 def OnSubrangeMinimumChanged(self, event): |
|
406 wx.CallAfter(self.SubrangeMinimum.SetValue, min(self.SubrangeMaximum.GetValue(), self.SubrangeMinimum.GetValue())) |
|
407 wx.CallAfter(self.RefreshSubrangeInitialValueRange) |
|
408 wx.CallAfter(self.RefreshTypeInfos) |
|
409 event.Skip() |
|
410 |
|
411 def OnSubrangeMaximumChanged(self, event): |
|
412 wx.CallAfter(self.SubrangeMaximum.SetValue, max(self.SubrangeMinimum.GetValue(), self.SubrangeMaximum.GetValue())) |
|
413 wx.CallAfter(self.RefreshSubrangeInitialValueRange) |
|
414 wx.CallAfter(self.RefreshTypeInfos) |
|
415 event.Skip() |
|
416 |
|
417 def OnDimensionsChanged(self, event): |
|
418 wx.CallAfter(self.RefreshTypeInfos) |
|
419 event.Skip() |
|
420 |
|
421 def RefreshDisplayedInfos(self): |
|
422 selected = self.DerivationType.GetStringSelection() |
|
423 if selected != self.CurrentPanel: |
|
424 if self.CurrentPanel == "Directly": |
|
425 self.DirectlyPanel.Hide() |
|
426 elif self.CurrentPanel == "Subrange": |
|
427 self.SubrangePanel.Hide() |
|
428 elif self.CurrentPanel == "Enumerated": |
|
429 self.EnumeratedPanel.Hide() |
|
430 elif self.CurrentPanel == "Array": |
|
431 self.ArrayPanel.Hide() |
|
432 self.CurrentPanel = selected |
|
433 if selected == "Directly": |
|
434 self.DirectlyPanel.Show() |
|
435 elif selected == "Subrange": |
|
436 self.SubrangePanel.Show() |
|
437 elif selected == "Enumerated": |
|
438 self.EnumeratedPanel.Show() |
|
439 elif selected == "Array": |
|
440 self.ArrayPanel.Show() |
|
441 self.MainSizer.Layout() |
|
442 |
|
443 def RefreshEnumeratedValues(self): |
|
444 selected = self.EnumeratedInitialValue.GetStringSelection() |
|
445 self.EnumeratedInitialValue.Clear() |
|
446 self.EnumeratedInitialValue.Append("") |
|
447 for value in self.EnumeratedValues.GetStrings(): |
|
448 self.EnumeratedInitialValue.Append(value) |
|
449 self.EnumeratedInitialValue.SetStringSelection(selected) |
|
450 |
|
451 def RefreshBoundsRange(self): |
|
452 range = GetDataTypeRange(self.SubrangeBaseType.GetStringSelection()) |
|
453 if range is not None: |
|
454 min_value, max_value = range |
|
455 self.SubrangeMinimum.SetRange(min_value, max_value) |
|
456 self.SubrangeMinimum.SetValue(min(max(min_value, self.SubrangeMinimum.GetValue()), max_value)) |
|
457 self.SubrangeMaximum.SetRange(min_value, max_value) |
|
458 self.SubrangeMaximum.SetValue(min(max(min_value, self.SubrangeMaximum.GetValue()), max_value)) |
|
459 |
|
460 def RefreshSubrangeInitialValueRange(self): |
|
461 self.SubrangeInitialValue.SetRange(self.SubrangeMinimum.GetValue(), self.SubrangeMaximum.GetValue()) |
|
462 |
|
463 def RefreshTypeInfos(self): |
|
464 selected = self.DerivationType.GetStringSelection() |
|
465 infos = {"type" : selected} |
|
466 if selected == "Directly": |
|
467 infos["base_type"] = self.DirectlyBaseType.GetStringSelection() |
|
468 infos["initial"] = self.DirectlyInitialValue.GetValue() |
|
469 elif selected == "Subrange": |
|
470 infos["base_type"] = self.SubrangeBaseType.GetStringSelection() |
|
471 infos["min"] = self.SubrangeMinimum.GetValue() |
|
472 infos["max"] = self.SubrangeMaximum.GetValue() |
|
473 initial_value = self.SubrangeInitialValue.GetValue() |
|
474 if initial_value == infos["min"]: |
|
475 infos["initial"] = "" |
|
476 else: |
|
477 infos["initial"] = str(initial_value) |
|
478 elif selected == "Enumerated": |
|
479 infos["values"] = self.EnumeratedValues.GetStrings() |
|
480 infos["initial"] = self.EnumeratedInitialValue.GetStringSelection() |
|
481 elif selected == "Array": |
|
482 infos["base_type"] = self.ArrayBaseType.GetStringSelection() |
|
483 infos["dimensions"] = self.ArrayDimensions.GetStrings() |
|
484 infos["initial"] = self.ArrayInitialValue.GetValue() |
|
485 self.Controler.SetDataTypeInfos(self.TagName, infos) |
|
486 self.ParentWindow.RefreshTitle() |
|
487 self.ParentWindow.RefreshEditMenu() |
|
488 |