controls/VariablePanel.py
changeset 623 e747685e4241
parent 616 8a60ffcfd70b
child 625 b7062a7018ec
equal deleted inserted replaced
622:05394e275a1c 623:e747685e4241
    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