PLCOpenEditor.py
changeset 125 394d9f168258
parent 122 e6faee0c271b
child 128 d16a8df4d322
equal deleted inserted replaced
124:635d0817508c 125:394d9f168258
    32 from SFCViewer import *
    32 from SFCViewer import *
    33 from LDViewer import *
    33 from LDViewer import *
    34 from Viewer import *
    34 from Viewer import *
    35 from TextViewer import *
    35 from TextViewer import *
    36 from RessourceEditor import *
    36 from RessourceEditor import *
       
    37 from DataTypeEditor import *
    37 from PLCControler import *
    38 from PLCControler import *
    38 from plcopen import OpenPDFDoc
    39 from plcopen import OpenPDFDoc
    39 from plcopen.structures import LOCATIONDATATYPES
    40 from plcopen.structures import LOCATIONDATATYPES
    40 
    41 
    41 import os, re, platform, sys, time, traceback, getopt
    42 import os, re, platform, sys, time, traceback, getopt
    42 
    43 
    43 __version__ = "$Revision$"
    44 __version__ = "$Revision$"
    44 
    45 
    45 CWD = os.path.split(__file__)[0]
    46 CWD = os.path.split(os.path.realpath(__file__))[0]
    46 
    47 
    47 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORPROJECTTREE, 
    48 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORPROJECTTREE, 
    48  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
    49  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
    49  ID_PLCOPENEDITOREDITORPANEL, ID_PLCOPENEDITORTABSOPENED, 
    50  ID_PLCOPENEDITOREDITORPANEL, ID_PLCOPENEDITORTABSOPENED, 
    50  ID_PLCOPENEDITORTOOLBAR, ID_PLCOPENEDITORDEFAULTTOOLBAR, 
    51  ID_PLCOPENEDITORTOOLBAR, ID_PLCOPENEDITORDEFAULTTOOLBAR, 
    69 
    70 
    70 [ID_PLCOPENEDITORCONFIGMENUITEMS0, ID_PLCOPENEDITORCONFIGMENUITEMS1, 
    71 [ID_PLCOPENEDITORCONFIGMENUITEMS0, ID_PLCOPENEDITORCONFIGMENUITEMS1, 
    71 ] = [wx.NewId() for _init_coll_HelpMenu_Items in range(2)]
    72 ] = [wx.NewId() for _init_coll_HelpMenu_Items in range(2)]
    72 
    73 
    73 [ID_PLCOPENEDITOREDITMENUITEMS0, ID_PLCOPENEDITOREDITMENUITEMS1, 
    74 [ID_PLCOPENEDITOREDITMENUITEMS0, ID_PLCOPENEDITOREDITMENUITEMS1, 
    74  ID_PLCOPENEDITOREDITMENUITEMS11, ID_PLCOPENEDITOREDITMENUITEMS12, 
       
    75  ID_PLCOPENEDITOREDITMENUITEMS2, ID_PLCOPENEDITOREDITMENUITEMS4, 
    75  ID_PLCOPENEDITOREDITMENUITEMS2, ID_PLCOPENEDITOREDITMENUITEMS4, 
    76  ID_PLCOPENEDITOREDITMENUITEMS5, ID_PLCOPENEDITOREDITMENUITEMS6, 
    76  ID_PLCOPENEDITOREDITMENUITEMS5, ID_PLCOPENEDITOREDITMENUITEMS6, 
    77  ID_PLCOPENEDITOREDITMENUITEMS8, ID_PLCOPENEDITOREDITMENUITEMS9, 
    77  ID_PLCOPENEDITOREDITMENUITEMS8, ID_PLCOPENEDITOREDITMENUITEMS9, 
    78 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(10)]
    78  ID_PLCOPENEDITOREDITMENUITEMS11, ID_PLCOPENEDITOREDITMENUITEMS12, 
       
    79  ID_PLCOPENEDITOREDITMENUITEMS14, ID_PLCOPENEDITOREDITMENUITEMS15, 
       
    80 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(12)]
    79 
    81 
    80 [ID_PLCOPENEDITORSFCMENUITEMS0, ID_PLCOPENEDITORSFCMENUITEMS1, 
    82 [ID_PLCOPENEDITORSFCMENUITEMS0, ID_PLCOPENEDITORSFCMENUITEMS1, 
    81  ID_PLCOPENEDITORSFCMENUITEMS2, ID_PLCOPENEDITORSFCMENUITEMS3, 
    83  ID_PLCOPENEDITORSFCMENUITEMS2, ID_PLCOPENEDITORSFCMENUITEMS3, 
    82 ] = [wx.NewId() for _init_coll_SFCMenu_Items in range(4)]
    84 ] = [wx.NewId() for _init_coll_SFCMenu_Items in range(4)]
    83 
    85 
   169               kind=wx.ITEM_NORMAL, text=u'Copy\tCTRL+C')
   171               kind=wx.ITEM_NORMAL, text=u'Copy\tCTRL+C')
   170         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS6,
   172         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS6,
   171               kind=wx.ITEM_NORMAL, text=u'Paste\tCTRL+V')
   173               kind=wx.ITEM_NORMAL, text=u'Paste\tCTRL+V')
   172         parent.AppendSeparator()
   174         parent.AppendSeparator()
   173         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS8,
   175         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS8,
       
   176               kind=wx.ITEM_NORMAL, text=u'Add Data Type')
       
   177         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS9,
       
   178               kind=wx.ITEM_NORMAL, text=u'Remove Data Type')
       
   179         parent.AppendSeparator()
       
   180         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS11,
   174               kind=wx.ITEM_NORMAL, text=u'Add POU')
   181               kind=wx.ITEM_NORMAL, text=u'Add POU')
   175         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS9,
   182         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS12,
   176               kind=wx.ITEM_NORMAL, text=u'Remove POU')
   183               kind=wx.ITEM_NORMAL, text=u'Remove POU')
   177         parent.AppendSeparator()
   184         parent.AppendSeparator()
   178         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS11,
   185         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS14,
   179               kind=wx.ITEM_NORMAL, text=u'Add Configuration')
   186               kind=wx.ITEM_NORMAL, text=u'Add Configuration')
   180         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS12,
   187         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS15,
   181               kind=wx.ITEM_NORMAL, text=u'Remove Configuration')
   188               kind=wx.ITEM_NORMAL, text=u'Remove Configuration')
   182         self.Bind(wx.EVT_MENU, self.OnRefreshMenu,
   189         self.Bind(wx.EVT_MENU, self.OnRefreshMenu,
   183               id=ID_PLCOPENEDITOREDITMENUITEMS0)
   190               id=ID_PLCOPENEDITOREDITMENUITEMS0)
   184         self.Bind(wx.EVT_MENU, self.OnUndoMenu,
   191         self.Bind(wx.EVT_MENU, self.OnUndoMenu,
   185               id=ID_PLCOPENEDITOREDITMENUITEMS1)
   192               id=ID_PLCOPENEDITOREDITMENUITEMS1)
   189               id=ID_PLCOPENEDITOREDITMENUITEMS4)
   196               id=ID_PLCOPENEDITOREDITMENUITEMS4)
   190         self.Bind(wx.EVT_MENU, self.OnCopyMenu,
   197         self.Bind(wx.EVT_MENU, self.OnCopyMenu,
   191               id=ID_PLCOPENEDITOREDITMENUITEMS5)
   198               id=ID_PLCOPENEDITOREDITMENUITEMS5)
   192         self.Bind(wx.EVT_MENU, self.OnPasteMenu,
   199         self.Bind(wx.EVT_MENU, self.OnPasteMenu,
   193               id=ID_PLCOPENEDITOREDITMENUITEMS6)
   200               id=ID_PLCOPENEDITOREDITMENUITEMS6)
       
   201         self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu,
       
   202               id=ID_PLCOPENEDITOREDITMENUITEMS8)
       
   203         self.Bind(wx.EVT_MENU, self.OnRemoveDataTypeMenu,
       
   204               id=ID_PLCOPENEDITOREDITMENUITEMS9)
   194         self.Bind(wx.EVT_MENU, self.OnAddPouMenu,
   205         self.Bind(wx.EVT_MENU, self.OnAddPouMenu,
   195               id=ID_PLCOPENEDITOREDITMENUITEMS8)
   206               id=ID_PLCOPENEDITOREDITMENUITEMS11)
   196         self.Bind(wx.EVT_MENU, self.OnRemovePouMenu,
   207         self.Bind(wx.EVT_MENU, self.OnRemovePouMenu,
   197               id=ID_PLCOPENEDITOREDITMENUITEMS9)
   208               id=ID_PLCOPENEDITOREDITMENUITEMS12)
   198         self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu,
   209         self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu,
   199               id=ID_PLCOPENEDITOREDITMENUITEMS11)
   210               id=ID_PLCOPENEDITOREDITMENUITEMS14)
   200         self.Bind(wx.EVT_MENU, self.OnRemoveConfigurationMenu,
   211         self.Bind(wx.EVT_MENU, self.OnRemoveConfigurationMenu,
   201               id=ID_PLCOPENEDITOREDITMENUITEMS12)
   212               id=ID_PLCOPENEDITOREDITMENUITEMS15)
   202 
   213 
   203     def _init_coll_menuBar1_Menus(self, parent):
   214     def _init_coll_menuBar1_Menus(self, parent):
   204         if self.ModeSolo:
   215         if self.ModeSolo:
   205             parent.Append(menu=self.FileMenu, title=u'File')
   216             parent.Append(menu=self.FileMenu, title=u'File')
   206         parent.Append(menu=self.EditMenu, title=u'Edit')
   217         parent.Append(menu=self.EditMenu, title=u'Edit')
   414             self.SecondSplitter.SplitHorizontally(self.TabsOpened, self.VariablePanelIndexer, -200)
   425             self.SecondSplitter.SplitHorizontally(self.TabsOpened, self.VariablePanelIndexer, -200)
   415         else:
   426         else:
   416             self.VariablePanelIndexer = VariablePanelIndexer(self, self.Controler)
   427             self.VariablePanelIndexer = VariablePanelIndexer(self, self.Controler)
   417             self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variable Panel").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
   428             self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variable Panel").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
   418             
   429             
   419             self.AUIManager.Update(); 
   430             self.AUIManager.Update()
   420         
   431         
   421     def __init__(self, parent, controler = None, fileOpen = None):
   432     def __init__(self, parent, controler = None, fileOpen = None):
   422         self.ModeSolo = controler == None
   433         self.ModeSolo = controler == None
   423         if self.ModeSolo:
   434         if self.ModeSolo:
   424             self.Controler = PLCControler()
   435             self.Controler = PLCControler()
   592                     self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, True)
   603                     self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, True)
   593                 else:
   604                 else:
   594                     self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False)
   605                     self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False)
   595                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, True)
   606                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, True)
   596                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, True)
   607                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, True)
       
   608                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS11, True)
       
   609                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS12, True)
       
   610                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS14, True)
       
   611                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS15, True)
   597             else:
   612             else:
   598                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False)
   613                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False)
   599                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, False)
   614                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, False)
   600                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, False)
   615                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, False)
       
   616                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS11, False)
       
   617                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS12, False)
       
   618                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS14, False)
       
   619                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS15, False)
   601             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS4, True)
   620             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS4, True)
   602             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS5, True)
   621             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS5, True)
   603             if self.CopyBuffer is not None:
   622             if self.CopyBuffer is not None:
   604                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, True)
   623                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, True)
   605             else:
   624             else:
   796         else:
   815         else:
   797             tool = self.Panes["ToolBar"].FindById(id)
   816             tool = self.Panes["ToolBar"].FindById(id)
   798         tool.SetToggle(False)
   817         tool.SetToggle(False)
   799 
   818 
   800     def OnSelectionTool(self, event):
   819     def OnSelectionTool(self, event):
   801         self.GetPageSelection()
   820         selected = self.GetPageSelection()
   802         if selected != -1:
   821         if selected != -1:
   803             self.GetPage(selected).SetMode(MODE_SELECTION)
   822             self.GetPage(selected).SetMode(MODE_SELECTION)
   804         event.Skip()
   823         event.Skip()
   805     
   824     
   806     def OnCommentTool(self, event):
   825     def OnCommentTool(self, event):
  1016                 item = event.GetItem()
  1035                 item = event.GetItem()
  1017                 old_name = self.ProjectTree.GetItemText(item)
  1036                 old_name = self.ProjectTree.GetItemText(item)
  1018                 itemtype = self.ProjectTree.GetPyData(item)
  1037                 itemtype = self.ProjectTree.GetPyData(item)
  1019                 if itemtype == ITEM_PROJECT:
  1038                 if itemtype == ITEM_PROJECT:
  1020                     self.Controler.SetProjectProperties(name = new_name)
  1039                     self.Controler.SetProjectProperties(name = new_name)
       
  1040                 elif itemtype == ITEM_DATATYPE:
       
  1041                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
       
  1042                         message = "\"%s\" data type already exists!"%new_name
       
  1043                         abort = True
       
  1044                     if not abort:
       
  1045                         self.Controler.ChangeDataTypeName(old_name, new_name)
       
  1046                         self.RefreshEditorNames(itemtype, old_name, new_name)
       
  1047                         self.RefreshPageTitles()
  1021                 elif itemtype == ITEM_POU:
  1048                 elif itemtype == ITEM_POU:
  1022                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]:
  1049                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]:
  1023                         message = "\"%s\" pou already exists!"%new_name
  1050                         message = "\"%s\" pou already exists!"%new_name
  1024                         abort = True
  1051                         abort = True
  1025                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1052                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1133             self.ProjectTree.Expand(selected)
  1160             self.ProjectTree.Expand(selected)
  1134         name = self.ProjectTree.GetItemText(selected)
  1161         name = self.ProjectTree.GetItemText(selected)
  1135         data = self.ProjectTree.GetPyData(selected)
  1162         data = self.ProjectTree.GetPyData(selected)
  1136         if name == "Properties":
  1163         if name == "Properties":
  1137             self.ShowProperties()
  1164             self.ShowProperties()
  1138         if data == ITEM_POU:
  1165         if data == ITEM_DATATYPE:
       
  1166             self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name))
       
  1167         elif data == ITEM_POU:
  1139             self.EditProjectElement(data, self.Controler.ComputePouName(name))
  1168             self.EditProjectElement(data, self.Controler.ComputePouName(name))
  1140         elif data == ITEM_CONFIGURATION:
  1169         elif data == ITEM_CONFIGURATION:
  1141             self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name))
  1170             self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name))
  1142         elif data == ITEM_RESOURCE:
  1171         elif data == ITEM_RESOURCE:
  1143             item = self.ProjectTree.GetItemParent(selected)
  1172             item = self.ProjectTree.GetItemParent(selected)
  1160                 tagname = self.Controler.ComputePouActionName(pou_name, name)
  1189                 tagname = self.Controler.ComputePouActionName(pou_name, name)
  1161             self.EditProjectElement(data, tagname)
  1190             self.EditProjectElement(data, tagname)
  1162     
  1191     
  1163     def OnProjectTreeLeftUp(self, event):
  1192     def OnProjectTreeLeftUp(self, event):
  1164         if self.SelectedItem is not None:
  1193         if self.SelectedItem is not None:
  1165             print "LeftUp", self.ProjectTree.GetItemText(self.SelectedItem)
       
  1166             self.ProjectTree.SelectItem(self.SelectedItem)
  1194             self.ProjectTree.SelectItem(self.SelectedItem)
  1167             name = self.ProjectTree.GetItemText(self.SelectedItem)
  1195             name = self.ProjectTree.GetItemText(self.SelectedItem)
  1168             data = self.ProjectTree.GetPyData(self.SelectedItem)
  1196             data = self.ProjectTree.GetPyData(self.SelectedItem)
  1169             if data == ITEM_POU:
  1197             if data == ITEM_DATATYPE:
       
  1198                 self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name), True)
       
  1199             elif data == ITEM_POU:
  1170                 self.EditProjectElement(data, self.Controler.ComputePouName(name), True)
  1200                 self.EditProjectElement(data, self.Controler.ComputePouName(name), True)
  1171             elif data == ITEM_CONFIGURATION:
  1201             elif data == ITEM_CONFIGURATION:
  1172                 self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name), True)
  1202                 self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name), True)
  1173             elif data == ITEM_RESOURCE:
  1203             elif data == ITEM_RESOURCE:
  1174                 item = self.ProjectTree.GetItemParent(self.SelectedItem)
  1204                 item = self.ProjectTree.GetItemParent(self.SelectedItem)
  1189                     tagname = self.Controler.ComputePouTransitionName(pou_name, name)
  1219                     tagname = self.Controler.ComputePouTransitionName(pou_name, name)
  1190                 elif data == ITEM_ACTION:
  1220                 elif data == ITEM_ACTION:
  1191                     tagname = self.Controler.ComputePouActionName(pou_name, name)
  1221                     tagname = self.Controler.ComputePouActionName(pou_name, name)
  1192                 self.EditProjectElement(data, tagname, True)
  1222                 self.EditProjectElement(data, tagname, True)
  1193             wx.CallAfter(self.ResetSelectedItem)
  1223             wx.CallAfter(self.ResetSelectedItem)
  1194         else:
       
  1195             print "LeftUp", None
       
  1196         event.Skip()
  1224         event.Skip()
  1197     
  1225     
  1198     def OnProjectTreeItemChanging(self, event):
  1226     def OnProjectTreeItemChanging(self, event):
  1199         if self.SelectedItem is not None:
       
  1200             print "Changing", self.ProjectTree.GetItemText(event.GetItem()), self.ProjectTree.GetItemText(self.SelectedItem)
       
  1201         else:
       
  1202             print "Changing", None, self.ProjectTree.GetItemText(event.GetItem())
       
  1203         if self.ProjectTree.GetPyData(event.GetItem()) != ITEM_UNEDITABLE and self.SelectedItem is None:
  1227         if self.ProjectTree.GetPyData(event.GetItem()) != ITEM_UNEDITABLE and self.SelectedItem is None:
  1204             self.SelectedItem = event.GetItem()
  1228             self.SelectedItem = event.GetItem()
  1205             event.Veto()
  1229             event.Veto()
  1206         else:
  1230         else:
  1207             event.Skip()
  1231             event.Skip()
  1228             self.RefreshToolBar()
  1252             self.RefreshToolBar()
  1229         elif not onlyopened:
  1253         elif not onlyopened:
  1230             if wx.VERSION >= (2, 8, 0):
  1254             if wx.VERSION >= (2, 8, 0):
  1231                 if elementtype == ITEM_CONFIGURATION:
  1255                 if elementtype == ITEM_CONFIGURATION:
  1232                     new_window = MDIConfigurationEditor(self, tagname, self, self.Controler)
  1256                     new_window = MDIConfigurationEditor(self, tagname, self, self.Controler)
  1233                     self.VariablePanelIndexer.AddVariablePanel(tagname, "config")
       
  1234                 elif elementtype == ITEM_RESOURCE:
  1257                 elif elementtype == ITEM_RESOURCE:
  1235                     new_window = MDIResourceEditor(self, tagname, self, self.Controler)
  1258                     new_window = MDIResourceEditor(self, tagname, self, self.Controler)
  1236                     self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
       
  1237                 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
  1259                 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
  1238                     bodytype = self.Controler.GetEditedElementBodyType(tagname)
  1260                     bodytype = self.Controler.GetEditedElementBodyType(tagname)
  1239                     if bodytype == "FBD":
  1261                     if bodytype == "FBD":
  1240                         new_window = MDIViewer(self, tagname, self, self.Controler)
  1262                         new_window = MDIViewer(self, tagname, self, self.Controler)
  1241                     elif bodytype == "LD":
  1263                     elif bodytype == "LD":
  1248                         viewer.SetTextSyntax(elementtype)
  1270                         viewer.SetTextSyntax(elementtype)
  1249                         if bodytype == "IL":
  1271                         if bodytype == "IL":
  1250                             viewer.SetKeywords(IL_KEYWORDS)
  1272                             viewer.SetKeywords(IL_KEYWORDS)
  1251                         else:
  1273                         else:
  1252                             viewer.SetKeywords(ST_KEYWORDS)
  1274                             viewer.SetKeywords(ST_KEYWORDS)
       
  1275                 elif elementtype == ITEM_DATATYPE:
       
  1276                     new_window = MDIDataTypeEditor(self, tagname, self, self.Controler)
  1253                 new_window.Bind(wx.EVT_ACTIVATE, self.OnPouSelectedChanged)
  1277                 new_window.Bind(wx.EVT_ACTIVATE, self.OnPouSelectedChanged)
  1254                 new_window.Bind(wx.EVT_CLOSE, self.OnPageClose)
  1278                 new_window.Bind(wx.EVT_CLOSE, self.OnPageClose)
       
  1279                 new_window.Layout()
  1255             else:
  1280             else:
  1256                 if elementtype == ITEM_CONFIGURATION:
  1281                 if elementtype == ITEM_CONFIGURATION:
  1257                     new_window = ConfigurationEditor(self.TabsOpened, tagname, self, self.Controler)
  1282                     new_window = ConfigurationEditor(self.TabsOpened, tagname, self, self.Controler)
  1258                     self.TabsOpened.AddPage(new_window, "")
  1283                     self.TabsOpened.AddPage(new_window, "")
  1259                     self.VariablePanelIndexer.AddVariablePanel(tagname, "config")
       
  1260                 elif elementtype == ITEM_RESOURCE:
  1284                 elif elementtype == ITEM_RESOURCE:
  1261                     new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler)
  1285                     new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler)
  1262                     self.TabsOpened.AddPage(new_window, "")
  1286                     self.TabsOpened.AddPage(new_window, "")
  1263                     self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
       
  1264                 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
  1287                 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
  1265                     bodytype = self.Controler.GetEditedElementBodyType(tagname)
  1288                     bodytype = self.Controler.GetEditedElementBodyType(tagname)
  1266                     if bodytype == "FBD":
  1289                     if bodytype == "FBD":
  1267                         new_window = Viewer(self.TabsOpened, tagname, self, self.Controler)
  1290                         new_window = Viewer(self.TabsOpened, tagname, self, self.Controler)
  1268                     elif bodytype == "LD":
  1291                     elif bodytype == "LD":
  1275                         if bodytype == "IL":
  1298                         if bodytype == "IL":
  1276                             new_window.SetKeywords(IL_KEYWORDS)
  1299                             new_window.SetKeywords(IL_KEYWORDS)
  1277                         else:
  1300                         else:
  1278                             new_window.SetKeywords(ST_KEYWORDS)
  1301                             new_window.SetKeywords(ST_KEYWORDS)
  1279                     self.TabsOpened.AddPage(new_window, "")
  1302                     self.TabsOpened.AddPage(new_window, "")
  1280             if elementtype == ITEM_POU:
  1303                 elif elementtype == ITEM_DATATYPE:
       
  1304                     new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
       
  1305                     self.TabsOpened.AddPage(new_window, "")
       
  1306             if elementtype == ITEM_CONFIGURATION:
       
  1307                 self.VariablePanelIndexer.AddVariablePanel(tagname, "config")
       
  1308             elif elementtype == ITEM_RESOURCE:
       
  1309                 self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
       
  1310             elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
  1281                 words = tagname.split("::")
  1311                 words = tagname.split("::")
  1282                 self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1]))
  1312                 self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1]))
  1283             elif elementtype == ITEM_TRANSITION:
       
  1284                 self.VariablePanelIndexer.AddVariablePanel(tagname, "transition")
       
  1285             elif elementtype == ITEM_TRANSITION:
       
  1286                 self.VariablePanelIndexer.AddVariablePanel(tagname, "action")
       
  1287             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1313             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1288             openedidx = self.IsOpened(tagname)
  1314             openedidx = self.IsOpened(tagname)
  1289             old_selected = self.GetPageSelection()
  1315             old_selected = self.GetPageSelection()
  1290             if old_selected != openedidx:
  1316             if old_selected != openedidx:
  1291                 if old_selected >= 0:
  1317                 if old_selected >= 0:
  1453         if selected != -1:
  1479         if selected != -1:
  1454             try:
  1480             try:
  1455                 self.GetPage(selected).Paste()
  1481                 self.GetPage(selected).Paste()
  1456             except:
  1482             except:
  1457                 pass
  1483                 pass
       
  1484         event.Skip()
       
  1485     
       
  1486     def OnAddDataTypeMenu(self, event):
       
  1487         dialog = DataTypeDialog(self, "Add a new data type", "Please enter data type name", "", wx.OK|wx.CANCEL)
       
  1488         dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames())
       
  1489         if dialog.ShowModal() == wx.ID_OK:
       
  1490             self.Controler.ProjectAddDataType(dialog.GetValue())
       
  1491             self.RefreshTitle()
       
  1492             self.RefreshEditMenu()
       
  1493             self.RefreshProjectTree()
       
  1494         dialog.Destroy()
       
  1495         event.Skip()
       
  1496         
       
  1497     def OnRemoveDataTypeMenu(self, event):
       
  1498         datatypes = self.Controler.GetProjectDataTypeNames()
       
  1499         dialog = wx.SingleChoiceDialog(self, "Select Data Type to remove:", "Data Type Remove", datatypes, wx.OK|wx.CANCEL)
       
  1500         if dialog.ShowModal() == wx.ID_OK:
       
  1501             selected = dialog.GetStringSelection()
       
  1502             if not self.Controler.DataTypeIsUsed(selected):
       
  1503                 self.Controler.ProjectRemoveDataType(selected)
       
  1504                 tagname = self.Controler.ComputeDataTypeName(selected)
       
  1505                 idx = self.IsOpened(tagname)
       
  1506                 if idx is not None:
       
  1507                     self.DeletePage(idx)
       
  1508                 self.RefreshTitle()
       
  1509                 self.RefreshEditMenu()
       
  1510                 self.RefreshProjectTree()
       
  1511                 self.RefreshToolBar()
       
  1512             else:
       
  1513                 message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
       
  1514                 message.ShowModal()
       
  1515                 message.Destroy()
  1458         event.Skip()
  1516         event.Skip()
  1459     
  1517     
  1460     def OnAddPouMenu(self, event):
  1518     def OnAddPouMenu(self, event):
  1461         dialog = PouDialog(self)
  1519         dialog = PouDialog(self)
  1462         dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1520         dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1836         if self.ProductRelease.GetValue() != None:
  1894         if self.ProductRelease.GetValue() != None:
  1837             values["productRelease"] = self.ProductRelease.GetValue()
  1895             values["productRelease"] = self.ProductRelease.GetValue()
  1838         if self.ProductRelease.GetValue() != None:
  1896         if self.ProductRelease.GetValue() != None:
  1839             values["contentDescription"] = self.ContentDescription.GetValue()
  1897             values["contentDescription"] = self.ContentDescription.GetValue()
  1840         return values
  1898         return values
       
  1899 
       
  1900 #-------------------------------------------------------------------------------
       
  1901 #                          Edit Step Name Dialog
       
  1902 #-------------------------------------------------------------------------------
       
  1903 
       
  1904 class DataTypeDialog(wx.TextEntryDialog):
       
  1905 
       
  1906     if wx.VERSION < (2, 6, 0):
       
  1907         def Bind(self, event, function, id = None):
       
  1908             if id is not None:
       
  1909                 event(self, id, function)
       
  1910             else:
       
  1911                 event(self, function)
       
  1912     
       
  1913 
       
  1914     def __init__(self, parent, message, caption = "Please enter text", defaultValue = "", 
       
  1915                        style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
       
  1916         wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
       
  1917         
       
  1918         self.DataTypeNames = []
       
  1919         if wx.VERSION >= (2, 8, 0):
       
  1920             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton().GetId())
       
  1921         elif wx.VERSION >= (2, 6, 0):
       
  1922             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetAffirmativeButton().GetId())
       
  1923         else:
       
  1924             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
       
  1925     
       
  1926     def OnOK(self, event):
       
  1927         datatype_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
       
  1928         if datatype_name == "":
       
  1929             message = wx.MessageDialog(self, "You must type a name!", "Error", wx.OK|wx.ICON_ERROR)
       
  1930             message.ShowModal()
       
  1931             message.Destroy()
       
  1932         elif not TestIdentifier(datatype_name):
       
  1933             message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%datatype_name, "Error", wx.OK|wx.ICON_ERROR)
       
  1934             message.ShowModal()
       
  1935             message.Destroy()
       
  1936         elif datatype_name.upper() in IEC_KEYWORDS:
       
  1937             message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%datatype_name, "Error", wx.OK|wx.ICON_ERROR)
       
  1938             message.ShowModal()
       
  1939             message.Destroy()
       
  1940         elif datatype_name.upper() in self.DataTypeNames:
       
  1941             message = wx.MessageDialog(self, "\"%s\" data type already exists!"%datatype_name, "Error", wx.OK|wx.ICON_ERROR)
       
  1942             message.ShowModal()
       
  1943             message.Destroy()
       
  1944         else:
       
  1945             self.EndModal(wx.ID_OK)
       
  1946 
       
  1947     def SetDataTypeNames(self, datatype_names):
       
  1948         self.DataTypeNames = [datatype_name.upper() for datatype_name in datatype_names]
       
  1949 
       
  1950     def GetValue(self):
       
  1951         return self.GetSizer().GetItem(1).GetWindow().GetValue()
  1841 
  1952 
  1842 #-------------------------------------------------------------------------------
  1953 #-------------------------------------------------------------------------------
  1843 #                            Create Pou Dialog
  1954 #                            Create Pou Dialog
  1844 #-------------------------------------------------------------------------------
  1955 #-------------------------------------------------------------------------------
  1845 
  1956 
  2460             self.VariablePanelList[new_tagname] = self.VariablePanelList.pop(old_tagname)
  2571             self.VariablePanelList[new_tagname] = self.VariablePanelList.pop(old_tagname)
  2461             if self.CurrentPanel == old_tagname:
  2572             if self.CurrentPanel == old_tagname:
  2462                 self.CurrentPanel = new_tagname
  2573                 self.CurrentPanel = new_tagname
  2463                 
  2574                 
  2464     def ChangeVariablePanel(self, tagname):
  2575     def ChangeVariablePanel(self, tagname):
  2465         if tagname in self.VariablePanelList and tagname != self.CurrentPanel:
  2576         if tagname in self.VariablePanelList:
       
  2577             if tagname != self.CurrentPanel:
       
  2578                 if self.CurrentPanel is not None:
       
  2579                     self.VariablePanelList[self.CurrentPanel].Hide()
       
  2580                 self.CurrentPanel = tagname
       
  2581                 self.VariablePanelList[self.CurrentPanel].RefreshView()
       
  2582                 self.VariablePanelList[self.CurrentPanel].Show()
       
  2583                 self.MainSizer.Layout()
       
  2584         else:
  2466             if self.CurrentPanel is not None:
  2585             if self.CurrentPanel is not None:
  2467                 self.VariablePanelList[self.CurrentPanel].Hide()
  2586                 self.VariablePanelList[self.CurrentPanel].Hide()
  2468             self.CurrentPanel = tagname
  2587             self.CurrentPanel = None
  2469             self.VariablePanelList[self.CurrentPanel].RefreshView()
       
  2470             self.VariablePanelList[self.CurrentPanel].Show()
       
  2471             self.MainSizer.Layout()
  2588             self.MainSizer.Layout()
  2472 
  2589 
  2473     def RefreshVariablePanel(self, tagname):
  2590     def RefreshVariablePanel(self, tagname):
  2474         if tagname in self.VariablePanelList:
  2591         if tagname in self.VariablePanelList:
  2475             self.VariablePanelList[self.CurrentPanel].RefreshView()
  2592             self.VariablePanelList[self.CurrentPanel].RefreshView()
  2872             reverse_transfer[choice] = filter
  2989             reverse_transfer[choice] = filter
  2873         self.ClassFilter.SetStringSelection(reverse_transfer[self.Filter])
  2990         self.ClassFilter.SetStringSelection(reverse_transfer[self.Filter])
  2874         self.RefreshTypeList()
  2991         self.RefreshTypeList()
  2875 
  2992 
  2876         self.OptionList = "Yes,No"
  2993         self.OptionList = "Yes,No"
  2877         self.TypeList = [value for value, parent in TypeHierarchy_list if not value.startswith("ANY")]
       
  2878         
  2994         
  2879         if element_type == "function":
  2995         if element_type == "function":
  2880             for value, parent in TypeHierarchy_list:
  2996             for base_type in self.Controler.GetBaseTypes():
  2881                 if not value.startswith("ANY"):
  2997                 self.ReturnType.Append(base_type)
  2882                     self.ReturnType.Append(value)
       
  2883             self.ReturnType.Enable(True)
  2998             self.ReturnType.Enable(True)
  2884         else:
  2999         else:
  2885             self.ReturnType.Enable(False)
  3000             self.ReturnType.Enable(False)
  2886             self.staticText1.Hide()
  3001             self.staticText1.Hide()
  2887             self.ReturnType.Hide()
  3002             self.ReturnType.Hide()
  3031     def OnVariablesGridEditorShown(self, event):
  3146     def OnVariablesGridEditorShown(self, event):
  3032         row, col = event.GetRow(), event.GetCol() 
  3147         row, col = event.GetRow(), event.GetCol() 
  3033         if self.Table.GetColLabelValue(col) == "Type":
  3148         if self.Table.GetColLabelValue(col) == "Type":
  3034             type_menu = wx.Menu(title='')
  3149             type_menu = wx.Menu(title='')
  3035             base_menu = wx.Menu(title='')
  3150             base_menu = wx.Menu(title='')
  3036             for base_type in self.TypeList:
  3151             for base_type in self.Controler.GetBaseTypes():
  3037                 new_id = wx.NewId()
  3152                 new_id = wx.NewId()
  3038                 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
  3153                 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
  3039                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id)
  3154                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id)
  3040             type_menu.AppendMenu(wx.NewId(), "Base Types", base_menu)
  3155             type_menu.AppendMenu(wx.NewId(), "Base Types", base_menu)
       
  3156             datatype_menu = wx.Menu(title='')
       
  3157             for datatype in self.Controler.GetDataTypes(basetypes = False):
       
  3158                 new_id = wx.NewId()
       
  3159                 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
       
  3160                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id)
       
  3161             type_menu.AppendMenu(wx.NewId(), "User Data Types", datatype_menu)
  3041             functionblock_menu = wx.Menu(title='')
  3162             functionblock_menu = wx.Menu(title='')
  3042             for functionblock_type in self.Controler.GetFunctionBlockTypes():
  3163             for functionblock_type in self.Controler.GetFunctionBlockTypes():
  3043                 new_id = wx.NewId()
  3164                 new_id = wx.NewId()
  3044                 AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
  3165                 AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
  3045                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
  3166                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
  3070             var_class = self.Table.GetValueByName(row, "Class")
  3191             var_class = self.Table.GetValueByName(row, "Class")
  3071             var_type = self.Table.GetValueByName(row, "Type")
  3192             var_type = self.Table.GetValueByName(row, "Type")
  3072             data = wx.TextDataObject(str((var_name, var_class, var_type, self.TagName)))
  3193             data = wx.TextDataObject(str((var_name, var_class, var_type, self.TagName)))
  3073             dragSource = wx.DropSource(self.VariablesGrid)
  3194             dragSource = wx.DropSource(self.VariablesGrid)
  3074             dragSource.SetData(data)
  3195             dragSource.SetData(data)
  3075             dragSource.DoDragDrop()
  3196             print dragSource.DoDragDrop()
  3076         event.Skip()
  3197         event.Skip()
  3077     
  3198     
  3078     def OnVariablesGridSelectCell(self, event):
  3199     def OnVariablesGridSelectCell(self, event):
  3079         wx.CallAfter(self.RefreshButtons)
  3200         wx.CallAfter(self.RefreshButtons)
  3080         event.Skip()
  3201         event.Skip()