PLCOpenEditor.py
changeset 90 2245e8776086
parent 82 119b62c73085
child 92 76d5001393df
equal deleted inserted replaced
89:a6ff2b3fcc25 90:2245e8776086
   344               style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor')
   344               style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor')
   345         self._init_utils()
   345         self._init_utils()
   346         self.SetClientSize(wx.Size(1000, 600))
   346         self.SetClientSize(wx.Size(1000, 600))
   347         self.SetMenuBar(self.menuBar1)
   347         self.SetMenuBar(self.menuBar1)
   348         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame, id=ID_PLCOPENEDITOR)
   348         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame, id=ID_PLCOPENEDITOR)
       
   349         if not self.ModeSolo:
       
   350             self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=ID_PLCOPENEDITORFILEMENUITEMS5)
       
   351             accel = wx.AcceleratorTable([wx.AcceleratorEntry(wx.ACCEL_CTRL, 83, ID_PLCOPENEDITORFILEMENUITEMS5)])
       
   352             self.SetAcceleratorTable(accel)
   349         
   353         
   350         self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER,
   354         self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER,
   351               name='MainSplitter', parent=self, point=wx.Point(0, 0),
   355               name='MainSplitter', parent=self, point=wx.Point(0, 0),
   352               size=wx.Size(0, 0), style=wx.SP_3D)
   356               size=wx.Size(0, 0), style=wx.SP_3D)
   353         self.MainSplitter.SetNeedUpdating(True)
   357         self.MainSplitter.SetNeedUpdating(True)
   363         self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
   367         self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
   364               self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
   368               self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
   365 
   369 
   366         self.ToolBar = wx.ToolBar(id=ID_PLCOPENEDITORTOOLBAR, name='ToolBar',
   370         self.ToolBar = wx.ToolBar(id=ID_PLCOPENEDITORTOOLBAR, name='ToolBar',
   367               parent=self.EditorPanel, pos=wx.Point(0, 0), size=wx.Size(0, 40),
   371               parent=self.EditorPanel, pos=wx.Point(0, 0), size=wx.Size(0, 40),
   368               style=wx.TB_HORIZONTAL | wx.NO_BORDER)
   372               style=wx.TB_HORIZONTAL|wx.NO_BORDER)
   369         self.ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
   373         self.ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
   370               wx.Bitmap(os.path.join(CWD, 'Images/select.png')), wx.NullBitmap, "Select an object")
   374               wx.Bitmap(os.path.join(CWD, 'Images/select.png')), wx.NullBitmap, "Select an object")
   371         self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
   375         self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
   372               id=ID_PLCOPENEDITORTOOLBARSELECTION)
   376               id=ID_PLCOPENEDITORTOOLBARSELECTION)
   373         
   377         
   494             self.Controler.SetProjectProperties(projectname, new_values)
   498             self.Controler.SetProjectProperties(projectname, new_values)
   495             self.RefreshProjectTree()
   499             self.RefreshProjectTree()
   496         dialog.Destroy()
   500         dialog.Destroy()
   497 
   501 
   498     def OnCloseFrame(self, event):
   502     def OnCloseFrame(self, event):
   499         if not self.Controler.ProjectIsSaved():
   503         if not self.ModeSolo and getattr(self, "_onclose", None) != None:
       
   504             self._onclose()
       
   505             event.Skip()
       
   506         elif not self.Controler.ProjectIsSaved():
   500             dialog = wx.MessageDialog(self, "There are changes, do you want to save?", "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
   507             dialog = wx.MessageDialog(self, "There are changes, do you want to save?", "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
   501             answer = dialog.ShowModal()
   508             answer = dialog.ShowModal()
   502             dialog.Destroy()
   509             dialog.Destroy()
   503             if answer == wx.ID_YES:
   510             if answer == wx.ID_YES:
   504                 self.SaveProject()
   511                 self.SaveProject()
   568         self.RefreshEditMenu()
   575         self.RefreshEditMenu()
   569         self.RefreshToolBar()
   576         self.RefreshToolBar()
   570         event.Skip()
   577         event.Skip()
   571 
   578 
   572     def OnSaveProjectMenu(self, event):
   579     def OnSaveProjectMenu(self, event):
   573         self.SaveProject()
   580         if not self.ModeSolo and getattr(self, "_onsave", None) != None:
       
   581             self._onsave()
       
   582         else:
       
   583             self.SaveProject()
   574         event.Skip()
   584         event.Skip()
   575 
   585 
   576     def OnSaveProjectAsMenu(self, event):
   586     def OnSaveProjectAsMenu(self, event):
   577         self.SaveProjectAs()
   587         self.SaveProjectAs()
   578         event.Skip()
   588         event.Skip()
  1013         event.Skip()
  1023         event.Skip()
  1014 
  1024 
  1015     def RefreshProjectTree(self):
  1025     def RefreshProjectTree(self):
  1016         infos = self.Controler.GetProjectInfos()
  1026         infos = self.Controler.GetProjectInfos()
  1017         root = self.ProjectTree.GetRootItem()
  1027         root = self.ProjectTree.GetRootItem()
       
  1028         if not root.IsOk():
       
  1029             root = self.ProjectTree.AddRoot(infos["name"])
  1018         self.GenerateTreeBranch(root, infos)
  1030         self.GenerateTreeBranch(root, infos)
  1019         self.ProjectTree.Expand(self.ProjectTree.GetRootItem())
  1031         self.ProjectTree.Expand(self.ProjectTree.GetRootItem())
  1020 
  1032 
  1021     def GenerateTreeBranch(self, root, infos):
  1033     def GenerateTreeBranch(self, root, infos):
  1022         to_delete = []
  1034         to_delete = []
  1023         if root.IsOk():
  1035         self.ProjectTree.SetItemText(root, infos["name"])
  1024             self.ProjectTree.SetItemText(root, infos["name"])
       
  1025         else:
       
  1026             root = self.ProjectTree.AddRoot(infos["name"])
       
  1027         self.ProjectTree.SetPyData(root, infos["type"])
  1036         self.ProjectTree.SetPyData(root, infos["type"])
  1028         if infos["type"] == ITEM_POU:
  1037         if infos["type"] == ITEM_POU:
  1029             self.ProjectTree.SetItemImage(root, LANGUAGES.index(self.Controler.GetPouBodyType(infos["name"])))
  1038             self.ProjectTree.SetItemImage(root, LANGUAGES.index(self.Controler.GetPouBodyType(infos["name"])))
  1030         item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1039         item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1031         if len(infos["values"]) > 0:
  1040         for values in infos["values"]:
  1032             for values in infos["values"]:
  1041             if not item.IsOk():
  1033                 if not item.IsOk():
  1042                 item = self.ProjectTree.AppendItem(root, "")
  1034                     item = self.ProjectTree.AppendItem(root, "")
  1043                 if wx.VERSION < (2, 7, 0):
  1035                     item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1044                     item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1036                 self.GenerateTreeBranch(item, values)
  1045             self.GenerateTreeBranch(item, values)
  1037                 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1046             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1038         while item.IsOk():
  1047         while item.IsOk():
  1039             to_delete.append(item)
  1048             to_delete.append(item)
  1040             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1049             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1041         for item in to_delete:
  1050         for item in to_delete:
  1042             self.ProjectTree.Delete(item)
  1051             self.ProjectTree.Delete(item)
  2185 
  2194 
  2186 class VariableDropTarget(wx.TextDropTarget):
  2195 class VariableDropTarget(wx.TextDropTarget):
  2187     
  2196     
  2188     def __init__(self, parent):
  2197     def __init__(self, parent):
  2189         wx.TextDropTarget.__init__(self)
  2198         wx.TextDropTarget.__init__(self)
  2190         self.Parent = parent
  2199         self.ParentWindow = parent
  2191     
  2200     
  2192     def OnDropText(self, x, y, data):
  2201     def OnDropText(self, x, y, data):
  2193         col = self.Parent.VariablesGrid.XToCol(x)
  2202         col = self.ParentWindow.VariablesGrid.XToCol(x)
  2194         row = self.Parent.VariablesGrid.YToRow(y)
  2203         row = self.ParentWindow.VariablesGrid.YToRow(y)
  2195         if col != wx.NOT_FOUND and row != wx.NOT_FOUND:
  2204         if col != wx.NOT_FOUND and row != wx.NOT_FOUND:
  2196             if self.Parent.Table.GetColLabelValue(col) != "Location":
  2205             if self.ParentWindow.Table.GetColLabelValue(col) != "Location":
  2197                 return
  2206                 return
  2198             try:
  2207             try:
  2199                 values = eval(data)    
  2208                 values = eval(data)    
  2200             except:
  2209             except:
  2201                 values = None
  2210                 values = None
  2202             if values and values[1] == "location":
  2211             if values and values[1] == "location":
  2203                 dialog = wx.SingleChoiceDialog(self.Parent, "Select a variable class:", "Variable class", ["Input", "Output", "Memory"], wx.OK|wx.CANCEL)
  2212                 dialog = wx.SingleChoiceDialog(self.ParentWindow, "Select a variable class:", "Variable class", ["Input", "Output", "Memory"], wx.OK|wx.CANCEL)
  2204                 if dialog.ShowModal() == wx.ID_OK:
  2213                 if dialog.ShowModal() == wx.ID_OK:
  2205                     selected = dialog.GetSelection()
  2214                     selected = dialog.GetSelection()
  2206                     if selected == 0:
  2215                     if selected == 0:
  2207                         location = "%I" + values[0]
  2216                         location = "%I" + values[0]
  2208                     elif selected == 1:
  2217                     elif selected == 1:
  2209                         location = "%Q" + values[0]
  2218                         location = "%Q" + values[0]
  2210                     else:
  2219                     else:
  2211                         location = "%M" + values[0]
  2220                         location = "%M" + values[0]
  2212                     self.Parent.Table.SetValue(row - 1, col, location)
  2221                     self.ParentWindow.Table.SetValue(row - 1, col, location)
  2213                     self.Parent.Table.ResetView(self.Parent.VariablesGrid)
  2222                     self.ParentWindow.Table.ResetView(self.ParentWindow.VariablesGrid)
  2214                     self.Parent.SaveValues()
  2223                     self.ParentWindow.SaveValues()
  2215                 dialog.Destroy()    
  2224                 dialog.Destroy()    
  2216 
  2225 
  2217 [ID_POUEDITORPANEL, ID_POUEDITORPANELVIEWER, 
  2226 [ID_POUEDITORPANEL, ID_POUEDITORPANELVIEWER, 
  2218  ID_POUEDITORPANELVARIABLESGRID, ID_POUEDITORPANELRETURNTYPE, 
  2227  ID_POUEDITORPANELVARIABLESGRID, ID_POUEDITORPANELRETURNTYPE, 
  2219  ID_POUEDITORPANELCLASSFILTER, ID_POUEDITORPANELADDBUTTON,
  2228  ID_POUEDITORPANELCLASSFILTER, ID_POUEDITORPANELADDBUTTON,
  2288               size=wx.Size(0, 0), style=0)
  2297               size=wx.Size(0, 0), style=0)
  2289             self.Viewer.SetSizer(wx.BoxSizer(wx.VERTICAL))
  2298             self.Viewer.SetSizer(wx.BoxSizer(wx.VERTICAL))
  2290             self.Viewer.ResetBuffer = lambda: None
  2299             self.Viewer.ResetBuffer = lambda: None
  2291             self.Viewer.RefreshView = lambda: None
  2300             self.Viewer.RefreshView = lambda: None
  2292         elif element_type == "resource":
  2301         elif element_type == "resource":
  2293             self.Viewer = ResourceEditor(self, self.Parent, self.Controler)
  2302             self.Viewer = ResourceEditor(self, self.ParentWindow, self.Controler)
  2294         elif element_type == "FBD":
  2303         elif element_type == "FBD":
  2295             self.Viewer = Viewer(self, self.Parent, self.Controler)
  2304             self.Viewer = Viewer(self, self.ParentWindow, self.Controler)
  2296         elif element_type == "LD":
  2305         elif element_type == "LD":
  2297             self.Viewer = LD_Viewer(self, self.Parent, self.Controler)
  2306             self.Viewer = LD_Viewer(self, self.ParentWindow, self.Controler)
  2298         elif element_type == "SFC":
  2307         elif element_type == "SFC":
  2299             self.Viewer = SFC_Viewer(self, self.Parent, self.Controler)
  2308             self.Viewer = SFC_Viewer(self, self.ParentWindow, self.Controler)
  2300         else:
  2309         else:
  2301             self.Viewer = TextViewer(self, self.Parent, self.Controler)
  2310             self.Viewer = TextViewer(self, self.ParentWindow, self.Controler)
  2302             self.Viewer.SetTextSyntax(element_type)
  2311             self.Viewer.SetTextSyntax(element_type)
  2303             if element_type == "IL":
  2312             if element_type == "IL":
  2304                 self.Viewer.SetKeywords(IL_KEYWORDS)
  2313                 self.Viewer.SetKeywords(IL_KEYWORDS)
  2305             else:
  2314             else:
  2306                 self.Viewer.SetKeywords(ST_KEYWORDS)
  2315                 self.Viewer.SetKeywords(ST_KEYWORDS)
  2363         self.SplitHorizontally(self.Viewer, self.VariablePanel, -200)
  2372         self.SplitHorizontally(self.Viewer, self.VariablePanel, -200)
  2364 
  2373 
  2365         self._init_sizers()
  2374         self._init_sizers()
  2366 
  2375 
  2367     def __init__(self, parent, window, controler, element_type, pou_name = None, transition_name = None, action_name = None, config_name = None, resource_name = None):
  2376     def __init__(self, parent, window, controler, element_type, pou_name = None, transition_name = None, action_name = None, config_name = None, resource_name = None):
  2368         self.Parent = window
  2377         self.ParentWindow = window
  2369         self.Controler = controler
  2378         self.Controler = controler
  2370         self.ElementType = element_type
  2379         self.ElementType = element_type
  2371         self.PouName = pou_name
  2380         self.PouName = pou_name
  2372         self.TransitionName = transition_name
  2381         self.TransitionName = transition_name
  2373         self.ActionName = action_name
  2382         self.ActionName = action_name
  2494                 self.Viewer.SetFunctions(self.Controler.GetBlockTypes())
  2503                 self.Viewer.SetFunctions(self.Controler.GetBlockTypes())
  2495     
  2504     
  2496     def OnReturnTypeChanged(self, event):
  2505     def OnReturnTypeChanged(self, event):
  2497         self.Controler.SetPouInterfaceReturnType(self.PouName, self.ReturnType.GetStringSelection())
  2506         self.Controler.SetPouInterfaceReturnType(self.PouName, self.ReturnType.GetStringSelection())
  2498         self.Controler.BufferProject()
  2507         self.Controler.BufferProject()
  2499         self.Parent.RefreshTitle()
  2508         self.ParentWindow.RefreshTitle()
  2500         self.Parent.RefreshEditMenu()
  2509         self.ParentWindow.RefreshEditMenu()
  2501         event.Skip()
  2510         event.Skip()
  2502     
  2511     
  2503     def OnClassFilter(self, event):
  2512     def OnClassFilter(self, event):
  2504         self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()]
  2513         self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()]
  2505         self.RefreshTypeList()
  2514         self.RefreshTypeList()
  2588                 self.SaveValues(False)
  2597                 self.SaveValues(False)
  2589                 old_value = self.Table.GetOldValue()
  2598                 old_value = self.Table.GetOldValue()
  2590                 if old_value != "":
  2599                 if old_value != "":
  2591                     self.Controler.UpdateCurrentPouEditingUsedVariable(old_value, value)
  2600                     self.Controler.UpdateCurrentPouEditingUsedVariable(old_value, value)
  2592                 self.Controler.BufferProject()
  2601                 self.Controler.BufferProject()
  2593                 self.Parent.RefreshTitle()
  2602                 self.ParentWindow.RefreshTitle()
  2594                 self.Parent.RefreshEditMenu()
  2603                 self.ParentWindow.RefreshEditMenu()
  2595                 self.RefreshViewerVarList()
  2604                 self.RefreshViewerVarList()
  2596                 self.Viewer.RefreshView()
  2605                 self.Viewer.RefreshView()
  2597                 event.Skip()
  2606                 event.Skip()
  2598         else:
  2607         else:
  2599             self.SaveValues()
  2608             self.SaveValues()
  2688             if self.ReturnType.IsEnabled():
  2697             if self.ReturnType.IsEnabled():
  2689                 self.Controler.SetPouInterfaceReturnType(self.PouName, self.ReturnType.GetStringSelection())
  2698                 self.Controler.SetPouInterfaceReturnType(self.PouName, self.ReturnType.GetStringSelection())
  2690             self.Controler.SetPouInterfaceVars(self.PouName, self.Values)
  2699             self.Controler.SetPouInterfaceVars(self.PouName, self.Values)
  2691         if buffer:
  2700         if buffer:
  2692             self.Controler.BufferProject()
  2701             self.Controler.BufferProject()
  2693             self.Parent.RefreshTitle()
  2702             self.ParentWindow.RefreshTitle()
  2694             self.Parent.RefreshEditMenu()
  2703             self.ParentWindow.RefreshEditMenu()
  2695 
  2704 
  2696 #-------------------------------------------------------------------------------
  2705 #-------------------------------------------------------------------------------
  2697 #                               Exception Handler
  2706 #                               Exception Handler
  2698 #-------------------------------------------------------------------------------
  2707 #-------------------------------------------------------------------------------
  2699 
  2708