PLCOpenEditor.py
changeset 249 d8425712acef
parent 245 fdd05081c966
child 253 d9391572655f
equal deleted inserted replaced
248:f7df265edd54 249:d8425712acef
   213               kind=wx.ITEM_NORMAL, text=u'Close Tab\tCTRL+W')
   213               kind=wx.ITEM_NORMAL, text=u'Close Tab\tCTRL+W')
   214         if self.ModeSolo:
   214         if self.ModeSolo:
   215             AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL,
   215             AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL,
   216                   kind=wx.ITEM_NORMAL, text=u'Close Project')
   216                   kind=wx.ITEM_NORMAL, text=u'Close Project')
   217             parent.AppendSeparator()
   217             parent.AppendSeparator()
   218         AppendMenu(parent, help='', id=wx.ID_SAVE,
   218         if not self.Debug:
   219               kind=wx.ITEM_NORMAL, text=u'Save\tCTRL+S')
   219             AppendMenu(parent, help='', id=wx.ID_SAVE,
       
   220                   kind=wx.ITEM_NORMAL, text=u'Save\tCTRL+S')
   220         if self.ModeSolo:
   221         if self.ModeSolo:
   221             AppendMenu(parent, help='', id=wx.ID_SAVEAS,
   222             AppendMenu(parent, help='', id=wx.ID_SAVEAS,
   222                   kind=wx.ITEM_NORMAL, text=u'Save As...\tCTRL+SHIFT+S')
   223                   kind=wx.ITEM_NORMAL, text=u'Save As...\tCTRL+SHIFT+S')
   223             AppendMenu(parent, help='', id=ID_PLCOPENEDITORFILEMENUGENERATE,
   224             AppendMenu(parent, help='', id=ID_PLCOPENEDITORFILEMENUGENERATE,
   224                   kind=wx.ITEM_NORMAL, text=u'Generate Program\tCTRL+G')
   225                   kind=wx.ITEM_NORMAL, text=u'Generate Program\tCTRL+G')
   227               kind=wx.ITEM_NORMAL, text=u'Page Setup')
   228               kind=wx.ITEM_NORMAL, text=u'Page Setup')
   228         AppendMenu(parent, help='', id=wx.ID_PREVIEW,
   229         AppendMenu(parent, help='', id=wx.ID_PREVIEW,
   229               kind=wx.ITEM_NORMAL, text=u'Preview')
   230               kind=wx.ITEM_NORMAL, text=u'Preview')
   230         AppendMenu(parent, help='', id=wx.ID_PRINT,
   231         AppendMenu(parent, help='', id=wx.ID_PRINT,
   231               kind=wx.ITEM_NORMAL, text=u'Print')
   232               kind=wx.ITEM_NORMAL, text=u'Print')
   232         parent.AppendSeparator()
   233         if not self.Debug:
   233         AppendMenu(parent, help='', id=wx.ID_PROPERTIES,
   234             parent.AppendSeparator()
   234               kind=wx.ITEM_NORMAL, text=u'Properties')
   235             AppendMenu(parent, help='', id=wx.ID_PROPERTIES,
       
   236                   kind=wx.ITEM_NORMAL, text=u'Properties')
   235         parent.AppendSeparator()
   237         parent.AppendSeparator()
   236         if self.ModeSolo:
   238         if self.ModeSolo:
   237             AppendMenu(parent, help='', id=wx.ID_EXIT,
   239             AppendMenu(parent, help='', id=wx.ID_EXIT,
   238                   kind=wx.ITEM_NORMAL, text=u'Quit\tCTRL+Q')
   240                   kind=wx.ITEM_NORMAL, text=u'Quit\tCTRL+Q')
   239         else:
   241         else:
   244             self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW)
   246             self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW)
   245             self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN)
   247             self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN)
   246         self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE)
   248         self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE)
   247         if self.ModeSolo:
   249         if self.ModeSolo:
   248             self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, id=wx.ID_CLOSE_ALL)
   250             self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, id=wx.ID_CLOSE_ALL)
   249         self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE)
   251         if not self.Debug:
       
   252             self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE)
   250         if self.ModeSolo:
   253         if self.ModeSolo:
   251             self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS)
   254             self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS)
   252             self.Bind(wx.EVT_MENU, self.OnGenerateProgramMenu,
   255             self.Bind(wx.EVT_MENU, self.OnGenerateProgramMenu,
   253                   id=ID_PLCOPENEDITORFILEMENUGENERATE)
   256                   id=ID_PLCOPENEDITORFILEMENUGENERATE)
   254         self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP)
   257         self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP)
   255         self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW)
   258         self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW)
   256         self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT)
   259         self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT)
   257         self.Bind(wx.EVT_MENU, self.OnPropertiesMenu, id=wx.ID_PROPERTIES)
   260         if not self.Debug:
       
   261             self.Bind(wx.EVT_MENU, self.OnPropertiesMenu, id=wx.ID_PROPERTIES)
   258         if self.ModeSolo:
   262         if self.ModeSolo:
   259             self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT)
   263             self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT)
   260         else:
   264         else:
   261             self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_CLOSE_ALL)
   265             self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_CLOSE_ALL)
   262     
   266     
   263     def _init_coll_EditMenu_Items(self, parent):
   267     def _init_coll_EditMenu_Items(self, parent):
   264         AppendMenu(parent, help='', id=wx.ID_REFRESH,
   268         AppendMenu(parent, help='', id=wx.ID_REFRESH,
   265               kind=wx.ITEM_NORMAL, text=u'Refresh\tCTRL+R')
   269               kind=wx.ITEM_NORMAL, text=u'Refresh\tCTRL+R')
   266         if not self.ModeSolo:
   270         if not self.Debug:
   267             AppendMenu(parent, help='', id=wx.ID_CLEAR,
   271             if not self.ModeSolo:
   268                   kind=wx.ITEM_NORMAL, text=u'Clear Errors\tCTRL+K')
   272                 AppendMenu(parent, help='', id=wx.ID_CLEAR,
   269         AppendMenu(parent, help='', id=wx.ID_UNDO,
   273                       kind=wx.ITEM_NORMAL, text=u'Clear Errors\tCTRL+K')
   270               kind=wx.ITEM_NORMAL, text=u'Undo\tCTRL+Z')
   274             AppendMenu(parent, help='', id=wx.ID_UNDO,
   271         AppendMenu(parent, help='', id=wx.ID_REDO,
   275                   kind=wx.ITEM_NORMAL, text=u'Undo\tCTRL+Z')
   272               kind=wx.ITEM_NORMAL, text=u'Redo\tCTRL+Y')
   276             AppendMenu(parent, help='', id=wx.ID_REDO,
   273         parent.AppendSeparator()
   277                   kind=wx.ITEM_NORMAL, text=u'Redo\tCTRL+Y')
   274         AppendMenu(parent, help='', id=wx.ID_CUT,
   278             parent.AppendSeparator()
   275               kind=wx.ITEM_NORMAL, text=u'Cut\tCTRL+X')
   279             AppendMenu(parent, help='', id=wx.ID_CUT,
   276         AppendMenu(parent, help='', id=wx.ID_COPY,
   280                   kind=wx.ITEM_NORMAL, text=u'Cut\tCTRL+X')
   277               kind=wx.ITEM_NORMAL, text=u'Copy\tCTRL+C')
   281             AppendMenu(parent, help='', id=wx.ID_COPY,
   278         AppendMenu(parent, help='', id=wx.ID_PASTE,
   282                   kind=wx.ITEM_NORMAL, text=u'Copy\tCTRL+C')
   279               kind=wx.ITEM_NORMAL, text=u'Paste\tCTRL+V')
   283             AppendMenu(parent, help='', id=wx.ID_PASTE,
   280         parent.AppendSeparator()
   284                   kind=wx.ITEM_NORMAL, text=u'Paste\tCTRL+V')
   281         addmenu = wx.Menu(title='')
   285             parent.AppendSeparator()
   282         parent.AppendMenu(wx.ID_ADD, "Add Element", addmenu)
   286             addmenu = wx.Menu(title='')
   283         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
   287             parent.AppendMenu(wx.ID_ADD, "Add Element", addmenu)
   284               kind=wx.ITEM_NORMAL, text=u'Data Type')
   288             AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
   285         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
   289                   kind=wx.ITEM_NORMAL, text=u'Data Type')
   286               kind=wx.ITEM_NORMAL, text=u'Function')
   290             AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
   287         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
   291                   kind=wx.ITEM_NORMAL, text=u'Function')
   288               kind=wx.ITEM_NORMAL, text=u'Function Block')
   292             AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
   289         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM,
   293                   kind=wx.ITEM_NORMAL, text=u'Function Block')
   290               kind=wx.ITEM_NORMAL, text=u'Program')
   294             AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM,
   291         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
   295                   kind=wx.ITEM_NORMAL, text=u'Program')
   292               kind=wx.ITEM_NORMAL, text=u'Configuration')
   296             AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
   293         AppendMenu(parent, help='', id=wx.ID_DELETE,
   297                   kind=wx.ITEM_NORMAL, text=u'Configuration')
   294               kind=wx.ITEM_NORMAL, text=u'Delete')
   298             AppendMenu(parent, help='', id=wx.ID_DELETE,
       
   299                   kind=wx.ITEM_NORMAL, text=u'Delete')
   295         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
   300         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
   296         if not self.ModeSolo:
   301         if not self.Debug:
   297             self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   302             if not self.ModeSolo:
   298         self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
   303                 self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   299         self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
   304             self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
   300         self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
   305             self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
   301         self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
   306             self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
   302         self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=wx.ID_PASTE)
   307             self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
   303         self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu,
   308             self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=wx.ID_PASTE)
   304               id=ID_PLCOPENEDITOREDITMENUADDDATATYPE)
   309             self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu,
   305         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("function"),
   310                   id=ID_PLCOPENEDITOREDITMENUADDDATATYPE)
   306               id=ID_PLCOPENEDITOREDITMENUADDFUNCTION)
   311             self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("function"),
   307         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("functionBlock"),
   312                   id=ID_PLCOPENEDITOREDITMENUADDFUNCTION)
   308               id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK)
   313             self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("functionBlock"),
   309         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("program"),
   314                   id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK)
   310               id=ID_PLCOPENEDITOREDITMENUADDPROGRAM)
   315             self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("program"),
   311         self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu,
   316                   id=ID_PLCOPENEDITOREDITMENUADDPROGRAM)
   312               id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION)
   317             self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu,
   313         self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE)
   318                   id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION)
       
   319             self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE)
   314 
   320 
   315     def _init_coll_HelpMenu_Items(self, parent):
   321     def _init_coll_HelpMenu_Items(self, parent):
   316         AppendMenu(parent, help='', id=wx.ID_HELP, 
   322         AppendMenu(parent, help='', id=wx.ID_HELP, 
   317             kind=wx.ITEM_NORMAL, text=u'PLCOpenEditor\tF1')
   323             kind=wx.ITEM_NORMAL, text=u'PLCOpenEditor\tF1')
   318         #AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS,
   324         #AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS,
   380                   0), size=wx.Size(0, 0), style=0)
   386                   0), size=wx.Size(0, 0), style=0)
   381         else:
   387         else:
   382             self.TreeNoteBook = wx.aui.AuiNotebook(self)
   388             self.TreeNoteBook = wx.aui.AuiNotebook(self)
   383             self.AUIManager.AddPane(self.TreeNoteBook, wx.aui.AuiPaneInfo().Caption("Project").Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False))
   389             self.AUIManager.AddPane(self.TreeNoteBook, wx.aui.AuiPaneInfo().Caption("Project").Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False))
   384         
   390         
       
   391         typestreestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER
       
   392         if not self.Debug:
       
   393             typestreestyle |= wx.TR_HIDE_ROOT
   385         self.TypesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORTYPESTREE,
   394         self.TypesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORTYPESTREE,
   386                   name='TypesTree', parent=self.TreeNoteBook, 
   395                   name='TypesTree', parent=self.TreeNoteBook, 
   387                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   396                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   388                   style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   397                   style=typestreestyle)
   389         self.TreeNoteBook.AddPage(self.TypesTree, "Types")
   398         self.TreeNoteBook.AddPage(self.TypesTree, "Types")
   390         
   399         
   391         if wx.Platform == '__WXMSW__':
   400         if not self.Debug:
   392             self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnTypesTreeRightUp,
   401             if wx.Platform == '__WXMSW__':
       
   402                 self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnTypesTreeRightUp,
       
   403                       id=ID_PLCOPENEDITORTYPESTREE)
       
   404                 self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypesTreeItemSelected,
       
   405                       id=ID_PLCOPENEDITORTYPESTREE)
       
   406             else:
       
   407                 if wx.VERSION >= (2, 6, 0):
       
   408                     self.TypesTree.Bind(wx.EVT_RIGHT_UP, self.OnTypesTreeRightUp)
       
   409                     self.TypesTree.Bind(wx.EVT_LEFT_UP, self.OnTypesTreeLeftUp)
       
   410                 else:
       
   411                     wx.EVT_RIGHT_UP(self.TypesTree, self.OnTypesTreeRightUp)
       
   412                     wx.EVT_LEFT_UP(self.TypesTree, self.OnTypesTreeLeftUp)
       
   413                 self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnTypesTreeItemChanging,
       
   414                       id=ID_PLCOPENEDITORTYPESTREE)
       
   415             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTypesTreeBeginDrag,
   393                   id=ID_PLCOPENEDITORTYPESTREE)
   416                   id=ID_PLCOPENEDITORTYPESTREE)
   394             self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypesTreeItemSelected,
   417             self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTypesTreeItemBeginEdit,
   395                   id=ID_PLCOPENEDITORTYPESTREE)
   418                   id=ID_PLCOPENEDITORTYPESTREE)
   396         else:
   419             self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTypesTreeItemEndEdit,
   397             if wx.VERSION >= (2, 6, 0):
       
   398                 self.TypesTree.Bind(wx.EVT_RIGHT_UP, self.OnTypesTreeRightUp)
       
   399                 self.TypesTree.Bind(wx.EVT_LEFT_UP, self.OnTypesTreeLeftUp)
       
   400             else:
       
   401                 wx.EVT_RIGHT_UP(self.TypesTree, self.OnTypesTreeRightUp)
       
   402                 wx.EVT_LEFT_UP(self.TypesTree, self.OnTypesTreeLeftUp)
       
   403             self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnTypesTreeItemChanging,
       
   404                   id=ID_PLCOPENEDITORTYPESTREE)
   420                   id=ID_PLCOPENEDITORTYPESTREE)
   405         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTypesTreeBeginDrag,
   421             self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTypesTreeItemActivated,
   406               id=ID_PLCOPENEDITORTYPESTREE)
   422                   id=ID_PLCOPENEDITORTYPESTREE)
   407         self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTypesTreeItemBeginEdit,
       
   408               id=ID_PLCOPENEDITORTYPESTREE)
       
   409         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTypesTreeItemEndEdit,
       
   410               id=ID_PLCOPENEDITORTYPESTREE)
       
   411         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTypesTreeItemActivated,
       
   412               id=ID_PLCOPENEDITORTYPESTREE)
       
   413         
   423         
   414         self.InstancesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORINSTANCESTREE,
   424         self.InstancesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORINSTANCESTREE,
   415                   name='InstancesTree', parent=self.TreeNoteBook, 
   425                   name='InstancesTree', parent=self.TreeNoteBook, 
   416                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   426                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   417                   style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   427                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   418         self.TreeNoteBook.AddPage(self.InstancesTree, "Instances")
   428         self.TreeNoteBook.AddPage(self.InstancesTree, "Instances")
   419         
   429         
   420         if wx.VERSION < (2, 8, 0):
   430         if self.Debug:
   421             self.ToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, 
   431             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag,
   422                   ID_PLCOPENEDITORTOOLBAR, 'ToolBar')
   432                   id=ID_PLCOPENEDITORINSTANCESTREE)
   423             self.ToolBar.SetToolBitmapSize(wx.Size(25, 25))
   433             self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated,
   424             self.ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
   434                   id=ID_PLCOPENEDITORINSTANCESTREE)
   425                   wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, "Select an object")
       
   426             self.ToolBar.Realize()
       
   427         else:
       
   428             ToolBar = wx.ToolBar(self, ID_PLCOPENEDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
       
   429                     wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
       
   430             ToolBar.SetToolBitmapSize(wx.Size(25, 25))
       
   431             ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
       
   432                   wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, "Select an object")
       
   433             ToolBar.Realize()
       
   434             self.Panes["ToolBar"] = ToolBar
       
   435             self.AUIManager.AddPane(ToolBar, wx.aui.AuiPaneInfo().
       
   436                       Name("ToolBar").Caption("Toolbar").
       
   437                       ToolbarPane().Top().
       
   438                       LeftDockable(False).RightDockable(False))
       
   439         
       
   440         self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
       
   441               id=ID_PLCOPENEDITORTOOLBARSELECTION)
       
   442             
   435             
   443         if wx.VERSION < (2, 8, 0):
   436             if wx.VERSION < (2, 8, 0):
   444             self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
   437                 self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
   445                   name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
   438                       name='TabsOpened', parent=self.MainSplitter, pos=wx.Point(0,
   446                   size=wx.Size(0, 0), style=wx.SP_3D)
   439                       0), size=wx.Size(0, 0), style=0)
   447             self.SecondSplitter.SetMinimumPaneSize(1)
   440                 if wx.VERSION >= (2, 6, 0):
       
   441                     self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
       
   442                         self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
       
   443                 else:
       
   444                     wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
       
   445                         self.OnPouSelectedChanged)
   448             
   446             
   449             self.MainSplitter.SplitVertically(self.TreeNoteBook, self.SecondSplitter, 200)
   447                 self.MainSplitter.SplitVertically(self.TreeNoteBook, self.TabsOpened, 200)
       
   448             else:
       
   449                 self.TabsOpened = wx.aui.AuiNotebook(self)
       
   450                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
       
   451                         self.OnPouSelectedChanged)
       
   452                 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane())
       
   453         else:
       
   454             if wx.VERSION < (2, 8, 0):
       
   455                 self.ToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, 
       
   456                       ID_PLCOPENEDITORTOOLBAR, 'ToolBar')
       
   457                 self.ToolBar.SetToolBitmapSize(wx.Size(25, 25))
       
   458                 self.ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
       
   459                       wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, "Select an object")
       
   460                 self.ToolBar.Realize()
       
   461             else:
       
   462                 ToolBar = wx.ToolBar(self, ID_PLCOPENEDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
       
   463                         wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
       
   464                 ToolBar.SetToolBitmapSize(wx.Size(25, 25))
       
   465                 ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
       
   466                       wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, "Select an object")
       
   467                 ToolBar.Realize()
       
   468                 self.Panes["ToolBar"] = ToolBar
       
   469                 self.AUIManager.AddPane(ToolBar, wx.aui.AuiPaneInfo().
       
   470                           Name("ToolBar").Caption("Toolbar").
       
   471                           ToolbarPane().Top().
       
   472                           LeftDockable(False).RightDockable(False))
   450             
   473             
   451             self.VariablePanelIndexer = VariablePanelIndexer(self.SecondSplitter, self, self.Controler)
   474             self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
   452         
   475                   id=ID_PLCOPENEDITORTOOLBARSELECTION)
   453             self.ThirdSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORTHIRDSPLITTER,
       
   454                   name='ThirdSplitter', parent=self.SecondSplitter, point=wx.Point(0, 0),
       
   455                   size=wx.Size(0, 0), style=wx.SP_3D)
       
   456             self.ThirdSplitter.SetMinimumPaneSize(1)
       
   457             
   476             
   458             self.SecondSplitter.SplitHorizontally(self.ThirdSplitter, self.VariablePanelIndexer, -200)
   477             if wx.VERSION < (2, 8, 0):
       
   478                 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
       
   479                       name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
       
   480                       size=wx.Size(0, 0), style=wx.SP_3D)
       
   481                 self.SecondSplitter.SetMinimumPaneSize(1)
       
   482                 
       
   483                 self.MainSplitter.SplitVertically(self.TreeNoteBook, self.SecondSplitter, 200)
       
   484                 
       
   485                 self.VariablePanelIndexer = VariablePanelIndexer(self.SecondSplitter, self, self.Controler)
   459             
   486             
   460             self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
   487                 self.ThirdSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORTHIRDSPLITTER,
   461                   name='TabsOpened', parent=self.SecondSplitter, pos=wx.Point(0,
   488                       name='ThirdSplitter', parent=self.SecondSplitter, point=wx.Point(0, 0),
   462                   0), size=wx.Size(0, 0), style=0)
   489                       size=wx.Size(0, 0), style=wx.SP_3D)
   463             if wx.VERSION >= (2, 6, 0):
   490                 self.ThirdSplitter.SetMinimumPaneSize(1)
   464                 self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
   491                 
   465                     self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
   492                 self.SecondSplitter.SplitHorizontally(self.ThirdSplitter, self.VariablePanelIndexer, -200)
       
   493                 
       
   494                 self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
       
   495                       name='TabsOpened', parent=self.SecondSplitter, pos=wx.Point(0,
       
   496                       0), size=wx.Size(0, 0), style=0)
       
   497                 if wx.VERSION >= (2, 6, 0):
       
   498                     self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
       
   499                         self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
       
   500                 else:
       
   501                     wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
       
   502                         self.OnPouSelectedChanged)
       
   503             
       
   504                 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
       
   505                       name='LibraryPanel', parent=self.ThirdSplitter, pos=wx.Point(0,
       
   506                       0), size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
       
   507                 
       
   508                 self.ThirdSplitter.SplitVertically(self.TabsOpened, self.LibraryPanel, -250)
   466             else:
   509             else:
   467                 wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
   510                 self.VariablePanelIndexer = VariablePanelIndexer(self, self, self.Controler)
   468                     self.OnPouSelectedChanged)
   511                 self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variables").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
   469         
       
   470             self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
       
   471                   name='LibraryPanel', parent=self.ThirdSplitter, pos=wx.Point(0,
       
   472                   0), size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
       
   473             
   512             
   474             self.ThirdSplitter.SplitVertically(self.TabsOpened, self.LibraryPanel, -250)
   513                 self.TabsOpened = wx.aui.AuiNotebook(self)
   475         else:
   514                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   476             self.VariablePanelIndexer = VariablePanelIndexer(self, self, self.Controler)
   515                         self.OnPouSelectedChanged)
   477             self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variables").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
   516                 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane())
   478         
   517             
   479             self.TabsOpened = wx.aui.AuiNotebook(self)
   518                 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   480             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   519                       name='LibraryPanel', parent=self, pos=wx.Point(0,
   481                     self.OnPouSelectedChanged)
   520                       0), size=wx.Size(0, 0), style=0)
   482             self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane())
   521                 self.AUIManager.AddPane(self.LibraryPanel, wx.aui.AuiPaneInfo().Caption("Library").Right().Layer(0).BestSize(wx.Size(250, 400)).CloseButton(False))
   483         
   522             
   484             self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   523             if wx.Platform == '__WXMSW__':
   485                   name='LibraryPanel', parent=self, pos=wx.Point(0,
   524                 librarytreestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER
   486                   0), size=wx.Size(0, 0), style=0)
   525             else:
   487             self.AUIManager.AddPane(self.LibraryPanel, wx.aui.AuiPaneInfo().Caption("Library").Right().Layer(0).BestSize(wx.Size(250, 400)).CloseButton(False))
   526                 librarytreestyle = wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER
   488         
   527             self.LibraryTree = wx.TreeCtrl(id=ID_PLCOPENEDITORLIBRARYTREE,
   489         if wx.Platform == '__WXMSW__':
   528                       name='LibraryTree', parent=self.LibraryPanel, 
   490             treestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER
   529                       pos=wx.Point(0, 0), size=wx.Size(0, 0),
   491         else:
   530                       style=librarytreestyle)
   492             treestyle = wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER
   531             self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnLibraryTreeItemSelected,
   493         self.LibraryTree = wx.TreeCtrl(id=ID_PLCOPENEDITORLIBRARYTREE,
   532                   id=ID_PLCOPENEDITORLIBRARYTREE)
   494                   name='LibraryTree', parent=self.LibraryPanel, 
   533             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnLibraryTreeBeginDrag,
   495                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   534                   id=ID_PLCOPENEDITORLIBRARYTREE)
   496                   style=treestyle)
   535             
   497         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnLibraryTreeItemSelected,
   536             self.LibraryComment = wx.TextCtrl(id=ID_PLCOPENEDITORLIBRARYCOMMENT,
   498               id=ID_PLCOPENEDITORLIBRARYTREE)
   537                       name='LibraryComment', parent=self.LibraryPanel, 
   499         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnLibraryTreeBeginDrag,
   538                       pos=wx.Point(0, 0), size=wx.Size(0, 60), 
   500               id=ID_PLCOPENEDITORLIBRARYTREE)
   539                       style=wx.TE_READONLY|wx.TE_MULTILINE)
   501         
   540             
   502         self.LibraryComment = wx.TextCtrl(id=ID_PLCOPENEDITORLIBRARYCOMMENT,
   541             self._init_sizers()
   503                   name='LibraryComment', parent=self.LibraryPanel, 
       
   504                   pos=wx.Point(0, 0), size=wx.Size(0, 60), 
       
   505                   style=wx.TE_READONLY|wx.TE_MULTILINE)
       
   506         
       
   507         self._init_sizers()
       
   508         
   542         
   509         if wx.VERSION >= (2, 8, 0):
   543         if wx.VERSION >= (2, 8, 0):
   510             self.AUIManager.Update()
   544             self.AUIManager.Update()
   511     
   545     
   512     def __init__(self, parent, controler = None, fileOpen = None):
   546     def __init__(self, parent, controler = None, fileOpen = None, debug = False):
   513         self.ModeSolo = controler == None
   547         self.ModeSolo = controler == None
       
   548         self.Debug = debug
   514         if self.ModeSolo:
   549         if self.ModeSolo:
   515             self.Controler = PLCControler()
   550             self.Controler = PLCControler()
   516             if fileOpen is not None:
   551             if fileOpen is not None:
   517                 self.Controler.OpenXMLFile(fileOpen)
   552                 self.Controler.OpenXMLFile(fileOpen)
   518         else:
   553         else:
   620             self.SetTitle("PLCOpenEditor - %s"%self.Controler.GetFilename())
   655             self.SetTitle("PLCOpenEditor - %s"%self.Controler.GetFilename())
   621         else:
   656         else:
   622             self.SetTitle("PLCOpenEditor")
   657             self.SetTitle("PLCOpenEditor")
   623 
   658 
   624     def ShowProperties(self):
   659     def ShowProperties(self):
   625         old_values = self.Controler.GetProjectProperties()
   660         old_values = self.Controler.GetProjectProperties(self.Debug)
   626         dialog = ProjectDialog(self)
   661         dialog = ProjectDialog(self)
   627         dialog.SetValues(old_values)
   662         dialog.SetValues(old_values)
   628         if dialog.ShowModal() == wx.ID_OK:
   663         if dialog.ShowModal() == wx.ID_OK:
   629             new_values = dialog.GetValues()
   664             new_values = dialog.GetValues()
   630             new_values["creationDateTime"] = old_values["creationDateTime"]
   665             new_values["creationDateTime"] = old_values["creationDateTime"]
   633                 self.RefreshTitle()
   668                 self.RefreshTitle()
   634                 self.RefreshFileMenu()
   669                 self.RefreshFileMenu()
   635                 self.RefreshEditMenu()
   670                 self.RefreshEditMenu()
   636                 self.RefreshTypesTree()
   671                 self.RefreshTypesTree()
   637                 for i in xrange(self.TabsOpened.GetPageCount()):
   672                 for i in xrange(self.TabsOpened.GetPageCount()):
   638                     editor = self.GetPage(i)
   673                     editor = self.TabsOpened.GetPage(i)
   639                     editor.RefreshScaling()
   674                     editor.RefreshScaling()
   640         dialog.Destroy()
   675         dialog.Destroy()
   641 
   676 
   642     def OnCloseFrame(self, event):
   677     def OnCloseFrame(self, event):
   643         if not self.ModeSolo and getattr(self, "_onclose", None) is not None:
   678         if not self.ModeSolo and getattr(self, "_onclose", None) is not None:
   765         event.Skip()
   800         event.Skip()
   766 
   801 
   767     def OnCloseTabMenu(self, event):
   802     def OnCloseTabMenu(self, event):
   768         selected = self.TabsOpened.GetSelection()
   803         selected = self.TabsOpened.GetSelection()
   769         if selected >= 0:
   804         if selected >= 0:
   770             tagname = self.TabsOpened.GetPage(selected).GetTagName()
       
   771             self.TabsOpened.DeletePage(selected)
   805             self.TabsOpened.DeletePage(selected)
   772             self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   806             if not self.Debug:
       
   807                 tagname = self.TabsOpened.GetPage(selected).GetTagName()
       
   808                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   773             if self.TabsOpened.GetPageCount() > 0:
   809             if self.TabsOpened.GetPageCount() > 0:
   774                 new_index = min(selected, self.TabsOpened.GetPageCount() - 1)
   810                 new_index = min(selected, self.TabsOpened.GetPageCount() - 1)
   775                 tagname = self.TabsOpened.GetPage(new_index).GetTagName()
       
   776                 self.TabsOpened.SetSelection(new_index)
   811                 self.TabsOpened.SetSelection(new_index)
   777                 self.VariablePanelIndexer.ChangeVariablePanel(tagname)
   812                 if not self.Debug:
   778             self.RefreshTitle()
   813                     tagname = self.TabsOpened.GetPage(new_index).GetTagName()
       
   814                     self.VariablePanelIndexer.ChangeVariablePanel(tagname)
   779             self.RefreshFileMenu()
   815             self.RefreshFileMenu()
   780             self.RefreshEditMenu()
   816             self.RefreshEditMenu()
   781             self.RefreshToolBar()
   817             self.RefreshToolBar()
   782         event.Skip()
   818         event.Skip()
   783     
   819     
   843     def SaveProjectAs(self):
   879     def SaveProjectAs(self):
   844         filepath = self.Controler.GetFilePath()
   880         filepath = self.Controler.GetFilePath()
   845         if filepath != "":
   881         if filepath != "":
   846             directory, filename = os.path.split(filepath)
   882             directory, filename = os.path.split(filepath)
   847         else:
   883         else:
   848             directory, filename = os.getcwd(), "%(projectName)s.xml"%self.Controler.GetProjectProperties()
   884             directory, filename = os.getcwd(), "%(projectName)s.xml"%self.Controler.GetProjectProperties(self.Debug)
   849         dialog = wx.FileDialog(self, "Choose a file", directory, filename,  "PLCOpen files (*.xml)|*.xml|All files|*.*", wx.SAVE|wx.OVERWRITE_PROMPT)
   885         dialog = wx.FileDialog(self, "Choose a file", directory, filename,  "PLCOpen files (*.xml)|*.xml|All files|*.*", wx.SAVE|wx.OVERWRITE_PROMPT)
   850         if dialog.ShowModal() == wx.ID_OK:
   886         if dialog.ShowModal() == wx.ID_OK:
   851             filepath = dialog.GetPath()
   887             filepath = dialog.GetPath()
   852             if os.path.isdir(os.path.dirname(filepath)):
   888             if os.path.isdir(os.path.dirname(filepath)):
   853                 result = self.Controler.SaveXMLFile(filepath)
   889                 result = self.Controler.SaveXMLFile(filepath)
   872 
   908 
   873     def OnPreviewMenu(self, event):
   909     def OnPreviewMenu(self, event):
   874         selected = self.TabsOpened.GetSelection()        
   910         selected = self.TabsOpened.GetSelection()        
   875         if selected != -1:
   911         if selected != -1:
   876             data = wx.PrintDialogData(self.PrintData)
   912             data = wx.PrintDialogData(self.PrintData)
   877             properties = self.Controler.GetProjectProperties()
   913             properties = self.Controler.GetProjectProperties(self.Debug)
   878             page_size = map(int, properties["pageSize"])
   914             page_size = map(int, properties["pageSize"])
   879             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
   915             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
   880             printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True)
   916             printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True)
   881             printout2 = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True)
   917             printout2 = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True)
   882             preview = wx.PrintPreview(printout, printout2, data)
   918             preview = wx.PrintPreview(printout, printout2, data)
   892     def OnPrintMenu(self, event):
   928     def OnPrintMenu(self, event):
   893         selected = self.TabsOpened.GetSelection()        
   929         selected = self.TabsOpened.GetSelection()        
   894         if selected != -1:
   930         if selected != -1:
   895             dialog_data = wx.PrintDialogData(self.PrintData)
   931             dialog_data = wx.PrintDialogData(self.PrintData)
   896             dialog_data.SetToPage(1)
   932             dialog_data.SetToPage(1)
   897             properties = self.Controler.GetProjectProperties()
   933             properties = self.Controler.GetProjectProperties(self.Debug)
   898             page_size = map(int, properties["pageSize"])
   934             page_size = map(int, properties["pageSize"])
   899             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
   935             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
   900             printer = wx.Printer(dialog_data)
   936             printer = wx.Printer(dialog_data)
   901             printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins)
   937             printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins)
   902             
   938             
   947     def OnRefreshMenu(self, event):
   983     def OnRefreshMenu(self, event):
   948         selected = self.TabsOpened.GetSelection()
   984         selected = self.TabsOpened.GetSelection()
   949         if selected != -1:
   985         if selected != -1:
   950             window = self.TabsOpened.GetPage(selected)
   986             window = self.TabsOpened.GetPage(selected)
   951             window.RefreshView()
   987             window.RefreshView()
   952             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   988             if not self.Debug:
       
   989                 self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   953         event.Skip()
   990         event.Skip()
   954 
   991 
   955     def OnClearErrorsMenu(self, event):
   992     def OnClearErrorsMenu(self, event):
   956         self.ClearErrors()
   993         self.ClearErrors()
   957         event.Skip()
   994         event.Skip()
   960         self.Controler.LoadPrevious()
   997         self.Controler.LoadPrevious()
   961         idxs = range(self.TabsOpened.GetPageCount())
   998         idxs = range(self.TabsOpened.GetPageCount())
   962         idxs.reverse()
   999         idxs.reverse()
   963         for idx in idxs:
  1000         for idx in idxs:
   964             tagname = self.TabsOpened.GetPage(idx).GetTagName()
  1001             tagname = self.TabsOpened.GetPage(idx).GetTagName()
   965             if self.Controler.GetEditedElement(tagname) is None:
  1002             if self.Controler.GetEditedElement(tagname, self.Debug) is None:
   966                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  1003                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   967                 self.TabsOpened.DeletePage(idx)
  1004                 self.TabsOpened.DeletePage(idx)
   968         selected = self.TabsOpened.GetSelection()        
  1005         selected = self.TabsOpened.GetSelection()        
   969         if selected != -1:
  1006         if selected != -1:
   970             window = self.TabsOpened.GetPage(selected)
  1007             window = self.TabsOpened.GetPage(selected)
   981         self.Controler.LoadNext()
  1018         self.Controler.LoadNext()
   982         idxs = range(self.TabsOpened.GetPageCount())
  1019         idxs = range(self.TabsOpened.GetPageCount())
   983         idxs.reverse()
  1020         idxs.reverse()
   984         for idx in idxs:
  1021         for idx in idxs:
   985             tagname = self.TabsOpened.GetPage(idx).GetTagName()
  1022             tagname = self.TabsOpened.GetPage(idx).GetTagName()
   986             if self.Controler.GetEditedElement(tagname) is None:
  1023             if self.Controler.GetEditedElement(tagname, self.Debug) is None:
   987                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  1024                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   988                 self.TabsOpened.DeletePage(idx)
  1025                 self.TabsOpened.DeletePage(idx)
   989         selected = self.TabsOpened.GetSelection()
  1026         selected = self.TabsOpened.GetSelection()
   990         if selected != -1:
  1027         if selected != -1:
   991             window = self.TabsOpened.GetPage(selected)
  1028             window = self.TabsOpened.GetPage(selected)
  1029             if selected.IsOk():
  1066             if selected.IsOk():
  1030                 type = self.TypesTree.GetPyData(selected)
  1067                 type = self.TypesTree.GetPyData(selected)
  1031                 tagname = ""
  1068                 tagname = ""
  1032                 if type == ITEM_DATATYPE:
  1069                 if type == ITEM_DATATYPE:
  1033                     name = self.TypesTree.GetItemText(selected)
  1070                     name = self.TypesTree.GetItemText(selected)
  1034                     if not self.Controler.DataTypeIsUsed(name):
  1071                     if not self.Controler.DataTypeIsUsed(name, self.Debug):
  1035                         self.Controler.ProjectRemoveDataType(name)
  1072                         self.Controler.ProjectRemoveDataType(name)
  1036                         tagname = self.Controler.ComputeDataTypeName(name)
  1073                         tagname = self.Controler.ComputeDataTypeName(name)
  1037                     else:
  1074                     else:
  1038                         message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  1075                         message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  1039                         message.ShowModal()
  1076                         message.ShowModal()
  1040                         message.Destroy()
  1077                         message.Destroy()
  1041                 elif type == ITEM_POU:
  1078                 elif type == ITEM_POU:
  1042                     name = self.TypesTree.GetItemText(selected)
  1079                     name = self.TypesTree.GetItemText(selected)
  1043                     if not self.Controler.DataTypeIsUsed(name):
  1080                     if not self.Controler.PouIsUsed(name, self.Debug):
  1044                         self.Controler.ProjectRemoveDataType(name)
  1081                         self.Controler.ProjectRemovePou(name)
  1045                         tagname = self.Controler.ComputeDataTypeName(name)
  1082                         tagname = self.Controler.ComputePouName(name)
  1046                     else:
  1083                     else:
  1047                         message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  1084                         message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  1048                         message.ShowModal()
  1085                         message.ShowModal()
  1049                         message.Destroy()
  1086                         message.Destroy()
  1050                 elif type in [ITEM_TRANSITION, ITEM_ACTION]:
  1087                 elif type in [ITEM_TRANSITION, ITEM_ACTION]:
  1098 #-------------------------------------------------------------------------------
  1135 #-------------------------------------------------------------------------------
  1099     
  1136     
  1100     def OnPouSelectedChanged(self, event):
  1137     def OnPouSelectedChanged(self, event):
  1101         old_selected = self.TabsOpened.GetSelection()
  1138         old_selected = self.TabsOpened.GetSelection()
  1102         if old_selected >= 0:
  1139         if old_selected >= 0:
  1103             self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1140             if self.Debug:
       
  1141                 pass
       
  1142             else:
       
  1143                 self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1104         selected = event.GetSelection()
  1144         selected = event.GetSelection()
  1105         if selected >= 0:
  1145         if selected >= 0:
  1106             window = self.TabsOpened.GetPage(selected)
  1146             window = self.TabsOpened.GetPage(selected)
  1107             self.SelectTypesTreeItem(window.GetTagName())
  1147             if self.Debug:
       
  1148                 self.SelectTypesTreeItem(window.GetTagName())
       
  1149             else:
       
  1150                 self.SelectInstancesTreeItem(self.InstancesTree.GetRootItem(), window.GetInstancePath())
  1108             window.RefreshView()
  1151             window.RefreshView()
  1109             self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
  1152             if not self.Debug:
       
  1153                 self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
  1110             self.RefreshFileMenu()
  1154             self.RefreshFileMenu()
  1111             self.RefreshEditMenu()
  1155             self.RefreshEditMenu()
  1112             self.RefreshToolBar()
  1156             self.RefreshToolBar()
  1113         event.Skip()
  1157         event.Skip()
  1114 
  1158 
  1139     def RefreshPageTitles(self):
  1183     def RefreshPageTitles(self):
  1140         for idx in xrange(self.TabsOpened.GetPageCount()):
  1184         for idx in xrange(self.TabsOpened.GetPageCount()):
  1141             window = self.TabsOpened.GetPage(idx)
  1185             window = self.TabsOpened.GetPage(idx)
  1142             words = window.GetTagName().split("::")
  1186             words = window.GetTagName().split("::")
  1143             if words[0] == "P":
  1187             if words[0] == "P":
  1144                 pou_type = self.Controler.GetEditedElementType(window.GetTagName())[1].upper()
  1188                 pou_type = self.Controler.GetEditedElementType(window.GetTagName(), self.Debug)[1].upper()
  1145                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName())
  1189                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), self.Debug)
  1146                 self.SetPageBitmap(idx, GenerateBitmap(pou_type, pou_body_type))
  1190                 self.SetPageBitmap(idx, GenerateBitmap(pou_type, pou_body_type))
  1147             elif words[0] == "T":
  1191             elif words[0] == "T":
  1148                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName())
  1192                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), self.Debug)
  1149                 self.SetPageBitmap(idx, GenerateBitmap("TRANSITION", pou_body_type))
  1193                 self.SetPageBitmap(idx, GenerateBitmap("TRANSITION", pou_body_type))
  1150             elif words[0] == "A":
  1194             elif words[0] == "A":
  1151                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName())
  1195                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), self.Debug)
  1152                 self.SetPageBitmap(idx, GenerateBitmap("ACTION", pou_body_type))
  1196                 self.SetPageBitmap(idx, GenerateBitmap("ACTION", pou_body_type))
  1153             elif words[0] == "C":
  1197             elif words[0] == "C":
  1154                 self.SetPageBitmap(idx, GenerateBitmap("CONFIGURATION"))
  1198                 self.SetPageBitmap(idx, GenerateBitmap("CONFIGURATION"))
  1155             elif words[0] == "R":
  1199             elif words[0] == "R":
  1156                 self.SetPageBitmap(idx, GenerateBitmap("RESOURCE"))
  1200                 self.SetPageBitmap(idx, GenerateBitmap("RESOURCE"))
  1157             elif words[0] == "D":
  1201             elif words[0] == "D":
  1158                 self.SetPageBitmap(idx, GenerateBitmap("DATATYPE"))
  1202                 self.SetPageBitmap(idx, GenerateBitmap("DATATYPE"))
  1159             self.TabsOpened.SetPageText(idx, "-".join(words[1:]))
  1203             if self.Debug:
       
  1204                 self.TabsOpened.SetPageText(idx, window.GetInstancePath())
       
  1205             else:
       
  1206                 self.TabsOpened.SetPageText(idx, "-".join(words[1:]))
  1160 
  1207 
  1161 
  1208 
  1162 #-------------------------------------------------------------------------------
  1209 #-------------------------------------------------------------------------------
  1163 #                         Types Tree Management Functions
  1210 #                         Types Tree Management Functions
  1164 #-------------------------------------------------------------------------------
  1211 #-------------------------------------------------------------------------------
  1165 
  1212 
  1166     def RefreshTypesTree(self):
  1213     def RefreshTypesTree(self):
  1167         infos = self.Controler.GetProjectInfos()
  1214         infos = self.Controler.GetProjectInfos(self.Debug)
  1168         root = self.TypesTree.GetRootItem()
  1215         root = self.TypesTree.GetRootItem()
  1169         if not root.IsOk():
  1216         if not root.IsOk():
  1170             root = self.TypesTree.AddRoot(infos["name"])
  1217             root = self.TypesTree.AddRoot(infos["name"])
  1171         self.GenerateTypesTreeBranch(root, infos)
  1218         self.GenerateTypesTreeBranch(root, infos)
  1172         self.TypesTree.Expand(root)
  1219         self.TypesTree.Expand(root)
  1180             self.TypesTree.SetItemTextColour(root, wx.RED)
  1227             self.TypesTree.SetItemTextColour(root, wx.RED)
  1181         else:
  1228         else:
  1182             self.TypesTree.SetItemBackgroundColour(root, wx.WHITE)
  1229             self.TypesTree.SetItemBackgroundColour(root, wx.WHITE)
  1183             self.TypesTree.SetItemTextColour(root, wx.BLACK)
  1230             self.TypesTree.SetItemTextColour(root, wx.BLACK)
  1184         if infos["type"] == ITEM_POU:
  1231         if infos["type"] == ITEM_POU:
  1185             self.TypesTree.SetItemImage(root, self.TypesTreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1232             self.TypesTree.SetItemImage(root, self.TypesTreeImageDict[self.Controler.GetPouBodyType(infos["name"], self.Debug)])
  1186         else:
  1233         else:
  1187             self.TypesTree.SetItemImage(root, self.TypesTreeImageDict[infos["type"]])      
  1234             self.TypesTree.SetItemImage(root, self.TypesTreeImageDict[infos["type"]])      
  1188             
  1235             
  1189         if wx.VERSION >= (2, 6, 0):
  1236         if wx.VERSION >= (2, 6, 0):
  1190             item, root_cookie = self.TypesTree.GetFirstChild(root)
  1237             item, root_cookie = self.TypesTree.GetFirstChild(root)
  1202             item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie)
  1249             item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie)
  1203         for item in to_delete:
  1250         for item in to_delete:
  1204             self.TypesTree.Delete(item)
  1251             self.TypesTree.Delete(item)
  1205 
  1252 
  1206     def SelectTypesTreeItem(self, tagname):
  1253     def SelectTypesTreeItem(self, tagname):
  1207         if self.TypesTree:
  1254         if self.TypesTree is not None:
  1208             root = self.TypesTree.GetRootItem()
  1255             root = self.TypesTree.GetRootItem()
  1209             words = tagname.split("::")
  1256             words = tagname.split("::")
  1210             if words[0] == "D":
  1257             if words[0] == "D":
  1211                 return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_DATATYPE)])
  1258                 return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_DATATYPE)])
  1212             elif words[0] == "P":
  1259             elif words[0] == "P":
  1221                 return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)])
  1268                 return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)])
  1222         return False
  1269         return False
  1223 
  1270 
  1224     def RecursiveTypesTreeItemSelection(self, root, items):
  1271     def RecursiveTypesTreeItemSelection(self, root, items):
  1225         found = False
  1272         found = False
  1226         if self.TypesTree:
  1273         if self.TypesTree is not None:
  1227             if wx.VERSION >= (2, 6, 0):
  1274             if wx.VERSION >= (2, 6, 0):
  1228                 item, root_cookie = self.TypesTree.GetFirstChild(root)
  1275                 item, root_cookie = self.TypesTree.GetFirstChild(root)
  1229             else:
  1276             else:
  1230                 item, root_cookie = self.TypesTree.GetFirstChild(root, 0)
  1277                 item, root_cookie = self.TypesTree.GetFirstChild(root, 0)
  1231             while item.IsOk() and not found:
  1278             while item.IsOk() and not found:
  1245     def OnTypesTreeBeginDrag(self, event):
  1292     def OnTypesTreeBeginDrag(self, event):
  1246         if wx.Platform == '__WXMSW__':
  1293         if wx.Platform == '__WXMSW__':
  1247             self.SelectedItem = event.GetItem()
  1294             self.SelectedItem = event.GetItem()
  1248         if self.SelectedItem is not None and self.TypesTree.GetPyData(self.SelectedItem) == ITEM_POU:
  1295         if self.SelectedItem is not None and self.TypesTree.GetPyData(self.SelectedItem) == ITEM_POU:
  1249             block_name = self.TypesTree.GetItemText(self.SelectedItem)
  1296             block_name = self.TypesTree.GetItemText(self.SelectedItem)
  1250             block_type = self.Controler.GetPouType(block_name)
  1297             block_type = self.Controler.GetPouType(block_name, self.Debug)
  1251             if block_type != "program":
  1298             if block_type != "program":
  1252                 data = wx.TextDataObject(str((block_name, block_type, "")))
  1299                 data = wx.TextDataObject(str((block_name, block_type, "")))
  1253                 dragSource = wx.DropSource(self.TypesTree)
  1300                 dragSource = wx.DropSource(self.TypesTree)
  1254                 dragSource.SetData(data)
  1301                 dragSource.SetData(data)
  1255                 dragSource.DoDragDrop()
  1302                 dragSource.DoDragDrop()
  1276                 old_name = self.TypesTree.GetItemText(item)
  1323                 old_name = self.TypesTree.GetItemText(item)
  1277                 itemtype = self.TypesTree.GetPyData(item)
  1324                 itemtype = self.TypesTree.GetPyData(item)
  1278                 if itemtype == ITEM_PROJECT:
  1325                 if itemtype == ITEM_PROJECT:
  1279                     self.Controler.SetProjectProperties(name = new_name)
  1326                     self.Controler.SetProjectProperties(name = new_name)
  1280                 elif itemtype == ITEM_DATATYPE:
  1327                 elif itemtype == ITEM_DATATYPE:
  1281                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
  1328                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames(self.Debug) if name != old_name]:
  1282                         message = "\"%s\" data type already exists!"%new_name
  1329                         message = "\"%s\" data type already exists!"%new_name
  1283                         abort = True
  1330                         abort = True
  1284                     if not abort:
  1331                     if not abort:
  1285                         self.Controler.ChangeDataTypeName(old_name, new_name)
  1332                         self.Controler.ChangeDataTypeName(old_name, new_name)
  1286                         self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), 
  1333                         self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), 
  1287                                                 self.Controler.ComputeDataTypeName(new_name))
  1334                                                 self.Controler.ComputeDataTypeName(new_name))
  1288                         self.RefreshPageTitles()
  1335                         self.RefreshPageTitles()
  1289                 elif itemtype == ITEM_POU:
  1336                 elif itemtype == ITEM_POU:
  1290                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]:
  1337                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug) if name != old_name]:
  1291                         message = "\"%s\" pou already exists!"%new_name
  1338                         message = "\"%s\" pou already exists!"%new_name
  1292                         abort = True
  1339                         abort = True
  1293                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1340                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]:
  1294                         messageDialog = wx.MessageDialog(self, "A variable is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1341                         messageDialog = wx.MessageDialog(self, "A variable is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1295                         if messageDialog.ShowModal() == wx.ID_NO:
  1342                         if messageDialog.ShowModal() == wx.ID_NO:
  1296                             abort = True
  1343                             abort = True
  1297                         messageDialog.Destroy()
  1344                         messageDialog.Destroy()
  1298                     if not abort:
  1345                     if not abort:
  1305                     parent_type = self.TypesTree.GetPyData(parent)
  1352                     parent_type = self.TypesTree.GetPyData(parent)
  1306                     while parent_type != ITEM_POU:
  1353                     while parent_type != ITEM_POU:
  1307                         parent = self.TypesTree.GetItemParent(parent)
  1354                         parent = self.TypesTree.GetItemParent(parent)
  1308                         parent_type = self.TypesTree.GetPyData(parent)
  1355                         parent_type = self.TypesTree.GetPyData(parent)
  1309                     pou_name = self.TypesTree.GetItemText(parent)
  1356                     pou_name = self.TypesTree.GetItemText(parent)
  1310                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1357                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1311                         message = "A pou with \"%s\" as name exists!"%new_name
  1358                         message = "A pou with \"%s\" as name exists!"%new_name
  1312                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1359                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name, self.Debug) if name != old_name]:
  1313                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
  1360                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
  1314                     else:
  1361                     else:
  1315                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
  1362                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
  1316                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), 
  1363                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), 
  1317                                                 self.Controler.ComputePouTransitionName(pou_name, new_name))
  1364                                                 self.Controler.ComputePouTransitionName(pou_name, new_name))
  1321                     parent_type = self.TypesTree.GetPyData(parent)
  1368                     parent_type = self.TypesTree.GetPyData(parent)
  1322                     while parent_type != ITEM_POU:
  1369                     while parent_type != ITEM_POU:
  1323                         parent = self.TypesTree.GetItemParent(parent)
  1370                         parent = self.TypesTree.GetItemParent(parent)
  1324                         parent_type = self.TypesTree.GetPyData(parent)
  1371                         parent_type = self.TypesTree.GetPyData(parent)
  1325                     pou_name = self.TypesTree.GetItemText(parent)
  1372                     pou_name = self.TypesTree.GetItemText(parent)
  1326                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1373                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1327                         message = "A pou with \"%s\" as name exists!"%new_name
  1374                         message = "A pou with \"%s\" as name exists!"%new_name
  1328                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1375                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name, self.Debug) if name != old_name]:
  1329                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
  1376                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
  1330                     else:
  1377                     else:
  1331                         self.Controler.ChangePouActionName(pou_name, old_name, new_name)
  1378                         self.Controler.ChangePouActionName(pou_name, old_name, new_name)
  1332                         self.RefreshEditorNames(self.Controler.ComputePouActionName(pou_name, old_name), 
  1379                         self.RefreshEditorNames(self.Controler.ComputePouActionName(pou_name, old_name), 
  1333                                                 self.Controler.ComputePouActionName(pou_name, new_name))
  1380                                                 self.Controler.ComputePouActionName(pou_name, new_name))
  1334                         self.RefreshPageTitles()
  1381                         self.RefreshPageTitles()
  1335                 elif itemtype == ITEM_CONFIGURATION:
  1382                 elif itemtype == ITEM_CONFIGURATION:
  1336                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames() if name != old_name]:
  1383                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames(self.Debug) if name != old_name]:
  1337                         message = "\"%s\" config already exists!"%new_name
  1384                         message = "\"%s\" config already exists!"%new_name
  1338                         abort = True
  1385                         abort = True
  1339                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1386                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1340                         messageDialog = wx.MessageDialog(self, "A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1387                         messageDialog = wx.MessageDialog(self, "A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1341                         if messageDialog.ShowModal() == wx.ID_NO:
  1388                         if messageDialog.ShowModal() == wx.ID_NO:
  1342                             abort = True
  1389                             abort = True
  1343                         messageDialog.Destroy()
  1390                         messageDialog.Destroy()
  1344                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1391                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]:
  1345                         messageDialog = wx.MessageDialog(self, "A variable is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1392                         messageDialog = wx.MessageDialog(self, "A variable is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1346                         if messageDialog.ShowModal() == wx.ID_NO:
  1393                         if messageDialog.ShowModal() == wx.ID_NO:
  1347                             abort = True
  1394                             abort = True
  1348                         messageDialog.Destroy()
  1395                         messageDialog.Destroy()
  1349                     if not abort:
  1396                     if not abort:
  1356                     parent_type = self.TypesTree.GetPyData(parent)
  1403                     parent_type = self.TypesTree.GetPyData(parent)
  1357                     while parent_type != ITEM_CONFIGURATION:
  1404                     while parent_type != ITEM_CONFIGURATION:
  1358                         parent = self.TypesTree.GetItemParent(parent)
  1405                         parent = self.TypesTree.GetItemParent(parent)
  1359                         parent_type = self.TypesTree.GetPyData(parent)
  1406                         parent_type = self.TypesTree.GetPyData(parent)
  1360                     config_name = self.TypesTree.GetItemText(parent)
  1407                     config_name = self.TypesTree.GetItemText(parent)
  1361                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]:
  1408                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames(self.Debug)]:
  1362                         message = "\"%s\" config already exists!"%new_name
  1409                         message = "\"%s\" config already exists!"%new_name
  1363                         abort = True
  1410                         abort = True
  1364                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1411                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1365                         messageDialog = wx.MessageDialog(self, "A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1412                         messageDialog = wx.MessageDialog(self, "A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1366                         if messageDialog.ShowModal() == wx.ID_NO:
  1413                         if messageDialog.ShowModal() == wx.ID_NO:
  1367                             abort = True
  1414                             abort = True
  1368                         messageDialog.Destroy()
  1415                         messageDialog.Destroy()
  1369                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1416                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]:
  1370                         messageDialog = wx.MessageDialog(self, "A variable is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1417                         messageDialog = wx.MessageDialog(self, "A variable is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1371                         if messageDialog.ShowModal() == wx.ID_NO:
  1418                         if messageDialog.ShowModal() == wx.ID_NO:
  1372                             abort = True
  1419                             abort = True
  1373                         messageDialog.Destroy()
  1420                         messageDialog.Destroy()
  1374                     if not abort:
  1421                     if not abort:
  1499             elif elementtype == ITEM_RESOURCE:
  1546             elif elementtype == ITEM_RESOURCE:
  1500                 new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler)
  1547                 new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler)
  1501                 self.TabsOpened.AddPage(new_window, "")
  1548                 self.TabsOpened.AddPage(new_window, "")
  1502                 self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
  1549                 self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
  1503             elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
  1550             elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
  1504                 bodytype = self.Controler.GetEditedElementBodyType(tagname)
  1551                 bodytype = self.Controler.GetEditedElementBodyType(tagname, self.Debug)
  1505                 if bodytype == "FBD":
  1552                 if bodytype == "FBD":
  1506                     new_window = Viewer(self.TabsOpened, tagname, self, self.Controler)
  1553                     new_window = Viewer(self.TabsOpened, tagname, self, self.Controler)
  1507                     new_window.RefreshScaling(False)
  1554                     new_window.RefreshScaling(False)
  1508                 elif bodytype == "LD":
  1555                 elif bodytype == "LD":
  1509                     new_window = LD_Viewer(self.TabsOpened, tagname, self, self.Controler)
  1556                     new_window = LD_Viewer(self.TabsOpened, tagname, self, self.Controler)
  1511                 elif bodytype == "SFC":
  1558                 elif bodytype == "SFC":
  1512                     new_window = SFC_Viewer(self.TabsOpened, tagname, self, self.Controler)
  1559                     new_window = SFC_Viewer(self.TabsOpened, tagname, self, self.Controler)
  1513                     new_window.RefreshScaling(False)
  1560                     new_window.RefreshScaling(False)
  1514                 else:
  1561                 else:
  1515                     new_window = TextViewer(self.TabsOpened, tagname, self, self.Controler)
  1562                     new_window = TextViewer(self.TabsOpened, tagname, self, self.Controler)
  1516                     new_window.SetTextSyntax(elementtype)
  1563                     new_window.SetTextSyntax(bodytype)
  1517                     if bodytype == "IL":
  1564                     if bodytype == "IL":
  1518                         new_window.SetKeywords(IL_KEYWORDS)
  1565                         new_window.SetKeywords(IL_KEYWORDS)
  1519                     else:
  1566                     else:
  1520                         new_window.SetKeywords(ST_KEYWORDS)
  1567                         new_window.SetKeywords(ST_KEYWORDS)
  1521                 self.TabsOpened.AddPage(new_window, "")
  1568                 self.TabsOpened.AddPage(new_window, "")
  1522                 words = tagname.split("::")
  1569                 words = tagname.split("::")
  1523                 self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1]))
  1570                 self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1], self.Debug))
  1524             elif elementtype == ITEM_DATATYPE:
  1571             elif elementtype == ITEM_DATATYPE:
  1525                 new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
  1572                 new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
  1526                 self.TabsOpened.AddPage(new_window, "")
  1573                 self.TabsOpened.AddPage(new_window, "")
  1527             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1574             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1528             openedidx = self.IsOpened(tagname)
  1575             openedidx = self.IsOpened(tagname)
  1548             item = self.TypesTree.GetSelection()
  1595             item = self.TypesTree.GetSelection()
  1549         name = self.TypesTree.GetItemText(item)
  1596         name = self.TypesTree.GetItemText(item)
  1550         type = self.TypesTree.GetPyData(item)
  1597         type = self.TypesTree.GetPyData(item)
  1551         if type == ITEM_POU:
  1598         if type == ITEM_POU:
  1552             menu = wx.Menu(title='')
  1599             menu = wx.Menu(title='')
  1553             if self.Controler.GetPouBodyType(name) == "SFC":
  1600             if self.Controler.GetPouBodyType(name, self.Debug) == "SFC":
  1554                 new_id = wx.NewId()
  1601                 new_id = wx.NewId()
  1555                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Transition")
  1602                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Transition")
  1556                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id)
  1603                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id)
  1557                 new_id = wx.NewId()
  1604                 new_id = wx.NewId()
  1558                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Action")
  1605                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Action")
  1642 #-------------------------------------------------------------------------------
  1689 #-------------------------------------------------------------------------------
  1643 #                         Instances Tree Management Functions
  1690 #                         Instances Tree Management Functions
  1644 #-------------------------------------------------------------------------------
  1691 #-------------------------------------------------------------------------------
  1645 
  1692 
  1646     def RefreshInstancesTree(self):
  1693     def RefreshInstancesTree(self):
  1647         infos = self.Controler.GetProjectTopology()
  1694         infos = self.Controler.GetProjectTopology(self.Debug)
  1648         root = self.InstancesTree.GetRootItem()
  1695         root = self.InstancesTree.GetRootItem()
  1649         if not root.IsOk():
  1696         if not root.IsOk():
  1650             root = self.InstancesTree.AddRoot(infos["name"])
  1697             root = self.InstancesTree.AddRoot(infos["name"])
  1651         self.GenerateInstancesTreeBranch(root, infos)
  1698         self.GenerateInstancesTreeBranch(root, infos)
  1652         self.InstancesTree.Expand(root)
  1699         self.InstancesTree.Expand(root)
  1653 
  1700 
  1654     def GenerateInstancesTreeBranch(self, root, infos):
  1701     def GenerateInstancesTreeBranch(self, root, infos):
  1655         to_delete = []
  1702         to_delete = []
  1656         if infos.get("elmt_type", None) is not None:
  1703         if infos.get("elmt_type", None) is not None:
  1657             self.InstancesTree.SetItemText(root, "%s(%s)"%(infos["name"], infos["elmt_type"]))
  1704             self.InstancesTree.SetItemText(root, "%s (%s)"%(infos["name"], infos["elmt_type"]))
  1658         else:
  1705         else:
  1659             self.InstancesTree.SetItemText(root, infos["name"])
  1706             self.InstancesTree.SetItemText(root, infos["name"])
  1660         self.InstancesTree.SetPyData(root, infos["type"])
  1707         self.InstancesTree.SetPyData(root, (infos["type"], infos.get("tagname", None)))
  1661         self.InstancesTree.SetItemImage(root, self.InstancesTreeImageDict[infos["type"]])      
  1708         self.InstancesTree.SetItemImage(root, self.InstancesTreeImageDict[infos["type"]])      
  1662             
  1709             
  1663         if wx.VERSION >= (2, 6, 0):
  1710         if wx.VERSION >= (2, 6, 0):
  1664             item, root_cookie = self.InstancesTree.GetFirstChild(root)
  1711             item, root_cookie = self.InstancesTree.GetFirstChild(root)
  1665         else:
  1712         else:
  1675             to_delete.append(item)
  1722             to_delete.append(item)
  1676             item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
  1723             item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
  1677         for item in to_delete:
  1724         for item in to_delete:
  1678             self.InstancesTree.Delete(item)
  1725             self.InstancesTree.Delete(item)
  1679 
  1726 
       
  1727     def OnInstancesTreeBeginDrag(self, event):
       
  1728         selected_item = event.GetItem()
       
  1729         selected_infos = self.InstancesTree.GetPyData(selected_item)
       
  1730         if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE:
       
  1731             var_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0]
       
  1732             parent_item = self.InstancesTree.GetItemParent(selected_item)
       
  1733             while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
       
  1734                 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
       
  1735                 var_path = "%s.%s"%(parent_name, var_path)
       
  1736                 parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  1737             data = wx.TextDataObject(str((var_path, "debug")))
       
  1738             dragSource = wx.DropSource(self.InstancesTree)
       
  1739             dragSource.SetData(data)
       
  1740             dragSource.DoDragDrop()
       
  1741         event.Skip()
       
  1742 
       
  1743     def OnInstancesTreeItemActivated(self, event):
       
  1744         selected_item = event.GetItem()
       
  1745         selected_infos = self.InstancesTree.GetPyData(selected_item)
       
  1746         if selected_item is not None and selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM, ITEM_TRANSITION, ITEM_ACTION]:
       
  1747             instance_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0]
       
  1748             parent_item = self.InstancesTree.GetItemParent(selected_item)
       
  1749             while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
       
  1750                 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
       
  1751                 instance_path = "%s.%s"%(parent_name, instance_path)
       
  1752                 parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  1753             openedidx = self.IsOpened(instance_path)
       
  1754             if openedidx is not None:
       
  1755                 old_selected = self.TabsOpened.GetSelection()
       
  1756                 if old_selected != openedidx:
       
  1757                     if old_selected >= 0:
       
  1758                         self.TabsOpened.GetPage(old_selected).ResetBuffer()
       
  1759                     self.TabsOpened.SetSelection(openedidx)
       
  1760                 self.TabsOpened.GetPage(openedidx).RefreshView()
       
  1761             elif selected_infos[1] is not None:
       
  1762                 bodytype = self.Controler.GetEditedElementBodyType(selected_infos[1], self.Debug)
       
  1763                 if bodytype == "FBD":
       
  1764                     new_window = Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1765                     new_window.RefreshScaling(False)
       
  1766                 elif bodytype == "LD":
       
  1767                     new_window = LD_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1768                     new_window.RefreshScaling(False)
       
  1769                 elif bodytype == "SFC":
       
  1770                     new_window = SFC_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1771                     new_window.RefreshScaling(False)
       
  1772                 else:
       
  1773                     new_window = TextViewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1774                     new_window.SetTextSyntax(bodytype)
       
  1775                     if bodytype == "IL":
       
  1776                         new_window.SetKeywords(IL_KEYWORDS)
       
  1777                     else:
       
  1778                         new_window.SetKeywords(ST_KEYWORDS)
       
  1779                 self.TabsOpened.AddPage(new_window, "")
       
  1780                 new_window.RefreshView()
       
  1781                 new_window.SetFocus()
       
  1782                 self.RefreshPageTitles()
       
  1783         event.Skip()
       
  1784 
       
  1785     def SelectInstancesTreeItem(self, root, instancepath):
       
  1786         found = False
       
  1787         if self.InstancesTree is not None:
       
  1788             paths = instancepath.split(".")
       
  1789             if wx.VERSION >= (2, 6, 0):
       
  1790                 item, root_cookie = self.InstancesTree.GetFirstChild(root)
       
  1791             else:
       
  1792                 item, root_cookie = self.InstancesTree.GetFirstChild(root, 0)
       
  1793             while item.IsOk() and not found:
       
  1794                 if self.InstancesTree.GetItemText(item) == paths[0]:
       
  1795                     if len(paths) == 1:
       
  1796                         self.InstancesTree.SelectItem(item)
       
  1797                         return True
       
  1798                     else:
       
  1799                         found = self.SelectInstancesTreeItem(item, paths[1:])
       
  1800                 else:
       
  1801                     item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
       
  1802         return found
       
  1803 
  1680 #-------------------------------------------------------------------------------
  1804 #-------------------------------------------------------------------------------
  1681 #                         Library Tree Management Functions
  1805 #                         Library Tree Management Functions
  1682 #-------------------------------------------------------------------------------
  1806 #-------------------------------------------------------------------------------
  1683 
  1807 
  1684     def RefreshLibraryTree(self):
  1808     def RefreshLibraryTree(self):
  1685         to_delete = []
  1809         if not self.Debug:
  1686         blocktypes = self.Controler.GetBlockTypes()
  1810             to_delete = []
  1687         root = self.LibraryTree.GetRootItem()
  1811             blocktypes = self.Controler.GetBlockTypes(debug = self.Debug)
  1688         if not root.IsOk():
  1812             root = self.LibraryTree.GetRootItem()
  1689             if wx.Platform == '__WXMSW__':
  1813             if not root.IsOk():
  1690                 root = self.LibraryTree.AddRoot("Block Types")
  1814                 if wx.Platform == '__WXMSW__':
  1691                 self.LibraryTree.SetPyData(root, {"type" : CATEGORY})
  1815                     root = self.LibraryTree.AddRoot("Block Types")
       
  1816                     self.LibraryTree.SetPyData(root, {"type" : CATEGORY})
       
  1817                 else:
       
  1818                     root = self.LibraryTree.AddRoot("")
       
  1819             if wx.VERSION >= (2, 6, 0):
       
  1820                 category_item, root_cookie = self.LibraryTree.GetFirstChild(root)
  1692             else:
  1821             else:
  1693                 root = self.LibraryTree.AddRoot("")
  1822                 category_item, root_cookie = self.LibraryTree.GetFirstChild(root, 0)
  1694         if wx.VERSION >= (2, 6, 0):
  1823             for category in blocktypes:
  1695             category_item, root_cookie = self.LibraryTree.GetFirstChild(root)
  1824                 if not category_item.IsOk():
  1696         else:
  1825                     category_item = self.LibraryTree.AppendItem(root, category["name"])
  1697             category_item, root_cookie = self.LibraryTree.GetFirstChild(root, 0)
       
  1698         for category in blocktypes:
       
  1699             if not category_item.IsOk():
       
  1700                 category_item = self.LibraryTree.AppendItem(root, category["name"])
       
  1701                 if wx.Platform != '__WXMSW__':
       
  1702                     category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
       
  1703             else:
       
  1704                 self.LibraryTree.SetItemText(category_item, category["name"])
       
  1705             self.LibraryTree.SetPyData(category_item, {"type" : CATEGORY})
       
  1706             if wx.VERSION >= (2, 6, 0):
       
  1707                 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item)
       
  1708             else:
       
  1709                 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item, 0)        
       
  1710             for blocktype in category["list"]:
       
  1711                 if not blocktype_item.IsOk():
       
  1712                     blocktype_item = self.LibraryTree.AppendItem(category_item, blocktype["name"])
       
  1713                     if wx.Platform != '__WXMSW__':
  1826                     if wx.Platform != '__WXMSW__':
  1714                         blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
  1827                         category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
  1715                 else:
  1828                 else:
  1716                     self.LibraryTree.SetItemText(blocktype_item, blocktype["name"])
  1829                     self.LibraryTree.SetItemText(category_item, category["name"])
  1717                 self.LibraryTree.SetPyData(blocktype_item, {"type" : BLOCK, "block_type" : blocktype["type"], "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]])})
  1830                 self.LibraryTree.SetPyData(category_item, {"type" : CATEGORY})
  1718                 blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
  1831                 if wx.VERSION >= (2, 6, 0):
  1719             while blocktype_item.IsOk():
  1832                     blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item)
  1720                 to_delete.append(blocktype_item)
  1833                 else:
  1721                 blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
  1834                     blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item, 0)        
  1722             category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
  1835                 for blocktype in category["list"]:
  1723         while category_item.IsOk():
  1836                     if not blocktype_item.IsOk():
  1724             to_delete.append(category_item)
  1837                         blocktype_item = self.LibraryTree.AppendItem(category_item, blocktype["name"])
  1725             category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
  1838                         if wx.Platform != '__WXMSW__':
  1726         for item in to_delete:
  1839                             blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
  1727             self.LibraryTree.Delete(item)
  1840                     else:
  1728         if wx.Platform == '__WXMSW__':        
  1841                         self.LibraryTree.SetItemText(blocktype_item, blocktype["name"])
  1729             self.LibraryTree.Expand(root)
  1842                     self.LibraryTree.SetPyData(blocktype_item, {"type" : BLOCK, "block_type" : blocktype["type"], "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]])})
       
  1843                     blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
       
  1844                 while blocktype_item.IsOk():
       
  1845                     to_delete.append(blocktype_item)
       
  1846                     blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
       
  1847                 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
       
  1848             while category_item.IsOk():
       
  1849                 to_delete.append(category_item)
       
  1850                 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
       
  1851             for item in to_delete:
       
  1852                 self.LibraryTree.Delete(item)
       
  1853             if wx.Platform == '__WXMSW__':        
       
  1854                 self.LibraryTree.Expand(root)
  1730 
  1855 
  1731     def OnLibraryTreeItemSelected(self, event):
  1856     def OnLibraryTreeItemSelected(self, event):
  1732         selected = event.GetItem()
  1857         selected = event.GetItem()
  1733         pydata = self.LibraryTree.GetPyData(selected)
  1858         pydata = self.LibraryTree.GetPyData(selected)
  1734         if pydata["type"] != CATEGORY:
  1859         if pydata["type"] != CATEGORY:
  1735             blocktype = self.Controler.GetBlockType(self.LibraryTree.GetItemText(selected), pydata["inputs"])
  1860             blocktype = self.Controler.GetBlockType(self.LibraryTree.GetItemText(selected), pydata["inputs"], debug = self.Debug)
  1736             if blocktype:
  1861             if blocktype:
  1737                 self.LibraryComment.SetValue(blocktype["comment"])
  1862                 self.LibraryComment.SetValue(blocktype["comment"])
  1738             else:
  1863             else:
  1739                 self.LibraryComment.SetValue("")
  1864                 self.LibraryComment.SetValue("")
  1740         else:
  1865         else:
  1754 #-------------------------------------------------------------------------------
  1879 #-------------------------------------------------------------------------------
  1755 #                          ToolBar Management Functions
  1880 #                          ToolBar Management Functions
  1756 #-------------------------------------------------------------------------------
  1881 #-------------------------------------------------------------------------------
  1757 
  1882 
  1758     def ResetToolBar(self):
  1883     def ResetToolBar(self):
  1759         for item in self.CurrentToolBar:
  1884         if not self.Debug:
  1760             if wx.VERSION >= (2, 6, 0):
  1885             for item in self.CurrentToolBar:
  1761                 self.Unbind(wx.EVT_MENU, id=item)
  1886                 if wx.VERSION >= (2, 6, 0):
       
  1887                     self.Unbind(wx.EVT_MENU, id=item)
       
  1888                 else:
       
  1889                     self.Disconnect(id=item, eventType=wx.wxEVT_COMMAND_MENU_SELECTED) 
       
  1890                 
       
  1891                 if wx.VERSION < (2, 8, 0):
       
  1892                     ToolBar = self.ToolBar
       
  1893                 else:
       
  1894                     ToolBar = self.Panes["ToolBar"]
       
  1895                 if ToolBar:
       
  1896                     ToolBar.DeleteTool(item)
       
  1897                     ToolBar.Realize()
       
  1898                     if wx.VERSION >= (2, 8, 0):
       
  1899                         self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
       
  1900                         self.AUIManager.Update()
       
  1901 
       
  1902     def RefreshToolBar(self):
       
  1903         if not self.Debug:
       
  1904             selected = self.TabsOpened.GetSelection()
       
  1905             if selected != -1:
       
  1906                 language = self.Controler.GetEditedElementBodyType(self.TabsOpened.GetPage(selected).GetTagName(), self.Debug)
  1762             else:
  1907             else:
  1763                 self.Disconnect(id=item, eventType=wx.wxEVT_COMMAND_MENU_SELECTED) 
  1908                 language = None
  1764             
  1909             if language is not None and language != self.CurrentLanguage:
  1765             if wx.VERSION < (2, 8, 0):
  1910                 self.ResetToolBar()
  1766                 ToolBar = self.ToolBar
  1911                 self.CurrentLanguage = language
  1767             else:
  1912                 self.CurrentToolBar = []
  1768                 ToolBar = self.Panes["ToolBar"]
  1913                 if wx.VERSION < (2, 8, 0):
  1769             if ToolBar:
  1914                     ToolBar = self.ToolBar
  1770                 ToolBar.DeleteTool(item)
  1915                 else:
  1771                 ToolBar.Realize()
  1916                     ToolBar = self.Panes["ToolBar"]
  1772                 if wx.VERSION >= (2, 8, 0):
  1917                 if ToolBar:
  1773                     self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
  1918                     for radio, modes, id, method, picture, help in ToolBarItems[language]:
  1774                     self.AUIManager.Update()
  1919                         if modes & self.DrawingMode:
  1775 
  1920                             if radio or self.DrawingMode == FREEDRAWING_MODE:
  1776     def RefreshToolBar(self):
  1921                                 ToolBar.AddRadioTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), wx.NullBitmap, help)
  1777         selected = self.TabsOpened.GetSelection()
  1922                             else:
  1778         if selected != -1:
  1923                                 ToolBar.AddSimpleTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), help)
  1779             language = self.Controler.GetEditedElementBodyType(self.TabsOpened.GetPage(selected).GetTagName())
  1924                             self.Bind(wx.EVT_TOOL, getattr(self, method), id=id)
  1780         else:
  1925                             self.CurrentToolBar.append(id)
  1781             language = None
  1926                     ToolBar.Realize()
  1782         if language is not None and language != self.CurrentLanguage:
  1927                     if wx.VERSION >= (2, 8, 0):
  1783             self.ResetToolBar()
  1928                         self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
  1784             self.CurrentLanguage = language
  1929                         self.AUIManager.Update()
  1785             self.CurrentToolBar = []
  1930             elif not language:
  1786             if wx.VERSION < (2, 8, 0):
  1931                 self.ResetToolBar()
  1787                 ToolBar = self.ToolBar
  1932                 self.CurrentLanguage = language
  1788             else:
  1933             self.ResetCurrentMode()
  1789                 ToolBar = self.Panes["ToolBar"]
       
  1790             if ToolBar:
       
  1791                 for radio, modes, id, method, picture, help in ToolBarItems[language]:
       
  1792                     if modes & self.DrawingMode:
       
  1793                         if radio or self.DrawingMode == FREEDRAWING_MODE:
       
  1794                             ToolBar.AddRadioTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), wx.NullBitmap, help)
       
  1795                         else:
       
  1796                             ToolBar.AddSimpleTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), help)
       
  1797                         self.Bind(wx.EVT_TOOL, getattr(self, method), id=id)
       
  1798                         self.CurrentToolBar.append(id)
       
  1799                 ToolBar.Realize()
       
  1800                 if wx.VERSION >= (2, 8, 0):
       
  1801                     self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
       
  1802                     self.AUIManager.Update()
       
  1803         elif not language:
       
  1804             self.ResetToolBar()
       
  1805             self.CurrentLanguage = language
       
  1806         self.ResetCurrentMode()
       
  1807 
  1934 
  1808 
  1935 
  1809 #-------------------------------------------------------------------------------
  1936 #-------------------------------------------------------------------------------
  1810 #                           ToolBar Items Functions
  1937 #                           ToolBar Items Functions
  1811 #-------------------------------------------------------------------------------
  1938 #-------------------------------------------------------------------------------
  1963 #                         Add Project Elements Functions
  2090 #                         Add Project Elements Functions
  1964 #-------------------------------------------------------------------------------
  2091 #-------------------------------------------------------------------------------
  1965 
  2092 
  1966     def OnAddDataTypeMenu(self, event):
  2093     def OnAddDataTypeMenu(self, event):
  1967         dialog = DataTypeDialog(self, "Add a new data type", "Please enter data type name", "", wx.OK|wx.CANCEL)
  2094         dialog = DataTypeDialog(self, "Add a new data type", "Please enter data type name", "", wx.OK|wx.CANCEL)
  1968         dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames())
  2095         dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames(self.Debug))
  1969         if dialog.ShowModal() == wx.ID_OK:
  2096         if dialog.ShowModal() == wx.ID_OK:
  1970             self.Controler.ProjectAddDataType(dialog.GetValue())
  2097             self.Controler.ProjectAddDataType(dialog.GetValue())
  1971             self.RefreshTitle()
  2098             self.RefreshTitle()
  1972             self.RefreshEditMenu()
  2099             self.RefreshEditMenu()
  1973             self.RefreshTypesTree()
  2100             self.RefreshTypesTree()
  1975         event.Skip()
  2102         event.Skip()
  1976 
  2103 
  1977     def GenerateAddPouFunction(self, pou_type):
  2104     def GenerateAddPouFunction(self, pou_type):
  1978         def OnAddPouMenu(event):
  2105         def OnAddPouMenu(event):
  1979             dialog = PouDialog(self, pou_type)
  2106             dialog = PouDialog(self, pou_type)
  1980             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2107             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  1981             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2108             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug))
  1982             if dialog.ShowModal() == wx.ID_OK:
  2109             if dialog.ShowModal() == wx.ID_OK:
  1983                 values = dialog.GetValues()
  2110                 values = dialog.GetValues()
  1984                 self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  2111                 self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  1985                 self.RefreshTitle()
  2112                 self.RefreshTitle()
  1986                 self.RefreshEditMenu()
  2113                 self.RefreshEditMenu()
  1991         return OnAddPouMenu
  2118         return OnAddPouMenu
  1992 
  2119 
  1993     def GenerateAddTransitionFunction(self, pou_name):
  2120     def GenerateAddTransitionFunction(self, pou_name):
  1994         def OnAddTransitionMenu(event):
  2121         def OnAddTransitionMenu(event):
  1995             dialog = PouTransitionDialog(self)
  2122             dialog = PouTransitionDialog(self)
  1996             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2123             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  1997             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name))
  2124             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name, self.Debug))
  1998             if dialog.ShowModal() == wx.ID_OK: 
  2125             if dialog.ShowModal() == wx.ID_OK: 
  1999                 values = dialog.GetValues()
  2126                 values = dialog.GetValues()
  2000                 self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  2127                 self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  2001                 self.RefreshTitle()
  2128                 self.RefreshTitle()
  2002                 self.RefreshEditMenu()
  2129                 self.RefreshEditMenu()
  2006         return OnAddTransitionMenu
  2133         return OnAddTransitionMenu
  2007 
  2134 
  2008     def GenerateAddActionFunction(self, pou_name):
  2135     def GenerateAddActionFunction(self, pou_name):
  2009         def OnAddActionMenu(event):
  2136         def OnAddActionMenu(event):
  2010             dialog = PouActionDialog(self)
  2137             dialog = PouActionDialog(self)
  2011             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2138             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2012             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name))
  2139             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name, self.Debug))
  2013             if dialog.ShowModal() == wx.ID_OK:
  2140             if dialog.ShowModal() == wx.ID_OK:
  2014                 values = dialog.GetValues()
  2141                 values = dialog.GetValues()
  2015                 self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"])
  2142                 self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"])
  2016                 self.RefreshTitle()
  2143                 self.RefreshTitle()
  2017                 self.RefreshEditMenu()
  2144                 self.RefreshEditMenu()
  2020             event.Skip()
  2147             event.Skip()
  2021         return OnAddActionMenu
  2148         return OnAddActionMenu
  2022 
  2149 
  2023     def OnAddConfigurationMenu(self, event):
  2150     def OnAddConfigurationMenu(self, event):
  2024         dialog = ConfigurationNameDialog(self, "Please enter configuration name", "Add new configuration")
  2151         dialog = ConfigurationNameDialog(self, "Please enter configuration name", "Add new configuration")
  2025         dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2152         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2026         dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2153         dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug))
  2027         if dialog.ShowModal() == wx.ID_OK:
  2154         if dialog.ShowModal() == wx.ID_OK:
  2028             value = dialog.GetValue()
  2155             value = dialog.GetValue()
  2029             self.Controler.ProjectAddConfiguration(value)
  2156             self.Controler.ProjectAddConfiguration(value)
  2030             self.RefreshTitle()
  2157             self.RefreshTitle()
  2031             self.RefreshEditMenu()
  2158             self.RefreshEditMenu()
  2035         event.Skip()
  2162         event.Skip()
  2036 
  2163 
  2037     def GenerateAddResourceFunction(self, config_name):
  2164     def GenerateAddResourceFunction(self, config_name):
  2038         def OnAddResourceMenu(event):
  2165         def OnAddResourceMenu(event):
  2039             dialog = ResourceNameDialog(self, "Please enter resource name", "Add new resource")
  2166             dialog = ResourceNameDialog(self, "Please enter resource name", "Add new resource")
  2040             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2167             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2041             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2168             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug))
  2042             if dialog.ShowModal() == wx.ID_OK:
  2169             if dialog.ShowModal() == wx.ID_OK:
  2043                 value = dialog.GetValue()
  2170                 value = dialog.GetValue()
  2044                 self.Controler.ProjectAddConfigurationResource(config_name, value)
  2171                 self.Controler.ProjectAddConfigurationResource(config_name, value)
  2045                 self.RefreshTitle()
  2172                 self.RefreshTitle()
  2046                 self.RefreshEditMenu()
  2173                 self.RefreshEditMenu()
  2057 
  2184 
  2058     def OnRemoveDataTypeMenu(self, event):
  2185     def OnRemoveDataTypeMenu(self, event):
  2059         selected = self.TypesTree.GetSelection()
  2186         selected = self.TypesTree.GetSelection()
  2060         if self.TypesTree.GetPyData(selected) == ITEM_DATATYPE:
  2187         if self.TypesTree.GetPyData(selected) == ITEM_DATATYPE:
  2061             name = self.TypesTree.GetItemText(selected)
  2188             name = self.TypesTree.GetItemText(selected)
  2062             if not self.Controler.DataTypeIsUsed(name):
  2189             if not self.Controler.DataTypeIsUsed(name, self.Debug):
  2063                 self.Controler.ProjectRemoveDataType(name)
  2190                 self.Controler.ProjectRemoveDataType(name)
  2064                 tagname = self.Controler.ComputeDataTypeName(name)
  2191                 tagname = self.Controler.ComputeDataTypeName(name)
  2065                 idx = self.IsOpened(tagname)
  2192                 idx = self.IsOpened(tagname)
  2066                 if idx is not None:
  2193                 if idx is not None:
  2067                     self.TabsOpened.DeletePage(idx)
  2194                     self.TabsOpened.DeletePage(idx)
  2077 
  2204 
  2078     def OnRemovePouMenu(self, event):
  2205     def OnRemovePouMenu(self, event):
  2079         selected = self.TypesTree.GetSelection()
  2206         selected = self.TypesTree.GetSelection()
  2080         if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  2207         if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  2081             name = self.TypesTree.GetItemText(selected)
  2208             name = self.TypesTree.GetItemText(selected)
  2082             if not self.Controler.PouIsUsed(name):
  2209             if not self.Controler.PouIsUsed(name, self.Debug):
  2083                 self.Controler.ProjectRemovePou(name)
  2210                 self.Controler.ProjectRemovePou(name)
  2084                 tagname = self.Controler.ComputePouName(name)
  2211                 tagname = self.Controler.ComputePouName(name)
  2085                 idx = self.IsOpened(tagname)
  2212                 idx = self.IsOpened(tagname)
  2086                 if idx is not None:
  2213                 if idx is not None:
  2087                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2214                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  3596                     message = "Invalid value \"%s\" for location"%data
  3723                     message = "Invalid value \"%s\" for location"%data
  3597                     values = None
  3724                     values = None
  3598                 if values is not None and values[1] == "location":
  3725                 if values is not None and values[1] == "location":
  3599                     location = values[0]
  3726                     location = values[0]
  3600                     variable_type = self.ParentWindow.Table.GetValueByName(row, "Type")
  3727                     variable_type = self.ParentWindow.Table.GetValueByName(row, "Type")
  3601                     base_type = self.ParentWindow.Controler.GetBaseType(variable_type)
  3728                     base_type = self.ParentWindow.Controler.GetBaseType(variable_type, self.Debug)
  3602                     message = None
  3729                     message = None
  3603                     if location.startswith("%"):
  3730                     if location.startswith("%"):
  3604                         if base_type != values[2]:
  3731                         if base_type != values[2]:
  3605                             message = "Incompatible data types between \"%s\" and \"%s\""%(values[2], variable_type)
  3732                             message = "Incompatible data types between \"%s\" and \"%s\""%(values[2], variable_type)
  3606                         else:
  3733                         else:
  3626                                     location = "%M" + location
  3753                                     location = "%M" + location
  3627                                 self.ParentWindow.Table.SetValue(row, col, location)
  3754                                 self.ParentWindow.Table.SetValue(row, col, location)
  3628                                 self.ParentWindow.Table.ResetView(self.ParentWindow.VariablesGrid)
  3755                                 self.ParentWindow.Table.ResetView(self.ParentWindow.VariablesGrid)
  3629                                 self.ParentWindow.SaveValues()
  3756                                 self.ParentWindow.SaveValues()
  3630                             dialog.Destroy()
  3757                             dialog.Destroy()
       
  3758         if message is not None:
  3631             wx.CallAfter(self.ShowMessage, message)
  3759             wx.CallAfter(self.ShowMessage, message)
  3632             
  3760             
  3633     def ShowMessage(self, message):
  3761     def ShowMessage(self, message):
  3634         if message is not None:
  3762         message = wx.MessageDialog(self.ParentWindow, message, "Error", wx.OK|wx.ICON_ERROR)
  3635             message = wx.MessageDialog(self.ParentWindow, message, "Error", wx.OK|wx.ICON_ERROR)
  3763         message.ShowModal()
  3636             message.ShowModal()
  3764         message.Destroy()
  3637             message.Destroy()
       
  3638 
  3765 
  3639 [ID_VARIABLEEDITORPANEL, ID_VARIABLEEDITORPANELVARIABLESGRID, 
  3766 [ID_VARIABLEEDITORPANEL, ID_VARIABLEEDITORPANELVARIABLESGRID, 
  3640  ID_VARIABLEEDITORPANELRETURNTYPE, ID_VARIABLEEDITORPANELCLASSFILTER, 
  3767  ID_VARIABLEEDITORPANELRETURNTYPE, ID_VARIABLEEDITORPANELCLASSFILTER, 
  3641  ID_VARIABLEEDITORPANELADDBUTTON, ID_VARIABLEEDITORPANELDELETEBUTTON, 
  3768  ID_VARIABLEEDITORPANELADDBUTTON, ID_VARIABLEEDITORPANELDELETEBUTTON, 
  3642  ID_VARIABLEEDITORPANELUPBUTTON, ID_VARIABLEEDITORPANELDOWNBUTTON, 
  3769  ID_VARIABLEEDITORPANELUPBUTTON, ID_VARIABLEEDITORPANELDOWNBUTTON, 
  3832     
  3959     
  3833     def SetTagName(self, tagname):
  3960     def SetTagName(self, tagname):
  3834         self.TagName = tagname
  3961         self.TagName = tagname
  3835     
  3962     
  3836     def RefreshView(self):
  3963     def RefreshView(self):
  3837         self.PouNames = self.Controler.GetProjectPouNames()
  3964         self.PouNames = self.Controler.GetProjectPouNames(self.ParentWindow.Debug)
  3838         
  3965         
  3839         words = self.TagName.split("::")
  3966         words = self.TagName.split("::")
  3840         if self.ElementType == "config":
  3967         if self.ElementType == "config":
  3841             self.PouIsUsed = False
  3968             self.PouIsUsed = False
  3842             returnType = None
  3969             returnType = None
  3843             self.Values = self.Controler.GetConfigurationGlobalVars(words[1])
  3970             self.Values = self.Controler.GetConfigurationGlobalVars(words[1], self.ParentWindow.Debug)
  3844         elif self.ElementType == "resource":
  3971         elif self.ElementType == "resource":
  3845             self.PouIsUsed = False
  3972             self.PouIsUsed = False
  3846             returnType = None
  3973             returnType = None
  3847             self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2])
  3974             self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2], self.ParentWindow.Debug)
  3848         else:
  3975         else:
  3849             self.PouIsUsed = self.Controler.PouIsUsed(words[1])
  3976             self.PouIsUsed = self.Controler.PouIsUsed(words[1], self.ParentWindow.Debug)
  3850             returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
  3977             returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, self.ParentWindow.Debug)
  3851             self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName)
  3978             self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.ParentWindow.Debug)
  3852         
  3979         
  3853         if returnType and self.ReturnType.IsEnabled():
  3980         if returnType and self.ReturnType.IsEnabled():
  3854             self.ReturnType.SetStringSelection(returnType)
  3981             self.ReturnType.SetStringSelection(returnType)
  3855         
  3982         
  3856         self.RefreshValues()
  3983         self.RefreshValues()
  3979                 new_id = wx.NewId()
  4106                 new_id = wx.NewId()
  3980                 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
  4107                 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
  3981                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id)
  4108                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id)
  3982             type_menu.AppendMenu(wx.NewId(), "Base Types", base_menu)
  4109             type_menu.AppendMenu(wx.NewId(), "Base Types", base_menu)
  3983             datatype_menu = wx.Menu(title='')
  4110             datatype_menu = wx.Menu(title='')
  3984             for datatype in self.Controler.GetDataTypes(basetypes = False):
  4111             for datatype in self.Controler.GetDataTypes(basetypes = False, debug = self.Debug):
  3985                 new_id = wx.NewId()
  4112                 new_id = wx.NewId()
  3986                 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
  4113                 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
  3987                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id)
  4114                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id)
  3988             type_menu.AppendMenu(wx.NewId(), "User Data Types", datatype_menu)
  4115             type_menu.AppendMenu(wx.NewId(), "User Data Types", datatype_menu)
  3989             functionblock_menu = wx.Menu(title='')
  4116             functionblock_menu = wx.Menu(title='')
  3990             for functionblock_type in self.Controler.GetFunctionBlockTypes():
  4117             for functionblock_type in self.Controler.GetFunctionBlockTypes(debug = self.Debug):
  3991                 new_id = wx.NewId()
  4118                 new_id = wx.NewId()
  3992                 AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
  4119                 AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
  3993                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
  4120                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
  3994             type_menu.AppendMenu(wx.NewId(), "Function Block Types", functionblock_menu)
  4121             type_menu.AppendMenu(wx.NewId(), "Function Block Types", functionblock_menu)
  3995             rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col))
  4122             rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col))