--- a/controls/VariablePanel.py Thu Jan 12 17:04:22 2012 +0100
+++ b/controls/VariablePanel.py Tue Jan 17 16:44:00 2012 +0100
@@ -29,7 +29,7 @@
from types import TupleType, StringType, UnicodeType
from plcopen.structures import LOCATIONDATATYPES, TestIdentifier, IEC_KEYWORDS
-from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
+from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD, ERROR_HIGHLIGHT
from dialogs.ArrayTypeDialog import ArrayTypeDialog
from CustomGrid import CustomGrid
from CustomTable import CustomTable
@@ -86,7 +86,7 @@
"External": lambda x: {"Constant": "Constant"}.get(x, "")
}
-LOCATION_MODEL = re.compile("((?:%[IQM](?:\*|(?:[XBWLD]?[0-9](?:\.[0-9])*)))?)$")
+LOCATION_MODEL = re.compile("((?:%[IQM](?:\*|(?:[XBWLD]?[0-9]+(?:\.[0-9]+)*)))?)$")
class VariableTable(CustomTable):
@@ -198,7 +198,10 @@
grid.SetCellEditor(row, col, editor)
grid.SetCellRenderer(row, col, renderer)
- highlight_colours = row_highlights.get(colname.lower(), [(wx.WHITE, wx.BLACK)])[-1]
+ if colname == "Location" and LOCATION_MODEL.match(self.GetValueByName(row, "Location")) is None:
+ highlight_colours = ERROR_HIGHLIGHT
+ else:
+ highlight_colours = row_highlights.get(colname.lower(), [(wx.WHITE, wx.BLACK)])[-1]
grid.SetCellBackgroundColour(row, col, highlight_colours[0])
grid.SetCellTextColour(row, col, highlight_colours[1])
self.ResizeRow(grid, row)
@@ -306,12 +309,13 @@
message.Destroy()
[ID_VARIABLEEDITORPANEL, ID_VARIABLEEDITORPANELVARIABLESGRID,
- ID_VARIABLEEDITORCONTROLPANEL, ID_VARIABLEEDITORPANELRETURNTYPE,
+ ID_VARIABLEEDITORCONTROLPANEL, ID_VARIABLEEDITORPANELRETURNTYPELABEL,
+ ID_VARIABLEEDITORPANELRETURNTYPE, ID_VARIABLEEDITORPANELDESCRIPTIONLABEL,
+ ID_VARIABLEEDITORPANELDESCRIPTION, ID_VARIABLEEDITORPANELCLASSFILTERLABEL,
ID_VARIABLEEDITORPANELCLASSFILTER, ID_VARIABLEEDITORPANELADDBUTTON,
ID_VARIABLEEDITORPANELDELETEBUTTON, ID_VARIABLEEDITORPANELUPBUTTON,
- ID_VARIABLEEDITORPANELDOWNBUTTON, ID_VARIABLEEDITORPANELSTATICTEXT1,
- ID_VARIABLEEDITORPANELSTATICTEXT2, ID_VARIABLEEDITORPANELSTATICTEXT3,
-] = [wx.NewId() for _init_ctrls in range(12)]
+ ID_VARIABLEEDITORPANELDOWNBUTTON,
+] = [wx.NewId() for _init_ctrls in range(13)]
class VariablePanel(wx.Panel):
@@ -331,9 +335,11 @@
parent.AddGrowableRow(1)
def _init_coll_ControlPanelSizer_Items(self, parent):
- parent.AddWindow(self.staticText1, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL)
+ parent.AddWindow(self.ReturnTypeLabel, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL)
parent.AddWindow(self.ReturnType, 0, border=0, flag=0)
- parent.AddWindow(self.staticText2, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL)
+ parent.AddWindow(self.DescriptionLabel, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL)
+ parent.AddWindow(self.Description, 0, border=0, flag=0)
+ parent.AddWindow(self.ClassFilterLabel, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL)
parent.AddWindow(self.ClassFilter, 0, border=0, flag=0)
parent.AddWindow(self.AddButton, 0, border=0, flag=0)
parent.AddWindow(self.DeleteButton, 0, border=0, flag=0)
@@ -346,7 +352,7 @@
def _init_sizers(self):
self.MainSizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=0)
- self.ControlPanelSizer = wx.FlexGridSizer(cols=8, hgap=5, rows=1, vgap=5)
+ self.ControlPanelSizer = wx.FlexGridSizer(cols=10, hgap=5, rows=1, vgap=5)
self._init_coll_MainSizer_Items(self.MainSizer)
self._init_coll_MainSizer_Growables(self.MainSizer)
@@ -379,8 +385,8 @@
size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
self.ControlPanel.SetScrollRate(10, 0)
- self.staticText1 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT1,
- label=_('Return Type:'), name='staticText1', parent=self.ControlPanel,
+ self.ReturnTypeLabel = wx.StaticText(id=ID_VARIABLEEDITORPANELRETURNTYPELABEL,
+ label=_('Return Type:'), name='ReturnTypeLabel', parent=self.ControlPanel,
pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
self.ReturnType = wx.ComboBox(id=ID_VARIABLEEDITORPANELRETURNTYPE,
@@ -388,8 +394,18 @@
size=wx.Size(145, 28), style=wx.CB_READONLY)
self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, id=ID_VARIABLEEDITORPANELRETURNTYPE)
- self.staticText2 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT2,
- label=_('Class Filter:'), name='staticText2', parent=self.ControlPanel,
+ self.DescriptionLabel = wx.StaticText(id=ID_VARIABLEEDITORPANELDESCRIPTIONLABEL,
+ label=_('Description:'), name='DescriptionLabel', parent=self.ControlPanel,
+ pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
+
+ self.Description = wx.TextCtrl(id=ID_VARIABLEEDITORPANELDESCRIPTION,
+ name='Description', parent=self.ControlPanel, pos=wx.Point(0, 0),
+ size=wx.Size(250, 28), style=wx.TE_PROCESS_ENTER)
+ self.Bind(wx.EVT_TEXT_ENTER, self.OnDescriptionChanged, id=ID_VARIABLEEDITORPANELDESCRIPTION)
+ self.Description.Bind(wx.EVT_KILL_FOCUS, self.OnDescriptionChanged)
+
+ self.ClassFilterLabel = wx.StaticText(id=ID_VARIABLEEDITORPANELCLASSFILTERLABEL,
+ label=_('Class Filter:'), name='ClassFilterLabel', parent=self.ControlPanel,
pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
self.ClassFilter = wx.ComboBox(id=ID_VARIABLEEDITORPANELCLASSFILTER,
@@ -577,15 +593,15 @@
def RefreshView(self):
self.PouNames = self.Controler.GetProjectPouNames(self.Debug)
+ returnType = None
+ description = None
words = self.TagName.split("::")
if self.ElementType == "config":
self.PouIsUsed = False
- returnType = None
self.Values = self.Controler.GetConfigurationGlobalVars(words[1], self.Debug)
elif self.ElementType == "resource":
self.PouIsUsed = False
- returnType = None
self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2], self.Debug)
else:
if self.ElementType == "function":
@@ -593,21 +609,30 @@
for base_type in self.Controler.GetDataTypes(self.TagName, True, debug=self.Debug):
self.ReturnType.Append(base_type)
returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
- else:
- returnType = None
+ description = self.Controler.GetPouDescription(words[1])
self.PouIsUsed = self.Controler.PouIsUsed(words[1])
self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)
if returnType is not None:
self.ReturnType.SetStringSelection(returnType)
- self.ReturnType.Enable(self.Debug)
- self.staticText1.Show()
+ self.ReturnType.Enable(not self.Debug)
+ self.ReturnTypeLabel.Show()
self.ReturnType.Show()
else:
self.ReturnType.Enable(False)
- self.staticText1.Hide()
+ self.ReturnTypeLabel.Hide()
self.ReturnType.Hide()
+ if description is not None:
+ self.Description.SetValue(description)
+ self.Description.Enable(not self.Debug)
+ self.DescriptionLabel.Show()
+ self.Description.Show()
+ else:
+ self.Description.Enable(False)
+ self.DescriptionLabel.Hide()
+ self.Description.Hide()
+
self.RefreshValues()
self.VariablesGrid.RefreshButtons()
@@ -619,6 +644,15 @@
self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, INSTANCESTREE, LIBRARYTREE)
event.Skip()
+ def OnDescriptionChanged(self, event):
+ words = self.TagName.split("::")
+ old_description = self.Controler.GetPouDescription(words[1])
+ new_description = self.Description.GetValue()
+ if new_description != old_description:
+ self.Controler.SetPouDescription(words[1], new_description)
+ self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, INSTANCESTREE, LIBRARYTREE)
+ event.Skip()
+
def OnClassFilter(self, event):
self.Filter = self.FilterChoiceTransfer[VARIABLE_CHOICES_DICT[self.ClassFilter.GetStringSelection()]]
self.RefreshTypeList()
@@ -660,12 +694,12 @@
self.ParentWindow.RefreshView(variablepanel = False)
self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, INSTANCESTREE, LIBRARYTREE)
event.Skip()
- elif colname == "Location" and LOCATION_MODEL.match(value) is None:
- message = _("\"%s\" is not a valid location!") % value
else:
self.SaveValues()
if colname == "Class":
self.ParentWindow.RefreshView(variablepanel = False)
+ elif colname == "Location":
+ wx.CallAfter(self.ParentWindow.RefreshView)
if message is not None:
dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)