35 from dialogs.ArrayTypeDialog import ArrayTypeDialog |
35 from dialogs.ArrayTypeDialog import ArrayTypeDialog |
36 from CustomGrid import CustomGrid |
36 from CustomGrid import CustomGrid |
37 from CustomTable import CustomTable |
37 from CustomTable import CustomTable |
38 from LocationCellEditor import LocationCellEditor |
38 from LocationCellEditor import LocationCellEditor |
39 from util.BitmapLibrary import GetBitmap |
39 from util.BitmapLibrary import GetBitmap |
|
40 from PLCControler import _VariableInfos |
40 |
41 |
41 #------------------------------------------------------------------------------- |
42 #------------------------------------------------------------------------------- |
42 # Helpers |
43 # Helpers |
43 #------------------------------------------------------------------------------- |
44 #------------------------------------------------------------------------------- |
44 |
45 |
103 def __init__(self, parent, data, colnames): |
104 def __init__(self, parent, data, colnames): |
104 # The base class must be initialized *first* |
105 # The base class must be initialized *first* |
105 CustomTable.__init__(self, parent, data, colnames) |
106 CustomTable.__init__(self, parent, data, colnames) |
106 self.old_value = None |
107 self.old_value = None |
107 |
108 |
|
109 def GetValueByName(self, row, colname): |
|
110 if row < self.GetNumberRows(): |
|
111 return getattr(self.data[row], colname) |
|
112 |
|
113 def SetValueByName(self, row, colname, value): |
|
114 if row < self.GetNumberRows(): |
|
115 setattr(self.data[row], colname, value) |
|
116 |
108 def GetValue(self, row, col): |
117 def GetValue(self, row, col): |
109 if row < self.GetNumberRows(): |
118 if row < self.GetNumberRows(): |
110 if col == 0: |
119 if col == 0: |
111 return self.data[row]["Number"] |
120 return self.data[row].Number |
112 colname = self.GetColLabelValue(col, False) |
121 colname = self.GetColLabelValue(col, False) |
113 value = self.data[row].get(colname, "") |
122 if colname == "Initial Value": |
|
123 colname = "InitialValue" |
|
124 value = getattr(self.data[row], colname, "") |
114 if colname == "Type" and isinstance(value, TupleType): |
125 if colname == "Type" and isinstance(value, TupleType): |
115 if value[0] == "array": |
126 if value[0] == "array": |
116 return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "..".join(x), value[2])), value[1]) |
127 return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "..".join(x), value[2])), value[1]) |
117 if not isinstance(value, (StringType, UnicodeType)): |
128 if not isinstance(value, (StringType, UnicodeType)): |
118 value = str(value) |
129 value = str(value) |
122 |
133 |
123 def SetValue(self, row, col, value): |
134 def SetValue(self, row, col, value): |
124 if col < len(self.colnames): |
135 if col < len(self.colnames): |
125 colname = self.GetColLabelValue(col, False) |
136 colname = self.GetColLabelValue(col, False) |
126 if colname == "Name": |
137 if colname == "Name": |
127 self.old_value = self.data[row][colname] |
138 self.old_value = getattr(self.data[row], colname) |
128 elif colname == "Class": |
139 elif colname == "Class": |
129 value = VARIABLE_CLASSES_DICT[value] |
140 value = VARIABLE_CLASSES_DICT[value] |
130 self.SetValueByName(row, "Option", CheckOptionForClass[value](self.GetValueByName(row, "Option"))) |
141 self.SetValueByName(row, "Option", CheckOptionForClass[value](self.GetValueByName(row, "Option"))) |
131 if value == "External": |
142 if value == "External": |
132 self.SetValueByName(row, "Initial Value", "") |
143 self.SetValueByName(row, "InitialValue", "") |
133 elif colname == "Option": |
144 elif colname == "Option": |
134 value = OPTIONS_DICT[value] |
145 value = OPTIONS_DICT[value] |
135 self.data[row][colname] = value |
146 elif colname == "Initial Value": |
|
147 colname = "InitialValue" |
|
148 setattr(self.data[row], colname, value) |
136 |
149 |
137 def GetOldValue(self): |
150 def GetOldValue(self): |
138 return self.old_value |
151 return self.old_value |
139 |
152 |
140 def _updateColAttrs(self, grid): |
153 def _updateColAttrs(self, grid): |
171 renderer = wx.grid.GridCellStringRenderer() |
184 renderer = wx.grid.GridCellStringRenderer() |
172 elif colname == "Initial Value": |
185 elif colname == "Initial Value": |
173 if var_class not in ["External", "InOut"]: |
186 if var_class not in ["External", "InOut"]: |
174 if self.Parent.Controler.IsEnumeratedType(var_type): |
187 if self.Parent.Controler.IsEnumeratedType(var_type): |
175 editor = wx.grid.GridCellChoiceEditor() |
188 editor = wx.grid.GridCellChoiceEditor() |
176 editor.SetParameters(",".join(self.Parent.Controler.GetEnumeratedDataValues(var_type))) |
189 editor.SetParameters(",".join([""] + self.Parent.Controler.GetEnumeratedDataValues(var_type))) |
177 else: |
190 else: |
178 editor = wx.grid.GridCellTextEditor() |
191 editor = wx.grid.GridCellTextEditor() |
179 renderer = wx.grid.GridCellStringRenderer() |
192 renderer = wx.grid.GridCellStringRenderer() |
180 else: |
193 else: |
181 grid.SetReadOnly(row, col, True) |
194 grid.SetReadOnly(row, col, True) |
312 message = _("\"%s\" pou already exists!")%var_name |
325 message = _("\"%s\" pou already exists!")%var_name |
313 elif not var_name.upper() in [name.upper() |
326 elif not var_name.upper() in [name.upper() |
314 for name in self.ParentWindow.Controler.\ |
327 for name in self.ParentWindow.Controler.\ |
315 GetEditedElementVariables(tagname, self.ParentWindow.Debug)]: |
328 GetEditedElementVariables(tagname, self.ParentWindow.Debug)]: |
316 var_infos = self.ParentWindow.DefaultValue.copy() |
329 var_infos = self.ParentWindow.DefaultValue.copy() |
317 var_infos["Name"] = var_name |
330 var_infos.Name = var_name |
318 var_infos["Type"] = values[2] |
331 var_infos.Type = values[2] |
319 if values[1] == "location": |
332 if values[1] == "location": |
320 location = values[0] |
333 location = values[0] |
321 if not location.startswith("%"): |
334 if not location.startswith("%"): |
322 dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow.ParentWindow, |
335 dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow.ParentWindow, |
323 _("Select a variable class:"), _("Variable class"), |
336 _("Select a variable class:"), _("Variable class"), |
344 if not var_name.upper() in [name.upper() |
357 if not var_name.upper() in [name.upper() |
345 for name in self.ParentWindow.Controler.\ |
358 for name in self.ParentWindow.Controler.\ |
346 GetConfigurationVariableNames(configs[0])]: |
359 GetConfigurationVariableNames(configs[0])]: |
347 self.ParentWindow.Controler.AddConfigurationGlobalVar( |
360 self.ParentWindow.Controler.AddConfigurationGlobalVar( |
348 configs[0], values[2], var_name, location, "") |
361 configs[0], values[2], var_name, location, "") |
349 var_infos["Class"] = "External" |
362 var_infos.Class = "External" |
350 else: |
363 else: |
351 if element_type == "program": |
364 if element_type == "program": |
352 var_infos["Class"] = "Local" |
365 var_infos.Class = "Local" |
353 else: |
366 else: |
354 var_infos["Class"] = "Global" |
367 var_infos.Class = "Global" |
355 var_infos["Location"] = location |
368 var_infos.Location = location |
356 else: |
369 else: |
357 var_infos["Class"] = "External" |
370 var_infos.Class = "External" |
358 var_infos["Number"] = len(self.ParentWindow.Values) |
371 var_infos.Number = len(self.ParentWindow.Values) |
359 self.ParentWindow.Values.append(var_infos) |
372 self.ParentWindow.Values.append(var_infos) |
360 self.ParentWindow.SaveValues() |
373 self.ParentWindow.SaveValues() |
361 self.ParentWindow.RefreshValues() |
374 self.ParentWindow.RefreshValues() |
362 |
375 |
363 if message is not None: |
376 if message is not None: |
445 |
458 |
446 self.Filter = "All" |
459 self.Filter = "All" |
447 self.FilterChoices = [] |
460 self.FilterChoices = [] |
448 self.FilterChoiceTransfer = GetFilterChoiceTransfer() |
461 self.FilterChoiceTransfer = GetFilterChoiceTransfer() |
449 |
462 |
450 self.DefaultValue = { |
463 self.DefaultValue = _VariableInfos("", "", "", "", "", True, "", "INT", ([], []), 0) |
451 "Name" : "", |
464 |
452 "Class" : "", |
|
453 "Type" : "INT", |
|
454 "Location" : "", |
|
455 "Initial Value" : "", |
|
456 "Option" : "", |
|
457 "Documentation" : "", |
|
458 "Edit" : True |
|
459 } |
|
460 |
|
461 if element_type in ["config", "resource"]: |
465 if element_type in ["config", "resource"]: |
462 self.DefaultTypes = {"All" : "Global"} |
466 self.DefaultTypes = {"All" : "Global"} |
463 else: |
467 else: |
464 self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"} |
468 self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"} |
465 |
469 |
501 c = wx.ALIGN_CENTER |
505 c = wx.ALIGN_CENTER |
502 |
506 |
503 # Num Name Class Type Init Option Doc |
507 # Num Name Class Type Init Option Doc |
504 self.ColSizes = [40, 80, 70, 80, 80, 100, 160] |
508 self.ColSizes = [40, 80, 70, 80, 80, 100, 160] |
505 self.ColAlignements = [c, l, l, l, l, l, l] |
509 self.ColAlignements = [c, l, l, l, l, l, l] |
506 |
510 |
|
511 self.ElementType = element_type |
|
512 self.BodyType = None |
|
513 |
507 for choice in self.FilterChoices: |
514 for choice in self.FilterChoices: |
508 self.ClassFilter.Append(_(choice)) |
515 self.ClassFilter.Append(_(choice)) |
509 |
516 |
510 reverse_transfer = {} |
517 reverse_transfer = {} |
511 for filter, choice in self.FilterChoiceTransfer.items(): |
518 for filter, choice in self.FilterChoiceTransfer.items(): |
522 |
529 |
523 def _AddVariable(new_row): |
530 def _AddVariable(new_row): |
524 if new_row > 0: |
531 if new_row > 0: |
525 row_content = self.Values[new_row - 1].copy() |
532 row_content = self.Values[new_row - 1].copy() |
526 |
533 |
527 result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content["Name"]) |
534 result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content.Name) |
528 if result is not None: |
535 if result is not None: |
529 name = row_content["Name"][:result.start(1)] |
536 name = row_content.Name[:result.start(1)] |
530 suffix = result.group(1) |
537 suffix = result.group(1) |
531 if suffix != "": |
538 if suffix != "": |
532 start_idx = int(suffix) |
539 start_idx = int(suffix) |
533 else: |
540 else: |
534 start_idx = 0 |
541 start_idx = 0 |
535 else: |
542 else: |
536 name = row_content["Name"] |
543 name = row_content.Name |
537 start_idx = 0 |
544 start_idx = 0 |
538 else: |
545 else: |
539 row_content = None |
546 row_content = None |
540 start_idx = 0 |
547 start_idx = 0 |
541 name = "LocalVar" |
548 name = "LocalVar" |
542 |
549 |
543 if row_content is not None and row_content["Edit"]: |
550 if row_content is not None and row_content.Edit: |
544 row_content = self.Values[new_row - 1].copy() |
551 row_content = self.Values[new_row - 1].copy() |
545 else: |
552 else: |
546 row_content = self.DefaultValue.copy() |
553 row_content = self.DefaultValue.copy() |
547 if self.Filter in self.DefaultTypes: |
554 if self.Filter in self.DefaultTypes: |
548 row_content["Class"] = self.DefaultTypes[self.Filter] |
555 row_content.Class = self.DefaultTypes[self.Filter] |
549 else: |
556 else: |
550 row_content["Class"] = self.Filter |
557 row_content.Class = self.Filter |
551 |
558 |
552 row_content["Name"] = self.Controler.GenerateNewName( |
559 row_content.Name = self.Controler.GenerateNewName( |
553 self.TagName, None, name + "%d", start_idx) |
560 self.TagName, None, name + "%d", start_idx) |
554 |
561 |
555 if self.Filter == "All" and len(self.Values) > 0: |
562 if self.Filter == "All" and len(self.Values) > 0: |
556 self.Values.insert(new_row, row_content) |
563 self.Values.insert(new_row, row_content) |
557 else: |
564 else: |
564 |
571 |
565 def _DeleteVariable(row): |
572 def _DeleteVariable(row): |
566 if self.Table.GetValueByName(row, "Edit"): |
573 if self.Table.GetValueByName(row, "Edit"): |
567 self.Values.remove(self.Table.GetRow(row)) |
574 self.Values.remove(self.Table.GetRow(row)) |
568 self.SaveValues() |
575 self.SaveValues() |
|
576 if self.ElementType == "resource": |
|
577 self.ParentWindow.RefreshView(variablepanel = False) |
569 self.RefreshValues() |
578 self.RefreshValues() |
570 setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable) |
579 setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable) |
571 |
580 |
572 def _MoveVariable(row, move): |
581 def _MoveVariable(row, move): |
573 if self.Filter == "All": |
582 if self.Filter == "All": |
606 def __del__(self): |
615 def __del__(self): |
607 self.RefreshHighlightsTimer.Stop() |
616 self.RefreshHighlightsTimer.Stop() |
608 |
617 |
609 def SetTagName(self, tagname): |
618 def SetTagName(self, tagname): |
610 self.TagName = tagname |
619 self.TagName = tagname |
|
620 self.BodyType = self.Controler.GetEditedElementBodyType(self.TagName) |
611 |
621 |
612 def GetTagName(self): |
622 def GetTagName(self): |
613 return self.TagName |
623 return self.TagName |
614 |
624 |
615 def IsFunctionBlockType(self, name): |
625 def IsFunctionBlockType(self, name): |
616 bodytype = self.Controler.GetEditedElementBodyType(self.TagName) |
626 if self.ElementType != "function" and self.BodyType in ["ST", "IL"]: |
617 pouname, poutype = self.Controler.GetEditedElementType(self.TagName) |
|
618 if poutype != "function" and bodytype in ["ST", "IL"]: |
|
619 return False |
627 return False |
620 else: |
628 else: |
621 return name in self.Controler.GetFunctionBlockTypes(self.TagName) |
629 return self.Controler.GetBlockType(name, debug=self.Debug) is not None |
622 |
630 |
623 def RefreshView(self): |
631 def RefreshView(self): |
624 self.PouNames = self.Controler.GetProjectPouNames(self.Debug) |
632 self.PouNames = self.Controler.GetProjectPouNames(self.Debug) |
625 returnType = None |
633 returnType = None |
626 description = None |
634 description = None |
633 else: |
641 else: |
634 if self.ElementType == "function": |
642 if self.ElementType == "function": |
635 self.ReturnType.Clear() |
643 self.ReturnType.Clear() |
636 for data_type in self.Controler.GetDataTypes(self.TagName, debug=self.Debug): |
644 for data_type in self.Controler.GetDataTypes(self.TagName, debug=self.Debug): |
637 self.ReturnType.Append(data_type) |
645 self.ReturnType.Append(data_type) |
638 returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName) |
646 returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, debug=self.Debug) |
639 description = self.Controler.GetPouDescription(words[1]) |
647 description = self.Controler.GetPouDescription(words[1]) |
640 self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug) |
648 self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug) |
641 |
649 |
642 if returnType is not None: |
650 if returnType is not None: |
643 self.ReturnType.SetStringSelection(returnType) |
651 self.ReturnType.SetStringSelection(returnType) |
644 self.ReturnType.Enable(not self.Debug) |
652 self.ReturnType.Enable(not self.Debug) |
645 self.ReturnTypeLabel.Show() |
653 self.ReturnTypeLabel.Show() |
708 message = _("\"%s\" is not a valid identifier!") % value |
716 message = _("\"%s\" is not a valid identifier!") % value |
709 elif value.upper() in IEC_KEYWORDS: |
717 elif value.upper() in IEC_KEYWORDS: |
710 message = _("\"%s\" is a keyword. It can't be used!") % value |
718 message = _("\"%s\" is a keyword. It can't be used!") % value |
711 elif value.upper() in self.PouNames: |
719 elif value.upper() in self.PouNames: |
712 message = _("A POU named \"%s\" already exists!") % value |
720 message = _("A POU named \"%s\" already exists!") % value |
713 elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]: |
721 elif value.upper() in [var.Name.upper() for var in self.Values if var != self.Table.data[row]]: |
714 message = _("A variable with \"%s\" as name already exists in this pou!") % value |
722 message = _("A variable with \"%s\" as name already exists in this pou!") % value |
715 else: |
723 else: |
716 self.SaveValues(False) |
724 self.SaveValues(False) |
717 old_value = self.Table.GetOldValue() |
725 old_value = self.Table.GetOldValue() |
718 if old_value != "": |
726 if old_value != "": |
842 event.Skip() |
850 event.Skip() |
843 |
851 |
844 def RefreshValues(self): |
852 def RefreshValues(self): |
845 data = [] |
853 data = [] |
846 for num, variable in enumerate(self.Values): |
854 for num, variable in enumerate(self.Values): |
847 if variable["Class"] in self.ClassList: |
855 if variable.Class in self.ClassList: |
848 variable["Number"] = num + 1 |
856 variable.Number = num + 1 |
849 data.append(variable) |
857 data.append(variable) |
850 self.Table.SetData(data) |
858 self.Table.SetData(data) |
851 self.Table.ResetView(self.VariablesGrid) |
859 self.Table.ResetView(self.VariablesGrid) |
852 |
860 |
853 def SaveValues(self, buffer = True): |
861 def SaveValues(self, buffer = True): |