etisserant@0: #Boa:Frame:PLCOpenEditor etisserant@0: #!/usr/bin/env python etisserant@0: # -*- coding: utf-8 -*- etisserant@0: etisserant@0: #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor etisserant@0: #based on the plcopen standard. etisserant@0: # etisserant@0: #Copyright (C): Edouard TISSERANT and Laurent BESSARD etisserant@0: # etisserant@0: #See COPYING file for copyrights details. etisserant@0: # etisserant@0: #This library is free software; you can redistribute it and/or etisserant@0: #modify it under the terms of the GNU Lesser General Public etisserant@0: #License as published by the Free Software Foundation; either etisserant@0: #version 2.1 of the License, or (at your option) any later version. etisserant@0: # etisserant@0: #This library is distributed in the hope that it will be useful, etisserant@0: #but WITHOUT ANY WARRANTY; without even the implied warranty of etisserant@0: #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU etisserant@0: #Lesser General Public License for more details. etisserant@0: # etisserant@0: #You should have received a copy of the GNU Lesser General Public etisserant@0: #License along with this library; if not, write to the Free Software etisserant@0: #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA etisserant@0: etisserant@0: from wxPython.wx import * etisserant@0: from wxPython.grid import * etisserant@0: from time import localtime etisserant@0: from datetime import datetime etisserant@0: import wx etisserant@0: etisserant@0: from SFCViewer import * etisserant@0: from FBDViewer import * etisserant@0: from LDViewer import * etisserant@0: from Viewer import * etisserant@0: from PLCControler import * etisserant@0: from plcopen import OpenPDFDoc etisserant@0: from plcopen.structures import * etisserant@0: etisserant@0: import os, re, platform, sys, time, traceback, getopt etisserant@0: etisserant@0: __version__ = "$Revision$" etisserant@0: etisserant@0: def create(parent): etisserant@0: return PLCOpenEditor(parent) etisserant@0: etisserant@0: def usage(): etisserant@0: print "\nUsage of PLCOpenEditor.py :" etisserant@0: print "\n %s [Filepath]\n"%sys.argv[0] etisserant@0: etisserant@0: try: etisserant@0: opts, args = getopt.getopt(sys.argv[1:], "h", ["help"]) etisserant@0: except getopt.GetoptError: etisserant@0: # print help information and exit: etisserant@0: usage() etisserant@0: sys.exit(2) etisserant@0: etisserant@0: for o, a in opts: etisserant@0: if o in ("-h", "--help"): etisserant@0: usage() etisserant@0: sys.exit() etisserant@0: etisserant@0: fileOpen = None etisserant@0: if len(args) > 1: etisserant@0: usage() etisserant@0: sys.exit() etisserant@0: elif len(args) == 1: etisserant@0: fileOpen = args[0] etisserant@0: etisserant@0: etisserant@0: # Test if identifier is valid etisserant@0: def TestIdentifier(identifier): etisserant@0: if identifier[0].isdigit(): etisserant@0: return False etisserant@0: words = identifier.split('_') etisserant@0: for i, word in enumerate(words): etisserant@0: if len(word) == 0 and i != 0: etisserant@0: return False etisserant@0: if len(word) != 0 and not word.isalnum(): etisserant@0: return False etisserant@0: return True etisserant@0: etisserant@0: [wxID_PLCOPENEDITOR, wxID_PLCOPENEDITORPROJECTTREE, etisserant@0: wxID_PLCOPENEDITORSPLITTERWINDOW1, wxID_PLCOPENEDITORTABSOPENED, etisserant@0: wxID_PLCOPENEDITORDEFAULTTOOLBAR, wxID_PLCOPENEDITORSFCTOOLBAR, etisserant@0: wxID_PLCOPENEDITORFBDTOOLBAR, wxID_PLCOPENEDITORLDTOOLBAR, etisserant@0: ] = [wx.NewId() for _init_ctrls in range(8)] etisserant@0: etisserant@0: [wxID_PLCOPENEDITORDEFAULTTOOLBARITEMS0, etisserant@0: ] = [wx.NewId() for _init_coll_DefaultToolBar_Items in range(1)] etisserant@0: etisserant@0: [wxID_PLCOPENEDITORSFCTOOLBARITEMS0, wxID_PLCOPENEDITORSFCTOOLBARITEMS1, etisserant@0: wxID_PLCOPENEDITORSFCTOOLBARITEMS2, wxID_PLCOPENEDITORSFCTOOLBARITEMS3, etisserant@0: wxID_PLCOPENEDITORSFCTOOLBARITEMS4, wxID_PLCOPENEDITORSFCTOOLBARITEMS5, etisserant@0: wxID_PLCOPENEDITORSFCTOOLBARITEMS6, etisserant@0: ] = [wx.NewId() for _init_coll_SFCToolBar_Items in range(7)] etisserant@0: etisserant@0: [wxID_PLCOPENEDITORFBDTOOLBARITEMS0, wxID_PLCOPENEDITORFBDTOOLBARITEMS1, etisserant@0: wxID_PLCOPENEDITORFBDTOOLBARITEMS2, wxID_PLCOPENEDITORFBDTOOLBARITEMS3, etisserant@0: wxID_PLCOPENEDITORFBDTOOLBARITEMS4, wxID_PLCOPENEDITORFBDTOOLBARITEMS5, etisserant@0: ] = [wx.NewId() for _init_coll_FBDToolBar_Items in range(6)] etisserant@0: etisserant@0: [wxID_PLCOPENEDITORLDTOOLBARITEMS0, wxID_PLCOPENEDITORLDTOOLBARITEMS1, etisserant@0: wxID_PLCOPENEDITORLDTOOLBARITEMS2, wxID_PLCOPENEDITORLDTOOLBARITEMS3, etisserant@0: wxID_PLCOPENEDITORLDTOOLBARITEMS4, etisserant@0: ] = [wx.NewId() for _init_coll_LDToolBar_Items in range(5)] etisserant@0: etisserant@0: [wxID_PLCOPENEDITORFILEMENUITEMS0, wxID_PLCOPENEDITORFILEMENUITEMS1, etisserant@0: wxID_PLCOPENEDITORFILEMENUITEMS2, wxID_PLCOPENEDITORFILEMENUITEMS3, etisserant@0: wxID_PLCOPENEDITORFILEMENUITEMS5, wxID_PLCOPENEDITORFILEMENUITEMS6, etisserant@0: wxID_PLCOPENEDITORFILEMENUITEMS7, wxID_PLCOPENEDITORFILEMENUITEMS9, etisserant@0: wxID_PLCOPENEDITORFILEMENUITEMS11, etisserant@0: ] = [wx.NewId() for _init_coll_FileMenu_Items in range(9)] etisserant@0: etisserant@0: [wxID_PLCOPENEDITORHELPMENUITEMS0, wxID_PLCOPENEDITORHELPMENUITEMS1, etisserant@0: wxID_PLCOPENEDITORHELPMENUITEMS2, wxID_PLCOPENEDITORHELPMENUITEMS3, etisserant@0: ] = [wx.NewId() for _init_coll_HelpMenu_Items in range(4)] etisserant@0: etisserant@0: [wxID_PLCOPENEDITORSFCMENUITEMS0, wxID_PLCOPENEDITORSFCMENUITEMS1, etisserant@0: wxID_PLCOPENEDITORSFCMENUITEMS2, wxID_PLCOPENEDITORSFCMENUITEMS3, etisserant@0: ] = [wx.NewId() for _init_coll_HelpMenu_Items in range(4)] etisserant@0: etisserant@0: [wxID_PLCOPENEDITORCONFIGMENUITEMS0, wxID_PLCOPENEDITORCONFIGMENUITEMS1, etisserant@0: ] = [wx.NewId() for _init_coll_HelpMenu_Items in range(2)] etisserant@0: etisserant@0: [wxID_PLCOPENEDITOREDITMENUITEMS0, wxID_PLCOPENEDITOREDITMENUITEMS1, etisserant@0: wxID_PLCOPENEDITOREDITMENUITEMS11, wxID_PLCOPENEDITOREDITMENUITEMS12, etisserant@0: wxID_PLCOPENEDITOREDITMENUITEMS2, wxID_PLCOPENEDITOREDITMENUITEMS4, etisserant@0: wxID_PLCOPENEDITOREDITMENUITEMS5, wxID_PLCOPENEDITOREDITMENUITEMS6, etisserant@0: wxID_PLCOPENEDITOREDITMENUITEMS8, wxID_PLCOPENEDITOREDITMENUITEMS9, etisserant@0: ] = [wx.NewId() for _init_coll_EditMenu_Items in range(10)] etisserant@0: etisserant@0: [wxID_PLCOPENEDITORSFCMENUITEMS0, wxID_PLCOPENEDITORSFCMENUITEMS1, etisserant@0: wxID_PLCOPENEDITORSFCMENUITEMS2, wxID_PLCOPENEDITORSFCMENUITEMS3, etisserant@0: ] = [wx.NewId() for _init_coll_SFCMenu_Items in range(4)] etisserant@0: etisserant@0: [wxID_PLCOPENEDITORCONFIGMENUITEMS0, wxID_PLCOPENEDITORCONFIGMENUITEMS1, etisserant@0: ] = [wx.NewId() for _init_coll_ConfigMenu_Items in range(2)] etisserant@0: etisserant@0: class PLCOpenEditor(wx.Frame): etisserant@0: _custom_classes = {'wx.SashWindow' : ['Viewer']} etisserant@0: etisserant@0: def _init_coll_EditMenu_Items(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITOREDITMENUITEMS0, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Refresh\tCTRL+R') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITOREDITMENUITEMS1, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Undo\tCTRL+Z') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITOREDITMENUITEMS2, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Redo\tCTRL+Y') etisserant@0: parent.AppendSeparator() etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITOREDITMENUITEMS4, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Cut\tCTRL+X') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITOREDITMENUITEMS5, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Copy\tCTRL+C') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITOREDITMENUITEMS6, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Paste\tCTRL+V') etisserant@0: parent.AppendSeparator() etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITOREDITMENUITEMS8, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Add POU') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITOREDITMENUITEMS9, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Remove POU') etisserant@0: parent.AppendSeparator() etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITOREDITMENUITEMS11, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Add Configuration') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITOREDITMENUITEMS12, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Remove Configuration') etisserant@0: self.Bind(wx.EVT_MENU, self.OnRefreshMenu, etisserant@0: id=wxID_PLCOPENEDITOREDITMENUITEMS0) etisserant@0: self.Bind(wx.EVT_MENU, self.OnCutMenu, etisserant@0: id=wxID_PLCOPENEDITOREDITMENUITEMS4) etisserant@0: self.Bind(wx.EVT_MENU, self.OnCopyMenu, etisserant@0: id=wxID_PLCOPENEDITOREDITMENUITEMS5) etisserant@0: self.Bind(wx.EVT_MENU, self.OnPasteMenu, etisserant@0: id=wxID_PLCOPENEDITOREDITMENUITEMS6) etisserant@0: self.Bind(wx.EVT_MENU, self.OnAddPouMenu, etisserant@0: id=wxID_PLCOPENEDITOREDITMENUITEMS8) etisserant@0: self.Bind(wx.EVT_MENU, self.OnRemovePouMenu, etisserant@0: id=wxID_PLCOPENEDITOREDITMENUITEMS9) etisserant@0: self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, etisserant@0: id=wxID_PLCOPENEDITOREDITMENUITEMS11) etisserant@0: self.Bind(wx.EVT_MENU, self.OnRemoveConfigurationMenu, etisserant@0: id=wxID_PLCOPENEDITOREDITMENUITEMS12) etisserant@0: etisserant@0: def _init_coll_menuBar1_Menus(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.Append(menu=self.FileMenu, title=u'File') etisserant@0: parent.Append(menu=self.EditMenu, title=u'Edit') etisserant@0: parent.Append(menu=self.HelpMenu, title=u'Help') etisserant@0: etisserant@0: def _init_coll_ConfigMenu_Items(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORCONFIGMENUITEMS0, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Add Resource') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORCONFIGMENUITEMS1, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Remove Resource') etisserant@0: self.Bind(wx.EVT_MENU, self.OnAddResourceMenu, etisserant@0: id=wxID_PLCOPENEDITORCONFIGMENUITEMS0) etisserant@0: self.Bind(wx.EVT_MENU, self.OnRemoveResourceMenu, etisserant@0: id=wxID_PLCOPENEDITORCONFIGMENUITEMS1) etisserant@0: etisserant@0: def _init_coll_HelpMenu_Items(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORHELPMENUITEMS0, etisserant@0: kind=wx.ITEM_NORMAL, text=u'PLCOpenEditor\tF1') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORHELPMENUITEMS1, etisserant@0: kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORHELPMENUITEMS2, etisserant@0: kind=wx.ITEM_NORMAL, text=u'IEC 61131-3\tF3') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORHELPMENUITEMS3, etisserant@0: kind=wx.ITEM_NORMAL, text=u'About') etisserant@0: self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu, etisserant@0: id=wxID_PLCOPENEDITORHELPMENUITEMS1) etisserant@0: etisserant@0: def _init_coll_FileMenu_Items(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORFILEMENUITEMS0, etisserant@0: kind=wx.ITEM_NORMAL, text=u'New\tCTRL+N') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORFILEMENUITEMS1, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Open\tCTRL+O') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORFILEMENUITEMS2, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Close Tab\tCTRL+W') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORFILEMENUITEMS3, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Close Project') etisserant@0: parent.AppendSeparator() etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORFILEMENUITEMS5, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Save\tCTRL+S') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORFILEMENUITEMS6, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Save As...\tCTRL+SHIFT+S') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORFILEMENUITEMS7, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Generate Program\tCTRL+G') etisserant@0: parent.AppendSeparator() etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORFILEMENUITEMS9, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Properties') etisserant@0: parent.AppendSeparator() etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORFILEMENUITEMS11, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Quit\tCTRL+Q') etisserant@0: self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, etisserant@0: id=wxID_PLCOPENEDITORFILEMENUITEMS0) etisserant@0: self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, etisserant@0: id=wxID_PLCOPENEDITORFILEMENUITEMS1) etisserant@0: self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, etisserant@0: id=wxID_PLCOPENEDITORFILEMENUITEMS2) etisserant@0: self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, etisserant@0: id=wxID_PLCOPENEDITORFILEMENUITEMS3) etisserant@0: self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, etisserant@0: id=wxID_PLCOPENEDITORFILEMENUITEMS5) etisserant@0: self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, etisserant@0: id=wxID_PLCOPENEDITORFILEMENUITEMS6) etisserant@0: self.Bind(wx.EVT_MENU, self.OnGenerateProgramMenu, etisserant@0: id=wxID_PLCOPENEDITORFILEMENUITEMS7) etisserant@0: self.Bind(wx.EVT_MENU, self.OnQuitMenu, etisserant@0: id=wxID_PLCOPENEDITORFILEMENUITEMS11) etisserant@0: etisserant@0: def _init_coll_SFCMenu_Items(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORSFCMENUITEMS0, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Add Transition') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORSFCMENUITEMS1, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Add Action') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORSFCMENUITEMS2, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Remove Transition') etisserant@0: parent.Append(help='', id=wxID_PLCOPENEDITORSFCMENUITEMS3, etisserant@0: kind=wx.ITEM_NORMAL, text=u'Remove Action') etisserant@0: self.Bind(wx.EVT_MENU, self.OnAddPouTransitionMenu, etisserant@0: id=wxID_PLCOPENEDITORSFCMENUITEMS0) etisserant@0: self.Bind(wx.EVT_MENU, self.OnAddPouActionMenu, etisserant@0: id=wxID_PLCOPENEDITORSFCMENUITEMS1) etisserant@0: self.Bind(wx.EVT_MENU, self.OnRemovePouTransitionMenu, etisserant@0: id=wxID_PLCOPENEDITORSFCMENUITEMS2) etisserant@0: self.Bind(wx.EVT_MENU, self.OnRemovePouActionMenu, etisserant@0: id=wxID_PLCOPENEDITORSFCMENUITEMS3) etisserant@0: etisserant@0: def _init_utils(self): etisserant@0: # generated method, don't edit etisserant@0: self.menuBar1 = wx.MenuBar() etisserant@0: etisserant@0: self.FileMenu = wx.Menu(title=u'') etisserant@0: etisserant@0: self.EditMenu = wx.Menu(title=u'') etisserant@0: etisserant@0: self.HelpMenu = wx.Menu(title='') etisserant@0: etisserant@0: self.SFCMenu = wx.Menu(title='') etisserant@0: etisserant@0: self.ConfigMenu = wx.Menu(title='') etisserant@0: etisserant@0: self._init_coll_menuBar1_Menus(self.menuBar1) etisserant@0: self._init_coll_FileMenu_Items(self.FileMenu) etisserant@0: self._init_coll_EditMenu_Items(self.EditMenu) etisserant@0: self._init_coll_HelpMenu_Items(self.HelpMenu) etisserant@0: self._init_coll_SFCMenu_Items(self.SFCMenu) etisserant@0: self._init_coll_ConfigMenu_Items(self.ConfigMenu) etisserant@0: etisserant@0: def _init_coll_MainGridSizer_Items(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.AddWindow(self.splitterWindow1, 0, border=0, flag=wxGROW) etisserant@0: etisserant@0: def _init_coll_MainGridSizer_Growables(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.AddGrowableCol(0) etisserant@0: parent.AddGrowableRow(0) etisserant@0: etisserant@0: def _init_sizers(self): etisserant@0: # generated method, don't edit etisserant@0: self.MainGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=1, vgap=0) etisserant@0: etisserant@0: self._init_coll_MainGridSizer_Growables(self.MainGridSizer) etisserant@0: self._init_coll_MainGridSizer_Items(self.MainGridSizer) etisserant@0: etisserant@0: self.SetSizer(self.MainGridSizer) etisserant@0: etisserant@0: def _init_ctrls(self, prnt): etisserant@0: # generated method, don't edit etisserant@0: wx.Frame.__init__(self, id=wxID_PLCOPENEDITOR, name=u'PLCOpenEditor', etisserant@0: parent=prnt, pos=wx.Point(235, 287), size=wx.Size(1000, 600), etisserant@0: style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor') etisserant@0: self._init_utils() etisserant@0: self.SetClientSize(wx.Size(1000, 600)) etisserant@0: self.SetMenuBar(self.menuBar1) etisserant@0: self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnProjectTreeItemBeginEdit, etisserant@0: id=wxID_PLCOPENEDITORPROJECTTREE) etisserant@0: self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnProjectTreeItemEndEdit, etisserant@0: id=wxID_PLCOPENEDITORPROJECTTREE) etisserant@0: self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnProjectTreeItemActivated, etisserant@0: id=wxID_PLCOPENEDITORPROJECTTREE) etisserant@0: self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnProjectTreeItemSelected, etisserant@0: id=wxID_PLCOPENEDITORPROJECTTREE) etisserant@0: etisserant@0: self.splitterWindow1 = wx.SplitterWindow(id=wxID_PLCOPENEDITORSPLITTERWINDOW1, etisserant@0: name='splitterWindow1', parent=self, point=wx.Point(0, 0), etisserant@0: size=wx.Size(-1, -1), style=wx.SP_3D) etisserant@0: self.splitterWindow1.SetNeedUpdating(True) etisserant@0: self.splitterWindow1.SetMinimumPaneSize(1) etisserant@0: etisserant@0: self.TabsOpened = wx.Notebook(id=wxID_PLCOPENEDITORTABSOPENED, etisserant@0: name='TabsOpened', parent=self.splitterWindow1, pos=wx.Point(0, etisserant@0: 0), size=wx.Size(-1, -1), style=0) etisserant@0: self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, etisserant@0: self.OnPouSelectedChanged, id=wxID_PLCOPENEDITORTABSOPENED) etisserant@0: etisserant@0: self.ProjectTree = wx.TreeCtrl(id=wxID_PLCOPENEDITORPROJECTTREE, etisserant@0: name='treeCtrl1', parent=self.splitterWindow1, pos=wx.Point(0, 0), etisserant@0: size=wx.Size(-1, -1), etisserant@0: style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS|wx.TR_SINGLE|wx.SUNKEN_BORDER) etisserant@0: self.ProjectTree.Bind(wx.EVT_RIGHT_UP, self.OnProjectTreeRightUp) etisserant@0: self.splitterWindow1.SplitVertically(self.ProjectTree, self.TabsOpened, etisserant@0: 200) etisserant@0: etisserant@0: self._init_sizers() etisserant@0: etisserant@0: def init_coll_DefaultToolBar_Items(self, parent): etisserant@0: parent.AddRadioTool(wxID_PLCOPENEDITORDEFAULTTOOLBARITEMS0, etisserant@0: wxBitmap('Images/select.png'), wxNullBitmap, "Select an object") etisserant@0: self.Bind(wx.EVT_TOOL, self.OnSelectionTool, etisserant@0: id=wxID_PLCOPENEDITORDEFAULTTOOLBARITEMS0) etisserant@0: etisserant@0: def init_coll_SFCToolBar_Items(self, parent): etisserant@0: parent.AddRadioTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS0, etisserant@0: wxBitmap('Images/select.png'), wxNullBitmap, "Select an object") etisserant@0: parent.AddRadioTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS1, etisserant@0: wxBitmap('Images/comment.png'), wxNullBitmap, "Create a new comment") etisserant@0: parent.AddRadioTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS2, etisserant@0: wxBitmap('Images/initial_step.png'), wxNullBitmap, "Create a new initial step") etisserant@0: parent.AddSimpleTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS3, etisserant@0: wxBitmap('Images/step.png'), "Create a new step") etisserant@0: parent.AddSimpleTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS4, etisserant@0: wxBitmap('Images/action.png'), "Add action block to step") etisserant@0: parent.AddSimpleTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS5, etisserant@0: wxBitmap('Images/divergence.png'), "Create a new divergence") etisserant@0: parent.AddSimpleTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS6, etisserant@0: wxBitmap('Images/jump.png'), "Create a new jump") etisserant@0: self.Bind(wx.EVT_TOOL, self.OnSelectionTool, etisserant@0: id=wxID_PLCOPENEDITORSFCTOOLBARITEMS0) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnCommentTool, etisserant@0: id=wxID_PLCOPENEDITORSFCTOOLBARITEMS1) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnSFCInitialStepTool, etisserant@0: id=wxID_PLCOPENEDITORSFCTOOLBARITEMS2) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnSFCStepTool, etisserant@0: id=wxID_PLCOPENEDITORSFCTOOLBARITEMS3) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnSFCActionBlockTool, etisserant@0: id=wxID_PLCOPENEDITORSFCTOOLBARITEMS4) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnSFCDivergenceTool, etisserant@0: id=wxID_PLCOPENEDITORSFCTOOLBARITEMS5) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnSFCJumpTool, etisserant@0: id=wxID_PLCOPENEDITORSFCTOOLBARITEMS6) etisserant@0: etisserant@0: def init_coll_FBDToolBar_Items(self, parent): etisserant@0: parent.AddRadioTool(wxID_PLCOPENEDITORFBDTOOLBARITEMS0, etisserant@0: wxBitmap('Images/select.png'), wxNullBitmap, "Select an object") etisserant@0: parent.AddRadioTool(wxID_PLCOPENEDITORFBDTOOLBARITEMS1, etisserant@0: wxBitmap('Images/comment.png'), wxNullBitmap, "Create a new comment") etisserant@0: parent.AddRadioTool(wxID_PLCOPENEDITORFBDTOOLBARITEMS2, etisserant@0: wxBitmap('Images/variable.png'), wxNullBitmap, "Create a new variable") etisserant@0: parent.AddRadioTool(wxID_PLCOPENEDITORFBDTOOLBARITEMS3, etisserant@0: wxBitmap('Images/block.png'), wxNullBitmap, "Create a new block") etisserant@0: parent.AddRadioTool(wxID_PLCOPENEDITORFBDTOOLBARITEMS4, etisserant@0: wxBitmap('Images/connection.png'), wxNullBitmap, "Create a new connection") etisserant@0: parent.AddRadioTool(wxID_PLCOPENEDITORFBDTOOLBARITEMS5, etisserant@0: wxBitmap('Images/wire.png'), wxNullBitmap, "Create a new wire") etisserant@0: self.Bind(wx.EVT_TOOL, self.OnSelectionTool, etisserant@0: id=wxID_PLCOPENEDITORFBDTOOLBARITEMS0) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnCommentTool, etisserant@0: id=wxID_PLCOPENEDITORFBDTOOLBARITEMS1) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnFBDVariableTool, etisserant@0: id=wxID_PLCOPENEDITORFBDTOOLBARITEMS2) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnFBDBlockTool, etisserant@0: id=wxID_PLCOPENEDITORFBDTOOLBARITEMS3) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnFBDConnectionTool, etisserant@0: id=wxID_PLCOPENEDITORFBDTOOLBARITEMS4) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnWireTool, etisserant@0: id=wxID_PLCOPENEDITORFBDTOOLBARITEMS5) etisserant@0: etisserant@0: def init_coll_LDToolBar_Items(self, parent): etisserant@0: parent.AddRadioTool(wxID_PLCOPENEDITORLDTOOLBARITEMS0, etisserant@0: wxBitmap('Images/select.png'), wxNullBitmap, "Select an object") etisserant@0: parent.AddSimpleTool(wxID_PLCOPENEDITORLDTOOLBARITEMS1, etisserant@0: wxBitmap('Images/coil.png'), "Create a new rung") etisserant@0: parent.AddSimpleTool(wxID_PLCOPENEDITORLDTOOLBARITEMS2, etisserant@0: wxBitmap('Images/contact.png'), "Create a new contact") etisserant@0: parent.AddSimpleTool(wxID_PLCOPENEDITORLDTOOLBARITEMS3, etisserant@0: wxBitmap('Images/block.png'), "Create a new block") etisserant@0: parent.AddSimpleTool(wxID_PLCOPENEDITORLDTOOLBARITEMS4, etisserant@0: wxBitmap('Images/branch.png'), "Create a new branch") etisserant@0: self.Bind(wx.EVT_TOOL, self.OnSelectionTool, etisserant@0: id=wxID_PLCOPENEDITORLDTOOLBARITEMS0) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnLDCoilTool, etisserant@0: id=wxID_PLCOPENEDITORLDTOOLBARITEMS1) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnLDContactTool, etisserant@0: id=wxID_PLCOPENEDITORLDTOOLBARITEMS2) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnLDBlockTool, etisserant@0: id=wxID_PLCOPENEDITORLDTOOLBARITEMS3) etisserant@0: self.Bind(wx.EVT_TOOL, self.OnLDBranchTool, etisserant@0: id=wxID_PLCOPENEDITORLDTOOLBARITEMS4) etisserant@0: etisserant@0: def init_toolbars(self, parent): etisserant@0: self.DefaultToolBar = wxToolBar(id=wxID_PLCOPENEDITORDEFAULTTOOLBAR, name='DefaultToolBar', etisserant@0: parent=parent, pos=wx.Point(0, 27), size=wx.Size(0, 0), etisserant@0: style=wxTB_HORIZONTAL | wxNO_BORDER) etisserant@0: etisserant@0: self.SFCToolBar = wxToolBar(id=wxID_PLCOPENEDITORSFCTOOLBAR, name='SFCToolBar', etisserant@0: parent=parent, pos=wx.Point(0, 27), size=wx.Size(0, 0), etisserant@0: style=wxTB_HORIZONTAL | wxNO_BORDER) etisserant@0: etisserant@0: self.FBDToolBar = wxToolBar(id=wxID_PLCOPENEDITORFBDTOOLBAR, name='FBDToolBar', etisserant@0: parent=parent, pos=wx.Point(0, 27), size=wx.Size(0, 0), etisserant@0: style=wxTB_HORIZONTAL | wxNO_BORDER) etisserant@0: etisserant@0: self.LDToolBar = wxToolBar(id=wxID_PLCOPENEDITORLDTOOLBAR, name='LDToolBar', etisserant@0: parent=parent, pos=wx.Point(0, 27), size=wx.Size(0, 0), etisserant@0: style=wxTB_HORIZONTAL | wxNO_BORDER) etisserant@0: etisserant@0: self.init_coll_DefaultToolBar_Items(self.DefaultToolBar) etisserant@0: self.init_coll_SFCToolBar_Items(self.SFCToolBar) etisserant@0: self.init_coll_FBDToolBar_Items(self.FBDToolBar) etisserant@0: self.init_coll_LDToolBar_Items(self.LDToolBar) etisserant@0: etisserant@0: def __init__(self, parent): etisserant@0: self._init_ctrls(parent) etisserant@0: self.init_toolbars(self) etisserant@0: etisserant@0: self.Controler = PLCControler() etisserant@0: etisserant@0: if fileOpen: etisserant@0: self.Controler.OpenXMLFile(fileOpen) etisserant@0: self.RefreshProjectTree() etisserant@0: etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshToolBar() etisserant@0: etisserant@0: def RefreshFileMenu(self): etisserant@0: if self.Controler.HasOpenedProject(): etisserant@0: if self.TabsOpened.GetPageCount() > 0: etisserant@0: self.FileMenu.FindItemByPosition(2).Enable(True) etisserant@0: else: etisserant@0: self.FileMenu.FindItemByPosition(2).Enable(False) etisserant@0: self.FileMenu.FindItemByPosition(3).Enable(True) etisserant@0: self.FileMenu.FindItemByPosition(5).Enable(True) etisserant@0: self.FileMenu.FindItemByPosition(6).Enable(True) etisserant@0: self.FileMenu.FindItemByPosition(7).Enable(True) etisserant@0: self.FileMenu.FindItemByPosition(9).Enable(True) etisserant@0: else: etisserant@0: self.FileMenu.FindItemByPosition(2).Enable(False) etisserant@0: self.FileMenu.FindItemByPosition(3).Enable(False) etisserant@0: self.FileMenu.FindItemByPosition(5).Enable(False) etisserant@0: self.FileMenu.FindItemByPosition(6).Enable(False) etisserant@0: self.FileMenu.FindItemByPosition(7).Enable(False) etisserant@0: self.FileMenu.FindItemByPosition(9).Enable(False) etisserant@0: etisserant@0: def RefreshEditMenu(self): etisserant@0: self.EditMenu.FindItemByPosition(1).Enable(False) etisserant@0: self.EditMenu.FindItemByPosition(2).Enable(False) etisserant@0: if self.Controler.HasOpenedProject(): etisserant@0: if self.TabsOpened.GetPageCount() > 0: etisserant@0: self.EditMenu.FindItemByPosition(0).Enable(True) etisserant@0: else: etisserant@0: self.EditMenu.FindItemByPosition(0).Enable(False) etisserant@0: self.EditMenu.FindItemByPosition(8).Enable(True) etisserant@0: self.EditMenu.FindItemByPosition(9).Enable(True) etisserant@0: else: etisserant@0: self.EditMenu.FindItemByPosition(0).Enable(False) etisserant@0: self.EditMenu.FindItemByPosition(8).Enable(False) etisserant@0: self.EditMenu.FindItemByPosition(9).Enable(False) etisserant@0: bodytype = self.Controler.GetCurrentElementEditingBodyType() etisserant@0: if bodytype in ["LD","ST"]: etisserant@0: self.EditMenu.FindItemByPosition(4).Enable(True) etisserant@0: self.EditMenu.FindItemByPosition(5).Enable(True) etisserant@0: self.EditMenu.FindItemByPosition(6).Enable(True) etisserant@0: else: etisserant@0: self.EditMenu.FindItemByPosition(4).Enable(False) etisserant@0: self.EditMenu.FindItemByPosition(5).Enable(False) etisserant@0: self.EditMenu.FindItemByPosition(6).Enable(False) etisserant@0: etisserant@0: def OnNewProjectMenu(self, event): etisserant@0: dialog = ProjectDialog(self) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: values = dialog.GetValues() etisserant@0: projectname = values.pop("projectName") etisserant@0: values["creationDateTime"] = datetime(*localtime()[:6]) etisserant@0: self.Controler.CreateNewProject(projectname) etisserant@0: self.Controler.SetProjectProperties(values) etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshProjectTree() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnOpenProjectMenu(self, event): etisserant@0: filepath = self.Controler.GetFilePath() etisserant@0: if filepath != "": etisserant@0: directory = os.path.dirname(filepath) etisserant@0: else: etisserant@0: directory = os.getcwd() etisserant@0: dialog = wxFileDialog(self, "Choose a file", directory, "", "PLCOpen files (*.xml)|*.xml|All files|*.*", wxOPEN) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: filepath = dialog.GetPath() etisserant@0: if os.path.isfile(filepath): etisserant@0: self.Controler.OpenXMLFile(filepath) etisserant@0: self.TabsOpened.DeleteAllPages() etisserant@0: self.RefreshProjectTree() etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshToolBar() etisserant@0: dialog.Destroy() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnCloseTabMenu(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected >= 0: etisserant@0: self.Controler.CloseElementEditing() etisserant@0: self.TabsOpened.DeletePage(selected) etisserant@0: if self.TabsOpened.GetPageCount() > 0: etisserant@0: self.TabsOpened.SetSelection(min(selected, self.TabsOpened.GetPageCount() - 1)) etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshToolBar() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnCloseProjectMenu(self, event): etisserant@0: self.Controler.Reset() etisserant@0: self.TabsOpened.DeleteAllPages() etisserant@0: self.ProjectTree.DeleteAllItems() etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshToolBar() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnSaveProjectMenu(self, event): etisserant@0: self.SaveProject() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnSaveProjectAsMenu(self, event): etisserant@0: self.SaveProjectAs() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnGenerateProgramMenu(self, event): etisserant@0: self.Controler.GenerateProgram() etisserant@0: event.Skip() etisserant@0: etisserant@0: def SaveProject(self): etisserant@0: result = self.Controler.SaveXMLFile() etisserant@0: if not result: etisserant@0: self.SaveProjectAs() etisserant@0: etisserant@0: def SaveProjectAs(self): etisserant@0: filepath = self.Controler.GetFilePath() etisserant@0: if filepath != "": etisserant@0: directory, filename = os.path.split(filepath) etisserant@0: else: etisserant@0: directory, filename = os.getcwd(), "%s.od"%self.Controler.GetProjectName() etisserant@0: dialog = wxFileDialog(self, "Choose a file", directory, filename, "PLCOpen files (*.xml)|*.xml|All files|*.*", wxSAVE|wxOVERWRITE_PROMPT) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: filepath = dialog.GetPath() etisserant@0: if os.path.isdir(os.path.dirname(filepath)): etisserant@0: result = self.Controler.SaveXMLFile(filepath) etisserant@0: if not result: etisserant@0: message = wxMessageDialog(self, "Can't save project to file %s!"%filepath, "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: else: etisserant@0: message = wxMessageDialog(self, "%s is not a valid folder!"%os.path.dirname(filepath), "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: dialog.Destroy() etisserant@0: etisserant@0: def OnQuitMenu(self, event): etisserant@0: self.Close() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnSelectionTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).SetMode(MODE_SELECTION) etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnCommentTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).SetMode(MODE_COMMENT) etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnWireTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).SetMode(MODE_WIRE) etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnSFCInitialStepTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).SetMode(MODE_INITIAL_STEP) etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnSFCStepTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).AddStep() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnSFCActionBlockTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).AddStepAction() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnSFCDivergenceTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).AddDivergence() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnSFCJumpTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).AddJump() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnFBDVariableTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).SetMode(MODE_VARIABLE) etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnFBDBlockTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).SetMode(MODE_BLOCK) etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnFBDConnectionTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).SetMode(MODE_CONNECTION) etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnLDCoilTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).AddRung() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnLDContactTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).AddContact() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnLDBlockTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: pass etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnLDBranchTool(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).AddBranch() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnPouSelectedChanged(self, event): etisserant@0: selected = event.GetSelection() etisserant@0: if selected >= 0: etisserant@0: self.Controler.RefreshCurrentElementEditing(selected) etisserant@0: found = False etisserant@0: name = self.TabsOpened.GetPageText(selected) etisserant@0: root = self.ProjectTree.GetRootItem() etisserant@0: item, root_cookie = self.ProjectTree.GetFirstChild(root) etisserant@0: while item.IsOk() and not found: etisserant@0: if self.ProjectTree.GetItemText(item) == name: etisserant@0: self.ProjectTree.SelectItem(item) etisserant@0: item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshToolBar() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnProjectTreeItemEndEdit(self, event): etisserant@0: new_name = event.GetLabel() etisserant@0: if new_name != "": etisserant@0: if TestIdentifier(new_name): etisserant@0: item = event.GetItem() etisserant@0: itemtype = self.ProjectTree.GetPyData(item) etisserant@0: if itemtype == ITEM_PROJECT: etisserant@0: self.Controler.SetProjectName(new_name) etisserant@0: elif itemtype == ITEM_POU: etisserant@0: old_name = self.ProjectTree.GetItemText(item) etisserant@0: self.Controler.ChangePouName(old_name, new_name) etisserant@0: self.RefreshTabsOpenedTitles() etisserant@0: elif itemtype == ITEM_TRANSITION: etisserant@0: old_name = self.ProjectTree.GetItemText(item) etisserant@0: parent = self.ProjectTree.GetItemParent(item) etisserant@0: grandparent = self.ProjectTree.GetItemParent(parent) etisserant@0: grandparent_name = self.ProjectTree.GetItemText(grandparent) etisserant@0: self.Controler.ChangePouTransitionName(grandparent_name, old_name, new_name) etisserant@0: self.RefreshTabsOpenedTitles() etisserant@0: elif itemtype == ITEM_ACTION: etisserant@0: old_name = self.ProjectTree.GetItemText(item) etisserant@0: parent = self.ProjectTree.GetItemParent(item) etisserant@0: grandparent = self.ProjectTree.GetItemParent(parent) etisserant@0: grandparent_name = self.ProjectTree.GetItemText(grandparent) etisserant@0: self.Controler.ChangePouActionName(grandparent_name, old_name, new_name) etisserant@0: self.RefreshTabsOpenedTitles() etisserant@0: wxCallAfter(self.RefreshProjectTree) etisserant@0: event.Skip() etisserant@0: else: etisserant@0: message = wxMessageDialog(self, "\"%s\" is not a valid identifier!"%new_name, "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: item = event.GetItem() etisserant@0: wxCallAfter(self.ProjectTree.EditLabel, item) etisserant@0: event.Veto() etisserant@0: etisserant@0: def OnProjectTreeItemBeginEdit(self, event): etisserant@0: selected = event.GetItem() etisserant@0: if self.ProjectTree.GetPyData(selected) == ITEM_UNEDITABLE: etisserant@0: event.Veto() etisserant@0: else: etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnProjectTreeItemActivated(self, event): etisserant@0: selected = event.GetItem() etisserant@0: if self.ProjectTree.IsExpanded(selected): etisserant@0: self.ProjectTree.Collapse(selected) etisserant@0: else: etisserant@0: self.ProjectTree.Expand(selected) etisserant@0: name = self.ProjectTree.GetItemText(selected) etisserant@0: data = self.ProjectTree.GetPyData(selected) etisserant@0: if name == "Properties": etisserant@0: old_values = self.Controler.GetProjectProperties() etisserant@0: old_values["projectName"] = self.Controler.GetProjectName() etisserant@0: dialog = ProjectDialog(self) etisserant@0: dialog.SetValues(old_values) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: new_values = dialog.GetValues() etisserant@0: projectname = new_values.pop("projectName") etisserant@0: new_values["creationDateTime"] = old_values["creationDateTime"] etisserant@0: self.Controler.SetProjectName(projectname) etisserant@0: self.Controler.SetProjectProperties(new_values) etisserant@0: self.RefreshProjectTree() etisserant@0: dialog.Destroy() etisserant@0: elif data == ITEM_CLASS: etisserant@0: item = self.ProjectTree.GetItemParent(selected) etisserant@0: item_type = self.ProjectTree.GetPyData(item) etisserant@0: while item_type != ITEM_POU: etisserant@0: item = self.ProjectTree.GetItemParent(item) etisserant@0: item_type = self.ProjectTree.GetPyData(item) etisserant@0: pou_name = self.ProjectTree.GetItemText(item) etisserant@0: dialog = EditVariableDialog(self, pou_name, self.Controler.GetPouType(pou_name), name) etisserant@0: values = {} etisserant@0: values["returnType"] = self.Controler.GetPouInterfaceReturnTypeByName(pou_name) etisserant@0: values["data"] = self.Controler.GetPouInterfaceVarsByName(pou_name) etisserant@0: dialog.SetValues(values) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: if not self.Controler.PouIsUsed(pou_name): etisserant@0: new_values = dialog.GetValues() etisserant@0: if "returnType" in new_values: etisserant@0: self.Controler.SetPouInterfaceReturnType(pou_name, new_values["returnType"]) etisserant@0: self.Controler.SetPouInterfaceVars(pou_name, new_values["data"]) etisserant@0: pou_names = self.Controler.GetElementsOpenedNames() etisserant@0: if pou_name in pou_names: etisserant@0: window = self.TabsOpened.GetPage(pou_names.index(pou_name)) etisserant@0: if isinstance(window, TextViewer): etisserant@0: varlist = [] etisserant@0: if "returnType" in new_values: etisserant@0: varlist.append(name) etisserant@0: for var in new_values["data"]: etisserant@0: varlist.append(var["Name"]) etisserant@0: window.SetVariables(varlist) etisserant@0: else: etisserant@0: message = wxMessageDialog(self, "\"%s\" is used by one or more POUs. Its interface can't be changed!"%pou_name, "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: dialog.Destroy() etisserant@0: elif name == "Global Vars": etisserant@0: parent = self.ProjectTree.GetItemParent(selected) etisserant@0: parent_name = self.ProjectTree.GetItemText(parent) etisserant@0: dialog = EditVariableDialog(self, parent_name, None) etisserant@0: if self.ProjectTree.GetPyData(parent) == ITEM_CONFIGURATION: etisserant@0: values = {"data" : self.Controler.GetConfigurationGlobalVars(parent_name)} etisserant@0: dialog.SetValues(values) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: new_values = dialog.GetValues() etisserant@0: self.Controler.SetConfigurationGlobalVars(parent_name, new_values["data"]) etisserant@0: else: etisserant@0: config = self.ProjectTree.GetItemParent(parent) etisserant@0: config_name = self.ProjectTree.GetItemText(config) etisserant@0: values = {"data" : self.Controler.GetConfigurationResourceGlobalVars(config_name, parent_name)} etisserant@0: dialog.SetValues(values) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: new_values = dialog.GetValues() etisserant@0: self.Controler.SetConfigurationResourceGlobalVars(config_name, parent_name, new_values["data"]) etisserant@0: elif data in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]: etisserant@0: if data == ITEM_POU: etisserant@0: idx = self.Controler.OpenElementEditing(name) etisserant@0: language = self.Controler.GetPouBodyType(name) etisserant@0: varlist = [] etisserant@0: returnType = self.Controler.GetPouInterfaceReturnTypeByName(name) etisserant@0: if returnType: etisserant@0: varlist.append(name) etisserant@0: vars = self.Controler.GetPouInterfaceVarsByName(name) etisserant@0: if vars: etisserant@0: for var in vars: etisserant@0: varlist.append(var["Name"]) etisserant@0: else: etisserant@0: parent = self.ProjectTree.GetItemParent(selected) etisserant@0: parent_name = self.ProjectTree.GetItemText(parent) etisserant@0: grandparent = self.ProjectTree.GetItemParent(parent) etisserant@0: grandparent_name = self.ProjectTree.GetItemText(grandparent) etisserant@0: if data == ITEM_TRANSITION: etisserant@0: idx = self.Controler.OpenPouTransitionEditing(grandparent_name, name) etisserant@0: language = self.Controler.GetTransitionBodyType(grandparent_name, name) etisserant@0: elif data == ITEM_ACTION: etisserant@0: idx = self.Controler.OpenPouActionEditing(grandparent_name, name) etisserant@0: language = self.Controler.GetActionBodyType(grandparent_name, name) etisserant@0: varlist = [name] etisserant@0: vars = self.Controler.GetPouInterfaceVarsByName(grandparent_name) etisserant@0: if vars: etisserant@0: for var in vars: etisserant@0: varlist.append(var["Name"]) etisserant@0: if idx != None: etisserant@0: if language == "FBD": etisserant@0: new_window = FBD_Viewer(self.TabsOpened, self, self.Controler) etisserant@0: elif language == "LD": etisserant@0: new_window = LD_Viewer(self.TabsOpened, self, self.Controler) etisserant@0: elif language == "SFC": etisserant@0: new_window = SFC_Viewer(self.TabsOpened, self, self.Controler) etisserant@0: elif language in ["IL", "ST"]: etisserant@0: new_window = TextViewer(self.TabsOpened, self, self.Controler) etisserant@0: if language == "IL": etisserant@0: new_window.SetKeywords(IL_KEYWORDS) etisserant@0: else: etisserant@0: new_window.SetKeywords(ST_KEYWORDS) etisserant@0: new_window.SetVariables(varlist) etisserant@0: new_window.SetFunctions(self.Controler.GetBlockTypes()) etisserant@0: else: etisserant@0: return etisserant@0: new_window.RefreshView() etisserant@0: self.TabsOpened.AddPage(new_window, "") etisserant@0: self.TabsOpened.SetSelection(idx) etisserant@0: self.RefreshTabsOpenedTitles() etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshToolBar() etisserant@0: else: etisserant@0: if data == ITEM_POU: etisserant@0: idx = self.Controler.ChangeElementEditing(name) etisserant@0: elif data == ITEM_TRANSITION: etisserant@0: idx = self.Controler.ChangePouTransitionEditing(grandparent_name, name) etisserant@0: elif data == ITEM_ACTION: etisserant@0: idx = self.Controler.ChangePouActionEditing(grandparent_name, name) etisserant@0: if idx != None: etisserant@0: self.TabsOpened.SetSelection(idx) etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshToolBar() etisserant@0: elif data == ITEM_RESOURCE: etisserant@0: item = self.ProjectTree.GetItemParent(selected) etisserant@0: item_type = self.ProjectTree.GetPyData(item) etisserant@0: while item_type != ITEM_CONFIGURATION: etisserant@0: item = self.ProjectTree.GetItemParent(item) etisserant@0: item_type = self.ProjectTree.GetPyData(item) etisserant@0: config_name = self.ProjectTree.GetItemText(item) etisserant@0: idx = self.Controler.OpenConfigurationResourceEditing(config_name, name) etisserant@0: if idx != None: etisserant@0: new_window = ResourceEditor(self.TabsOpened, self, self.Controler) etisserant@0: new_window.RefreshView() etisserant@0: self.TabsOpened.AddPage(new_window, "") etisserant@0: self.TabsOpened.SetSelection(idx) etisserant@0: self.RefreshTabsOpenedTitles() etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshToolBar() etisserant@0: else: etisserant@0: idx = self.Controler.ChangeConfigurationResourceEditing(parent_name, name) etisserant@0: if idx != None: etisserant@0: self.TabsOpened.SetSelection(idx) etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshToolBar() etisserant@0: etisserant@0: def OnProjectTreeRightUp(self, event): etisserant@0: selected = self.ProjectTree.GetSelection() etisserant@0: if self.ProjectTree.GetPyData(selected) == ITEM_POU: etisserant@0: name = self.ProjectTree.GetItemText(selected) etisserant@0: if self.Controler.GetPouBodyType(name) == "SFC": etisserant@0: self.PopupMenu(self.SFCMenu) etisserant@0: elif self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: etisserant@0: self.PopupMenu(self.ConfigMenu) etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnProjectTreeItemSelected(self, event): etisserant@0: selected = event.GetItem() etisserant@0: name = self.ProjectTree.GetItemText(selected) etisserant@0: if self.ProjectTree.GetItemParent(selected) == self.ProjectTree.GetRootItem() and name != "Properties": etisserant@0: if self.Controler.IsElementEditing(name): etisserant@0: idx = self.Controler.ChangeElementEditing(name) etisserant@0: if idx != None: etisserant@0: self.TabsOpened.SetSelection(idx) etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshToolBar() etisserant@0: else: etisserant@0: name = self.ProjectTree.GetItemText(selected) etisserant@0: parent = self.ProjectTree.GetItemParent(selected) etisserant@0: parent_name = self.ProjectTree.GetItemText(parent) etisserant@0: grandparent = self.ProjectTree.GetItemParent(parent) etisserant@0: grandparent_name = self.ProjectTree.GetItemText(grandparent) etisserant@0: if parent_name == "Transitions": etisserant@0: idx = self.Controler.ChangePouTransitionEditing(grandparent_name, name) etisserant@0: if idx != None: etisserant@0: self.TabsOpened.SetSelection(idx) etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshToolBar() etisserant@0: elif parent_name == "Action": etisserant@0: idx = self.Controler.ChangePouActionEditing(grandparent_name, name) etisserant@0: if idx != None: etisserant@0: self.TabsOpened.SetSelection(idx) etisserant@0: self.RefreshFileMenu() etisserant@0: self.RefreshEditMenu() etisserant@0: self.RefreshToolBar() etisserant@0: event.Skip() etisserant@0: etisserant@0: def RefreshProjectTree(self): etisserant@0: infos = self.Controler.GetProjectInfos() etisserant@0: root = self.ProjectTree.GetRootItem() etisserant@0: self.GenerateTreeBranch(root, infos) etisserant@0: self.ProjectTree.Expand(self.ProjectTree.GetRootItem()) etisserant@0: etisserant@0: def GenerateTreeBranch(self, root, infos): etisserant@0: to_delete = [] etisserant@0: if root.IsOk(): etisserant@0: self.ProjectTree.SetItemText(root, infos["name"]) etisserant@0: else: etisserant@0: root = self.ProjectTree.AddRoot(infos["name"]) etisserant@0: self.ProjectTree.SetPyData(root, infos["type"]) etisserant@0: item, root_cookie = self.ProjectTree.GetFirstChild(root) etisserant@0: if len(infos["values"]) > 0: etisserant@0: for values in infos["values"]: etisserant@0: if not item.IsOk(): etisserant@0: item = self.ProjectTree.AppendItem(root, "") etisserant@0: item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) etisserant@0: self.GenerateTreeBranch(item, values) etisserant@0: item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) etisserant@0: while item.IsOk(): etisserant@0: to_delete.append(item) etisserant@0: item, root_cookie = self.ProjectTree.GetNextChild(item, root_cookie) etisserant@0: for item in to_delete: etisserant@0: self.ProjectTree.Delete(item) etisserant@0: etisserant@0: def RefreshToolBar(self): etisserant@0: language = self.Controler.GetCurrentElementEditingBodyType() etisserant@0: if language == "SFC": etisserant@0: self.SFCToolBar.ToggleTool(0, True) etisserant@0: self.SFCToolBar.Show() etisserant@0: self.SetToolBar(self.SFCToolBar) etisserant@0: self.DefaultToolBar.Hide() etisserant@0: self.FBDToolBar.Hide() etisserant@0: self.LDToolBar.Hide() etisserant@0: elif language == "FBD": etisserant@0: self.FBDToolBar.ToggleTool(0, True) etisserant@0: self.FBDToolBar.Show() etisserant@0: self.SetToolBar(self.FBDToolBar) etisserant@0: self.DefaultToolBar.Hide() etisserant@0: self.SFCToolBar.Hide() etisserant@0: self.LDToolBar.Hide() etisserant@0: elif language == "LD": etisserant@0: self.LDToolBar.ToggleTool(0, True) etisserant@0: self.LDToolBar.Show() etisserant@0: self.SetToolBar(self.LDToolBar) etisserant@0: self.DefaultToolBar.Hide() etisserant@0: self.SFCToolBar.Hide() etisserant@0: self.FBDToolBar.Hide() etisserant@0: else: etisserant@0: self.DefaultToolBar.ToggleTool(0, True) etisserant@0: self.DefaultToolBar.Show() etisserant@0: self.SetToolBar(self.DefaultToolBar) etisserant@0: self.SFCToolBar.Hide() etisserant@0: self.FBDToolBar.Hide() etisserant@0: self.LDToolBar.Hide() etisserant@0: etisserant@0: def RefreshTabsOpenedTitles(self): etisserant@0: pous = self.Controler.GetElementsOpenedNames() etisserant@0: for i, pou in enumerate(pous): etisserant@0: self.TabsOpened.SetPageText(i, pou) etisserant@0: etisserant@0: def OnRefreshMenu(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).Refresh() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnCutMenu(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).Cut() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnCopyMenu(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).Copy() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnPasteMenu(self, event): etisserant@0: selected = self.TabsOpened.GetSelection() etisserant@0: if selected != -1: etisserant@0: self.TabsOpened.GetPage(selected).Paste() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnAddPouMenu(self, event): etisserant@0: dialog = PouDialog(self) etisserant@0: dialog.SetPouNames(self.Controler.GetProjectPouNames()) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: values = dialog.GetValues() etisserant@0: self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"]) etisserant@0: self.RefreshProjectTree() etisserant@0: dialog.Destroy() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnRemovePouMenu(self, event): etisserant@0: pous = self.Controler.GetProjectPouNames() etisserant@0: dialog = wxSingleChoiceDialog(self, "Select POU to remove:", "POU Remove", pous, wxOK|wxCANCEL) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: selected = dialog.GetStringSelection() etisserant@0: if not self.Controler.PouIsUsed(selected): etisserant@0: self.Controler.ProjectRemovePou(selected) etisserant@0: for i in xrange(self.TabsOpened.GetPageCount()): etisserant@0: if self.TabsOpened.GetPageText(i) == selected: etisserant@0: self.TabsOpened.DeletePage(i) etisserant@0: self.RefreshProjectTree() etisserant@0: self.RefreshToolBar() etisserant@0: else: etisserant@0: message = wxMessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnAddConfigurationMenu(self, event): etisserant@0: dialog = wxTextEntryDialog(self, "Enter configuration name:", "Create new configuration", "", wxOK|wxCANCEL) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: value = dialog.GetValue() etisserant@0: self.Controler.ProjectAddConfiguration(value) etisserant@0: self.RefreshProjectTree() etisserant@0: dialog.Destroy() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnRemoveConfigurationMenu(self, event): etisserant@0: configs = self.Controler.GetProjectConfigNames() etisserant@0: dialog = wxSingleChoiceDialog(self, "Select Configuration to remove:", "Configuration Remove", configs, wxOK|wxCANCEL) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: selected = dialog.GetStringSelection() etisserant@0: self.Controler.ProjectRemoveConfiguration(selected) etisserant@0: self.RefreshProjectTree() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnAddPouTransitionMenu(self, event): etisserant@0: dialog = PouTransitionDialog(self) etisserant@0: dialog.SetPous(self.Controler.GetSFCPous()) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: values = dialog.GetValues() etisserant@0: self.Controler.ProjectAddPouTransition(values["pouName"], values["transitionName"], values["language"]) etisserant@0: self.RefreshProjectTree() etisserant@0: dialog.Destroy() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnRemovePouTransitionMenu(self, event): etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnAddPouActionMenu(self, event): etisserant@0: dialog = PouActionDialog(self) etisserant@0: dialog.SetPous(self.Controler.GetSFCPous()) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: values = dialog.GetValues() etisserant@0: self.Controler.ProjectAddPouAction(values["pouName"], values["actionName"], values["language"]) etisserant@0: self.RefreshProjectTree() etisserant@0: dialog.Destroy() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnRemovePouActionMenu(self, event): etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnAddResourceMenu(self, event): etisserant@0: selected = self.ProjectTree.GetSelection() etisserant@0: if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: etisserant@0: config_name = self.ProjectTree.GetItemText(selected) etisserant@0: dialog = wxTextEntryDialog(self, "Enter Resource name:", "Create new Resource", "", wxOK|wxCANCEL) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: value = dialog.GetValue() etisserant@0: self.Controler.ProjectAddConfigurationResource(config_name, value) etisserant@0: self.RefreshProjectTree() etisserant@0: dialog.Destroy() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnRemoveResourceMenu(self, event): etisserant@0: selected = self.ProjectTree.GetSelection() etisserant@0: if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: etisserant@0: config_name = self.ProjectTree.GetItemText(selected) etisserant@0: infos = self.Controler.GetProjectInfos() etisserant@0: resources = [] etisserant@0: for config in infos["configs"]: etisserant@0: if config["name"] == config_name: etisserant@0: resources = config["resources"] etisserant@0: dialog = wxSingleChoiceDialog(self, "Select Resource to remove:", "Resource Remove", resources, wxOK|wxCANCEL) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: resource = dialog.GetStringSelection() etisserant@0: self.Controler.ProjectRemoveConfigurationResource(config_name, resource) etisserant@0: self.RefreshProjectTree() etisserant@0: dialog.Destroy() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnPLCOpenMenu(self, event): etisserant@0: result = OpenPDFDoc() etisserant@0: if type(result) == StringType: etisserant@0: message = wxMessageDialog(self, result, "ERROR", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: event.Skip() etisserant@0: etisserant@0: current_num = 0 etisserant@0: def GetNewNum(): etisserant@0: global current_num etisserant@0: current_num += 1 etisserant@0: return current_num etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Create Project Dialog etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: [wxID_PROJECTDIALOG, wxID_PROJECTDIALOGMAINPANEL, etisserant@0: wxID_PROJECTDIALOGPROJECTNAME, wxID_PROJECTDIALOGCOMPANYNAME, etisserant@0: wxID_PROJECTDIALOGCOMPANYURL, wxID_PROJECTDIALOGPRODUCTNAME, etisserant@0: wxID_PROJECTDIALOGPRODUCTVERSION, wxID_PROJECTDIALOGPRODUCTRELEASE, etisserant@0: wxID_PROJECTDIALOGCONTENTDESCRIPTION, wxID_PROJECTDIALOGSTATICTEXT1, etisserant@0: wxID_PROJECTDIALOGSTATICTEXT2, wxID_PROJECTDIALOGSTATICTEXT3, etisserant@0: wxID_PROJECTDIALOGSTATICTEXT4, wxID_PROJECTDIALOGSTATICTEXT5, etisserant@0: wxID_PROJECTDIALOGSTATICTEXT6, wxID_PROJECTDIALOGSTATICTEXT7, etisserant@0: ] = [wx.NewId() for _init_ctrls in range(16)] etisserant@0: etisserant@0: class ProjectDialog(wx.Dialog): etisserant@0: def _init_coll_flexGridSizer1_Items(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.AddWindow(self.MainPanel, 0, border=0, flag=0) etisserant@0: etisserant@0: def _init_sizers(self): etisserant@0: # generated method, don't edit etisserant@0: self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) etisserant@0: etisserant@0: self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) etisserant@0: etisserant@0: self.SetSizer(self.flexGridSizer1) etisserant@0: etisserant@0: def _init_ctrls(self, prnt): etisserant@0: # generated method, don't edit etisserant@0: wx.Dialog.__init__(self, id=wxID_PROJECTDIALOG, etisserant@0: name='ProjectDialog', parent=prnt, pos=wx.Point(376, 223), etisserant@0: size=wx.Size(550, 450), style=wx.DEFAULT_DIALOG_STYLE, etisserant@0: title='Create a new project') etisserant@0: self.SetClientSize(wx.Size(550, 450)) etisserant@0: etisserant@0: self.MainPanel = wx.Panel(id=wxID_PROJECTDIALOGMAINPANEL, etisserant@0: name='MainPanel', parent=self, pos=wx.Point(0, 0), etisserant@0: size=wx.Size(450, 400), style=wx.TAB_TRAVERSAL) etisserant@0: self.MainPanel.SetAutoLayout(True) etisserant@0: etisserant@0: self.staticText1 = wx.StaticText(id=wxID_PROJECTDIALOGSTATICTEXT1, etisserant@0: label='Project Name (required):', name='staticText1', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 24), size=wx.Size(215, 17), style=0) etisserant@0: etisserant@0: self.ProjectName = wx.TextCtrl(id=wxID_PROJECTDIALOGPROJECTNAME, etisserant@0: name='ProjectName', parent=self.MainPanel, pos=wx.Point(224, 24), etisserant@0: size=wx.Size(295, 24), style=0) etisserant@0: etisserant@0: self.staticText2 = wx.StaticText(id=wxID_PROJECTDIALOGSTATICTEXT2, etisserant@0: label='Company Name (required):', name='staticText2', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 64), size=wx.Size(215, 17), style=0) etisserant@0: etisserant@0: self.CompanyName = wx.TextCtrl(id=wxID_PROJECTDIALOGCOMPANYNAME, etisserant@0: name='CompanyName', parent=self.MainPanel, pos=wx.Point(224, 64), etisserant@0: size=wx.Size(295, 24), style=0) etisserant@0: etisserant@0: self.staticText3 = wx.StaticText(id=wxID_PROJECTDIALOGSTATICTEXT3, etisserant@0: label='Company URL (optional):', name='staticText3', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 104), size=wx.Size(215, 17), style=0) etisserant@0: etisserant@0: self.CompanyURL = wx.TextCtrl(id=wxID_PROJECTDIALOGCOMPANYURL, etisserant@0: name='CompanyURL', parent=self.MainPanel, pos=wx.Point(224, 104), etisserant@0: size=wx.Size(295, 24), style=0) etisserant@0: etisserant@0: self.staticText4 = wx.StaticText(id=wxID_PROJECTDIALOGSTATICTEXT4, etisserant@0: label='Product Name (required):', name='staticText4', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 144), size=wx.Size(215, 17), style=0) etisserant@0: etisserant@0: self.ProductName = wx.TextCtrl(id=wxID_PROJECTDIALOGPRODUCTNAME, etisserant@0: name='ProductName', parent=self.MainPanel, pos=wx.Point(224, 144), etisserant@0: size=wx.Size(295, 24), style=0) etisserant@0: etisserant@0: self.staticText5 = wx.StaticText(id=wxID_PROJECTDIALOGSTATICTEXT5, etisserant@0: label='Product Version (required):', name='staticText5', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 184), size=wx.Size(215, 17), style=0) etisserant@0: etisserant@0: self.ProductVersion = wx.TextCtrl(id=wxID_PROJECTDIALOGPRODUCTVERSION, etisserant@0: name='ProductVersion', parent=self.MainPanel, pos=wx.Point(224, 184), etisserant@0: size=wx.Size(295, 24), style=0) etisserant@0: etisserant@0: self.staticText6 = wx.StaticText(id=wxID_PROJECTDIALOGSTATICTEXT6, etisserant@0: label='Product Release (optional):', name='staticText6', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 224), size=wx.Size(215, 17), style=0) etisserant@0: etisserant@0: self.ProductRelease = wx.TextCtrl(id=wxID_PROJECTDIALOGPRODUCTRELEASE, etisserant@0: name='ProductRelease', parent=self.MainPanel, pos=wx.Point(224, 224), etisserant@0: size=wx.Size(295, 24), style=0) etisserant@0: etisserant@0: self.staticText7 = wx.StaticText(id=wxID_PROJECTDIALOGSTATICTEXT7, etisserant@0: label='Content Description (optional):', name='staticText7', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 264), size=wx.Size(215, 17), style=0) etisserant@0: etisserant@0: self.ContentDescription = wx.TextCtrl(id=wxID_PROJECTDIALOGCONTENTDESCRIPTION, etisserant@0: name='ProductRelease', parent=self.MainPanel, pos=wx.Point(224, 264), etisserant@0: size=wx.Size(295, 120), style=wxTE_MULTILINE) etisserant@0: etisserant@0: self._init_sizers() etisserant@0: etisserant@0: def __init__(self, parent): etisserant@0: self._init_ctrls(parent) etisserant@0: self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL) etisserant@0: self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_RIGHT) etisserant@0: etisserant@0: EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK) etisserant@0: etisserant@0: def OnOK(self, event): etisserant@0: error = [] etisserant@0: if self.ProjectName.GetValue() == "": etisserant@0: error.append("Project Name") etisserant@0: if self.CompanyName.GetValue() == "": etisserant@0: error.append("Company Name") etisserant@0: if self.ProductName.GetValue() == "": etisserant@0: error.append("Product Name") etisserant@0: if self.ProductVersion.GetValue() == "": etisserant@0: error.append("Product Version") etisserant@0: if len(error) > 0: etisserant@0: text = "" etisserant@0: for i, item in enumerate(error): etisserant@0: if i == 0: etisserant@0: text += item etisserant@0: elif i == len(error) - 1: etisserant@0: text += " and %s"%item etisserant@0: else: etisserant@0: text += ", %s"%item etisserant@0: message = wxMessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: else: etisserant@0: self.EndModal(wxID_OK) etisserant@0: etisserant@0: def SetValues(self, values): etisserant@0: for item, value in values.items(): etisserant@0: if item == "projectName": etisserant@0: self.ProjectName.SetValue(value) etisserant@0: elif item == "companyName": etisserant@0: self.CompanyName.SetValue(value) etisserant@0: elif item == "companyURL": etisserant@0: self.CompanyURL.SetValue(value) etisserant@0: elif item == "productName": etisserant@0: self.ProductName.SetValue(value) etisserant@0: elif item == "productVersion": etisserant@0: self.ProductVersion.SetValue(value) etisserant@0: elif item == "productRelease": etisserant@0: self.ProductRelease.SetValue(value) etisserant@0: elif item == "contentDescription": etisserant@0: self.ContentDescription.SetValue(value) etisserant@0: etisserant@0: def GetValues(self): etisserant@0: values = {} etisserant@0: values["projectName"] = self.ProjectName.GetValue() etisserant@0: values["companyName"] = self.CompanyName.GetValue() etisserant@0: if self.CompanyURL.GetValue() != None: etisserant@0: values["companyURL"] = self.CompanyURL.GetValue() etisserant@0: values["productName"] = self.ProductName.GetValue() etisserant@0: values["productVersion"] = self.ProductVersion.GetValue() etisserant@0: if self.ProductRelease.GetValue() != None: etisserant@0: values["productRelease"] = self.ProductRelease.GetValue() etisserant@0: if self.ProductRelease.GetValue() != None: etisserant@0: values["contentDescription"] = self.ContentDescription.GetValue() etisserant@0: return values etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Create Pou Dialog etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: [wxID_POUDIALOG, wxID_POUDIALOGMAINPANEL, wxID_POUDIALOGPOUNAME, etisserant@0: wxID_POUDIALOGPOUTYPE, wxID_POUDIALOGLANGUAGE, wxID_POUDIALOGSTATICTEXT1, etisserant@0: wxID_POUDIALOGSTATICTEXT2, wxID_POUDIALOGSTATICTEXT3, etisserant@0: ] = [wx.NewId() for _init_ctrls in range(8)] etisserant@0: etisserant@0: class PouDialog(wx.Dialog): etisserant@0: def _init_coll_flexGridSizer1_Items(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.AddWindow(self.MainPanel, 0, border=0, flag=0) etisserant@0: etisserant@0: def _init_sizers(self): etisserant@0: # generated method, don't edit etisserant@0: self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) etisserant@0: etisserant@0: self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) etisserant@0: etisserant@0: self.SetSizer(self.flexGridSizer1) etisserant@0: etisserant@0: def _init_ctrls(self, prnt): etisserant@0: # generated method, don't edit etisserant@0: wx.Dialog.__init__(self, id=wxID_POUDIALOG, etisserant@0: name='ProjectDialog', parent=prnt, pos=wx.Point(376, 223), etisserant@0: size=wx.Size(300, 200), style=wx.DEFAULT_DIALOG_STYLE, etisserant@0: title='Create a new project') etisserant@0: self.SetClientSize(wx.Size(300, 200)) etisserant@0: etisserant@0: self.MainPanel = wx.Panel(id=wxID_POUDIALOGMAINPANEL, etisserant@0: name='MainPanel', parent=self, pos=wx.Point(0, 0), etisserant@0: size=wx.Size(300, 200), style=wx.TAB_TRAVERSAL) etisserant@0: self.MainPanel.SetAutoLayout(True) etisserant@0: etisserant@0: self.staticText1 = wx.StaticText(id=wxID_POUDIALOGSTATICTEXT1, etisserant@0: label='POU Name:', name='staticText1', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 24), size=wx.Size(95, 17), style=0) etisserant@0: etisserant@0: self.PouName = wx.TextCtrl(id=wxID_POUDIALOGPOUNAME, etisserant@0: name='POUName', parent=self.MainPanel, pos=wx.Point(104, 24), etisserant@0: size=wx.Size(150, 24), style=0) etisserant@0: etisserant@0: self.staticText2 = wx.StaticText(id=wxID_POUDIALOGSTATICTEXT2, etisserant@0: label='POU Type:', name='staticText2', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 64), size=wx.Size(95, 17), style=0) etisserant@0: etisserant@0: self.PouType = wx.Choice(id=wxID_POUDIALOGPOUTYPE, etisserant@0: name='POUType', parent=self.MainPanel, pos=wx.Point(104, 64), etisserant@0: size=wx.Size(150, 24), style=0) etisserant@0: EVT_CHOICE(self, wxID_POUDIALOGPOUTYPE, self.OnTypeChanged) etisserant@0: etisserant@0: self.staticText3 = wx.StaticText(id=wxID_POUDIALOGSTATICTEXT3, etisserant@0: label='Language:', name='staticText3', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 104), size=wx.Size(95, 17), style=0) etisserant@0: etisserant@0: self.Language = wx.Choice(id=wxID_POUDIALOGLANGUAGE, etisserant@0: name='Language', parent=self.MainPanel, pos=wx.Point(104, 104), etisserant@0: size=wx.Size(150, 24), style=0) etisserant@0: etisserant@0: self._init_sizers() etisserant@0: etisserant@0: def __init__(self, parent): etisserant@0: self._init_ctrls(parent) etisserant@0: self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL) etisserant@0: self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_RIGHT) etisserant@0: etisserant@0: for option in ["function","functionBlock","program"]: etisserant@0: self.PouType.Append(option) etisserant@0: self.RefreshLanguage() etisserant@0: etisserant@0: EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK) etisserant@0: etisserant@0: def OnOK(self, event): etisserant@0: error = [] etisserant@0: pou_name = self.PouName.GetValue() etisserant@0: if pou_name == "": etisserant@0: error.append("POU Name") etisserant@0: if self.PouType.GetStringSelection() == "": etisserant@0: error.append("POU Type") etisserant@0: if self.Language.GetStringSelection() == "": etisserant@0: error.append("Language") etisserant@0: if len(error) > 0: etisserant@0: text = "" etisserant@0: for i, item in enumerate(error): etisserant@0: if i == 0: etisserant@0: text += item etisserant@0: elif i == len(error) - 1: etisserant@0: text += " and %s"%item etisserant@0: else: etisserant@0: text += ", %s"%item etisserant@0: message = wxMessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: elif not TestIdentifier(pou_name): etisserant@0: message = wxMessageDialog(self, "\"%s\" is not a valid identifier!"%pou_name, "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: elif pou_name.upper() in IEC_KEYWORDS: etisserant@0: message = wxMessageDialog(self, "\"%s\" is a keyword. It can't be used!"%pou_name, "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: elif pou_name.upper() in self.PouNames: etisserant@0: message = wxMessageDialog(self, "\"%s\" pou already exists!"%pou_name, "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: else: etisserant@0: self.EndModal(wxID_OK) etisserant@0: etisserant@0: def RefreshLanguage(self): etisserant@0: selection = self.Language.GetStringSelection() etisserant@0: self.Language.Clear() etisserant@0: for option in ["IL","ST","LD","FBD","SFC"]: etisserant@0: if option != "SFC" or self.PouType.GetStringSelection() == "program": etisserant@0: self.Language.Append(option) etisserant@0: if self.Language.FindString(selection) != wxNOT_FOUND: etisserant@0: self.Language.SetStringSelection(selection) etisserant@0: etisserant@0: def OnTypeChanged(self, event): etisserant@0: self.RefreshLanguage() etisserant@0: event.Skip() etisserant@0: etisserant@0: def SetPouNames(self, pou_names): etisserant@0: self.PouNames = [pou_name.upper() for pou_name in pou_names] etisserant@0: etisserant@0: def SetValues(self, values): etisserant@0: for item, value in values.items(): etisserant@0: if item == "pouName": etisserant@0: self.PouName.SetValue(value) etisserant@0: elif item == "pouType": etisserant@0: self.PouType.SetStringSelection(value) etisserant@0: elif item == "language": etisserant@0: self.Language.SetStringSelection(value) etisserant@0: etisserant@0: def GetValues(self): etisserant@0: values = {} etisserant@0: values["pouName"] = self.PouName.GetValue() etisserant@0: values["pouType"] = self.PouType.GetStringSelection() etisserant@0: values["language"] = self.Language.GetStringSelection() etisserant@0: return values etisserant@0: etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Create Pou Transition Dialog etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: [wxID_POUTRANSITIONDIALOG, wxID_POUTRANSITIONDIALOGMAINPANEL, etisserant@0: wxID_POUTRANSITIONDIALOGPOUNAME, wxID_POUTRANSITIONDIALOGTRANSITIONNAME, etisserant@0: wxID_POUTRANSITIONDIALOGLANGUAGE, wxID_POUTRANSITIONDIALOGSTATICTEXT1, etisserant@0: wxID_POUTRANSITIONDIALOGSTATICTEXT2, wxID_POUTRANSITIONDIALOGSTATICTEXT3, etisserant@0: ] = [wx.NewId() for _init_ctrls in range(8)] etisserant@0: etisserant@0: class PouTransitionDialog(wx.Dialog): etisserant@0: def _init_coll_flexGridSizer1_Items(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.AddWindow(self.MainPanel, 0, border=0, flag=0) etisserant@0: etisserant@0: def _init_sizers(self): etisserant@0: # generated method, don't edit etisserant@0: self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) etisserant@0: etisserant@0: self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) etisserant@0: etisserant@0: self.SetSizer(self.flexGridSizer1) etisserant@0: etisserant@0: def _init_ctrls(self, prnt): etisserant@0: # generated method, don't edit etisserant@0: wx.Dialog.__init__(self, id=wxID_POUTRANSITIONDIALOG, etisserant@0: name='ProjectDialog', parent=prnt, pos=wx.Point(376, 223), etisserant@0: size=wx.Size(350, 200), style=wx.DEFAULT_DIALOG_STYLE, etisserant@0: title='Create a new project') etisserant@0: self.SetClientSize(wx.Size(350, 200)) etisserant@0: etisserant@0: self.MainPanel = wx.Panel(id=wxID_POUTRANSITIONDIALOGMAINPANEL, etisserant@0: name='MainPanel', parent=self, pos=wx.Point(0, 0), etisserant@0: size=wx.Size(350, 200), style=wx.TAB_TRAVERSAL) etisserant@0: self.MainPanel.SetAutoLayout(True) etisserant@0: etisserant@0: self.staticText1 = wx.StaticText(id=wxID_POUTRANSITIONDIALOGSTATICTEXT1, etisserant@0: label='POU Name:', name='staticText1', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 24), size=wx.Size(145, 17), style=0) etisserant@0: etisserant@0: self.PouName = wx.Choice(id=wxID_POUTRANSITIONDIALOGPOUNAME, etisserant@0: name='POUName', parent=self.MainPanel, pos=wx.Point(154, 24), etisserant@0: size=wx.Size(150, 24), style=0) etisserant@0: etisserant@0: self.staticText2 = wx.StaticText(id=wxID_POUTRANSITIONDIALOGSTATICTEXT2, etisserant@0: label='Transition Name:', name='staticText2', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 64), size=wx.Size(145, 17), style=0) etisserant@0: etisserant@0: self.TransitionName = wx.TextCtrl(id=wxID_POUTRANSITIONDIALOGTRANSITIONNAME, etisserant@0: name='TransitionName', parent=self.MainPanel, pos=wx.Point(154, 64), etisserant@0: size=wx.Size(150, 24), style=0) etisserant@0: etisserant@0: self.staticText3 = wx.StaticText(id=wxID_POUTRANSITIONDIALOGSTATICTEXT3, etisserant@0: label='Language:', name='staticText3', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 104), size=wx.Size(145, 17), style=0) etisserant@0: etisserant@0: self.Language = wx.Choice(id=wxID_POUTRANSITIONDIALOGLANGUAGE, etisserant@0: name='Language', parent=self.MainPanel, pos=wx.Point(154, 104), etisserant@0: size=wx.Size(150, 24), style=0) etisserant@0: etisserant@0: self._init_sizers() etisserant@0: etisserant@0: def __init__(self, parent): etisserant@0: self._init_ctrls(parent) etisserant@0: self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL) etisserant@0: self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_RIGHT) etisserant@0: etisserant@0: for option in ["IL","ST","LD","FBD"]: etisserant@0: self.Language.Append(option) etisserant@0: etisserant@0: EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK) etisserant@0: etisserant@0: def OnOK(self, event): etisserant@0: error = [] etisserant@0: if self.PouName.GetStringSelection() == "": etisserant@0: error.append("POU Name") etisserant@0: if self.TransitionName.GetValue() == "": etisserant@0: error.append("Transition Name") etisserant@0: if self.Language.GetStringSelection() == "": etisserant@0: error.append("Language") etisserant@0: if len(error) > 0: etisserant@0: text = "" etisserant@0: for i, item in enumerate(error): etisserant@0: if i == 0: etisserant@0: text += item etisserant@0: elif i == len(error) - 1: etisserant@0: text += " and %s"%item etisserant@0: else: etisserant@0: text += ", %s"%item etisserant@0: message = wxMessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: else: etisserant@0: self.EndModal(wxID_OK) etisserant@0: etisserant@0: def SetPous(self, pous): etisserant@0: for pou in pous: etisserant@0: self.PouName.Append(pou) etisserant@0: etisserant@0: def SetValues(self, values): etisserant@0: for item, value in values.items(): etisserant@0: if item == "pouName": etisserant@0: self.PouName.SetStringSelection(value) etisserant@0: elif item == "transitionName": etisserant@0: self.TransitionName.SetValue(value) etisserant@0: elif item == "language": etisserant@0: self.Language.SetStringSelection(value) etisserant@0: etisserant@0: def GetValues(self): etisserant@0: values = {} etisserant@0: values["pouName"] = self.PouName.GetStringSelection() etisserant@0: values["transitionName"] = self.TransitionName.GetValue() etisserant@0: values["language"] = self.Language.GetStringSelection() etisserant@0: return values etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Create Pou Action Dialog etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: [wxID_POUACTIONDIALOG, wxID_POUACTIONDIALOGMAINPANEL, etisserant@0: wxID_POUACTIONDIALOGPOUNAME, wxID_POUACTIONDIALOGACTIONNAME, etisserant@0: wxID_POUACTIONDIALOGLANGUAGE, wxID_POUACTIONDIALOGSTATICTEXT1, etisserant@0: wxID_POUACTIONDIALOGSTATICTEXT2, wxID_POUACTIONDIALOGSTATICTEXT3, etisserant@0: ] = [wx.NewId() for _init_ctrls in range(8)] etisserant@0: etisserant@0: class PouActionDialog(wx.Dialog): etisserant@0: def _init_coll_flexGridSizer1_Items(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.AddWindow(self.MainPanel, 0, border=0, flag=0) etisserant@0: etisserant@0: def _init_sizers(self): etisserant@0: # generated method, don't edit etisserant@0: self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) etisserant@0: etisserant@0: self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) etisserant@0: etisserant@0: self.SetSizer(self.flexGridSizer1) etisserant@0: etisserant@0: def _init_ctrls(self, prnt): etisserant@0: # generated method, don't edit etisserant@0: wx.Dialog.__init__(self, id=wxID_POUACTIONDIALOG, etisserant@0: name='ProjectDialog', parent=prnt, pos=wx.Point(376, 223), etisserant@0: size=wx.Size(320, 200), style=wx.DEFAULT_DIALOG_STYLE, etisserant@0: title='Create a new project') etisserant@0: self.SetClientSize(wx.Size(320, 200)) etisserant@0: etisserant@0: self.MainPanel = wx.Panel(id=wxID_POUACTIONDIALOGMAINPANEL, etisserant@0: name='MainPanel', parent=self, pos=wx.Point(0, 0), etisserant@0: size=wx.Size(350, 200), style=wx.TAB_TRAVERSAL) etisserant@0: self.MainPanel.SetAutoLayout(True) etisserant@0: etisserant@0: self.staticText1 = wx.StaticText(id=wxID_POUACTIONDIALOGSTATICTEXT1, etisserant@0: label='POU Name:', name='staticText1', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 24), size=wx.Size(145, 17), style=0) etisserant@0: etisserant@0: self.PouName = wx.Choice(id=wxID_POUACTIONDIALOGPOUNAME, etisserant@0: name='POUName', parent=self.MainPanel, pos=wx.Point(124, 24), etisserant@0: size=wx.Size(150, 24), style=0) etisserant@0: etisserant@0: self.staticText2 = wx.StaticText(id=wxID_POUACTIONDIALOGSTATICTEXT2, etisserant@0: label='Action Name:', name='staticText2', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 64), size=wx.Size(145, 17), style=0) etisserant@0: etisserant@0: self.ActionName = wx.TextCtrl(id=wxID_POUACTIONDIALOGACTIONNAME, etisserant@0: name='ActionName', parent=self.MainPanel, pos=wx.Point(124, 64), etisserant@0: size=wx.Size(150, 24), style=0) etisserant@0: etisserant@0: self.staticText3 = wx.StaticText(id=wxID_POUACTIONDIALOGSTATICTEXT3, etisserant@0: label='Language:', name='staticText3', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 104), size=wx.Size(145, 17), style=0) etisserant@0: etisserant@0: self.Language = wx.Choice(id=wxID_POUACTIONDIALOGLANGUAGE, etisserant@0: name='Language', parent=self.MainPanel, pos=wx.Point(124, 104), etisserant@0: size=wx.Size(150, 24), style=0) etisserant@0: etisserant@0: self._init_sizers() etisserant@0: etisserant@0: def __init__(self, parent): etisserant@0: self._init_ctrls(parent) etisserant@0: self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL) etisserant@0: self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_RIGHT) etisserant@0: etisserant@0: for option in ["IL","ST","LD","FBD"]: etisserant@0: self.Language.Append(option) etisserant@0: etisserant@0: EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK) etisserant@0: etisserant@0: def OnOK(self, event): etisserant@0: error = [] etisserant@0: if self.PouName.GetStringSelection() == "": etisserant@0: error.append("POU Name") etisserant@0: if self.ActionName.GetValue() == "": etisserant@0: error.append("Action Name") etisserant@0: if self.Language.GetStringSelection() == "": etisserant@0: error.append("Language") etisserant@0: if len(error) > 0: etisserant@0: text = "" etisserant@0: for i, item in enumerate(error): etisserant@0: if i == 0: etisserant@0: text += item etisserant@0: elif i == len(error) - 1: etisserant@0: text += " and %s"%item etisserant@0: else: etisserant@0: text += ", %s"%item etisserant@0: message = wxMessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: else: etisserant@0: self.EndModal(wxID_OK) etisserant@0: etisserant@0: def SetPous(self, pous): etisserant@0: for pou in pous: etisserant@0: self.PouName.Append(pou) etisserant@0: etisserant@0: def SetValues(self, values): etisserant@0: for item, value in values.items(): etisserant@0: if item == "pouName": etisserant@0: self.PouName.SetStringSelection(value) etisserant@0: elif item == "actionName": etisserant@0: self.ActionName.SetValue(value) etisserant@0: elif item == "language": etisserant@0: self.Language.SetStringSelection(value) etisserant@0: etisserant@0: def GetValues(self): etisserant@0: values = {} etisserant@0: values["pouName"] = self.PouName.GetStringSelection() etisserant@0: values["actionName"] = self.ActionName.GetValue() etisserant@0: values["language"] = self.Language.GetStringSelection() etisserant@0: return values etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Pou Interface Dialog etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: class VariableTable(wxPyGridTableBase): etisserant@0: etisserant@0: """ etisserant@0: A custom wxGrid Table using user supplied data etisserant@0: """ etisserant@0: def __init__(self, parent, data, colnames): etisserant@0: # The base class must be initialized *first* etisserant@0: wxPyGridTableBase.__init__(self) etisserant@0: self.data = data etisserant@0: self.colnames = colnames etisserant@0: self.Parent = parent etisserant@0: # XXX etisserant@0: # we need to store the row length and collength to etisserant@0: # see if the table has changed size etisserant@0: self._rows = self.GetNumberRows() etisserant@0: self._cols = self.GetNumberCols() etisserant@0: etisserant@0: def GetNumberCols(self): etisserant@0: return len(self.colnames) etisserant@0: etisserant@0: def GetNumberRows(self): etisserant@0: return len(self.data) etisserant@0: etisserant@0: def GetColLabelValue(self, col): etisserant@0: if col < len(self.colnames): etisserant@0: return self.colnames[col] etisserant@0: etisserant@0: def GetRowLabelValues(self, row): etisserant@0: return row etisserant@0: etisserant@0: def GetValue(self, row, col): etisserant@0: if row < self.GetNumberRows(): etisserant@0: name = str(self.data[row].get(self.GetColLabelValue(col), "")) etisserant@0: return name etisserant@0: etisserant@0: def GetValueByName(self, row, colname): etisserant@0: return self.data[row].get(colname) etisserant@0: etisserant@0: def SetValue(self, row, col, value): etisserant@0: if col < len(self.colnames): etisserant@0: self.data[row][self.GetColLabelValue(col)] = value etisserant@0: etisserant@0: def ResetView(self, grid): etisserant@0: """ etisserant@0: (wxGrid) -> Reset the grid view. Call this to etisserant@0: update the grid if rows and columns have been added or deleted etisserant@0: """ etisserant@0: grid.BeginBatch() etisserant@0: for current, new, delmsg, addmsg in [ etisserant@0: (self._rows, self.GetNumberRows(), wxGRIDTABLE_NOTIFY_ROWS_DELETED, wxGRIDTABLE_NOTIFY_ROWS_APPENDED), etisserant@0: (self._cols, self.GetNumberCols(), wxGRIDTABLE_NOTIFY_COLS_DELETED, wxGRIDTABLE_NOTIFY_COLS_APPENDED), etisserant@0: ]: etisserant@0: if new < current: etisserant@0: msg = wxGridTableMessage(self,delmsg,new,current-new) etisserant@0: grid.ProcessTableMessage(msg) etisserant@0: elif new > current: etisserant@0: msg = wxGridTableMessage(self,addmsg,new-current) etisserant@0: grid.ProcessTableMessage(msg) etisserant@0: self.UpdateValues(grid) etisserant@0: grid.EndBatch() etisserant@0: etisserant@0: self._rows = self.GetNumberRows() etisserant@0: self._cols = self.GetNumberCols() etisserant@0: # update the column rendering scheme etisserant@0: self._updateColAttrs(grid) etisserant@0: etisserant@0: # update the scrollbars and the displayed part of the grid etisserant@0: grid.AdjustScrollbars() etisserant@0: grid.ForceRefresh() etisserant@0: etisserant@0: def UpdateValues(self, grid): etisserant@0: """Update all displayed values""" etisserant@0: # This sends an event to the grid table to update all of the values etisserant@0: msg = wxGridTableMessage(self, wxGRIDTABLE_REQUEST_VIEW_GET_VALUES) etisserant@0: grid.ProcessTableMessage(msg) etisserant@0: etisserant@0: def _updateColAttrs(self, grid): etisserant@0: """ etisserant@0: wxGrid -> update the column attributes to add the etisserant@0: appropriate renderer given the column name. etisserant@0: etisserant@0: Otherwise default to the default renderer. etisserant@0: """ etisserant@0: etisserant@0: for col in range(self.GetNumberCols()): etisserant@0: attr = wxGridCellAttr() etisserant@0: attr.SetAlignment(self.Parent.ColAlignements[col], wxALIGN_CENTRE) etisserant@0: grid.SetColAttr(col, attr) etisserant@0: grid.SetColSize(col, self.Parent.ColSizes[col]) etisserant@0: etisserant@0: typelist = None etisserant@0: accesslist = None etisserant@0: for row in range(self.GetNumberRows()): etisserant@0: for col in range(self.GetNumberCols()): etisserant@0: editor = None etisserant@0: renderer = None etisserant@0: colname = self.GetColLabelValue(col) etisserant@0: grid.SetReadOnly(row, col, False) etisserant@0: if colname in ["Name","Initial Value","Location"]: etisserant@0: editor = wxGridCellTextEditor() etisserant@0: renderer = wxGridCellStringRenderer() etisserant@0: elif colname == "Class": etisserant@0: if len(self.Parent.ClassList) == 1: etisserant@0: grid.SetReadOnly(row, col, True) etisserant@0: else: etisserant@0: editor = wxGridCellChoiceEditor() etisserant@0: editor.SetParameters(",".join(self.Parent.ClassList)) etisserant@0: elif colname == "Type": etisserant@0: editor = wxGridCellChoiceEditor() etisserant@0: editor.SetParameters(self.Parent.TypeList) etisserant@0: elif colname in ["Retain", "Constant"]: etisserant@0: editor = wxGridCellChoiceEditor() etisserant@0: editor.SetParameters(self.Parent.OptionList) etisserant@0: etisserant@0: grid.SetCellEditor(row, col, editor) etisserant@0: grid.SetCellRenderer(row, col, renderer) etisserant@0: etisserant@0: grid.SetCellBackgroundColour(row, col, wxWHITE) etisserant@0: etisserant@0: def SetData(self, data): etisserant@0: self.data = data etisserant@0: etisserant@0: def GetData(self): etisserant@0: return self.data etisserant@0: etisserant@0: def GetCurrentIndex(self): etisserant@0: return self.CurrentIndex etisserant@0: etisserant@0: def SetCurrentIndex(self, index): etisserant@0: self.CurrentIndex = index etisserant@0: etisserant@0: def AppendRow(self, row_content): etisserant@0: self.data.append(row_content) etisserant@0: etisserant@0: def RemoveRow(self, row_index): etisserant@0: self.data.pop(row_index) etisserant@0: etisserant@0: def MoveRow(self, row_index, move, grid): etisserant@0: new_index = max(0, min(row_index + move, len(self.data) - 1)) etisserant@0: if new_index != row_index: etisserant@0: self.data.insert(new_index, self.data.pop(row_index)) etisserant@0: grid.SetGridCursor(new_index, grid.GetGridCursorCol()) etisserant@0: etisserant@0: def Empty(self): etisserant@0: self.data = [] etisserant@0: self.editors = [] etisserant@0: etisserant@0: [wxID_EDITVARIABLEDIALOG, wxID_EDITVARIABLEDIALOGMAINPANEL, etisserant@0: wxID_EDITVARIABLEDIALOGVARIABLESGRID, wxID_EDITVARIABLEDIALOGRETURNTYPE, etisserant@0: wxID_EDITVARIABLEDIALOGCLASSFILTER, wxID_EDITVARIABLEDIALOGADDBUTTON, etisserant@0: wxID_EDITVARIABLEDIALOGDELETEBUTTON, wxID_EDITVARIABLEDIALOGUPBUTTON, etisserant@0: wxID_EDITVARIABLEDIALOGDOWNBUTTON, wxID_EDITVARIABLEDIALOGSTATICTEXT1, etisserant@0: wxID_EDITVARIABLEDIALOGSTATICTEXT2, wxID_EDITVARIABLEDIALOGSTATICTEXT3, etisserant@0: ] = [wx.NewId() for _init_ctrls in range(12)] etisserant@0: etisserant@0: class EditVariableDialog(wx.Dialog): etisserant@0: def _init_coll_flexGridSizer1_Items(self, parent): etisserant@0: # generated method, don't edit etisserant@0: etisserant@0: parent.AddWindow(self.MainPanel, 0, border=0, flag=0) etisserant@0: etisserant@0: def _init_sizers(self): etisserant@0: # generated method, don't edit etisserant@0: self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) etisserant@0: etisserant@0: self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) etisserant@0: etisserant@0: self.SetSizer(self.flexGridSizer1) etisserant@0: etisserant@0: def _init_ctrls(self, prnt, name): etisserant@0: # generated method, don't edit etisserant@0: wx.Dialog.__init__(self, id=wxID_EDITVARIABLEDIALOG, etisserant@0: name='EditVariableDialog', parent=prnt, pos=wx.Point(376, 223), etisserant@0: size=wx.Size(600, 440), style=wx.DEFAULT_DIALOG_STYLE, etisserant@0: title='Edit variables of %s'%name) etisserant@0: self.SetClientSize(wx.Size(600, 440)) etisserant@0: etisserant@0: self.MainPanel = wx.Panel(id=wxID_EDITVARIABLEDIALOGMAINPANEL, etisserant@0: name='MainPanel', parent=self, pos=wx.Point(0, 0), etisserant@0: size=wx.Size(600, 440), style=wx.TAB_TRAVERSAL) etisserant@0: self.MainPanel.SetAutoLayout(True) etisserant@0: etisserant@0: self.staticText1 = wx.StaticText(id=wxID_EDITVARIABLEDIALOGSTATICTEXT1, etisserant@0: label='Return Type:', name='staticText1', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 29), size=wx.Size(95, 17), style=0) etisserant@0: etisserant@0: self.ReturnType = wx.Choice(id=wxID_EDITVARIABLEDIALOGRETURNTYPE, etisserant@0: name='ReturnType', parent=self.MainPanel, pos=wx.Point(124, 24), etisserant@0: size=wx.Size(145, 24), style=0) etisserant@0: etisserant@0: self.staticText2 = wx.StaticText(id=wxID_EDITVARIABLEDIALOGSTATICTEXT2, etisserant@0: label='Class Filter:', name='staticText2', parent=self.MainPanel, etisserant@0: pos=wx.Point(324, 29), size=wx.Size(95, 17), style=0) etisserant@0: etisserant@0: self.ClassFilter = wx.Choice(id=wxID_EDITVARIABLEDIALOGCLASSFILTER, etisserant@0: name='ClassFilter', parent=self.MainPanel, pos=wx.Point(424, 24), etisserant@0: size=wx.Size(145, 24), style=0) etisserant@0: EVT_CHOICE(self, wxID_EDITVARIABLEDIALOGCLASSFILTER, self.OnClassFilter) etisserant@0: etisserant@0: self.staticText3 = wx.StaticText(id=wxID_EDITVARIABLEDIALOGSTATICTEXT3, etisserant@0: label='Variables:', name='staticText3', parent=self.MainPanel, etisserant@0: pos=wx.Point(24, 60), size=wx.Size(95, 17), style=0) etisserant@0: etisserant@0: self.VariablesGrid = wx.grid.Grid(id=wxID_EDITVARIABLEDIALOGVARIABLESGRID, etisserant@0: name='VariablesGrid', parent=self.MainPanel, pos=wx.Point(24, 80), etisserant@0: size=wx.Size(550, 250), style=wxVSCROLL) etisserant@0: self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False, etisserant@0: 'Sans')) etisserant@0: self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL, etisserant@0: False, 'Sans')) etisserant@0: self.VariablesGrid.DisableDragGridSize() etisserant@0: self.VariablesGrid.EnableScrolling(False, True) etisserant@0: etisserant@0: self.AddButton = wx.Button(id=wxID_EDITVARIABLEDIALOGADDBUTTON, label='Add', etisserant@0: name='AddButton', parent=self.MainPanel, pos=wx.Point(345, 340), etisserant@0: size=wx.Size(72, 32), style=0) etisserant@0: EVT_BUTTON(self, wxID_EDITVARIABLEDIALOGADDBUTTON, self.OnAddButton) etisserant@0: etisserant@0: self.DeleteButton = wx.Button(id=wxID_EDITVARIABLEDIALOGDELETEBUTTON, label='Delete', etisserant@0: name='DeleteButton', parent=self.MainPanel, pos=wx.Point(425, 340), etisserant@0: size=wx.Size(72, 32), style=0) etisserant@0: EVT_BUTTON(self, wxID_EDITVARIABLEDIALOGDELETEBUTTON, self.OnDeleteButton) etisserant@0: etisserant@0: self.UpButton = wx.Button(id=wxID_EDITVARIABLEDIALOGUPBUTTON, label='^', etisserant@0: name='UpButton', parent=self.MainPanel, pos=wx.Point(505, 340), etisserant@0: size=wx.Size(32, 32), style=0) etisserant@0: EVT_BUTTON(self, wxID_EDITVARIABLEDIALOGUPBUTTON, self.OnUpButton) etisserant@0: etisserant@0: self.DownButton = wx.Button(id=wxID_EDITVARIABLEDIALOGDOWNBUTTON, label='v', etisserant@0: name='DownButton', parent=self.MainPanel, pos=wx.Point(545, 340), etisserant@0: size=wx.Size(32, 32), style=0) etisserant@0: EVT_BUTTON(self, wxID_EDITVARIABLEDIALOGDOWNBUTTON, self.OnDownButton) etisserant@0: etisserant@0: self._init_sizers() etisserant@0: etisserant@0: def __init__(self, parent, name, pou_type, filter = "All"): etisserant@0: self._init_ctrls(parent, name) etisserant@0: self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL) etisserant@0: self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_RIGHT) etisserant@0: self.Filter = filter etisserant@0: self.FilterChoices = [] etisserant@0: self.FilterChoiceTransfer = {"All" : "All", "Interface" : "Interface", etisserant@0: "Input" : " Input", "Output" : " Output", "InOut" : " InOut", etisserant@0: "External" : " External", "Variables" : "Variables", "Local" : " Local", etisserant@0: "Temp" : " Temp", "Global" : "Global", "Access" : "Access"} etisserant@0: etisserant@0: if pou_type: etisserant@0: self.DefaultValue = {"Name" : "", "Class" : "Input", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"} etisserant@0: else: etisserant@0: self.DefaultValue = {"Name" : "", "Class" : "Global", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No"} etisserant@0: if not pou_type or pou_type == "program": etisserant@0: self.Table = VariableTable(self, [], ["Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"]) etisserant@0: if pou_type: etisserant@0: self.FilterChoices = ["All","Interface"," Input"," Output"," InOut"," External","Variables"," Local"," Temp","Global","Access"] etisserant@0: else: etisserant@0: self.FilterChoices = ["All","Global","Access"] etisserant@0: self.ColSizes = [80, 70, 80, 80, 80, 60, 70] etisserant@0: self.ColAlignements = [wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_CENTER, wxALIGN_CENTER] etisserant@0: else: etisserant@0: self.Table = VariableTable(self, [], ["Name", "Class", "Type", "Initial Value", "Retain", "Constant"]) etisserant@0: self.FilterChoices = ["All","Interface"," Input"," Output"," InOut"," External","Variables"," Local"," Temp"] etisserant@0: self.ColSizes = [120, 70, 80, 120, 60, 70] etisserant@0: self.ColAlignements = [wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_LEFT, wxALIGN_CENTER, wxALIGN_CENTER] etisserant@0: for choice in self.FilterChoices: etisserant@0: self.ClassFilter.Append(choice) etisserant@0: self.ClassFilter.SetStringSelection(self.FilterChoiceTransfer[self.Filter]) etisserant@0: self.RefreshTypeList() etisserant@0: self.RefreshUpDownButtons() etisserant@0: etisserant@0: self.OptionList = "Yes,No" etisserant@0: self.TypeList = "" etisserant@0: for value in TypeHierarchy.keys(): etisserant@0: if not value.startswith("ANY"): etisserant@0: self.TypeList += "%s,"%value etisserant@0: self.TypeList = self.TypeList[:-1] etisserant@0: etisserant@0: if pou_type == "function": etisserant@0: for value in TypeHierarchy.keys(): etisserant@0: if not value.startswith("ANY"): etisserant@0: self.ReturnType.Append(value) etisserant@0: self.ReturnType.Enable(True) etisserant@0: else: etisserant@0: self.ReturnType.Enable(False) etisserant@0: self.staticText2.Hide() etisserant@0: self.ReturnType.Hide() etisserant@0: etisserant@0: self.VariablesGrid.SetTable(self.Table) etisserant@0: self.VariablesGrid.SetRowLabelSize(0) etisserant@0: etisserant@0: self.Table.ResetView(self.VariablesGrid) etisserant@0: etisserant@0: EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK) etisserant@0: etisserant@0: def OnOK(self, event): etisserant@0: self.VariablesGrid.SetGridCursor(0, 0) etisserant@0: error = [] etisserant@0: if self.ReturnType.IsEnabled() and self.ReturnType.GetStringSelection() == "": etisserant@0: error.append("Return Type") etisserant@0: if len(error) > 0: etisserant@0: text = "" etisserant@0: for i, item in enumerate(error): etisserant@0: if i == 0: etisserant@0: text += item etisserant@0: elif i == len(error) - 1: etisserant@0: text += " and %s"%item etisserant@0: else: etisserant@0: text += ", %s"%item etisserant@0: message = wxMessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: else: etisserant@0: self.EndModal(wxID_OK) etisserant@0: etisserant@0: def OnClassFilter(self, event): etisserant@0: reverse_transfer = {} etisserant@0: for filter, choice in self.FilterChoiceTransfer.items(): etisserant@0: reverse_transfer[choice] = filter etisserant@0: self.Filter = reverse_transfer[self.ClassFilter.GetStringSelection()] etisserant@0: self.RefreshTypeList() etisserant@0: self.RefreshValues() etisserant@0: self.RefreshUpDownButtons() etisserant@0: event.Skip() etisserant@0: etisserant@0: def RefreshTypeList(self): etisserant@0: if self.Filter == "All": etisserant@0: self.ClassList = [choice for choice in self.FilterChoices if choice not in ["All","Interface","Variables"]] etisserant@0: elif self.Filter == "Interface": etisserant@0: self.ClassList = ["Input","Output","InOut","External"] etisserant@0: elif self.Filter == "Variables": etisserant@0: self.ClassList = ["Local","Temp"] etisserant@0: else: etisserant@0: self.ClassList = [self.Filter] etisserant@0: etisserant@0: def RefreshUpDownButtons(self): etisserant@0: if self.Filter == "All": etisserant@0: self.UpButton.Enable(True) etisserant@0: self.DownButton.Enable(True) etisserant@0: else: etisserant@0: self.UpButton.Enable(False) etisserant@0: self.DownButton.Enable(False) etisserant@0: etisserant@0: def OnAddButton(self, event): etisserant@0: self.Table.AppendRow(self.DefaultValue.copy()) etisserant@0: self.Table.ResetView(self.VariablesGrid) etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnDeleteButton(self, event): etisserant@0: row = self.VariablesGrid.GetGridCursorRow() etisserant@0: self.Table.RemoveRow(row) etisserant@0: self.Table.ResetView(self.VariablesGrid) etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnUpButton(self, event): etisserant@0: row = self.VariablesGrid.GetGridCursorRow() etisserant@0: self.Table.MoveRow(row, -1, self.VariablesGrid) etisserant@0: self.Table.ResetView(self.VariablesGrid) etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnDownButton(self, event): etisserant@0: row = self.VariablesGrid.GetGridCursorRow() etisserant@0: self.Table.MoveRow(row, 1, self.VariablesGrid) etisserant@0: self.Table.ResetView(self.VariablesGrid) etisserant@0: event.Skip() etisserant@0: etisserant@0: def SetValues(self, values): etisserant@0: for item, value in values.items(): etisserant@0: if item == "returnType" and value and self.ReturnType.IsEnabled(): etisserant@0: self.ReturnType.SetStringSelection(value) etisserant@0: if item == "data": etisserant@0: self.Values = value etisserant@0: self.RefreshValues() etisserant@0: etisserant@0: def RefreshValues(self): etisserant@0: data = [] etisserant@0: for variable in self.Values: etisserant@0: if variable["Class"] in self.ClassList: etisserant@0: data.append(variable) etisserant@0: self.Table.SetData(data) etisserant@0: self.Table.ResetView(self.VariablesGrid) etisserant@0: etisserant@0: def GetValues(self): etisserant@0: values = {} etisserant@0: if self.ReturnType.IsEnabled(): etisserant@0: values["returnType"] = self.ReturnType.GetStringSelection() etisserant@0: values["data"] = self.Table.GetData() etisserant@0: return values etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Exception Handler etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: Max_Traceback_List_Size = 20 etisserant@0: etisserant@0: def Display_Exception_Dialog(e_type,e_value,e_tb): etisserant@0: trcbck_lst = [] etisserant@0: for i,line in enumerate(traceback.extract_tb(e_tb)): etisserant@0: trcbck = " " + str(i+1) + ". " etisserant@0: if line[0].find(os.getcwd()) == -1: etisserant@0: trcbck += "file : " + str(line[0]) + ", " etisserant@0: else: etisserant@0: trcbck += "file : " + str(line[0][len(os.getcwd()):]) + ", " etisserant@0: trcbck += "line : " + str(line[1]) + ", " + "function : " + str(line[2]) etisserant@0: trcbck_lst.append(trcbck) etisserant@0: etisserant@0: # Allow clicking.... etisserant@0: cap = wx.Window_GetCapture() etisserant@0: if cap: etisserant@0: cap.ReleaseMouse() etisserant@0: etisserant@0: dlg = wx.SingleChoiceDialog(None, etisserant@0: """ etisserant@0: An error happens. etisserant@0: etisserant@0: Click on OK for saving an error report. etisserant@0: etisserant@0: Please contact LOLITech at: etisserant@0: +33 (0)3 29 52 95 67 etisserant@0: bugs_PLCOpenEditor@lolitech.fr etisserant@0: etisserant@0: etisserant@0: Error: etisserant@0: """ + etisserant@0: str(e_type) + " : " + str(e_value), etisserant@0: "Error", etisserant@0: trcbck_lst) etisserant@0: try: etisserant@0: res = (dlg.ShowModal() == wx.ID_OK) etisserant@0: finally: etisserant@0: dlg.Destroy() etisserant@0: etisserant@0: return res etisserant@0: etisserant@0: def Display_Error_Dialog(e_value): etisserant@0: message = wxMessageDialog(None, str(e_value), "Error", wxOK|wxICON_ERROR) etisserant@0: message.ShowModal() etisserant@0: message.Destroy() etisserant@0: etisserant@0: def get_last_traceback(tb): etisserant@0: while tb.tb_next: etisserant@0: tb = tb.tb_next etisserant@0: return tb etisserant@0: etisserant@0: etisserant@0: def format_namespace(d, indent=' '): etisserant@0: return '\n'.join(['%s%s: %s' % (indent, k, repr(v)[:10000]) for k, v in d.iteritems()]) etisserant@0: etisserant@0: etisserant@0: ignored_exceptions = [] # a problem with a line in a module is only reported once per session etisserant@0: etisserant@0: def wxAddExceptHook(path, app_version='[No version]'):#, ignored_exceptions=[]): etisserant@0: etisserant@0: def handle_exception(e_type, e_value, e_traceback): etisserant@0: traceback.print_exception(e_type, e_value, e_traceback) # this is very helpful when there's an exception in the rest of this func etisserant@0: last_tb = get_last_traceback(e_traceback) etisserant@0: ex = (last_tb.tb_frame.f_code.co_filename, last_tb.tb_frame.f_lineno) etisserant@0: if str(e_value).startswith("!!!"): etisserant@0: Display_Error_Dialog(e_value) etisserant@0: elif ex not in ignored_exceptions: etisserant@0: result = Display_Exception_Dialog(e_type,e_value,e_traceback) etisserant@0: if result: etisserant@0: ignored_exceptions.append(ex) etisserant@0: info = { etisserant@0: 'app-title' : wx.GetApp().GetAppName(), # app_title etisserant@0: 'app-version' : app_version, etisserant@0: 'wx-version' : wx.VERSION_STRING, etisserant@0: 'wx-platform' : wx.Platform, etisserant@0: 'python-version' : platform.python_version(), #sys.version.split()[0], etisserant@0: 'platform' : platform.platform(), etisserant@0: 'e-type' : e_type, etisserant@0: 'e-value' : e_value, etisserant@0: 'date' : time.ctime(), etisserant@0: 'cwd' : os.getcwd(), etisserant@0: } etisserant@0: if e_traceback: etisserant@0: info['traceback'] = ''.join(traceback.format_tb(e_traceback)) + '%s: %s' % (e_type, e_value) etisserant@0: last_tb = get_last_traceback(e_traceback) etisserant@0: exception_locals = last_tb.tb_frame.f_locals # the locals at the level of the stack trace where the exception actually occurred etisserant@0: info['locals'] = format_namespace(exception_locals) etisserant@0: if 'self' in exception_locals: etisserant@0: info['self'] = format_namespace(exception_locals['self'].__dict__) etisserant@0: etisserant@0: output = open(path+os.sep+"bug_report_"+info['date'].replace(':','-').replace(' ','_')+".txt",'w') etisserant@0: lst = info.keys() etisserant@0: lst.sort() etisserant@0: for a in lst: etisserant@0: output.write(a+":\n"+str(info[a])+"\n\n") etisserant@0: etisserant@0: #sys.excepthook = lambda *args: wx.CallAfter(handle_exception, *args) etisserant@0: sys.excepthook = handle_exception etisserant@0: etisserant@0: if __name__ == '__main__': etisserant@0: app = wxPySimpleApp() etisserant@0: wxInitAllImageHandlers() etisserant@0: etisserant@0: # Install a exception handle for bug reports etisserant@0: wxAddExceptHook(os.getcwd(),__version__) etisserant@0: etisserant@0: frame = PLCOpenEditor(None) etisserant@0: etisserant@0: frame.Show() etisserant@0: app.MainLoop() etisserant@0: