PLCOpenEditor.py
changeset 68 66308e07402c
parent 67 3a1b0afdaf84
child 70 0e48629c1e6d
equal deleted inserted replaced
67:3a1b0afdaf84 68:66308e07402c
   299 
   299 
   300         if self.ModeSolo:
   300         if self.ModeSolo:
   301             self.FileMenu = wx.Menu(title=u'')
   301             self.FileMenu = wx.Menu(title=u'')
   302         else:
   302         else:
   303             self.FileMenu = None
   303             self.FileMenu = None
   304 
       
   305         self.EditMenu = wx.Menu(title=u'')
   304         self.EditMenu = wx.Menu(title=u'')
   306 
       
   307         self.HelpMenu = wx.Menu(title='')
   305         self.HelpMenu = wx.Menu(title='')
   308 
       
   309         self.SFCMenu = wx.Menu(title='')
   306         self.SFCMenu = wx.Menu(title='')
   310 
       
   311         self.ConfigMenu = wx.Menu(title='')
   307         self.ConfigMenu = wx.Menu(title='')
   312 
   308 
   313         self._init_coll_menuBar1_Menus(self.menuBar1)
   309         self._init_coll_menuBar1_Menus(self.menuBar1)
   314         if self.ModeSolo:
   310         if self.ModeSolo:
   315             self._init_coll_FileMenu_Items(self.FileMenu)
   311             self._init_coll_FileMenu_Items(self.FileMenu)
   910             self.ProjectTree.Expand(selected)
   906             self.ProjectTree.Expand(selected)
   911         name = self.ProjectTree.GetItemText(selected)
   907         name = self.ProjectTree.GetItemText(selected)
   912         data = self.ProjectTree.GetPyData(selected)
   908         data = self.ProjectTree.GetPyData(selected)
   913         if name == "Properties":
   909         if name == "Properties":
   914             self.ShowProperties()
   910             self.ShowProperties()
   915 ##        elif data == ITEM_CLASS:
       
   916 ##            item = self.ProjectTree.GetItemParent(selected)
       
   917 ##            item_type = self.ProjectTree.GetPyData(item)
       
   918 ##            while item_type not in [ITEM_POU, ITEM_RESOURCE, ITEM_CONFIGURATION] and item.IsOk():
       
   919 ##                item = self.ProjectTree.GetItemParent(item)
       
   920 ##                item_type = self.ProjectTree.GetPyData(item)
       
   921 ##            item_name = self.ProjectTree.GetItemText(item)
       
   922 ##            if item_type == ITEM_POU:
       
   923 ##                dialog = EditVariableDialog(self, item_name, self.Controler.GetPouType(item_name), self.Controler.PouIsUsed(item_name), name)
       
   924 ##                dialog.SetPouNames(self.Controler.GetProjectPouNames())
       
   925 ##                values = {}
       
   926 ##                values["returnType"] = self.Controler.GetPouInterfaceReturnTypeByName(item_name)
       
   927 ##                values["data"] = self.Controler.GetPouInterfaceVarsByName(item_name)
       
   928 ##                dialog.SetValues(values)
       
   929 ##                if dialog.ShowModal() == wx.ID_OK:
       
   930 ##                    new_values = dialog.GetValues()
       
   931 ##                    if "returnType" in new_values:
       
   932 ##                        self.Controler.SetPouInterfaceReturnType(item_name, new_values["returnType"])
       
   933 ##                    self.Controler.SetPouInterfaceVars(item_name, new_values["data"])
       
   934 ##                    pou_names = self.Controler.GetElementsOpenedNames()
       
   935 ##                    if item_name in pou_names:
       
   936 ##                        window = self.TabsOpened.GetPage(pou_names.index(item_name))
       
   937 ##                        if isinstance(window, TextViewer):
       
   938 ##                            varlist = []
       
   939 ##                            if "returnType" in new_values:
       
   940 ##                                varlist.append(name)
       
   941 ##                            for var in new_values["data"]:
       
   942 ##                                varlist.append(var["Name"])
       
   943 ##                            window.SetVariables(varlist)
       
   944 ##                dialog.Destroy()
       
   945 ##                self.RefreshProjectTree()
       
   946 ##            elif item_type == ITEM_CONFIGURATION:
       
   947 ##                dialog = EditVariableDialog(self, item_name, None, False, name)
       
   948 ##                dialog.SetPouNames(self.Controler.GetProjectPouNames())
       
   949 ##                values = {"data" : self.Controler.GetConfigurationGlobalVars(item_name)}
       
   950 ##                dialog.SetValues(values)
       
   951 ##                if dialog.ShowModal() == wx.ID_OK:
       
   952 ##                    new_values = dialog.GetValues()
       
   953 ##                    self.Controler.SetConfigurationGlobalVars(item_name, new_values["data"])
       
   954 ##                dialog.Destroy()
       
   955 ##                self.RefreshProjectTree()
       
   956 ##            elif item_type == ITEM_RESOURCE:
       
   957 ##                config = self.ProjectTree.GetItemParent(item)
       
   958 ##                config_type = self.ProjectTree.GetPyData(config)
       
   959 ##                while config_type != ITEM_CONFIGURATION and config.IsOk():
       
   960 ##                    config = self.ProjectTree.GetItemParent(config)
       
   961 ##                    config_type = self.ProjectTree.GetPyData(config)
       
   962 ##                if config.IsOk():
       
   963 ##                    config_name = self.ProjectTree.GetItemText(config)
       
   964 ##                    dialog = EditVariableDialog(self, item_name, None, False, name)
       
   965 ##                    values = {"data" : self.Controler.GetConfigurationResourceGlobalVars(config_name, item_name)}
       
   966 ##                    dialog.SetValues(values)
       
   967 ##                    if dialog.ShowModal() == wx.ID_OK:
       
   968 ##                        new_values = dialog.GetValues()
       
   969 ##                        self.Controler.SetConfigurationResourceGlobalVars(config_name, item_name, new_values["data"])
       
   970 ##                    dialog.Destroy()
       
   971 ##                    self.RefreshProjectTree()
       
   972 ##        elif data in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
       
   973 ##            if data == ITEM_POU:
       
   974 ##                idx = self.Controler.OpenElementEditing(name)
       
   975 ##                language = self.Controler.GetPouBodyType(name)
       
   976 ##                varlist = []
       
   977 ##                returnType = self.Controler.GetPouInterfaceReturnTypeByName(name)
       
   978 ##                if returnType:
       
   979 ##                    varlist.append(name)
       
   980 ##                vars = self.Controler.GetPouInterfaceVarsByName(name)
       
   981 ##                if vars:
       
   982 ##                    for var in vars:
       
   983 ##                        varlist.append(var["Name"])
       
   984 ##                self.EditVariable.SetPou(self.Controler.GetPouType(name), self.Controler.PouIsUsed(name))
       
   985 ##                self.EditVariable.SetValues({"returnType":returnType,"data":vars})
       
   986 ##            else:
       
   987 ##                parent = self.ProjectTree.GetItemParent(selected)
       
   988 ##                parent_name = self.ProjectTree.GetItemText(parent)
       
   989 ##                grandparent = self.ProjectTree.GetItemParent(parent)
       
   990 ##                grandparent_name = self.ProjectTree.GetItemText(grandparent)
       
   991 ##                if data == ITEM_TRANSITION:
       
   992 ##                    idx = self.Controler.OpenPouTransitionEditing(grandparent_name, name)
       
   993 ##                    language = self.Controler.GetTransitionBodyType(grandparent_name, name)
       
   994 ##                elif data == ITEM_ACTION:
       
   995 ##                    idx = self.Controler.OpenPouActionEditing(grandparent_name, name)
       
   996 ##                    language = self.Controler.GetActionBodyType(grandparent_name, name)
       
   997 ##                varlist = [name]
       
   998 ##                vars = self.Controler.GetPouInterfaceVarsByName(grandparent_name)
       
   999 ##                if vars:
       
  1000 ##                    for var in vars:
       
  1001 ##                        varlist.append(var["Name"])
       
  1002 ##                self.EditVariable.SetPou(self.Controler.GetPouType(grandparent_name), self.Controler.PouIsUsed(grandparent_name))
       
  1003 ##                self.EditVariable.SetValues({"returnType":returnType,"data":vars})
       
  1004 ##            if idx != None:
       
  1005 ##                if language == "FBD":
       
  1006 ##                    new_window = Viewer(self.TabsOpened, self, self.Controler)
       
  1007 ##                elif language == "LD":
       
  1008 ##                    new_window = LD_Viewer(self.TabsOpened, self, self.Controler)
       
  1009 ##                elif language == "SFC":
       
  1010 ##                    new_window = SFC_Viewer(self.TabsOpened, self, self.Controler)
       
  1011 ##                elif language in ["IL", "ST"]:
       
  1012 ##                    new_window = TextViewer(self.TabsOpened, self, self.Controler)
       
  1013 ##                    new_window.SetTextSyntax(language)
       
  1014 ##                    if language == "IL":
       
  1015 ##                        new_window.SetKeywords(IL_KEYWORDS)
       
  1016 ##                    else:
       
  1017 ##                        new_window.SetKeywords(ST_KEYWORDS)
       
  1018 ##                    new_window.SetVariables(varlist)
       
  1019 ##                    new_window.SetFunctions(self.Controler.GetBlockTypes())
       
  1020 ##                else:
       
  1021 ##                    return
       
  1022 ##                new_window.RefreshView()
       
  1023 ##                self.TabsOpened.AddPage(new_window, "")
       
  1024 ##                self.TabsOpened.SetSelection(idx)
       
  1025 ##                self.RefreshTabsOpenedTitles()
       
  1026 ##                self.RefreshFileMenu()
       
  1027 ##                self.RefreshEditMenu()
       
  1028 ##                self.RefreshToolBar()
       
  1029 ##            else:
       
  1030 ##                if data == ITEM_POU:
       
  1031 ##                    idx = self.Controler.ChangeElementEditing(name)
       
  1032 ##                elif data == ITEM_TRANSITION:
       
  1033 ##                    idx = self.Controler.ChangePouTransitionEditing(grandparent_name, name)
       
  1034 ##                elif data == ITEM_ACTION:
       
  1035 ##                    idx = self.Controler.ChangePouActionEditing(grandparent_name, name)
       
  1036 ##                if idx != None:
       
  1037 ##                    self.TabsOpened.SetSelection(idx)
       
  1038 ##                    self.RefreshFileMenu()
       
  1039 ##                    self.RefreshEditMenu()
       
  1040 ##                    self.RefreshToolBar()
       
  1041 ##        elif data == ITEM_RESOURCE:
       
  1042 ##            item = self.ProjectTree.GetItemParent(selected)
       
  1043 ##            item_type = self.ProjectTree.GetPyData(item)
       
  1044 ##            while item_type != ITEM_CONFIGURATION:
       
  1045 ##                item = self.ProjectTree.GetItemParent(item)
       
  1046 ##                item_type = self.ProjectTree.GetPyData(item)
       
  1047 ##            config_name = self.ProjectTree.GetItemText(item)
       
  1048 ##            idx = self.Controler.OpenConfigurationResourceEditing(config_name, name)
       
  1049 ##            if idx != None:
       
  1050 ##                new_window = ResourceEditor(self.TabsOpened, self, self.Controler)
       
  1051 ##                new_window.RefreshView()
       
  1052 ##                self.TabsOpened.AddPage(new_window, "")
       
  1053 ##                self.TabsOpened.SetSelection(idx)
       
  1054 ##                self.RefreshTabsOpenedTitles()
       
  1055 ##                self.RefreshFileMenu()
       
  1056 ##                self.RefreshEditMenu()
       
  1057 ##                self.RefreshToolBar()
       
  1058 ##            else:
       
  1059 ##                idx = self.Controler.ChangeConfigurationResourceEditing(parent_name, name)
       
  1060 ##                if idx != None:
       
  1061 ##                    self.TabsOpened.SetSelection(idx)
       
  1062 ##                    self.RefreshFileMenu()
       
  1063 ##                    self.RefreshEditMenu()
       
  1064 ##                    self.RefreshToolBar()
       
  1065         elif data in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE, ITEM_CONFIGURATION]:
   911         elif data in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE, ITEM_CONFIGURATION]:
  1066             if data == ITEM_CONFIGURATION:
   912             if data == ITEM_CONFIGURATION:
  1067                 idx = self.Controler.OpenConfigurationEditing(name)
   913                 idx = self.Controler.OpenConfigurationEditing(name)
  1068                 if idx != None:
   914                 if idx != None:
  1069                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "config", config_name = name)
   915                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "config", config_name = name)
  1966         values["actionName"] = self.ActionName.GetValue()
  1812         values["actionName"] = self.ActionName.GetValue()
  1967         values["language"] = self.Language.GetStringSelection()
  1813         values["language"] = self.Language.GetStringSelection()
  1968         return values
  1814         return values
  1969 
  1815 
  1970 #-------------------------------------------------------------------------------
  1816 #-------------------------------------------------------------------------------
  1971 #                            Pou Interface Dialog
  1817 #                            Pou Editor Panel
  1972 #-------------------------------------------------------------------------------
  1818 #-------------------------------------------------------------------------------
  1973 
  1819 
  1974 class VariableTable(wx.grid.PyGridTableBase):
  1820 class VariableTable(wx.grid.PyGridTableBase):
  1975     
  1821     
  1976     """
  1822     """
  2007             if col == 0:
  1853             if col == 0:
  2008                 return self.Parent.Values.index(self.data[row]) + 1
  1854                 return self.Parent.Values.index(self.data[row]) + 1
  2009             name = str(self.data[row].get(self.GetColLabelValue(col), ""))
  1855             name = str(self.data[row].get(self.GetColLabelValue(col), ""))
  2010             return name
  1856             return name
  2011     
  1857     
  2012     def GetValueByName(self, row, colname):
       
  2013         return self.data[row].get(colname)
       
  2014 
       
  2015     def SetValue(self, row, col, value):
  1858     def SetValue(self, row, col, value):
  2016         if col < len(self.colnames):
  1859         if col < len(self.colnames):
  2017             colname = self.GetColLabelValue(col)
  1860             colname = self.GetColLabelValue(col)
  2018             if colname == "Name":
  1861             if colname == "Name":
  2019                 self.old_value = self.data[row][colname]
  1862                 self.old_value = self.data[row][colname]
  2020             self.data[row][colname] = value
  1863             self.data[row][colname] = value
  2021     
  1864     
       
  1865     def GetValueByName(self, row, colname):
       
  1866         if row < self.GetNumberRows():
       
  1867             return self.data[row].get(colname)
       
  1868 
       
  1869     def SetValueByName(self, row, colname, value):
       
  1870         if row < self.GetNumberRows():
       
  1871             self.data[row][colname] = value
       
  1872 
  2022     def GetOldValue(self):
  1873     def GetOldValue(self):
  2023         return self.old_value
  1874         return self.old_value
  2024     
  1875     
  2025     def ResetView(self, grid):
  1876     def ResetView(self, grid):
  2026         """
  1877         """
  2075         for row in range(self.GetNumberRows()):
  1926         for row in range(self.GetNumberRows()):
  2076             for col in range(self.GetNumberCols()):
  1927             for col in range(self.GetNumberCols()):
  2077                 editor = None
  1928                 editor = None
  2078                 renderer = None
  1929                 renderer = None
  2079                 colname = self.GetColLabelValue(col)
  1930                 colname = self.GetColLabelValue(col)
  2080                 grid.SetReadOnly(row, col, False)
  1931                 if col != 0 and self.GetValueByName(row, "Edit"):
  2081                 if col == 0:
  1932                     grid.SetReadOnly(row, col, False)
  2082                     grid.SetReadOnly(row, col, True)
  1933                     if colname == "Name":
  2083                 elif colname == "Name":
  1934                         if self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]:
  2084                     if self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]:
  1935                             grid.SetReadOnly(row, col, True)
  2085                         grid.SetReadOnly(row, col, True)
  1936                         else:
  2086                     else:
  1937                             editor = wx.grid.GridCellTextEditor()
       
  1938                             renderer = wx.grid.GridCellStringRenderer()
       
  1939                     elif colname in ["Initial Value","Location"]:
  2087                         editor = wx.grid.GridCellTextEditor()
  1940                         editor = wx.grid.GridCellTextEditor()
  2088                         renderer = wx.grid.GridCellStringRenderer()
  1941                         renderer = wx.grid.GridCellStringRenderer()
  2089                 elif colname in ["Initial Value","Location"]:
  1942                     elif colname == "Class":
  2090                     editor = wx.grid.GridCellTextEditor()
  1943                         if len(self.Parent.ClassList) == 1 or self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]:
  2091                     renderer = wx.grid.GridCellStringRenderer()
  1944                             grid.SetReadOnly(row, col, True)
  2092                 elif colname == "Class":
  1945                         else:
  2093                     if len(self.Parent.ClassList) == 1 or self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]:
  1946                             editor = wx.grid.GridCellChoiceEditor()
  2094                         grid.SetReadOnly(row, col, True)
  1947                             excluded = []
  2095                     else:
  1948                             if self.Parent.PouIsUsed:
       
  1949                                 excluded.extend(["Input","Output","InOut"])    
       
  1950                             editor.SetParameters(",".join([choice for choice in self.Parent.ClassList if choice not in excluded]))
       
  1951                     elif colname in ["Retain", "Constant"]:
  2096                         editor = wx.grid.GridCellChoiceEditor()
  1952                         editor = wx.grid.GridCellChoiceEditor()
  2097                         excluded = []
  1953                         editor.SetParameters(self.Parent.OptionList)
  2098                         if self.Parent.PouIsUsed:
  1954                     elif colname == "Type":
  2099                             excluded.extend(["Input","Output","InOut"])    
  1955                         editor = wx.grid.GridCellTextEditor()
  2100                         editor.SetParameters(",".join([choice for choice in self.Parent.ClassList if choice not in excluded]))
  1956                 else:
  2101                 elif colname == "Type":
  1957                     grid.SetReadOnly(row, col, True)
  2102                     if self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]:
  1958                 
  2103                         grid.SetReadOnly(row, col, True)
       
  2104                     else:
       
  2105                         editor = wx.grid.GridCellChoiceEditor()
       
  2106                         editor.SetParameters(self.Parent.TypeList)
       
  2107                 elif colname in ["Retain", "Constant"]:
       
  2108                     editor = wx.grid.GridCellChoiceEditor()
       
  2109                     editor.SetParameters(self.Parent.OptionList)
       
  2110                     
       
  2111                 grid.SetCellEditor(row, col, editor)
  1959                 grid.SetCellEditor(row, col, editor)
  2112                 grid.SetCellRenderer(row, col, renderer)
  1960                 grid.SetCellRenderer(row, col, renderer)
  2113                 
  1961                 
  2114                 grid.SetCellBackgroundColour(row, col, wx.WHITE)
  1962                 grid.SetCellBackgroundColour(row, col, wx.WHITE)
  2115     
  1963     
  2175  ID_POUEDITORPANELDELETEBUTTON, ID_POUEDITORPANELUPBUTTON, 
  2023  ID_POUEDITORPANELDELETEBUTTON, ID_POUEDITORPANELUPBUTTON, 
  2176  ID_POUEDITORPANELDOWNBUTTON, ID_POUEDITORPANELSTATICTEXT1, 
  2024  ID_POUEDITORPANELDOWNBUTTON, ID_POUEDITORPANELSTATICTEXT1, 
  2177  ID_POUEDITORPANELSTATICTEXT2, ID_POUEDITORPANELSTATICTEXT3,
  2025  ID_POUEDITORPANELSTATICTEXT2, ID_POUEDITORPANELSTATICTEXT3,
  2178 ] = [wx.NewId() for _init_ctrls in range(12)]
  2026 ] = [wx.NewId() for _init_ctrls in range(12)]
  2179 
  2027 
  2180 class PouEditorPanel(wx.Panel):
  2028 class PouEditorPanel(wx.SplitterWindow):
  2181     def _init_coll_MainPanelSizer_Items(self, parent):
       
  2182         parent.AddWindow(self.Viewer, 0, border=0, flag=wx.GROW)
       
  2183         parent.AddSizer(self.VariablePanelSizer, 0, border=0, flag=wx.GROW)
       
  2184 
       
  2185     def _init_coll_MainPanelSizer_Growables(self, parent):
       
  2186         parent.AddGrowableCol(0)
       
  2187         parent.AddGrowableRow(0)
       
  2188     
       
  2189     def _init_coll_VariablePanelSizer_Items(self, parent):
  2029     def _init_coll_VariablePanelSizer_Items(self, parent):
  2190         parent.AddWindow(self.VariablesGrid, 0, border=0, flag=wx.GROW)
  2030         parent.AddWindow(self.VariablesGrid, 0, border=0, flag=wx.GROW)
  2191         parent.AddSizer(self.ControlPanelSizer, 0, border=0, flag=wx.GROW)
  2031         parent.AddSizer(self.ControlPanelSizer, 0, border=0, flag=wx.GROW)
  2192     
  2032     
  2193     def _init_coll_VariablePanelSizer_Growables(self, parent):
  2033     def _init_coll_VariablePanelSizer_Growables(self, parent):
  2221         parent.AddGrowableCol(2)
  2061         parent.AddGrowableCol(2)
  2222         parent.AddGrowableCol(3)
  2062         parent.AddGrowableCol(3)
  2223         parent.AddGrowableRow(0)
  2063         parent.AddGrowableRow(0)
  2224 
  2064 
  2225     def _init_sizers(self):
  2065     def _init_sizers(self):
  2226         self.MainPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
       
  2227         self.VariablePanelSizer = wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=0)
  2066         self.VariablePanelSizer = wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=0)
  2228         self.ControlPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  2067         self.ControlPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  2229         self.ChoicePanelSizer = wx.GridSizer(cols=1, hgap=5, rows=4, vgap=5)
  2068         self.ChoicePanelSizer = wx.GridSizer(cols=1, hgap=5, rows=4, vgap=5)
  2230         self.ButtonPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
  2069         self.ButtonPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
  2231         
  2070         
  2232         self._init_coll_MainPanelSizer_Items(self.MainPanelSizer)
       
  2233         self._init_coll_MainPanelSizer_Growables(self.MainPanelSizer)
       
  2234         self._init_coll_VariablePanelSizer_Items(self.VariablePanelSizer)
  2071         self._init_coll_VariablePanelSizer_Items(self.VariablePanelSizer)
  2235         self._init_coll_VariablePanelSizer_Growables(self.VariablePanelSizer)
  2072         self._init_coll_VariablePanelSizer_Growables(self.VariablePanelSizer)
  2236         self._init_coll_ControlPanelSizer_Items(self.ControlPanelSizer)
  2073         self._init_coll_ControlPanelSizer_Items(self.ControlPanelSizer)
  2237         self._init_coll_ControlPanelSizer_Growables(self.ControlPanelSizer)
  2074         self._init_coll_ControlPanelSizer_Growables(self.ControlPanelSizer)
  2238         self._init_coll_ChoicePanelSizer_Items(self.ChoicePanelSizer)
  2075         self._init_coll_ChoicePanelSizer_Items(self.ChoicePanelSizer)
  2239         self._init_coll_ButtonPanelSizer_Items(self.ButtonPanelSizer)
  2076         self._init_coll_ButtonPanelSizer_Items(self.ButtonPanelSizer)
  2240         self._init_coll_ButtonPanelSizer_Growables(self.ButtonPanelSizer)
  2077         self._init_coll_ButtonPanelSizer_Growables(self.ButtonPanelSizer)
  2241         
  2078         
  2242         self.SetSizer(self.MainPanelSizer)
  2079         self.VariablePanel.SetSizer(self.VariablePanelSizer)
  2243 
  2080 
  2244     def _init_ctrls(self, prnt, element_type):
  2081     def _init_ctrls(self, prnt, element_type):
  2245         wx.Panel.__init__(self, id=ID_POUEDITORPANEL,
  2082         wx.SplitterWindow.__init__(self, id=ID_POUEDITORPANEL,
  2246               name='EditVariablePanel', parent=prnt, pos=wx.Point(0, 0),
  2083               name='EditVariablePanel', parent=prnt, pos=wx.Point(0, 0),
  2247               size=wx.Size(-1, -1), style=0)
  2084               size=wx.Size(-1, -1), style=wx.SP_3D)
       
  2085         self.SetNeedUpdating(True)
       
  2086         self.SetMinimumPaneSize(1)
  2248         
  2087         
  2249         if element_type == "config":
  2088         if element_type == "config":
  2250             self.Viewer = wx.Panel(id=ID_POUEDITORPANELVIEWER,
  2089             self.Viewer = wx.Panel(id=ID_POUEDITORPANELVIEWER,
  2251               name='ConfigPanel', parent=self, pos=wx.Point(0, 0),
  2090               name='ConfigPanel', parent=self.splitterWindow1, pos=wx.Point(0, 0),
  2252               size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL)
  2091               size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL)
  2253             self.Viewer.ResetBuffer = lambda: None
  2092             self.Viewer.ResetBuffer = lambda: None
  2254             self.Viewer.RefreshView = lambda: None
  2093             self.Viewer.RefreshView = lambda: None
  2255         elif element_type == "resource":
  2094         elif element_type == "resource":
  2256             self.Viewer = ResourceEditor(self, self.Parent, self.Controler)
  2095             self.Viewer = ResourceEditor(self, self.Parent, self.Controler)
  2266             if element_type == "IL":
  2105             if element_type == "IL":
  2267                 self.Viewer.SetKeywords(IL_KEYWORDS)
  2106                 self.Viewer.SetKeywords(IL_KEYWORDS)
  2268             else:
  2107             else:
  2269                 self.Viewer.SetKeywords(ST_KEYWORDS)
  2108                 self.Viewer.SetKeywords(ST_KEYWORDS)
  2270         
  2109         
       
  2110         self.VariablePanel = wx.Panel(id=ID_POUEDITORPANELVIEWER,
       
  2111               name='VariablePanel', parent=self, pos=wx.Point(0, 0),
       
  2112               size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL)
       
  2113         
  2271         self.staticText1 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT1,
  2114         self.staticText1 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT1,
  2272               label='Return Type:', name='staticText1', parent=self,
  2115               label='Return Type:', name='staticText1', parent=self.VariablePanel,
  2273               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  2116               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  2274 
  2117 
  2275         self.ReturnType = wx.Choice(id=ID_POUEDITORPANELRETURNTYPE,
  2118         self.ReturnType = wx.Choice(id=ID_POUEDITORPANELRETURNTYPE,
  2276               name='ReturnType', parent=self, pos=wx.Point(0, 0),
  2119               name='ReturnType', parent=self.VariablePanel, pos=wx.Point(0, 0),
  2277               size=wx.Size(145, 24), style=0)
  2120               size=wx.Size(145, 24), style=0)
  2278 
  2121 
  2279         self.staticText2 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT2,
  2122         self.staticText2 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT2,
  2280               label='Class Filter:', name='staticText2', parent=self,
  2123               label='Class Filter:', name='staticText2', parent=self.VariablePanel,
  2281               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  2124               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  2282 
  2125 
  2283         self.ClassFilter = wx.Choice(id=ID_POUEDITORPANELCLASSFILTER,
  2126         self.ClassFilter = wx.Choice(id=ID_POUEDITORPANELCLASSFILTER,
  2284               name='ClassFilter', parent=self, pos=wx.Point(0, 0),
  2127               name='ClassFilter', parent=self.VariablePanel, pos=wx.Point(0, 0),
  2285               size=wx.Size(145, 24), style=0)
  2128               size=wx.Size(145, 24), style=0)
  2286         self.Bind(wx.EVT_CHOICE, self.OnClassFilter, id=ID_POUEDITORPANELCLASSFILTER)
  2129         self.Bind(wx.EVT_CHOICE, self.OnClassFilter, id=ID_POUEDITORPANELCLASSFILTER)
  2287 
  2130 
  2288         self.VariablesGrid = wx.grid.Grid(id=ID_POUEDITORPANELVARIABLESGRID,
  2131         self.VariablesGrid = wx.grid.Grid(id=ID_POUEDITORPANELVARIABLESGRID,
  2289               name='VariablesGrid', parent=self, pos=wx.Point(0, 0), 
  2132               name='VariablesGrid', parent=self.VariablePanel, pos=wx.Point(0, 0), 
  2290               size=wx.Size(0, 150), style=wx.VSCROLL)
  2133               size=wx.Size(0, 150), style=wx.VSCROLL)
  2291         self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
  2134         self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
  2292               'Sans'))
  2135               'Sans'))
  2293         self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
  2136         self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
  2294               False, 'Sans'))
  2137               False, 'Sans'))
  2295         self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange)
  2138         self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange)
  2296         self.VariablesGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnVariablesGridSelectCell)
  2139         self.VariablesGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnVariablesGridSelectCell)
  2297         self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick)
  2140         self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick)
  2298         
  2141         self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnVariablesGridEditorShown)
  2299         self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
  2142         self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
  2300         
  2143         
  2301         self.AddButton = wx.Button(id=ID_POUEDITORPANELADDBUTTON, label='Add',
  2144         self.AddButton = wx.Button(id=ID_POUEDITORPANELADDBUTTON, label='Add',
  2302               name='AddButton', parent=self, pos=wx.Point(345, 340),
  2145               name='AddButton', parent=self.VariablePanel, pos=wx.Point(345, 340),
  2303               size=wx.Size(72, 32), style=0)
  2146               size=wx.Size(72, 32), style=0)
  2304         self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_POUEDITORPANELADDBUTTON)
  2147         self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_POUEDITORPANELADDBUTTON)
  2305 
  2148 
  2306         self.DeleteButton = wx.Button(id=ID_POUEDITORPANELDELETEBUTTON, label='Delete',
  2149         self.DeleteButton = wx.Button(id=ID_POUEDITORPANELDELETEBUTTON, label='Delete',
  2307               name='DeleteButton', parent=self, pos=wx.Point(425, 340),
  2150               name='DeleteButton', parent=self.VariablePanel, pos=wx.Point(425, 340),
  2308               size=wx.Size(72, 32), style=0)
  2151               size=wx.Size(72, 32), style=0)
  2309         self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_POUEDITORPANELDELETEBUTTON)
  2152         self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_POUEDITORPANELDELETEBUTTON)
  2310 
  2153 
  2311         self.UpButton = wx.Button(id=ID_POUEDITORPANELUPBUTTON, label='^',
  2154         self.UpButton = wx.Button(id=ID_POUEDITORPANELUPBUTTON, label='^',
  2312               name='UpButton', parent=self, pos=wx.Point(505, 340),
  2155               name='UpButton', parent=self.VariablePanel, pos=wx.Point(505, 340),
  2313               size=wx.Size(32, 32), style=0)
  2156               size=wx.Size(32, 32), style=0)
  2314         self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_POUEDITORPANELUPBUTTON)
  2157         self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_POUEDITORPANELUPBUTTON)
  2315 
  2158 
  2316         self.DownButton = wx.Button(id=ID_POUEDITORPANELDOWNBUTTON, label='v',
  2159         self.DownButton = wx.Button(id=ID_POUEDITORPANELDOWNBUTTON, label='v',
  2317               name='DownButton', parent=self, pos=wx.Point(545, 340),
  2160               name='DownButton', parent=self.VariablePanel, pos=wx.Point(545, 340),
  2318               size=wx.Size(32, 32), style=0)
  2161               size=wx.Size(32, 32), style=0)
  2319         self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_POUEDITORPANELDOWNBUTTON)
  2162         self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_POUEDITORPANELDOWNBUTTON)
       
  2163 
       
  2164         self.SplitHorizontally(self.Viewer, self.VariablePanel, -200)
  2320 
  2165 
  2321         self._init_sizers()
  2166         self._init_sizers()
  2322 
  2167 
  2323     def __init__(self, parent, window, controler, element_type, pou_name = None, transition_name = None, action_name = None, config_name = None, resource_name = None):
  2168     def __init__(self, parent, window, controler, element_type, pou_name = None, transition_name = None, action_name = None, config_name = None, resource_name = None):
  2324         self.Parent = window
  2169         self.Parent = window
  2352             "   External" : "External", "Variables" : "Variables", "   Local" : "Local",
  2197             "   External" : "External", "Variables" : "Variables", "   Local" : "Local",
  2353             "   Temp" : "Temp", "Global" : "Global", "Access" : "Access"}
  2198             "   Temp" : "Temp", "Global" : "Global", "Access" : "Access"}
  2354         
  2199         
  2355         if pou_type in ["config", "resource"]:
  2200         if pou_type in ["config", "resource"]:
  2356             self.DefaultTypes = {"All" : "Global"}
  2201             self.DefaultTypes = {"All" : "Global"}
  2357             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"}
  2202             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : "True"}
  2358         else:
  2203         else:
  2359             self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
  2204             self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
  2360             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"}
  2205             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : "True"}
  2361         if pou_type in ["config", "resource"] or pou_type == "program":
  2206         if pou_type in ["config", "resource"] or pou_type == "program":
  2362             self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"])
  2207             self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant", "Edit"])
  2363             if pou_type not in ["config", "resource"]:
  2208             if pou_type not in ["config", "resource"]:
  2364                 self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp","Global","Access"]
  2209                 self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp","Global","Access"]
  2365             else:
  2210             else:
  2366                 self.FilterChoices = ["All","Global","Access"]
  2211                 self.FilterChoices = ["All","Global","Access"]
  2367             self.ColSizes = [40, 80, 70, 80, 80, 80, 60, 70]
  2212             self.ColSizes = [40, 80, 70, 80, 80, 80, 60, 70, 50]
  2368             self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER]
  2213             self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER, wx.ALIGN_LEFT]
  2369         else:
  2214         else:
  2370             self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Initial Value", "Retain", "Constant"])
  2215             self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Initial Value", "Retain", "Constant", "Edit"])
  2371             self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp"]
  2216             self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp"]
  2372             self.ColSizes = [40, 120, 70, 80, 120, 60, 70]
  2217             self.ColSizes = [40, 120, 70, 80, 120, 60, 70, 50]
  2373             self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER]
  2218             self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER, wx.ALIGN_LEFT]
  2374         for choice in self.FilterChoices:
  2219         for choice in self.FilterChoices:
  2375             self.ClassFilter.Append(choice)
  2220             self.ClassFilter.Append(choice)
  2376         reverse_transfer = {}
  2221         reverse_transfer = {}
  2377         for filter, choice in self.FilterChoiceTransfer.items():
  2222         for filter, choice in self.FilterChoiceTransfer.items():
  2378             reverse_transfer[choice] = filter
  2223             reverse_transfer[choice] = filter
  2379         self.ClassFilter.SetStringSelection(reverse_transfer[self.Filter])
  2224         self.ClassFilter.SetStringSelection(reverse_transfer[self.Filter])
  2380         self.RefreshTypeList()
  2225         self.RefreshTypeList()
  2381 
  2226 
  2382         self.OptionList = "Yes,No"
  2227         self.OptionList = "Yes,No"
  2383         self.TypeList = ",".join([value for value, parent in TypeHierarchy_list if not value.startswith("ANY")])
  2228         self.TypeList = [value for value, parent in TypeHierarchy_list if not value.startswith("ANY")]
  2384         
  2229         
  2385         if pou_type == "function":
  2230         if pou_type == "function":
  2386             for value, parent in TypeHierarchy_list:
  2231             for value, parent in TypeHierarchy_list:
  2387                 if not value.startswith("ANY"):
  2232                 if not value.startswith("ANY"):
  2388                     self.ReturnType.Append(value)
  2233                     self.ReturnType.Append(value)
  2422             self.Values = self.Controler.GetConfigurationResourceGlobalVars(self.ConfigName, self.ResourceName)
  2267             self.Values = self.Controler.GetConfigurationResourceGlobalVars(self.ConfigName, self.ResourceName)
  2423         else:
  2268         else:
  2424             self.PouIsUsed = self.Controler.PouIsUsed(self.PouName)
  2269             self.PouIsUsed = self.Controler.PouIsUsed(self.PouName)
  2425             returnType = self.Controler.GetCurrentElementEditingInterfaceReturnType()
  2270             returnType = self.Controler.GetCurrentElementEditingInterfaceReturnType()
  2426             self.Values = self.Controler.GetCurrentElementEditingInterfaceVars()
  2271             self.Values = self.Controler.GetCurrentElementEditingInterfaceVars()
       
  2272         
       
  2273         if returnType and self.ReturnType.IsEnabled():
       
  2274             self.ReturnType.SetStringSelection(returnType)
       
  2275         
       
  2276         self.RefreshValues()
       
  2277         self.RefreshViewerVarList()
       
  2278         self.RefreshButtons()
       
  2279         self.Viewer.RefreshView()
       
  2280     
       
  2281     def RefreshViewerVarList(self):
       
  2282         if self.ElementType not in ["config", "ressource"]:
  2427             varlist = [var["Name"] for var in self.Values]
  2283             varlist = [var["Name"] for var in self.Values]
  2428             if self.ElementType == "transtion":
  2284             if self.ElementType == "transition":
  2429                 language = self.Controler.GetTransitionBodyType(self.PouName, self.TransitionName)
  2285                 language = self.Controler.GetTransitionBodyType(self.PouName, self.TransitionName)
  2430                 varlist.append(self.ActionName)
  2286                 varlist.append(self.TransitionName)
  2431             elif self.ElementType == "action":
  2287             elif self.ElementType == "action":
  2432                 language = self.Controler.GetActionBodyType(self.PouName, self.ActionName)
  2288                 language = self.Controler.GetActionBodyType(self.PouName, self.ActionName)
  2433                 varlist.append(self.ActionName)
  2289                 varlist.append(self.ActionName)
  2434             else:
  2290             else:
  2435                 language = self.Controler.GetPouBodyType(self.PouName)
  2291                 language = self.Controler.GetPouBodyType(self.PouName)
  2436                 varlist.append(self.PouName)
  2292                 varlist.append(self.PouName)
  2437             if language in ["IL", "ST"]:
  2293             if language in ["IL", "ST"]:
  2438                 self.Viewer.SetVariables(varlist)
  2294                 self.Viewer.SetVariables(varlist)
  2439                 self.Viewer.SetFunctions(self.Controler.GetBlockTypes())
  2295                 self.Viewer.SetFunctions(self.Controler.GetBlockTypes())
  2440         
       
  2441         if returnType and self.ReturnType.IsEnabled():
       
  2442             self.ReturnType.SetStringSelection(returnType)
       
  2443         self.RefreshValues()
       
  2444         self.RefreshButtons()
       
  2445         self.Viewer.RefreshView()
       
  2446     
  2296     
  2447     def OnClassFilter(self, event):
  2297     def OnClassFilter(self, event):
  2448         self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()]
  2298         self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()]
  2449         self.RefreshTypeList()
  2299         self.RefreshTypeList()
  2450         self.RefreshValues()
  2300         self.RefreshValues()
  2478         if self.Filter in self.DefaultTypes:
  2328         if self.Filter in self.DefaultTypes:
  2479             new_row["Class"] = self.DefaultTypes[self.Filter]
  2329             new_row["Class"] = self.DefaultTypes[self.Filter]
  2480         else:
  2330         else:
  2481             new_row["Class"] = self.Filter
  2331             new_row["Class"] = self.Filter
  2482         self.Values.append(new_row)
  2332         self.Values.append(new_row)
       
  2333         self.SaveValues()
  2483         self.RefreshValues()
  2334         self.RefreshValues()
  2484         self.RefreshButtons()
  2335         self.RefreshButtons()
  2485         event.Skip()
  2336         event.Skip()
  2486 
  2337 
  2487     def OnDeleteButton(self, event):
  2338     def OnDeleteButton(self, event):
  2488         row = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow())
  2339         row = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow())
  2489         self.Values.remove(row)
  2340         self.Values.remove(row)
       
  2341         self.SaveValues()
  2490         self.RefreshValues()
  2342         self.RefreshValues()
  2491         self.RefreshButtons()
  2343         self.RefreshButtons()
  2492         event.Skip()
  2344         event.Skip()
  2493 
  2345 
  2494     def OnUpButton(self, event):
  2346     def OnUpButton(self, event):
  2532                 if old_value != "":
  2384                 if old_value != "":
  2533                     self.Controler.UpdateCurrentPouEditingUsedVariable(old_value, value)
  2385                     self.Controler.UpdateCurrentPouEditingUsedVariable(old_value, value)
  2534                 self.Controler.BufferProject()
  2386                 self.Controler.BufferProject()
  2535                 self.Parent.RefreshTitle()
  2387                 self.Parent.RefreshTitle()
  2536                 self.Parent.RefreshEditMenu()
  2388                 self.Parent.RefreshEditMenu()
       
  2389                 self.RefreshViewerVarList()
  2537                 self.Viewer.RefreshView()
  2390                 self.Viewer.RefreshView()
  2538                 event.Skip()
  2391                 event.Skip()
  2539         else:
  2392         else:
  2540             self.SaveValues()
  2393             self.SaveValues()
  2541             event.Skip()
  2394             event.Skip()
  2542 
  2395 
       
  2396     def OnVariablesGridCellLeftClick(self, event):
       
  2397         if event.GetCol() == "#":
       
  2398             row = event.GetRow()
       
  2399             var_name = self.Table.GetValueByName(row, "Name")
       
  2400             var_class = self.Table.GetValueByName(row, "Class")
       
  2401             var_type = self.Table.GetValueByName(row, "Type")
       
  2402             data = wx.TextDataObject(str((var_name, var_class, var_type)))
       
  2403             dragSource = wx.DropSource(self.VariablesGrid)
       
  2404             dragSource.SetData(data)
       
  2405             dragSource.DoDragDrop()
       
  2406         event.Skip()
       
  2407     
       
  2408     def OnVariablesGridEditorShown(self, event):
       
  2409         row, col = event.GetRow(), event.GetCol() 
       
  2410         if self.Table.GetColLabelValue(col) == "Type":
       
  2411             type_menu = wx.Menu(title='')
       
  2412             base_menu = wx.Menu(title='')
       
  2413             for base_type in self.TypeList:
       
  2414                 new_id = wx.NewId()
       
  2415                 base_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
       
  2416                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id)
       
  2417             type_menu.AppendMenu(-1, "Base Types", base_menu, '')
       
  2418             functionblock_menu = wx.Menu(title='')
       
  2419             for functionblock_type in self.Controler.GetFunctionBlockTypes():
       
  2420                 new_id = wx.NewId()
       
  2421                 functionblock_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
       
  2422                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
       
  2423             type_menu.AppendMenu(-1, "Function Block Types", functionblock_menu, '')
       
  2424             rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col))
       
  2425             self.VariablesGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.VariablesGrid.GetColLabelSize())
       
  2426             event.Veto()
       
  2427         else:
       
  2428             event.Skip()
       
  2429     
       
  2430     def GetVariableTypeFunction(self, base_type):
       
  2431         def VariableTypeFunction(event):
       
  2432             row = self.VariablesGrid.GetGridCursorRow()
       
  2433             self.Table.SetValueByName(row, "Type", base_type)
       
  2434             self.SaveValues()
       
  2435             self.Table.ResetView(self.VariablesGrid)
       
  2436             event.Skip()
       
  2437         return VariableTypeFunction
       
  2438     
  2543     def OnVariablesGridCellLeftClick(self, event):
  2439     def OnVariablesGridCellLeftClick(self, event):
  2544         if event.GetCol() == 0:
  2440         if event.GetCol() == 0:
  2545             row = event.GetRow()
  2441             row = event.GetRow()
  2546             var_name = self.Table.GetValueByName(row, "Name")
  2442             var_name = self.Table.GetValueByName(row, "Name")
  2547             var_class = self.Table.GetValueByName(row, "Class")
  2443             var_class = self.Table.GetValueByName(row, "Class")
  2587             self.Controler.SetPouInterfaceVars(self.PouName, self.Values)
  2483             self.Controler.SetPouInterfaceVars(self.PouName, self.Values)
  2588         if buffer:
  2484         if buffer:
  2589             self.Controler.BufferProject()
  2485             self.Controler.BufferProject()
  2590             self.Parent.RefreshTitle()
  2486             self.Parent.RefreshTitle()
  2591             self.Parent.RefreshEditMenu()
  2487             self.Parent.RefreshEditMenu()
  2592 
       
  2593 ##[ID_EDITVARIABLEDIALOG, ID_EDITVARIABLEDIALOGMAINPANEL, 
       
  2594 ## ID_EDITVARIABLEDIALOGVARIABLESGRID, ID_EDITVARIABLEDIALOGRETURNTYPE, 
       
  2595 ## ID_EDITVARIABLEDIALOGCLASSFILTER, ID_EDITVARIABLEDIALOGADDBUTTON,
       
  2596 ## ID_EDITVARIABLEDIALOGDELETEBUTTON, ID_EDITVARIABLEDIALOGUPBUTTON, 
       
  2597 ## ID_EDITVARIABLEDIALOGDOWNBUTTON, ID_EDITVARIABLEDIALOGSTATICTEXT1, 
       
  2598 ## ID_EDITVARIABLEDIALOGSTATICTEXT2, ID_EDITVARIABLEDIALOGSTATICTEXT3,
       
  2599 ##] = [wx.NewId() for _init_ctrls in range(12)]
       
  2600 ##
       
  2601 ##class EditVariableDialog(wx.Dialog):
       
  2602 ##    def _init_coll_flexGridSizer1_Items(self, parent):
       
  2603 ##        parent.AddWindow(self.MainPanel, 0, border=0, flag=0)
       
  2604 ##        parent.AddWindow(self.ButtonSizer, 0, border=0, flag=wx.ALIGN_RIGHT)
       
  2605 ##
       
  2606 ##    def _init_sizers(self):
       
  2607 ##        self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
       
  2608 ##
       
  2609 ##        self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
       
  2610 ##
       
  2611 ##        self.SetSizer(self.flexGridSizer1)
       
  2612 ##
       
  2613 ##    def _init_ctrls(self, prnt, name):
       
  2614 ##        wx.Dialog.__init__(self, id=ID_EDITVARIABLEDIALOG,
       
  2615 ##              name='EditVariableDialog', parent=prnt, pos=wx.Point(376, 223),
       
  2616 ##              size=wx.Size(600, 440), style=wx.DEFAULT_DIALOG_STYLE,
       
  2617 ##              title='Edit variables of %s'%name)
       
  2618 ##        self.SetClientSize(wx.Size(600, 440))
       
  2619 ##
       
  2620 ##        self.MainPanel = wx.Panel(id=ID_EDITVARIABLEDIALOGMAINPANEL,
       
  2621 ##              name='MainPanel', parent=self, pos=wx.Point(0, 0),
       
  2622 ##              size=wx.Size(600, 440), style=wx.TAB_TRAVERSAL)
       
  2623 ##        self.MainPanel.SetAutoLayout(True)
       
  2624 ##
       
  2625 ##        self.staticText1 = wx.StaticText(id=ID_EDITVARIABLEDIALOGSTATICTEXT1,
       
  2626 ##              label='Return Type:', name='staticText1', parent=self.MainPanel,
       
  2627 ##              pos=wx.Point(24, 29), size=wx.Size(95, 17), style=0)
       
  2628 ##
       
  2629 ##        self.ReturnType = wx.Choice(id=ID_EDITVARIABLEDIALOGRETURNTYPE,
       
  2630 ##              name='ReturnType', parent=self.MainPanel, pos=wx.Point(124, 24),
       
  2631 ##              size=wx.Size(145, 24), style=0)
       
  2632 ##
       
  2633 ##        self.staticText2 = wx.StaticText(id=ID_EDITVARIABLEDIALOGSTATICTEXT2,
       
  2634 ##              label='Class Filter:', name='staticText2', parent=self.MainPanel,
       
  2635 ##              pos=wx.Point(324, 29), size=wx.Size(95, 17), style=0)
       
  2636 ##
       
  2637 ##        self.ClassFilter = wx.Choice(id=ID_EDITVARIABLEDIALOGCLASSFILTER,
       
  2638 ##              name='ClassFilter', parent=self.MainPanel, pos=wx.Point(424, 24),
       
  2639 ##              size=wx.Size(145, 24), style=0)
       
  2640 ##        self.Bind(wx.EVT_CHOICE, self.OnClassFilter, id=ID_EDITVARIABLEDIALOGCLASSFILTER)
       
  2641 ##
       
  2642 ##        self.staticText3 = wx.StaticText(id=ID_EDITVARIABLEDIALOGSTATICTEXT3,
       
  2643 ##              label='Variables:', name='staticText3', parent=self.MainPanel,
       
  2644 ##              pos=wx.Point(24, 60), size=wx.Size(95, 17), style=0)
       
  2645 ##
       
  2646 ##        self.VariablesGrid = wx.grid.Grid(id=ID_EDITVARIABLEDIALOGVARIABLESGRID,
       
  2647 ##              name='VariablesGrid', parent=self.MainPanel, pos=wx.Point(24, 80), 
       
  2648 ##              size=wx.Size(550, 250), style=wx.VSCROLL)
       
  2649 ##        self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
       
  2650 ##              'Sans'))
       
  2651 ##        self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
       
  2652 ##              False, 'Sans'))
       
  2653 ##        self.VariablesGrid.DisableDragGridSize()
       
  2654 ##        self.VariablesGrid.EnableScrolling(False, True)
       
  2655 ##        self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange)
       
  2656 ##        self.VariablesGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnVariablesGridSelectCell)
       
  2657 ##
       
  2658 ##        self.AddButton = wx.Button(id=ID_EDITVARIABLEDIALOGADDBUTTON, label='Add',
       
  2659 ##              name='AddButton', parent=self.MainPanel, pos=wx.Point(345, 340),
       
  2660 ##              size=wx.Size(72, 32), style=0)
       
  2661 ##        self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_EDITVARIABLEDIALOGADDBUTTON)
       
  2662 ##
       
  2663 ##        self.DeleteButton = wx.Button(id=ID_EDITVARIABLEDIALOGDELETEBUTTON, label='Delete',
       
  2664 ##              name='DeleteButton', parent=self.MainPanel, pos=wx.Point(425, 340),
       
  2665 ##              size=wx.Size(72, 32), style=0)
       
  2666 ##        self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_EDITVARIABLEDIALOGDELETEBUTTON)
       
  2667 ##
       
  2668 ##        self.UpButton = wx.Button(id=ID_EDITVARIABLEDIALOGUPBUTTON, label='^',
       
  2669 ##              name='UpButton', parent=self.MainPanel, pos=wx.Point(505, 340),
       
  2670 ##              size=wx.Size(32, 32), style=0)
       
  2671 ##        self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_EDITVARIABLEDIALOGUPBUTTON)
       
  2672 ##
       
  2673 ##        self.DownButton = wx.Button(id=ID_EDITVARIABLEDIALOGDOWNBUTTON, label='v',
       
  2674 ##              name='DownButton', parent=self.MainPanel, pos=wx.Point(545, 340),
       
  2675 ##              size=wx.Size(32, 32), style=0)
       
  2676 ##        self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_EDITVARIABLEDIALOGDOWNBUTTON)
       
  2677 ##
       
  2678 ##        self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
       
  2679 ##        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())       
       
  2680 ##
       
  2681 ##        self._init_sizers()
       
  2682 ##
       
  2683 ##    def __init__(self, parent, name, pou_type, pou_is_used, filter = "All"):
       
  2684 ##        self._init_ctrls(parent, name)
       
  2685 ##
       
  2686 ##        self.Filter = filter
       
  2687 ##        self.PouIsUsed = pou_is_used
       
  2688 ##        self.FilterChoices = []
       
  2689 ##        self.FilterChoiceTransfer = {"All" : "All", "Interface" : "Interface", 
       
  2690 ##            "   Input" : "Input", "   Output" : "Output", "   InOut" : "InOut", 
       
  2691 ##            "   External" : "External", "Variables" : "Variables", "   Local" : "Local",
       
  2692 ##            "   Temp" : "Temp", "Global" : "Global", "Access" : "Access"}
       
  2693 ##        
       
  2694 ##        if pou_type:
       
  2695 ##            self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
       
  2696 ##            self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"}
       
  2697 ##        else:
       
  2698 ##            self.DefaultTypes = {"All" : "Global"}
       
  2699 ##            self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"}
       
  2700 ##        if not pou_type or pou_type == "program":
       
  2701 ##            self.Table = VariableTable(self, [], ["Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"])
       
  2702 ##            if pou_type:
       
  2703 ##                self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp","Global","Access"]
       
  2704 ##            else:
       
  2705 ##                self.FilterChoices = ["All","Global","Access"]
       
  2706 ##            self.ColSizes = [80, 70, 80, 80, 80, 60, 70]
       
  2707 ##            self.ColAlignements = [wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER]
       
  2708 ##        else:
       
  2709 ##            self.Table = VariableTable(self, [], ["Name", "Class", "Type", "Initial Value", "Retain", "Constant"])
       
  2710 ##            self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp"]
       
  2711 ##            self.ColSizes = [120, 70, 80, 120, 60, 70]
       
  2712 ##            self.ColAlignements = [wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER]
       
  2713 ##        for choice in self.FilterChoices:
       
  2714 ##            self.ClassFilter.Append(choice)
       
  2715 ##        reverse_transfer = {}
       
  2716 ##        for filter, choice in self.FilterChoiceTransfer.items():
       
  2717 ##            reverse_transfer[choice] = filter
       
  2718 ##        self.ClassFilter.SetStringSelection(reverse_transfer[self.Filter])
       
  2719 ##        self.RefreshTypeList()
       
  2720 ##        self.RefreshButtons()
       
  2721 ##
       
  2722 ##        self.OptionList = "Yes,No"
       
  2723 ##        self.TypeList = ",".join([value for value, parent in TypeHierarchy_list if not value.startswith("ANY")])
       
  2724 ##        
       
  2725 ##        if pou_type == "function":
       
  2726 ##            for value, parent in TypeHierarchy_list:
       
  2727 ##                if not value.startswith("ANY"):
       
  2728 ##                    self.ReturnType.Append(value)
       
  2729 ##            self.ReturnType.Enable(True)
       
  2730 ##        else:
       
  2731 ##            self.ReturnType.Enable(False)
       
  2732 ##            self.staticText2.Hide()
       
  2733 ##            self.ReturnType.Hide()
       
  2734 ##        
       
  2735 ##        self.VariablesGrid.SetTable(self.Table)
       
  2736 ##        self.VariablesGrid.SetRowLabelSize(0)
       
  2737 ##        
       
  2738 ##        self.Table.ResetView(self.VariablesGrid)
       
  2739 ##
       
  2740 ##        self.PouNames = []
       
  2741 ##
       
  2742 ##        if self.PouIsUsed:
       
  2743 ##            wx.CallAfter(self.WarningMessage, name)
       
  2744 ##    
       
  2745 ##    def WarningMessage(self, name):
       
  2746 ##        message = wx.MessageDialog(self, "\"%s\" is used by one or more POUs. Its interface can't be changed!"%name, "WARNING", wx.OK|wx.ICON_EXCLAMATION)
       
  2747 ##        message.ShowModal()
       
  2748 ##        message.Destroy()
       
  2749 ##    
       
  2750 ##    def OnOK(self, event):
       
  2751 ##        self.VariablesGrid.SetGridCursor(0, 0)
       
  2752 ##        error = []
       
  2753 ##        if self.ReturnType.IsEnabled() and self.ReturnType.GetStringSelection() == "":
       
  2754 ##            error.append("Return Type")
       
  2755 ##        if len(error) > 0:
       
  2756 ##            text = ""
       
  2757 ##            for i, item in enumerate(error):
       
  2758 ##                if i == 0:
       
  2759 ##                    text += item
       
  2760 ##                elif i == len(error) - 1:
       
  2761 ##                    text += " and %s"%item
       
  2762 ##                else:
       
  2763 ##                    text += ", %s"%item 
       
  2764 ##            message = wx.MessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wx.OK|wx.ICON_ERROR)
       
  2765 ##            message.ShowModal()
       
  2766 ##            message.Destroy()
       
  2767 ##        else:
       
  2768 ##            self.EndModal(wx.ID_OK)
       
  2769 ##
       
  2770 ##    def OnClassFilter(self, event):
       
  2771 ##        self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()]
       
  2772 ##        self.RefreshTypeList()
       
  2773 ##        self.RefreshValues()
       
  2774 ##        self.RefreshButtons()
       
  2775 ##        event.Skip()
       
  2776 ##
       
  2777 ##    def RefreshTypeList(self):
       
  2778 ##        if self.Filter == "All":
       
  2779 ##            self.ClassList = [self.FilterChoiceTransfer[choice] for choice in self.FilterChoices if self.FilterChoiceTransfer[choice] not in ["All","Interface","Variables"]]
       
  2780 ##        elif self.Filter == "Interface":
       
  2781 ##            self.ClassList = ["Input","Output","InOut","External"]
       
  2782 ##        elif self.Filter == "Variables":
       
  2783 ##            self.ClassList = ["Local","Temp"]
       
  2784 ##        else:
       
  2785 ##            self.ClassList = [self.Filter]
       
  2786 ##
       
  2787 ##    def RefreshButtons(self):
       
  2788 ##        table_length = len(self.Table.data)
       
  2789 ##        row_class = None
       
  2790 ##        if table_length and self.PouIsUsed:
       
  2791 ##            row = self.VariablesGrid.GetGridCursorRow()
       
  2792 ##            row_class = self.Table.GetValueByName(row, "Class")
       
  2793 ##        self.AddButton.Enable(not self.PouIsUsed or self.Filter not in ["Interface", "Input", "Output", "InOut"])
       
  2794 ##        self.DeleteButton.Enable(table_length > 0 and row_class not in ["Input", "Output", "InOut"])
       
  2795 ##        self.UpButton.Enable(table_length > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
       
  2796 ##        self.DownButton.Enable(table_length > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
       
  2797 ##    
       
  2798 ##    def OnAddButton(self, event):
       
  2799 ##        new_row = self.DefaultValue.copy()
       
  2800 ##        if self.Filter in self.DefaultTypes:
       
  2801 ##            new_row["Class"] = self.DefaultTypes[self.Filter]
       
  2802 ##        else:
       
  2803 ##            new_row["Class"] = self.Filter
       
  2804 ##        self.Values.append(new_row)
       
  2805 ##        self.RefreshValues()
       
  2806 ##        self.RefreshButtons()
       
  2807 ##        event.Skip()
       
  2808 ##
       
  2809 ##    def OnDeleteButton(self, event):
       
  2810 ##        row = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow())
       
  2811 ##        self.Values.remove(row)
       
  2812 ##        self.RefreshValues()
       
  2813 ##        self.RefreshButtons()
       
  2814 ##        event.Skip()
       
  2815 ##
       
  2816 ##    def OnUpButton(self, event):
       
  2817 ##        self.MoveValue(self.VariablesGrid.GetGridCursorRow(), -1)
       
  2818 ##        self.RefreshButtons()
       
  2819 ##        event.Skip()
       
  2820 ##
       
  2821 ##    def OnDownButton(self, event):
       
  2822 ##        self.MoveValue(self.VariablesGrid.GetGridCursorRow(), 1)
       
  2823 ##        self.RefreshButtons()
       
  2824 ##        event.Skip()
       
  2825 ##
       
  2826 ##    def OnVariablesGridCellChange(self, event):
       
  2827 ##        row, col = event.GetRow(), event.GetCol()
       
  2828 ##        colname = self.Table.GetColLabelValue(col)
       
  2829 ##        value = self.Table.GetValue(row, col)
       
  2830 ##        if colname == "Name":
       
  2831 ##            if not TestIdentifier(value):
       
  2832 ##                message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%value, "Error", wx.OK|wx.ICON_ERROR)
       
  2833 ##                message.ShowModal()
       
  2834 ##                message.Destroy()
       
  2835 ##                event.Veto()
       
  2836 ##            elif value.upper() in IEC_KEYWORDS:
       
  2837 ##                message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%value, "Error", wx.OK|wx.ICON_ERROR)
       
  2838 ##                message.ShowModal()
       
  2839 ##                message.Destroy()
       
  2840 ##                event.Veto()
       
  2841 ##            elif value.upper() in self.PouNames:
       
  2842 ##                message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%value, "Error", wx.OK|wx.ICON_ERROR)
       
  2843 ##                message.ShowModal()
       
  2844 ##                message.Destroy()
       
  2845 ##                event.Veto()
       
  2846 ##            elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]:
       
  2847 ##                message = wx.MessageDialog(self, "A variable with \"%s\" as name exists in this pou!"%value, "Error", wx.OK|wx.ICON_ERROR)
       
  2848 ##                message.ShowModal()
       
  2849 ##                message.Destroy()
       
  2850 ##                event.Veto()
       
  2851 ##            else:
       
  2852 ##                event.Skip()
       
  2853 ##        else:
       
  2854 ##            event.Skip()
       
  2855 ##
       
  2856 ##    def OnVariablesGridSelectCell(self, event):
       
  2857 ##        wx.CallAfter(self.RefreshButtons)
       
  2858 ##        event.Skip()
       
  2859 ##
       
  2860 ##    def SetPouNames(self, pou_names):
       
  2861 ##        self.PouNames = [pou_name.upper() for pou_name in pou_names]
       
  2862 ##
       
  2863 ##    def SetValues(self, values):
       
  2864 ##        for item, value in values.items():
       
  2865 ##            if item == "returnType" and value and self.ReturnType.IsEnabled():
       
  2866 ##                self.ReturnType.SetStringSelection(value)
       
  2867 ##            if item == "data":
       
  2868 ##                self.Values = value
       
  2869 ##        self.RefreshValues()
       
  2870 ##
       
  2871 ##    def MoveValue(self, value_index, move):
       
  2872 ##        new_index = max(0, min(value_index + move, len(self.Values) - 1))
       
  2873 ##        if new_index != value_index:
       
  2874 ##            self.Values.insert(new_index, self.Values.pop(value_index))
       
  2875 ##            self.RefreshValues()
       
  2876 ##            self.VariablesGrid.SetGridCursor(new_index, self.VariablesGrid.GetGridCursorCol())
       
  2877 ##        else:
       
  2878 ##            self.RefreshValues()
       
  2879 ##    
       
  2880 ##    def RefreshValues(self):
       
  2881 ##        if len(self.Table.data) > 0:
       
  2882 ##            self.VariablesGrid.SetGridCursor(0, 0)
       
  2883 ##        data = []
       
  2884 ##        for variable in self.Values:
       
  2885 ##            if variable["Class"] in self.ClassList:
       
  2886 ##                data.append(variable)
       
  2887 ##        self.Table.SetData(data)
       
  2888 ##        self.Table.ResetView(self.VariablesGrid)
       
  2889 ##                
       
  2890 ##    def GetValues(self):
       
  2891 ##        values = {}
       
  2892 ##        if self.ReturnType.IsEnabled():
       
  2893 ##            values["returnType"] = self.ReturnType.GetStringSelection()
       
  2894 ##        values["data"] = self.Values
       
  2895 ##        return values
       
  2896 
  2488 
  2897 #-------------------------------------------------------------------------------
  2489 #-------------------------------------------------------------------------------
  2898 #                               Exception Handler
  2490 #                               Exception Handler
  2899 #-------------------------------------------------------------------------------
  2491 #-------------------------------------------------------------------------------
  2900 
  2492