PLCOpenEditor.py
changeset 80 c798a68c5560
parent 71 0578bc212c20
child 82 119b62c73085
equal deleted inserted replaced
79:b22f661cbcfb 80:c798a68c5560
    62 if len(args) > 1:
    62 if len(args) > 1:
    63     usage()
    63     usage()
    64     sys.exit()
    64     sys.exit()
    65 elif len(args) == 1:
    65 elif len(args) == 1:
    66     fileOpen = args[0]
    66     fileOpen = args[0]
    67 CWD = ""
    67 CWD = os.path.split(__file__)[0]
    68 for path in sys.path:
       
    69     if os.path.isfile(os.path.join(path, "PLCOpenEditor.py")):
       
    70         CWD = path
       
    71 
    68 
    72 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORPROJECTTREE, 
    69 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORPROJECTTREE, 
    73  ID_PLCOPENEDITORSPLITTERWINDOW1, ID_PLCOPENEDITOREDITORPANEL,
    70  ID_PLCOPENEDITORSPLITTERWINDOW1, ID_PLCOPENEDITOREDITORPANEL,
    74  ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTOOLBAR,
    71  ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTOOLBAR,
    75  ID_PLCOPENEDITORDEFAULTTOOLBAR, ID_PLCOPENEDITORSFCTOOLBAR, 
    72  ID_PLCOPENEDITORDEFAULTTOOLBAR, ID_PLCOPENEDITORSFCTOOLBAR, 
   350         self.SetMenuBar(self.menuBar1)
   347         self.SetMenuBar(self.menuBar1)
   351         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame, id=ID_PLCOPENEDITOR)
   348         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame, id=ID_PLCOPENEDITOR)
   352         
   349         
   353         self.splitterWindow1 = wx.SplitterWindow(id=ID_PLCOPENEDITORSPLITTERWINDOW1,
   350         self.splitterWindow1 = wx.SplitterWindow(id=ID_PLCOPENEDITORSPLITTERWINDOW1,
   354               name='splitterWindow1', parent=self, point=wx.Point(0, 0),
   351               name='splitterWindow1', parent=self, point=wx.Point(0, 0),
   355               size=wx.Size(-1, -1), style=wx.SP_3D)
   352               size=wx.Size(0, 0), style=wx.SP_3D)
   356         self.splitterWindow1.SetNeedUpdating(True)
   353         self.splitterWindow1.SetNeedUpdating(True)
   357         self.splitterWindow1.SetMinimumPaneSize(1)
   354         self.splitterWindow1.SetMinimumPaneSize(1)
   358 
   355 
   359         self.EditorPanel = wx.Panel(id=ID_PLCOPENEDITOREDITORPANEL, 
   356         self.EditorPanel = wx.Panel(id=ID_PLCOPENEDITOREDITORPANEL, 
   360               name='TabPanel', parent=self.splitterWindow1, pos=wx.Point(0, 0),
   357               name='TabPanel', parent=self.splitterWindow1, pos=wx.Point(0, 0),
   361               size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL)
   358               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   362         
   359         
   363         self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
   360         self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
   364               name='TabsOpened', parent=self.EditorPanel, pos=wx.Point(0,
   361               name='TabsOpened', parent=self.EditorPanel, pos=wx.Point(0,
   365               0), size=wx.Size(-1, -1), style=0)
   362               0), size=wx.Size(0, 0), style=0)
   366         self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
   363         self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
   367               self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
   364               self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
   368 
   365 
   369         self.ToolBar = wx.ToolBar(id=ID_PLCOPENEDITORTOOLBAR, name='ToolBar',
   366         self.ToolBar = wx.ToolBar(id=ID_PLCOPENEDITORTOOLBAR, name='ToolBar',
   370               parent=self.EditorPanel, pos=wx.Point(0, 0), size=wx.Size(0, 40),
   367               parent=self.EditorPanel, pos=wx.Point(0, 0), size=wx.Size(0, 40),
   498             self.RefreshProjectTree()
   495             self.RefreshProjectTree()
   499         dialog.Destroy()
   496         dialog.Destroy()
   500 
   497 
   501     def OnCloseFrame(self, event):
   498     def OnCloseFrame(self, event):
   502         if not self.Controler.ProjectIsSaved():
   499         if not self.Controler.ProjectIsSaved():
   503             dialog = wx.MessageDialog(self, "There are changes, do you want to save?",  "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
   500             dialog = wx.MessageDialog(self, "There are changes, do you want to save?", "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
   504             answer = dialog.ShowModal()
   501             answer = dialog.ShowModal()
   505             dialog.Destroy()
   502             dialog.Destroy()
   506             if answer == wx.ID_YES:
   503             if answer == wx.ID_YES:
   507                 self.SaveProject()
   504                 self.SaveProject()
   508                 event.Skip()
   505                 event.Skip()
   509             elif answer == wx.ID_NO:
   506             elif answer == wx.ID_NO:
       
   507                 self.Controler.Reset()
       
   508                 wx.CallAfter(self.Close)
   510                 event.Skip()
   509                 event.Skip()
       
   510             else:
       
   511                 event.Veto()
   511         else:
   512         else:
   512             event.Skip()
   513             event.Skip()
   513 
   514 
   514     def OnNewProjectMenu(self, event):
   515     def OnNewProjectMenu(self, event):
   515         dialog = ProjectDialog(self)
   516         dialog = ProjectDialog(self)
   629     def OnPropertiesMenu(self, event):
   630     def OnPropertiesMenu(self, event):
   630         self.ShowProperties()
   631         self.ShowProperties()
   631         event.Skip()
   632         event.Skip()
   632 
   633 
   633     def OnQuitMenu(self, event):
   634     def OnQuitMenu(self, event):
   634         self.ToolBar.Reparent(self)
       
   635         self.Controler.Reset()
       
   636         self.Close()
   635         self.Close()
   637         event.Skip()
   636         event.Skip()
   638 
   637 
   639     def ResetCurrentMode(self):
   638     def ResetCurrentMode(self):
   640         selected = self.TabsOpened.GetSelection()
   639         selected = self.TabsOpened.GetSelection()
   893         name = self.ProjectTree.GetItemText(selected)
   892         name = self.ProjectTree.GetItemText(selected)
   894         data = self.ProjectTree.GetPyData(selected)
   893         data = self.ProjectTree.GetPyData(selected)
   895         if name == "Properties":
   894         if name == "Properties":
   896             self.ShowProperties()
   895             self.ShowProperties()
   897         elif data in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE, ITEM_CONFIGURATION]:
   896         elif data in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE, ITEM_CONFIGURATION]:
       
   897             idx = None
   898             if data == ITEM_CONFIGURATION:
   898             if data == ITEM_CONFIGURATION:
   899                 idx = self.Controler.OpenConfigurationEditing(name)
   899                 idx = self.Controler.OpenConfigurationEditing(name)
   900                 if idx != None:
   900                 if idx != None:
   901                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "config", config_name = name)
   901                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "config", config_name = name)
   902                     self.TabsOpened.AddPage(new_window, "")
   902                     self.TabsOpened.AddPage(new_window, "")
   914                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "resource", config_name = config_name, resource_name = name)
   914                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "resource", config_name = config_name, resource_name = name)
   915                     self.TabsOpened.AddPage(new_window, "")
   915                     self.TabsOpened.AddPage(new_window, "")
   916                 else:
   916                 else:
   917                     idx = self.Controler.ChangeConfigurationResourceEditing(config_name, name)
   917                     idx = self.Controler.ChangeConfigurationResourceEditing(config_name, name)
   918             elif data == ITEM_POU:
   918             elif data == ITEM_POU:
   919                 idx = self.Controler.OpenElementEditing(name)
   919                 idx = self.Controler.OpenPouEditing(name)
   920                 if idx != None:
   920                 if idx != None:
   921                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, self.Controler.GetPouType(name), pou_name = name)
   921                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, self.Controler.GetPouType(name), pou_name = name)
   922                     self.TabsOpened.AddPage(new_window, "")
   922                     self.TabsOpened.AddPage(new_window, "")
   923                 else:
   923                 else:
   924                     idx = self.Controler.ChangeElementEditing(name)
   924                     idx = self.Controler.ChangePouEditing(name)
   925             else:
   925             else:
   926                 parent = self.ProjectTree.GetItemParent(selected)
   926                 item = self.ProjectTree.GetItemParent(selected)
   927                 parent_name = self.ProjectTree.GetItemText(parent)
   927                 item_type = self.ProjectTree.GetPyData(item)
   928                 grandparent = self.ProjectTree.GetItemParent(parent)
   928                 while item_type != ITEM_POU:
   929                 grandparent_name = self.ProjectTree.GetItemText(grandparent)
   929                     item = self.ProjectTree.GetItemParent(item)
       
   930                     item_type = self.ProjectTree.GetPyData(item)
       
   931                 pou_name = self.ProjectTree.GetItemText(item)
   930                 if data == ITEM_TRANSITION:
   932                 if data == ITEM_TRANSITION:
   931                     idx = self.Controler.OpenPouTransitionEditing(grandparent_name, name)
   933                     idx = self.Controler.OpenPouTransitionEditing(pou_name, name)
   932                     if idx != None:
   934                     if idx != None:
   933                         new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "transition", pou_name = grandparent_name, transition_name = name)
   935                         new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "transition", pou_name = pou_name, transition_name = name)
   934                         self.TabsOpened.AddPage(new_window, "")
   936                         self.TabsOpened.AddPage(new_window, "")
   935                     else:
   937                     else:
   936                         idx = self.Controler.ChangePouTransitionEditing(grandparent_name, name)
   938                         idx = self.Controler.ChangePouTransitionEditing(pou_name, name)
   937                 elif data == ITEM_ACTION:
   939                 elif data == ITEM_ACTION:
   938                     idx = self.Controler.OpenPouActionEditing(grandparent_name, name)
   940                     idx = self.Controler.OpenPouActionEditing(pou_name, name)
   939                     if idx != None:
   941                     if idx != None:
   940                         new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "action", pou_name = grandparent_name, action_name = name)
   942                         new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "action", pou_name = pou_name, action_name = name)
   941                         self.TabsOpened.AddPage(new_window, "")
   943                         self.TabsOpened.AddPage(new_window, "")
   942                     else:
   944                     else:
   943                         idx = self.Controler.ChangePouActionEditing(grandparent_name, name)
   945                         idx = self.Controler.ChangePouActionEditing(pou_name, name)
   944             if idx != None:
   946             if idx != None:
   945                 old_selected = self.TabsOpened.GetSelection()
   947                 old_selected = self.TabsOpened.GetSelection()
   946                 if old_selected >= 0:
   948                 if old_selected >= 0:
   947                     self.TabsOpened.GetPage(old_selected).ResetBuffer()
   949                     self.TabsOpened.GetPage(old_selected).ResetBuffer()
   948                 self.TabsOpened.SetSelection(idx)
   950                 self.TabsOpened.SetSelection(idx)
   964         event.Skip()
   966         event.Skip()
   965     
   967     
   966     def OnProjectTreeItemSelected(self, event):
   968     def OnProjectTreeItemSelected(self, event):
   967         selected = event.GetItem()
   969         selected = event.GetItem()
   968         name = self.ProjectTree.GetItemText(selected)
   970         name = self.ProjectTree.GetItemText(selected)
   969         if self.ProjectTree.GetItemParent(selected) == self.ProjectTree.GetRootItem() and name != "Properties":
   971         data = self.ProjectTree.GetPyData(selected)
   970             if self.Controler.IsElementEditing(name):
   972         if data in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE, ITEM_CONFIGURATION]:
   971                 idx = self.Controler.ChangeElementEditing(name)
   973             idx = None
   972                 if idx != None:
   974             if data == ITEM_CONFIGURATION:
   973                     self.TabsOpened.SetSelection(idx)
   975                 if self.Controler.IsConfigurationEditing(name):
   974                     self.RefreshFileMenu()
   976                     idx = self.Controler.ChangeConfigurationEditing(name)
   975                     self.RefreshEditMenu()
   977             elif data == ITEM_RESOURCE:
   976                     self.RefreshToolBar()
   978                 item = self.ProjectTree.GetItemParent(selected)
   977         else:
   979                 item_type = self.ProjectTree.GetPyData(item)
   978             name = self.ProjectTree.GetItemText(selected)
   980                 while item_type != ITEM_CONFIGURATION:
   979             parent = self.ProjectTree.GetItemParent(selected)
   981                     item = self.ProjectTree.GetItemParent(item)
   980             parent_name = self.ProjectTree.GetItemText(parent)
   982                     item_type = self.ProjectTree.GetPyData(item)
   981             grandparent = self.ProjectTree.GetItemParent(parent)
   983                 config_name = self.ProjectTree.GetItemText(item)
   982             grandparent_name = self.ProjectTree.GetItemText(grandparent)
   984                 if self.Controler.IsConfigurationResourceEditing(config_name, name):
   983             if parent_name == "Transitions":
   985                     idx = self.Controler.ChangeConfigurationResourceEditing(config_name, name)
   984                 idx = self.Controler.ChangePouTransitionEditing(grandparent_name, name)
   986             elif data == ITEM_POU:
   985                 if idx != None:
   987                 if self.Controler.IsPouEditing(name):
   986                     self.TabsOpened.SetSelection(idx)
   988                     idx = self.Controler.ChangePouEditing(name)
   987                     self.RefreshFileMenu()
   989             else:
   988                     self.RefreshEditMenu()
   990                 item = self.ProjectTree.GetItemParent(selected)
   989                     self.RefreshToolBar()
   991                 item_type = self.ProjectTree.GetPyData(item)
   990             elif parent_name == "Action":
   992                 while item_type != ITEM_POU:
   991                 idx = self.Controler.ChangePouActionEditing(grandparent_name, name)
   993                     item = self.ProjectTree.GetItemParent(item)
   992                 if idx != None:
   994                     item_type = self.ProjectTree.GetPyData(item)
   993                     self.TabsOpened.SetSelection(idx)
   995                 pou_name = self.ProjectTree.GetItemText(item)
   994                     self.RefreshFileMenu()
   996                 if data == ITEM_TRANSITION:
   995                     self.RefreshEditMenu()
   997                     if self.Controler.IsPouTransitionEditing(pou_name, name):
   996                     self.RefreshToolBar()
   998                         idx = self.Controler.ChangePouTransitionEditing(pou_name, name)
       
   999                 elif data == ITEM_ACTION:
       
  1000                     if self.Controler.IsPouActionEditing(pou_name, name):
       
  1001                         idx = self.Controler.ChangePouActionEditing(pou_name, name)
       
  1002             if idx != None:
       
  1003                 old_selected = self.TabsOpened.GetSelection()
       
  1004                 if old_selected >= 0:
       
  1005                     self.TabsOpened.GetPage(old_selected).ResetBuffer()
       
  1006                 self.TabsOpened.SetSelection(idx)
       
  1007                 window = self.TabsOpened.GetPage(idx)
       
  1008                 window.RefreshView()
       
  1009                 self.RefreshTabsOpenedTitles()
       
  1010                 self.RefreshFileMenu()
       
  1011                 self.RefreshEditMenu()
       
  1012                 self.RefreshToolBar()
   997         event.Skip()
  1013         event.Skip()
   998 
  1014 
   999     def RefreshProjectTree(self):
  1015     def RefreshProjectTree(self):
  1000         infos = self.Controler.GetProjectInfos()
  1016         infos = self.Controler.GetProjectInfos()
  1001         root = self.ProjectTree.GetRootItem()
  1017         root = self.ProjectTree.GetRootItem()
  1064         if selected != -1:
  1080         if selected != -1:
  1065             self.TabsOpened.GetPage(selected).RefreshView()
  1081             self.TabsOpened.GetPage(selected).RefreshView()
  1066             self.TabsOpened.GetPage(selected).Refresh()
  1082             self.TabsOpened.GetPage(selected).Refresh()
  1067         self.RefreshTitle()
  1083         self.RefreshTitle()
  1068         self.RefreshEditMenu()
  1084         self.RefreshEditMenu()
       
  1085         self.RefreshProjectTree()
  1069         event.Skip()
  1086         event.Skip()
  1070     
  1087     
  1071     def OnRedoMenu(self, event):
  1088     def OnRedoMenu(self, event):
  1072         self.Controler.LoadNext()
  1089         self.Controler.LoadNext()
  1073         selected = self.TabsOpened.GetSelection()
  1090         selected = self.TabsOpened.GetSelection()
  1074         if selected != -1:
  1091         if selected != -1:
  1075             self.TabsOpened.GetPage(selected).RefreshView()
  1092             self.TabsOpened.GetPage(selected).RefreshView()
  1076             self.TabsOpened.GetPage(selected).Refresh()
  1093             self.TabsOpened.GetPage(selected).Refresh()
  1077         self.RefreshTitle()
  1094         self.RefreshTitle()
  1078         self.RefreshEditMenu()
  1095         self.RefreshEditMenu()
       
  1096         self.RefreshProjectTree()
  1079         event.Skip()
  1097         event.Skip()
  1080 
  1098 
  1081     def OnCutMenu(self, event):
  1099     def OnCutMenu(self, event):
  1082         selected = self.TabsOpened.GetSelection()
  1100         selected = self.TabsOpened.GetSelection()
  1083         if selected != -1:
  1101         if selected != -1:
  1110         dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1128         dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1111         dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  1129         dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  1112         if dialog.ShowModal() == wx.ID_OK:
  1130         if dialog.ShowModal() == wx.ID_OK:
  1113             values = dialog.GetValues()
  1131             values = dialog.GetValues()
  1114             self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  1132             self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
       
  1133             self.RefreshTitle()
       
  1134             self.RefreshEditMenu()
  1115             self.RefreshProjectTree()
  1135             self.RefreshProjectTree()
  1116         dialog.Destroy()
  1136         dialog.Destroy()
  1117         event.Skip()
  1137         event.Skip()
  1118 
  1138 
  1119     def OnRemovePouMenu(self, event):
  1139     def OnRemovePouMenu(self, event):
  1127                 for i in xrange(self.TabsOpened.GetPageCount()):
  1147                 for i in xrange(self.TabsOpened.GetPageCount()):
  1128                     if self.TabsOpened.GetPageText(i) == selected:
  1148                     if self.TabsOpened.GetPageText(i) == selected:
  1129                         deleted = i
  1149                         deleted = i
  1130                 if deleted != None:
  1150                 if deleted != None:
  1131                     self.TabsOpened.DeletePage(i)
  1151                     self.TabsOpened.DeletePage(i)
       
  1152                 self.RefreshTitle()
       
  1153                 self.RefreshEditMenu()
  1132                 self.RefreshProjectTree()
  1154                 self.RefreshProjectTree()
  1133                 self.RefreshToolBar()
  1155                 self.RefreshToolBar()
  1134             else:
  1156             else:
  1135                 message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  1157                 message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  1136                 message.ShowModal()
  1158                 message.ShowModal()
  1137                 message.Destroy()
  1159                 message.Destroy()
  1138         event.Skip()
  1160         event.Skip()
  1139 
  1161 
  1140     def OnAddConfigurationMenu(self, event):
  1162     def OnAddConfigurationMenu(self, event):
  1141         dialog = wx.TextEntryDialog(self, "Enter configuration name:", "Create new configuration", "", wx.OK|wx.CANCEL)
  1163         dialog = ConfigurationNameDialog(self, "Please enter configuration name", "Add new configuration")
       
  1164         dialog.SetPouNames(self.Controler.GetProjectPouNames())
       
  1165         dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  1142         if dialog.ShowModal() == wx.ID_OK:
  1166         if dialog.ShowModal() == wx.ID_OK:
  1143             value = dialog.GetValue()
  1167             value = dialog.GetValue()
  1144             self.Controler.ProjectAddConfiguration(value)
  1168             self.Controler.ProjectAddConfiguration(value)
       
  1169             self.RefreshTitle()
       
  1170             self.RefreshEditMenu()
  1145             self.RefreshProjectTree()
  1171             self.RefreshProjectTree()
  1146         dialog.Destroy()
  1172         dialog.Destroy()
  1147         event.Skip()
  1173         event.Skip()
  1148 
  1174 
  1149     def OnRemoveConfigurationMenu(self, event):
  1175     def OnRemoveConfigurationMenu(self, event):
  1150         configs = self.Controler.GetProjectConfigNames()
  1176         configs = self.Controler.GetProjectConfigNames()
  1151         dialog = wx.SingleChoiceDialog(self, "Select Configuration to remove:", "Remove configuration", configs, wx.OK|wx.CANCEL)
  1177         dialog = wx.SingleChoiceDialog(self, "Please select a configuration", "Remove configuration", configs, wx.OK|wx.CANCEL)
  1152         if dialog.ShowModal() == wx.ID_OK:
  1178         if dialog.ShowModal() == wx.ID_OK:
  1153             selected = dialog.GetStringSelection()
  1179             selected = dialog.GetStringSelection()
  1154             self.Controler.ProjectRemoveConfiguration(selected)
  1180             self.Controler.ProjectRemoveConfiguration(selected)
       
  1181             self.RefreshTitle()
       
  1182             self.RefreshEditMenu()
  1155             self.RefreshProjectTree()
  1183             self.RefreshProjectTree()
  1156         event.Skip()
  1184         event.Skip()
  1157 
  1185 
  1158     def OnAddPouTransitionMenu(self, event):
  1186     def OnAddPouTransitionMenu(self, event):
  1159         selected = self.ProjectTree.GetSelection()
  1187         selected = self.ProjectTree.GetSelection()
  1164                 dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1192                 dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1165                 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pouname))
  1193                 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pouname))
  1166                 if dialog.ShowModal() == wx.ID_OK: 
  1194                 if dialog.ShowModal() == wx.ID_OK: 
  1167                     values = dialog.GetValues()
  1195                     values = dialog.GetValues()
  1168                     self.Controler.ProjectAddPouTransition(pouname, values["transitionName"], values["language"])
  1196                     self.Controler.ProjectAddPouTransition(pouname, values["transitionName"], values["language"])
       
  1197                     self.RefreshTitle()
       
  1198                     self.RefreshEditMenu()
  1169                     self.RefreshProjectTree()
  1199                     self.RefreshProjectTree()
  1170                 dialog.Destroy()
  1200                 dialog.Destroy()
  1171         event.Skip()
  1201         event.Skip()
  1172 
  1202 
  1173     def OnRemovePouTransitionMenu(self, event):
  1203     def OnRemovePouTransitionMenu(self, event):
  1178                 transitions = self.Controler.GetPouTransitions(pouname)
  1208                 transitions = self.Controler.GetPouTransitions(pouname)
  1179                 dialog = wx.SingleChoiceDialog(self, "Select Transition to remove:", "Remove transition", transitions, wx.OK|wx.CANCEL)
  1209                 dialog = wx.SingleChoiceDialog(self, "Select Transition to remove:", "Remove transition", transitions, wx.OK|wx.CANCEL)
  1180                 if dialog.ShowModal() == wx.ID_OK: 
  1210                 if dialog.ShowModal() == wx.ID_OK: 
  1181                     selected = dialog.GetStringSelection()
  1211                     selected = dialog.GetStringSelection()
  1182                     self.Controler.ProjectRemovePouTransition(pouname, selected)
  1212                     self.Controler.ProjectRemovePouTransition(pouname, selected)
       
  1213                     self.RefreshTitle()
       
  1214                     self.RefreshEditMenu()
  1183                     self.RefreshProjectTree()
  1215                     self.RefreshProjectTree()
  1184                 dialog.Destroy()
  1216                 dialog.Destroy()
  1185         event.Skip()
  1217         event.Skip()
  1186 
  1218 
  1187     def OnAddPouActionMenu(self, event):
  1219     def OnAddPouActionMenu(self, event):
  1193                 dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1225                 dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1194                 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pouname))
  1226                 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pouname))
  1195                 if dialog.ShowModal() == wx.ID_OK:
  1227                 if dialog.ShowModal() == wx.ID_OK:
  1196                     values = dialog.GetValues()
  1228                     values = dialog.GetValues()
  1197                     self.Controler.ProjectAddPouAction(pouname, values["actionName"], values["language"])
  1229                     self.Controler.ProjectAddPouAction(pouname, values["actionName"], values["language"])
       
  1230                     self.RefreshTitle()
       
  1231                     self.RefreshEditMenu()
  1198                     self.RefreshProjectTree()
  1232                     self.RefreshProjectTree()
  1199                 dialog.Destroy()
  1233                 dialog.Destroy()
  1200         event.Skip()
  1234         event.Skip()
  1201 
  1235 
  1202     def OnRemovePouActionMenu(self, event):
  1236     def OnRemovePouActionMenu(self, event):
  1207                 actions = self.Controler.GetPouActions(pouname)
  1241                 actions = self.Controler.GetPouActions(pouname)
  1208                 dialog = wx.SingleChoiceDialog(self, "Select Action to remove:", "Remove action", actions, wx.OK|wx.CANCEL)
  1242                 dialog = wx.SingleChoiceDialog(self, "Select Action to remove:", "Remove action", actions, wx.OK|wx.CANCEL)
  1209                 if dialog.ShowModal() == wx.ID_OK: 
  1243                 if dialog.ShowModal() == wx.ID_OK: 
  1210                     selected = dialog.GetStringSelection()
  1244                     selected = dialog.GetStringSelection()
  1211                     self.Controler.ProjectRemovePouAction(pouname, selected)
  1245                     self.Controler.ProjectRemovePouAction(pouname, selected)
       
  1246                     self.RefreshTitle()
       
  1247                     self.RefreshEditMenu()
  1212                     self.RefreshProjectTree()
  1248                     self.RefreshProjectTree()
  1213                 dialog.Destroy()
  1249                 dialog.Destroy()
  1214         event.Skip()
  1250         event.Skip()
  1215 
  1251 
  1216     def OnAddResourceMenu(self, event):
  1252     def OnAddResourceMenu(self, event):
  1217         selected = self.ProjectTree.GetSelection()
  1253         selected = self.ProjectTree.GetSelection()
  1218         if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION:
  1254         if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION:
  1219             config_name = self.ProjectTree.GetItemText(selected)
  1255             config_name = self.ProjectTree.GetItemText(selected)
  1220             dialog = wx.TextEntryDialog(self, "Enter Resource name:", "Create new Resource", "", wx.OK|wx.CANCEL)
  1256             dialog = ResourceNameDialog(self, "Please enter resource name", "Add new resource")
       
  1257             dialog.SetPouNames(self.Controler.GetProjectPouNames())
       
  1258             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  1221             if dialog.ShowModal() == wx.ID_OK:
  1259             if dialog.ShowModal() == wx.ID_OK:
  1222                 value = dialog.GetValue()
  1260                 value = dialog.GetValue()
  1223                 self.Controler.ProjectAddConfigurationResource(config_name, value)
  1261                 self.Controler.ProjectAddConfigurationResource(config_name, value)
       
  1262                 self.RefreshTitle()
       
  1263                 self.RefreshEditMenu()
  1224                 self.RefreshProjectTree()
  1264                 self.RefreshProjectTree()
  1225             dialog.Destroy()
  1265             dialog.Destroy()
  1226         event.Skip()
  1266         event.Skip()
  1227 
  1267 
  1228     def OnRemoveResourceMenu(self, event):
  1268     def OnRemoveResourceMenu(self, event):
  1236                     resources = config["resources"]
  1276                     resources = config["resources"]
  1237             dialog = wx.SingleChoiceDialog(self, "Select Resource to remove:", "Remove resource", resources, wx.OK|wx.CANCEL)
  1277             dialog = wx.SingleChoiceDialog(self, "Select Resource to remove:", "Remove resource", resources, wx.OK|wx.CANCEL)
  1238             if dialog.ShowModal() == wx.ID_OK:
  1278             if dialog.ShowModal() == wx.ID_OK:
  1239                 resource = dialog.GetStringSelection()
  1279                 resource = dialog.GetStringSelection()
  1240                 self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
  1280                 self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
       
  1281                 self.RefreshTitle()
       
  1282                 self.RefreshEditMenu()
  1241                 self.RefreshProjectTree()
  1283                 self.RefreshProjectTree()
  1242             dialog.Destroy()
  1284             dialog.Destroy()
  1243         event.Skip()
  1285         event.Skip()
  1244 
  1286 
  1245     def OnPLCOpenMenu(self, event):
  1287     def OnPLCOpenMenu(self, event):
  1865         values["actionName"] = self.ActionName.GetValue()
  1907         values["actionName"] = self.ActionName.GetValue()
  1866         values["language"] = self.Language.GetStringSelection()
  1908         values["language"] = self.Language.GetStringSelection()
  1867         return values
  1909         return values
  1868 
  1910 
  1869 #-------------------------------------------------------------------------------
  1911 #-------------------------------------------------------------------------------
       
  1912 #                          Configuration Name Dialog
       
  1913 #-------------------------------------------------------------------------------
       
  1914 
       
  1915 class ConfigurationNameDialog(wx.TextEntryDialog):
       
  1916 
       
  1917     def __init__(self, parent, message, caption = "Please enter configuration name", defaultValue = "", 
       
  1918                        style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
       
  1919         wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
       
  1920         
       
  1921         self.PouNames = []
       
  1922         self.PouElementNames = []
       
  1923         
       
  1924         self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetAffirmativeButton().GetId())
       
  1925         
       
  1926     def OnOK(self, event):
       
  1927         config_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
       
  1928         if config_name == "":
       
  1929             message = wx.MessageDialog(self, "You must type a name!", "Error", wx.OK|wx.ICON_ERROR)
       
  1930             message.ShowModal()
       
  1931             message.Destroy()
       
  1932         elif not TestIdentifier(config_name):
       
  1933             message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%config_name, "Error", wx.OK|wx.ICON_ERROR)
       
  1934             message.ShowModal()
       
  1935             message.Destroy()
       
  1936         elif config_name.upper() in IEC_KEYWORDS:
       
  1937             message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%config_name, "Error", wx.OK|wx.ICON_ERROR)
       
  1938             message.ShowModal()
       
  1939             message.Destroy()
       
  1940         elif config_name.upper() in self.PouNames:
       
  1941             message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%config_name, "Error", wx.OK|wx.ICON_ERROR)
       
  1942             message.ShowModal()
       
  1943             message.Destroy()
       
  1944         elif config_name.upper() in self.PouElementNames:
       
  1945             message = wx.MessageDialog(self, "A pou has an element with \"%s\" for name. It can generate a conflict. Do you wish to continue?"%config_name, "Warning", wx.YES_NO|wx.ICON_EXCLAMATION)
       
  1946             result = message.ShowModal()
       
  1947             message.Destroy()
       
  1948             if result == wx.ID_YES:
       
  1949                 self.EndModal(wx.ID_OK)
       
  1950         else:
       
  1951             self.EndModal(wx.ID_OK)
       
  1952 
       
  1953     def SetPouNames(self, pou_names):
       
  1954         self.PouNames = [pou_name.upper() for pou_name in pou_names]
       
  1955     
       
  1956     def SetPouElementNames(self, pou_names):
       
  1957         self.PouElementNames = [pou_name.upper() for pou_name in pou_names]
       
  1958     
       
  1959     def GetValue(self):
       
  1960         return self.GetSizer().GetItem(1).GetWindow().GetValue()
       
  1961 
       
  1962 #-------------------------------------------------------------------------------
       
  1963 #                          Resource Name Dialog
       
  1964 #-------------------------------------------------------------------------------
       
  1965 
       
  1966 class ResourceNameDialog(wx.TextEntryDialog):
       
  1967 
       
  1968     def __init__(self, parent, message, caption = "Please enter resource name", defaultValue = "", 
       
  1969                        style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
       
  1970         wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
       
  1971         
       
  1972         self.PouNames = []
       
  1973         self.PouElementNames = []
       
  1974         
       
  1975         self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetAffirmativeButton().GetId())
       
  1976         
       
  1977     def OnOK(self, event):
       
  1978         resource_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
       
  1979         if resource_name == "":
       
  1980             message = wx.MessageDialog(self, "You must type a name!", "Error", wx.OK|wx.ICON_ERROR)
       
  1981             message.ShowModal()
       
  1982             message.Destroy()
       
  1983         elif not TestIdentifier(resource_name):
       
  1984             message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%resource_name, "Error", wx.OK|wx.ICON_ERROR)
       
  1985             message.ShowModal()
       
  1986             message.Destroy()
       
  1987         elif resource_name.upper() in IEC_KEYWORDS:
       
  1988             message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%resource_name, "Error", wx.OK|wx.ICON_ERROR)
       
  1989             message.ShowModal()
       
  1990             message.Destroy()
       
  1991         elif resource_name.upper() in self.PouNames:
       
  1992             message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%resource_name, "Error", wx.OK|wx.ICON_ERROR)
       
  1993             message.ShowModal()
       
  1994             message.Destroy()
       
  1995         elif resource_name.upper() in self.PouElementNames:
       
  1996             message = wx.MessageDialog(self, "A pou has an element with \"%s\" for name. It can generate a conflict. Do you wish to continue?"%resource_name, "Warning", wx.YES_NO|wx.ICON_EXCLAMATION)
       
  1997             result = message.ShowModal()
       
  1998             message.Destroy()
       
  1999             if result == wx.ID_YES:
       
  2000                 self.EndModal(wx.ID_OK)
       
  2001         else:
       
  2002             self.EndModal(wx.ID_OK)
       
  2003 
       
  2004     def SetPouNames(self, pou_names):
       
  2005         self.PouNames = [pou_name.upper() for pou_name in pou_names]
       
  2006     
       
  2007     def SetPouElementNames(self, pou_names):
       
  2008         self.PouElementNames = [pou_name.upper() for pou_name in pou_names]
       
  2009     
       
  2010     def GetValue(self):
       
  2011         return self.GetSizer().GetItem(1).GetWindow().GetValue()
       
  2012 
       
  2013 #-------------------------------------------------------------------------------
  1870 #                            Pou Editor Panel
  2014 #                            Pou Editor Panel
  1871 #-------------------------------------------------------------------------------
  2015 #-------------------------------------------------------------------------------
  1872 
  2016 
  1873 class VariableTable(wx.grid.PyGridTableBase):
  2017 class VariableTable(wx.grid.PyGridTableBase):
  1874     
  2018     
  1902         return row
  2046         return row
  1903 
  2047 
  1904     def GetValue(self, row, col):
  2048     def GetValue(self, row, col):
  1905         if row < self.GetNumberRows():
  2049         if row < self.GetNumberRows():
  1906             if col == 0:
  2050             if col == 0:
  1907                 return self.Parent.Values.index(self.data[row]) + 1
  2051                 return self.data[row]["Number"]
  1908             name = str(self.data[row].get(self.GetColLabelValue(col), ""))
  2052             name = str(self.data[row].get(self.GetColLabelValue(col), ""))
  1909             return name
  2053             return name
  1910     
  2054     
  1911     def SetValue(self, row, col, value):
  2055     def SetValue(self, row, col, value):
  1912         if col < len(self.colnames):
  2056         if col < len(self.colnames):
  2132         self.VariablePanel.SetSizer(self.VariablePanelSizer)
  2276         self.VariablePanel.SetSizer(self.VariablePanelSizer)
  2133 
  2277 
  2134     def _init_ctrls(self, prnt, element_type):
  2278     def _init_ctrls(self, prnt, element_type):
  2135         wx.SplitterWindow.__init__(self, id=ID_POUEDITORPANEL,
  2279         wx.SplitterWindow.__init__(self, id=ID_POUEDITORPANEL,
  2136               name='EditVariablePanel', parent=prnt, pos=wx.Point(0, 0),
  2280               name='EditVariablePanel', parent=prnt, pos=wx.Point(0, 0),
  2137               size=wx.Size(-1, -1), style=wx.SP_3D)
  2281               size=wx.Size(0, 0), style=wx.SP_3D)
  2138         self.SetNeedUpdating(True)
  2282         self.SetNeedUpdating(True)
  2139         self.SetMinimumPaneSize(1)
  2283         self.SetMinimumPaneSize(1)
  2140         
  2284         
  2141         if element_type == "config":
  2285         if element_type == "config":
  2142             self.Viewer = wx.Panel(id=ID_POUEDITORPANELVIEWER,
  2286             self.Viewer = wx.Panel(id=ID_POUEDITORPANELVIEWER,
  2143               name='ConfigPanel', parent=self, pos=wx.Point(0, 0),
  2287               name='ConfigPanel', parent=self, pos=wx.Point(0, 0),
  2144               size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL)
  2288               size=wx.Size(0, 0), style=0)
       
  2289             self.Viewer.SetSizer(wx.BoxSizer(wx.VERTICAL))
  2145             self.Viewer.ResetBuffer = lambda: None
  2290             self.Viewer.ResetBuffer = lambda: None
  2146             self.Viewer.RefreshView = lambda: None
  2291             self.Viewer.RefreshView = lambda: None
  2147         elif element_type == "resource":
  2292         elif element_type == "resource":
  2148             self.Viewer = ResourceEditor(self, self.Parent, self.Controler)
  2293             self.Viewer = ResourceEditor(self, self.Parent, self.Controler)
  2149         elif element_type == "FBD":
  2294         elif element_type == "FBD":
  2160             else:
  2305             else:
  2161                 self.Viewer.SetKeywords(ST_KEYWORDS)
  2306                 self.Viewer.SetKeywords(ST_KEYWORDS)
  2162         
  2307         
  2163         self.VariablePanel = wx.Panel(id=ID_POUEDITORPANELVIEWER,
  2308         self.VariablePanel = wx.Panel(id=ID_POUEDITORPANELVIEWER,
  2164               name='VariablePanel', parent=self, pos=wx.Point(0, 0),
  2309               name='VariablePanel', parent=self, pos=wx.Point(0, 0),
  2165               size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL)
  2310               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2166         
  2311         
  2167         self.staticText1 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT1,
  2312         self.staticText1 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT1,
  2168               label='Return Type:', name='staticText1', parent=self.VariablePanel,
  2313               label='Return Type:', name='staticText1', parent=self.VariablePanel,
  2169               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  2314               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  2170 
  2315 
  2171         self.ReturnType = wx.Choice(id=ID_POUEDITORPANELRETURNTYPE,
  2316         self.ReturnType = wx.Choice(id=ID_POUEDITORPANELRETURNTYPE,
  2172               name='ReturnType', parent=self.VariablePanel, pos=wx.Point(0, 0),
  2317               name='ReturnType', parent=self.VariablePanel, pos=wx.Point(0, 0),
  2173               size=wx.Size(145, 24), style=0)
  2318               size=wx.Size(145, 24), style=0)
       
  2319         self.Bind(wx.EVT_CHOICE, self.OnReturnTypeChanged, id=ID_POUEDITORPANELRETURNTYPE)
  2174 
  2320 
  2175         self.staticText2 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT2,
  2321         self.staticText2 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT2,
  2176               label='Class Filter:', name='staticText2', parent=self.VariablePanel,
  2322               label='Class Filter:', name='staticText2', parent=self.VariablePanel,
  2177               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  2323               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  2178 
  2324 
  2250             "   External" : "External", "Variables" : "Variables", "   Local" : "Local",
  2396             "   External" : "External", "Variables" : "Variables", "   Local" : "Local",
  2251             "   Temp" : "Temp", "Global" : "Global", "Access" : "Access"}
  2397             "   Temp" : "Temp", "Global" : "Global", "Access" : "Access"}
  2252         
  2398         
  2253         if pou_type in ["config", "resource"]:
  2399         if pou_type in ["config", "resource"]:
  2254             self.DefaultTypes = {"All" : "Global"}
  2400             self.DefaultTypes = {"All" : "Global"}
  2255             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : "True"}
  2401             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True}
  2256         else:
  2402         else:
  2257             self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
  2403             self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
  2258             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : "True"}
  2404             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True}
  2259         if pou_type in ["config", "resource"] or pou_type == "program":
  2405         if pou_type in ["config", "resource"] or pou_type == "program":
  2260             self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"])
  2406             self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"])
  2261             if pou_type not in ["config", "resource"]:
  2407             if pou_type not in ["config", "resource"]:
  2262                 self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp","Global","Access"]
  2408                 self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp","Global","Access"]
  2263             else:
  2409             else:
  2344                 language = self.Controler.GetPouBodyType(self.PouName)
  2490                 language = self.Controler.GetPouBodyType(self.PouName)
  2345                 varlist.append(self.PouName)
  2491                 varlist.append(self.PouName)
  2346             if language in ["IL", "ST"]:
  2492             if language in ["IL", "ST"]:
  2347                 self.Viewer.SetVariables(varlist)
  2493                 self.Viewer.SetVariables(varlist)
  2348                 self.Viewer.SetFunctions(self.Controler.GetBlockTypes())
  2494                 self.Viewer.SetFunctions(self.Controler.GetBlockTypes())
       
  2495     
       
  2496     def OnReturnTypeChanged(self, event):
       
  2497         self.Controler.SetPouInterfaceReturnType(self.PouName, self.ReturnType.GetStringSelection())
       
  2498         self.Controler.BufferProject()
       
  2499         self.Parent.RefreshTitle()
       
  2500         self.Parent.RefreshEditMenu()
       
  2501         event.Skip()
  2349     
  2502     
  2350     def OnClassFilter(self, event):
  2503     def OnClassFilter(self, event):
  2351         self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()]
  2504         self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()]
  2352         self.RefreshTypeList()
  2505         self.RefreshTypeList()
  2353         self.RefreshValues()
  2506         self.RefreshValues()
  2517 
  2670 
  2518     def RefreshValues(self):
  2671     def RefreshValues(self):
  2519         if len(self.Table.data) > 0:
  2672         if len(self.Table.data) > 0:
  2520             self.VariablesGrid.SetGridCursor(0, 1)
  2673             self.VariablesGrid.SetGridCursor(0, 1)
  2521         data = []
  2674         data = []
  2522         for variable in self.Values:
  2675         for num, variable in enumerate(self.Values):
  2523             if variable["Class"] in self.ClassList:
  2676             if variable["Class"] in self.ClassList:
       
  2677                 variable["Number"] = num + 1
  2524                 data.append(variable)
  2678                 data.append(variable)
  2525         self.Table.SetData(data)
  2679         self.Table.SetData(data)
  2526         self.Table.ResetView(self.VariablesGrid)
  2680         self.Table.ResetView(self.VariablesGrid)
  2527 
  2681 
  2528     def SaveValues(self, buffer = True):
  2682     def SaveValues(self, buffer = True):