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() |
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 |