controls/VariablePanel.py
changeset 625 b7062a7018ec
parent 623 e747685e4241
child 627 99ab0b74865f
--- 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)