33 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD |
33 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD |
34 from controls import CustomEditableListBox, CustomGrid, CustomTable |
34 from controls import CustomEditableListBox, CustomGrid, CustomTable |
35 from dialogs import ArrayTypeDialog |
35 from dialogs import ArrayTypeDialog |
36 from EditorPanel import EditorPanel |
36 from EditorPanel import EditorPanel |
37 from util.BitmapLibrary import GetBitmap |
37 from util.BitmapLibrary import GetBitmap |
38 |
38 from util.TranslationCatalogs import NoTranslate |
39 #------------------------------------------------------------------------------- |
39 |
|
40 # ------------------------------------------------------------------------------- |
40 # Helpers |
41 # Helpers |
41 #------------------------------------------------------------------------------- |
42 # ------------------------------------------------------------------------------- |
42 |
43 |
43 DIMENSION_MODEL = re.compile("([0-9]+)\.\.([0-9]+)$") |
44 DIMENSION_MODEL = re.compile("([0-9]+)\.\.([0-9]+)$") |
|
45 |
44 |
46 |
45 def AppendMenu(parent, help, id, kind, text): |
47 def AppendMenu(parent, help, id, kind, text): |
46 parent.Append(help=help, id=id, kind=kind, text=text) |
48 parent.Append(help=help, id=id, kind=kind, text=text) |
47 |
49 |
|
50 |
48 def GetElementsTableColnames(): |
51 def GetElementsTableColnames(): |
49 _ = lambda x : x |
52 _ = NoTranslate |
50 return ["#", _("Name"), _("Type"), _("Initial Value")] |
53 return ["#", _("Name"), _("Type"), _("Initial Value")] |
51 |
54 |
|
55 |
52 def GetDatatypeTypes(): |
56 def GetDatatypeTypes(): |
53 _ = lambda x : x |
57 _ = NoTranslate |
54 return [_("Directly"), _("Subrange"), _("Enumerated"), _("Array"), _("Structure")] |
58 return [_("Directly"), _("Subrange"), _("Enumerated"), _("Array"), _("Structure")] |
|
59 |
|
60 |
55 DATATYPE_TYPES_DICT = dict([(_(datatype), datatype) for datatype in GetDatatypeTypes()]) |
61 DATATYPE_TYPES_DICT = dict([(_(datatype), datatype) for datatype in GetDatatypeTypes()]) |
56 |
62 |
57 #------------------------------------------------------------------------------- |
63 # ------------------------------------------------------------------------------- |
58 # Structure Elements Table |
64 # Structure Elements Table |
59 #------------------------------------------------------------------------------- |
65 # ------------------------------------------------------------------------------- |
|
66 |
60 |
67 |
61 class ElementsTable(CustomTable): |
68 class ElementsTable(CustomTable): |
62 |
69 |
63 """ |
70 """ |
64 A custom wx.grid.Grid Table using user supplied data |
71 A custom wx.grid.Grid Table using user supplied data |
146 self.MainSizer.AddGrowableCol(0) |
154 self.MainSizer.AddGrowableCol(0) |
147 self.MainSizer.AddGrowableRow(1) |
155 self.MainSizer.AddGrowableRow(1) |
148 |
156 |
149 top_sizer = wx.BoxSizer(wx.HORIZONTAL) |
157 top_sizer = wx.BoxSizer(wx.HORIZONTAL) |
150 self.MainSizer.AddSizer(top_sizer, border=5, |
158 self.MainSizer.AddSizer(top_sizer, border=5, |
151 flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT) |
159 flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT) |
152 |
160 |
153 derivation_type_label = wx.StaticText(self.Editor, label=_('Derivation Type:')) |
161 derivation_type_label = wx.StaticText(self.Editor, label=_('Derivation Type:')) |
154 top_sizer.AddWindow(derivation_type_label, border=5, |
162 top_sizer.AddWindow(derivation_type_label, border=5, |
155 flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT) |
163 flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT) |
156 |
164 |
157 self.DerivationType = wx.ComboBox(self.Editor, |
165 self.DerivationType = wx.ComboBox(self.Editor, |
158 size=wx.Size(200, -1), style=wx.CB_READONLY) |
166 size=wx.Size(200, -1), style=wx.CB_READONLY) |
159 self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, self.DerivationType) |
167 self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, self.DerivationType) |
160 top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW|wx.RIGHT) |
168 top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW | wx.RIGHT) |
161 |
169 |
162 typeinfos_staticbox = wx.StaticBox(self.Editor, label=_('Type infos:')) |
170 typeinfos_staticbox = wx.StaticBox(self.Editor, label=_('Type infos:')) |
163 typeinfos_sizer = wx.StaticBoxSizer(typeinfos_staticbox, wx.HORIZONTAL) |
171 typeinfos_sizer = wx.StaticBoxSizer(typeinfos_staticbox, wx.HORIZONTAL) |
164 self.MainSizer.AddSizer(typeinfos_sizer, border=5, |
172 self.MainSizer.AddSizer(typeinfos_sizer, border=5, |
165 flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT) |
173 flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT) |
166 |
174 |
167 # Panel for Directly derived data types |
175 # Panel for Directly derived data types |
168 |
176 |
169 self.DirectlyPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL) |
177 self.DirectlyPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL) |
170 typeinfos_sizer.AddWindow(self.DirectlyPanel, 1) |
178 typeinfos_sizer.AddWindow(self.DirectlyPanel, 1) |
171 |
179 |
172 directly_panel_sizer = wx.BoxSizer(wx.HORIZONTAL) |
180 directly_panel_sizer = wx.BoxSizer(wx.HORIZONTAL) |
173 |
181 |
174 directly_basetype_label = wx.StaticText(self.DirectlyPanel, |
182 directly_basetype_label = wx.StaticText(self.DirectlyPanel, |
175 label=_('Base Type:')) |
183 label=_('Base Type:')) |
176 directly_panel_sizer.AddWindow(directly_basetype_label, 1, border=5, |
184 directly_panel_sizer.AddWindow(directly_basetype_label, 1, border=5, |
177 flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL) |
185 flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) |
178 |
186 |
179 self.DirectlyBaseType = wx.ComboBox(self.DirectlyPanel, style=wx.CB_READONLY) |
187 self.DirectlyBaseType = wx.ComboBox(self.DirectlyPanel, style=wx.CB_READONLY) |
180 self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.DirectlyBaseType) |
188 self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.DirectlyBaseType) |
181 directly_panel_sizer.AddWindow(self.DirectlyBaseType, 1, border=5, |
189 directly_panel_sizer.AddWindow(self.DirectlyBaseType, 1, border=5, |
182 flag=wx.GROW|wx.ALL) |
190 flag=wx.GROW | wx.ALL) |
183 |
191 |
184 directly_initialvalue_label = wx.StaticText(self.DirectlyPanel, |
192 directly_initialvalue_label = wx.StaticText(self.DirectlyPanel, |
185 label=_('Initial Value:')) |
193 label=_('Initial Value:')) |
186 directly_panel_sizer.AddWindow(directly_initialvalue_label, 1, border=5, |
194 directly_panel_sizer.AddWindow(directly_initialvalue_label, 1, border=5, |
187 flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL) |
195 flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) |
188 |
196 |
189 self.DirectlyInitialValue = wx.TextCtrl(self.DirectlyPanel, |
197 self.DirectlyInitialValue = wx.TextCtrl(self.DirectlyPanel, |
190 style=wx.TE_PROCESS_ENTER|wx.TE_RICH) |
198 style=wx.TE_PROCESS_ENTER | wx.TE_RICH) |
191 self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.DirectlyInitialValue) |
199 self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.DirectlyInitialValue) |
192 directly_panel_sizer.AddWindow(self.DirectlyInitialValue, 1, border=5, |
200 directly_panel_sizer.AddWindow(self.DirectlyInitialValue, 1, border=5, |
193 flag=wx.ALL) |
201 flag=wx.ALL) |
194 |
202 |
195 self.DirectlyPanel.SetSizer(directly_panel_sizer) |
203 self.DirectlyPanel.SetSizer(directly_panel_sizer) |
196 |
204 |
197 # Panel for Subrange data types |
205 # Panel for Subrange data types |
198 |
206 |
200 typeinfos_sizer.AddWindow(self.SubrangePanel, 1) |
208 typeinfos_sizer.AddWindow(self.SubrangePanel, 1) |
201 |
209 |
202 subrange_panel_sizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0) |
210 subrange_panel_sizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0) |
203 |
211 |
204 subrange_basetype_label = wx.StaticText(self.SubrangePanel, |
212 subrange_basetype_label = wx.StaticText(self.SubrangePanel, |
205 label=_('Base Type:')) |
213 label=_('Base Type:')) |
206 subrange_panel_sizer.AddWindow(subrange_basetype_label, 1, border=5, |
214 subrange_panel_sizer.AddWindow(subrange_basetype_label, 1, border=5, |
207 flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL) |
215 flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) |
208 |
216 |
209 self.SubrangeBaseType = wx.ComboBox(self.SubrangePanel, style=wx.CB_READONLY) |
217 self.SubrangeBaseType = wx.ComboBox(self.SubrangePanel, style=wx.CB_READONLY) |
210 self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged, |
218 self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged, |
211 self.SubrangeBaseType) |
219 self.SubrangeBaseType) |
212 subrange_panel_sizer.AddWindow(self.SubrangeBaseType, 1, border=5, |
220 subrange_panel_sizer.AddWindow(self.SubrangeBaseType, 1, border=5, |
213 flag=wx.GROW|wx.ALL) |
221 flag=wx.GROW | wx.ALL) |
214 |
222 |
215 subrange_initialvalue_label = wx.StaticText(self.SubrangePanel, |
223 subrange_initialvalue_label = wx.StaticText(self.SubrangePanel, |
216 label=_('Initial Value:')) |
224 label=_('Initial Value:')) |
217 subrange_panel_sizer.AddWindow(subrange_initialvalue_label, 1, border=5, |
225 subrange_panel_sizer.AddWindow(subrange_initialvalue_label, 1, border=5, |
218 flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL) |
226 flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) |
219 |
227 |
220 self.SubrangeInitialValue = wx.SpinCtrl(self.SubrangePanel, |
228 self.SubrangeInitialValue = wx.SpinCtrl(self.SubrangePanel, |
221 style=wx.TAB_TRAVERSAL) |
229 style=wx.TAB_TRAVERSAL) |
222 self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, self.SubrangeInitialValue) |
230 self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, self.SubrangeInitialValue) |
223 subrange_panel_sizer.AddWindow(self.SubrangeInitialValue, 1, border=5, |
231 subrange_panel_sizer.AddWindow(self.SubrangeInitialValue, 1, border=5, |
224 flag=wx.GROW|wx.ALL) |
232 flag=wx.GROW | wx.ALL) |
225 |
233 |
226 subrange_minimum_label = wx.StaticText(self.SubrangePanel, label=_('Minimum:')) |
234 subrange_minimum_label = wx.StaticText(self.SubrangePanel, label=_('Minimum:')) |
227 subrange_panel_sizer.AddWindow(subrange_minimum_label, 1, border=5, |
235 subrange_panel_sizer.AddWindow(subrange_minimum_label, 1, border=5, |
228 flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL) |
236 flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) |
229 |
237 |
230 self.SubrangeMinimum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL) |
238 self.SubrangeMinimum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL) |
231 self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, self.SubrangeMinimum) |
239 self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, self.SubrangeMinimum) |
232 subrange_panel_sizer.AddWindow(self.SubrangeMinimum, 1, border=5, |
240 subrange_panel_sizer.AddWindow(self.SubrangeMinimum, 1, border=5, |
233 flag=wx.GROW|wx.ALL) |
241 flag=wx.GROW | wx.ALL) |
234 |
242 |
235 for i in xrange(2): |
243 for i in xrange(2): |
236 subrange_panel_sizer.AddWindow(wx.Size(0, 0), 1) |
244 subrange_panel_sizer.AddWindow(wx.Size(0, 0), 1) |
237 |
245 |
238 subrange_maximum_label = wx.StaticText(self.SubrangePanel, |
246 subrange_maximum_label = wx.StaticText(self.SubrangePanel, |
239 label=_('Maximum:')) |
247 label=_('Maximum:')) |
240 subrange_panel_sizer.AddWindow(subrange_maximum_label, 1, border=5, |
248 subrange_panel_sizer.AddWindow(subrange_maximum_label, 1, border=5, |
241 flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL) |
249 flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) |
242 |
250 |
243 self.SubrangeMaximum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL) |
251 self.SubrangeMaximum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL) |
244 self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, self.SubrangeMaximum) |
252 self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, self.SubrangeMaximum) |
245 |
253 |
246 subrange_panel_sizer.AddWindow(self.SubrangeMaximum, 1, border=5, |
254 subrange_panel_sizer.AddWindow(self.SubrangeMaximum, 1, border=5, |
247 flag=wx.GROW|wx.ALL) |
255 flag=wx.GROW | wx.ALL) |
248 |
256 |
249 self.SubrangePanel.SetSizer(subrange_panel_sizer) |
257 self.SubrangePanel.SetSizer(subrange_panel_sizer) |
250 |
258 |
251 # Panel for Enumerated data types |
259 # Panel for Enumerated data types |
252 |
260 |
253 self.EnumeratedPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL) |
261 self.EnumeratedPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL) |
254 typeinfos_sizer.AddWindow(self.EnumeratedPanel, 1) |
262 typeinfos_sizer.AddWindow(self.EnumeratedPanel, 1) |
255 |
263 |
256 enumerated_panel_sizer = wx.BoxSizer(wx.HORIZONTAL) |
264 enumerated_panel_sizer = wx.BoxSizer(wx.HORIZONTAL) |
257 |
265 |
258 self.EnumeratedValues = CustomEditableListBox(self.EnumeratedPanel, |
266 self.EnumeratedValues = CustomEditableListBox( |
259 label=_("Values:"), style=wx.gizmos.EL_ALLOW_NEW| |
267 self.EnumeratedPanel, |
260 wx.gizmos.EL_ALLOW_EDIT| |
268 label=_("Values:"), |
261 wx.gizmos.EL_ALLOW_DELETE) |
269 style=(wx.gizmos.EL_ALLOW_NEW | |
|
270 wx.gizmos.EL_ALLOW_EDIT | |
|
271 wx.gizmos.EL_ALLOW_DELETE)) |
262 setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit) |
272 setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit) |
263 for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]: |
273 for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]: |
264 setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged) |
274 setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged) |
265 enumerated_panel_sizer.AddWindow(self.EnumeratedValues, 1, border=5, |
275 enumerated_panel_sizer.AddWindow(self.EnumeratedValues, 1, border=5, |
266 flag=wx.GROW|wx.ALL) |
276 flag=wx.GROW | wx.ALL) |
267 |
277 |
268 enumerated_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL) |
278 enumerated_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL) |
269 enumerated_panel_sizer.AddSizer(enumerated_panel_rightsizer, 1) |
279 enumerated_panel_sizer.AddSizer(enumerated_panel_rightsizer, 1) |
270 |
280 |
271 enumerated_initialvalue_label = wx.StaticText(self.EnumeratedPanel, |
281 enumerated_initialvalue_label = wx.StaticText(self.EnumeratedPanel, |
272 label=_('Initial Value:')) |
282 label=_('Initial Value:')) |
273 enumerated_panel_rightsizer.AddWindow(enumerated_initialvalue_label, 1, |
283 enumerated_panel_rightsizer.AddWindow(enumerated_initialvalue_label, 1, |
274 border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL) |
284 border=5, |
|
285 flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) |
275 |
286 |
276 self.EnumeratedInitialValue = wx.ComboBox(self.EnumeratedPanel, |
287 self.EnumeratedInitialValue = wx.ComboBox(self.EnumeratedPanel, |
277 style=wx.CB_READONLY) |
288 style=wx.CB_READONLY) |
278 self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.EnumeratedInitialValue) |
289 self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.EnumeratedInitialValue) |
279 enumerated_panel_rightsizer.AddWindow(self.EnumeratedInitialValue, 1, |
290 enumerated_panel_rightsizer.AddWindow(self.EnumeratedInitialValue, 1, |
280 border=5, flag=wx.ALL) |
291 border=5, flag=wx.ALL) |
281 |
292 |
282 self.EnumeratedPanel.SetSizer(enumerated_panel_sizer) |
293 self.EnumeratedPanel.SetSizer(enumerated_panel_sizer) |
283 |
294 |
284 # Panel for Array data types |
295 # Panel for Array data types |
285 |
296 |
294 array_panel_leftSizer = wx.BoxSizer(wx.HORIZONTAL) |
305 array_panel_leftSizer = wx.BoxSizer(wx.HORIZONTAL) |
295 array_panel_sizer.AddSizer(array_panel_leftSizer, flag=wx.GROW) |
306 array_panel_sizer.AddSizer(array_panel_leftSizer, flag=wx.GROW) |
296 |
307 |
297 array_basetype_label = wx.StaticText(self.ArrayPanel, label=_('Base Type:')) |
308 array_basetype_label = wx.StaticText(self.ArrayPanel, label=_('Base Type:')) |
298 array_panel_leftSizer.AddWindow(array_basetype_label, 1, border=5, |
309 array_panel_leftSizer.AddWindow(array_basetype_label, 1, border=5, |
299 flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL) |
310 flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) |
300 |
311 |
301 self.ArrayBaseType = wx.ComboBox(self.ArrayPanel, style=wx.CB_READONLY) |
312 self.ArrayBaseType = wx.ComboBox(self.ArrayPanel, style=wx.CB_READONLY) |
302 self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.ArrayBaseType) |
313 self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.ArrayBaseType) |
303 array_panel_leftSizer.AddWindow(self.ArrayBaseType, 1, border=5, |
314 array_panel_leftSizer.AddWindow(self.ArrayBaseType, 1, border=5, |
304 flag=wx.GROW|wx.ALL) |
315 flag=wx.GROW | wx.ALL) |
305 |
316 |
306 array_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL) |
317 array_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL) |
307 array_panel_sizer.AddSizer(array_panel_rightsizer, flag=wx.GROW) |
318 array_panel_sizer.AddSizer(array_panel_rightsizer, flag=wx.GROW) |
308 |
319 |
309 array_initialvalue_label = wx.StaticText(self.ArrayPanel, |
320 array_initialvalue_label = wx.StaticText(self.ArrayPanel, |
310 label=_('Initial Value:')) |
321 label=_('Initial Value:')) |
311 array_panel_rightsizer.AddWindow(array_initialvalue_label, 1, border=5, |
322 array_panel_rightsizer.AddWindow(array_initialvalue_label, 1, border=5, |
312 flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL) |
323 flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) |
313 |
324 |
314 self.ArrayInitialValue = wx.TextCtrl(self.ArrayPanel, |
325 self.ArrayInitialValue = wx.TextCtrl(self.ArrayPanel, |
315 style=wx.TE_PROCESS_ENTER|wx.TE_RICH) |
326 style=wx.TE_PROCESS_ENTER | wx.TE_RICH) |
316 self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.ArrayInitialValue) |
327 self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.ArrayInitialValue) |
317 array_panel_rightsizer.AddWindow(self.ArrayInitialValue, 1, border=5, |
328 array_panel_rightsizer.AddWindow(self.ArrayInitialValue, 1, border=5, |
318 flag=wx.ALL) |
329 flag=wx.ALL) |
319 |
330 |
320 self.ArrayDimensions = CustomEditableListBox(self.ArrayPanel, |
331 self.ArrayDimensions = CustomEditableListBox( |
321 label=_("Dimensions:"), style=wx.gizmos.EL_ALLOW_NEW| |
332 self.ArrayPanel, |
322 wx.gizmos.EL_ALLOW_EDIT| |
333 label=_("Dimensions:"), |
323 wx.gizmos.EL_ALLOW_DELETE) |
334 style=(wx.gizmos.EL_ALLOW_NEW | |
|
335 wx.gizmos.EL_ALLOW_EDIT | |
|
336 wx.gizmos.EL_ALLOW_DELETE)) |
324 for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton", |
337 for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton", |
325 "_OnUpButton", "_OnDownButton"]: |
338 "_OnUpButton", "_OnDownButton"]: |
326 setattr(self.ArrayDimensions, func, self.OnDimensionsChanged) |
339 setattr(self.ArrayDimensions, func, self.OnDimensionsChanged) |
327 array_panel_sizer.AddWindow(self.ArrayDimensions, 0, border=5, |
340 array_panel_sizer.AddWindow(self.ArrayDimensions, 0, border=5, |
328 flag=wx.GROW|wx.ALL) |
341 flag=wx.GROW | wx.ALL) |
329 |
342 |
330 self.ArrayPanel.SetSizer(array_panel_sizer) |
343 self.ArrayPanel.SetSizer(array_panel_sizer) |
331 |
344 |
332 # Panel for Structure data types |
345 # Panel for Structure data types |
333 |
346 |
340 |
353 |
341 structure_button_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0) |
354 structure_button_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0) |
342 structure_button_sizer.AddGrowableCol(0) |
355 structure_button_sizer.AddGrowableCol(0) |
343 structure_button_sizer.AddGrowableRow(0) |
356 structure_button_sizer.AddGrowableRow(0) |
344 structure_panel_sizer.AddSizer(structure_button_sizer, 0, border=5, |
357 structure_panel_sizer.AddSizer(structure_button_sizer, 0, border=5, |
345 flag=wx.ALL|wx.GROW) |
358 flag=wx.ALL | wx.GROW) |
346 |
359 |
347 structure_elements_label = wx.StaticText(self.StructurePanel, |
360 structure_elements_label = wx.StaticText(self.StructurePanel, |
348 label=_('Elements :')) |
361 label=_('Elements :')) |
349 structure_button_sizer.AddWindow(structure_elements_label, flag=wx.ALIGN_BOTTOM) |
362 structure_button_sizer.AddWindow(structure_elements_label, flag=wx.ALIGN_BOTTOM) |
350 |
363 |
351 for name, bitmap, help in [ |
364 for name, bitmap, help in [ |
352 ("StructureAddButton", "add_element", _("Add element")), |
365 ("StructureAddButton", "add_element", _("Add element")), |
353 ("StructureDeleteButton", "remove_element", _("Remove element")), |
366 ("StructureDeleteButton", "remove_element", _("Remove element")), |
354 ("StructureUpButton", "up", _("Move element up")), |
367 ("StructureUpButton", "up", _("Move element up")), |
355 ("StructureDownButton", "down", _("Move element down"))]: |
368 ("StructureDownButton", "down", _("Move element down"))]: |
356 button = wx.lib.buttons.GenBitmapButton(self.StructurePanel, |
369 button = wx.lib.buttons.GenBitmapButton(self.StructurePanel, |
357 bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) |
370 bitmap=GetBitmap(bitmap), |
|
371 size=wx.Size(28, 28), |
|
372 style=wx.NO_BORDER) |
358 button.SetToolTipString(help) |
373 button.SetToolTipString(help) |
359 setattr(self, name, button) |
374 setattr(self, name, button) |
360 structure_button_sizer.AddWindow(button) |
375 structure_button_sizer.AddWindow(button) |
361 |
376 |
362 self.StructureElementsGrid = CustomGrid(self.StructurePanel, |
377 self.StructureElementsGrid = CustomGrid(self.StructurePanel, |
363 size=wx.Size(0, 150), style=wx.VSCROLL) |
378 size=wx.Size(0, 150), style=wx.VSCROLL) |
364 self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, |
379 self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, |
365 self.OnStructureElementsGridCellChange) |
380 self.OnStructureElementsGridCellChange) |
366 self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, |
381 self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, |
367 self.OnStructureElementsGridEditorShown) |
382 self.OnStructureElementsGridEditorShown) |
368 structure_panel_sizer.AddWindow(self.StructureElementsGrid, flag=wx.GROW) |
383 structure_panel_sizer.AddWindow(self.StructureElementsGrid, flag=wx.GROW) |
369 |
384 |
370 self.StructurePanel.SetSizer(structure_panel_sizer) |
385 self.StructurePanel.SetSizer(structure_panel_sizer) |
371 |
386 |
372 self.Editor.SetSizer(self.MainSizer) |
387 self.Editor.SetSizer(self.MainSizer) |
373 |
388 |
374 def __init__(self, parent, tagname, window, controler): |
389 def __init__(self, parent, tagname, window, controler): |
375 EditorPanel.__init__(self, parent, tagname, window, controler) |
390 EditorPanel.__init__(self, parent, tagname, window, controler) |
376 |
391 |
377 self.StructureElementDefaultValue = {"Name" : "", "Type" : DefaultType, "Initial Value" : ""} |
392 self.StructureElementDefaultValue = {"Name": "", "Type": DefaultType, "Initial Value": ""} |
378 self.StructureElementsTable = ElementsTable(self, [], GetElementsTableColnames()) |
393 self.StructureElementsTable = ElementsTable(self, [], GetElementsTableColnames()) |
379 self.StructureColSizes = [40, 150, 100, 250] |
394 self.StructureColSizes = [40, 150, 100, 250] |
380 self.StructureColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT] |
395 self.StructureColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT] |
381 |
396 |
382 self.StructureElementsGrid.SetTable(self.StructureElementsTable) |
397 self.StructureElementsGrid.SetTable(self.StructureElementsTable) |
569 wx.CallAfter(self.RefreshEnumeratedValues) |
584 wx.CallAfter(self.RefreshEnumeratedValues) |
570 wx.CallAfter(self.RefreshTypeInfos) |
585 wx.CallAfter(self.RefreshTypeInfos) |
571 event.Skip() |
586 event.Skip() |
572 |
587 |
573 def ShowErrorMessage(self, message): |
588 def ShowErrorMessage(self, message): |
574 dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR) |
589 dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR) |
575 dialog.ShowModal() |
590 dialog.ShowModal() |
576 dialog.Destroy() |
591 dialog.Destroy() |
577 |
592 |
578 def OnStructureElementsGridCellChange(self, event): |
593 def OnStructureElementsGridCellChange(self, event): |
579 row, col = event.GetRow(), event.GetCol() |
594 row, col = event.GetRow(), event.GetCol() |
580 colname = self.StructureElementsTable.GetColLabelValue(col, False) |
595 colname = self.StructureElementsTable.GetColLabelValue(col, False) |
581 value = self.StructureElementsTable.GetValue(row, col) |
596 value = self.StructureElementsTable.GetValue(row, col) |
582 if colname == "Name": |
597 if colname == "Name": |
583 message = None |
598 message = None |
584 if not TestIdentifier(value): |
599 if not TestIdentifier(value): |
585 message = _("\"%s\" is not a valid identifier!")%value |
600 message = _("\"%s\" is not a valid identifier!") % value |
586 elif value.upper() in IEC_KEYWORDS: |
601 elif value.upper() in IEC_KEYWORDS: |
587 message = _("\"%s\" is a keyword. It can't be used!")%value |
602 message = _("\"%s\" is a keyword. It can't be used!") % value |
588 ## elif value.upper() in self.PouNames: |
603 # elif value.upper() in self.PouNames: |
589 ## message = _("A pou with \"%s\" as name exists!")%value |
604 # message = _("A pou with \"%s\" as name exists!")%value |
590 elif value.upper() in [var["Name"].upper() for idx, var in enumerate(self.StructureElementsTable.GetData()) if idx != row]: |
605 elif value.upper() in [var["Name"].upper() for idx, var in enumerate(self.StructureElementsTable.GetData()) if idx != row]: |
591 message = _("An element named \"%s\" already exists in this structure!")%value |
606 message = _("An element named \"%s\" already exists in this structure!") % value |
592 else: |
607 else: |
593 self.RefreshTypeInfos() |
608 self.RefreshTypeInfos() |
594 wx.CallAfter(self.StructureElementsTable.ResetView, self.StructureElementsGrid) |
609 wx.CallAfter(self.StructureElementsTable.ResetView, self.StructureElementsGrid) |
595 ## old_value = self.Table.GetOldValue() |
610 # old_value = self.Table.GetOldValue() |
596 ## if old_value != "": |
611 # if old_value != "": |
597 ## self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value) |
612 # self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value) |
598 ## self.Controler.BufferProject() |
613 # self.Controler.BufferProject() |
599 event.Skip() |
614 event.Skip() |
600 |
615 |
601 if message is not None: |
616 if message is not None: |
602 event.Veto() |
617 event.Veto() |
603 wx.CallAfter(self.ShowErrorMessage, message) |
618 wx.CallAfter(self.ShowErrorMessage, message) |
631 |
646 |
632 new_id = wx.NewId() |
647 new_id = wx.NewId() |
633 AppendMenu(type_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Array")) |
648 AppendMenu(type_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Array")) |
634 self.Bind(wx.EVT_MENU, self.ElementArrayTypeFunction, id=new_id) |
649 self.Bind(wx.EVT_MENU, self.ElementArrayTypeFunction, id=new_id) |
635 |
650 |
636 ## functionblock_menu = wx.Menu(title='') |
651 # functionblock_menu = wx.Menu(title='') |
637 ## bodytype = self.Controler.GetEditedElementBodyType(self.TagName) |
652 # bodytype = self.Controler.GetEditedElementBodyType(self.TagName) |
638 ## pouname, poutype = self.Controler.GetEditedElementType(self.TagName) |
653 # pouname, poutype = self.Controler.GetEditedElementType(self.TagName) |
639 ## if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]: |
654 # if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]: |
640 ## for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName): |
655 # for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName): |
641 ## new_id = wx.NewId() |
656 # new_id = wx.NewId() |
642 ## AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type) |
657 # AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type) |
643 ## self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id) |
658 # self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id) |
644 ## type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu) |
659 # type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu) |
645 |
660 |
646 rect = self.StructureElementsGrid.BlockToDeviceRect((row, col), (row, col)) |
661 rect = self.StructureElementsGrid.BlockToDeviceRect((row, col), (row, col)) |
647 self.StructureElementsGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.StructureElementsGrid.GetColLabelSize()) |
662 self.StructureElementsGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.StructureElementsGrid.GetColLabelSize()) |
648 type_menu.Destroy() |
663 type_menu.Destroy() |
649 event.Veto() |
664 event.Veto() |