22 #License along with this library; if not, write to the Free Software |
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 |
23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
24 |
24 |
25 import os |
25 import os |
26 import wx, wx.grid |
26 import wx, wx.grid |
|
27 import re |
27 |
28 |
28 from types import TupleType, StringType, UnicodeType |
29 from types import TupleType, StringType, UnicodeType |
29 |
30 |
30 from plcopen.structures import LOCATIONDATATYPES, TestIdentifier, IEC_KEYWORDS |
31 from plcopen.structures import LOCATIONDATATYPES, TestIdentifier, IEC_KEYWORDS |
31 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD |
32 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD |
82 "InOut": lambda x: "", |
83 "InOut": lambda x: "", |
83 "Output": lambda x: {"Retain": "Retain", "Non-Retain": "Non-Retain"}.get(x, ""), |
84 "Output": lambda x: {"Retain": "Retain", "Non-Retain": "Non-Retain"}.get(x, ""), |
84 "Global": lambda x: {"Constant": "Constant", "Retain": "Retain"}.get(x, ""), |
85 "Global": lambda x: {"Constant": "Constant", "Retain": "Retain"}.get(x, ""), |
85 "External": lambda x: {"Constant": "Constant"}.get(x, "") |
86 "External": lambda x: {"Constant": "Constant"}.get(x, "") |
86 } |
87 } |
|
88 |
|
89 LOCATION_MODEL = re.compile("((?:%[IQM](?:\*|(?:[XBWLD]?[0-9](?:\.[0-9])*)))?)$") |
87 |
90 |
88 class VariableTable(CustomTable): |
91 class VariableTable(CustomTable): |
89 |
92 |
90 """ |
93 """ |
91 A custom wx.grid.Grid Table using user supplied data |
94 A custom wx.grid.Grid Table using user supplied data |
635 |
638 |
636 def OnVariablesGridCellChange(self, event): |
639 def OnVariablesGridCellChange(self, event): |
637 row, col = event.GetRow(), event.GetCol() |
640 row, col = event.GetRow(), event.GetCol() |
638 colname = self.Table.GetColLabelValue(col, False) |
641 colname = self.Table.GetColLabelValue(col, False) |
639 value = self.Table.GetValue(row, col) |
642 value = self.Table.GetValue(row, col) |
640 |
643 message = None |
|
644 |
641 if colname == "Name" and value != "": |
645 if colname == "Name" and value != "": |
642 if not TestIdentifier(value): |
646 if not TestIdentifier(value): |
643 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%value, _("Error"), wx.OK|wx.ICON_ERROR) |
647 message = _("\"%s\" is not a valid identifier!") % value |
644 message.ShowModal() |
|
645 message.Destroy() |
|
646 event.Veto() |
|
647 elif value.upper() in IEC_KEYWORDS: |
648 elif value.upper() in IEC_KEYWORDS: |
648 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%value, _("Error"), wx.OK|wx.ICON_ERROR) |
649 message = _("\"%s\" is a keyword. It can't be used!") % value |
649 message.ShowModal() |
|
650 message.Destroy() |
|
651 event.Veto() |
|
652 elif value.upper() in self.PouNames: |
650 elif value.upper() in self.PouNames: |
653 message = wx.MessageDialog(self, _("A POU named \"%s\" already exists!")%value, _("Error"), wx.OK|wx.ICON_ERROR) |
651 message = _("A POU named \"%s\" already exists!") % value |
654 message.ShowModal() |
|
655 message.Destroy() |
|
656 event.Veto() |
|
657 elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]: |
652 elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]: |
658 message = wx.MessageDialog(self, _("A variable with \"%s\" as name already exists in this pou!")%value, _("Error"), wx.OK|wx.ICON_ERROR) |
653 message = _("A variable with \"%s\" as name already exists in this pou!") % value |
659 message.ShowModal() |
|
660 message.Destroy() |
|
661 event.Veto() |
|
662 else: |
654 else: |
663 self.SaveValues(False) |
655 self.SaveValues(False) |
664 old_value = self.Table.GetOldValue() |
656 old_value = self.Table.GetOldValue() |
665 if old_value != "": |
657 if old_value != "": |
666 self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value) |
658 self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value) |
667 self.Controler.BufferProject() |
659 self.Controler.BufferProject() |
668 self.ParentWindow.RefreshView(variablepanel = False) |
660 self.ParentWindow.RefreshView(variablepanel = False) |
669 self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, INSTANCESTREE, LIBRARYTREE) |
661 self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, INSTANCESTREE, LIBRARYTREE) |
670 event.Skip() |
662 event.Skip() |
|
663 elif colname == "Location" and LOCATION_MODEL.match(value) is None: |
|
664 message = _("\"%s\" is not a valid location!") % value |
671 else: |
665 else: |
672 self.SaveValues() |
666 self.SaveValues() |
673 if colname == "Class": |
667 if colname == "Class": |
674 self.ParentWindow.RefreshView(variablepanel = False) |
668 self.ParentWindow.RefreshView(variablepanel = False) |
|
669 |
|
670 if message is not None: |
|
671 dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR) |
|
672 dialog.ShowModal() |
|
673 dialog.Destroy() |
|
674 event.Veto() |
|
675 else: |
675 event.Skip() |
676 event.Skip() |
676 |
677 |
677 def OnVariablesGridEditorShown(self, event): |
678 def OnVariablesGridEditorShown(self, event): |
678 row, col = event.GetRow(), event.GetCol() |
679 row, col = event.GetRow(), event.GetCol() |
679 |
680 |