PLCOpenEditor.py
changeset 676 0f10f5091245
parent 675 0ea836add01f
child 677 8f1f6022b3d3
equal deleted inserted replaced
675:0ea836add01f 676:0f10f5091245
   112 from GraphicViewer import *
   112 from GraphicViewer import *
   113 from RessourceEditor import *
   113 from RessourceEditor import *
   114 from DataTypeEditor import *
   114 from DataTypeEditor import *
   115 from PLCControler import *
   115 from PLCControler import *
   116 from SearchResultPanel import SearchResultPanel
   116 from SearchResultPanel import SearchResultPanel
   117 from controls import CustomGrid, CustomTable
   117 from controls import CustomGrid, CustomTable, LibraryPanel
   118 
   118 
   119 # Define PLCOpenEditor controls id
   119 # Define PLCOpenEditor controls id
   120 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
   120 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
   121  ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK, 
   121  ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK, 
   122  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
   122  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
   123  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
   123  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
   124  ID_PLCOPENEDITORTHIRDSPLITTER, ID_PLCOPENEDITORLIBRARYPANEL, 
   124  ID_PLCOPENEDITORTHIRDSPLITTER, ID_PLCOPENEDITORLIBRARYPANEL, 
   125  ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT, 
   125  ID_PLCOPENEDITORLIBRARYSEARCHCTRL, ID_PLCOPENEDITORLIBRARYTREE, 
   126  ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTABSOPENED,
   126  ID_PLCOPENEDITORLIBRARYCOMMENT, ID_PLCOPENEDITORTABSOPENED, 
   127  ID_PLCOPENEDITOREDITORMENUTOOLBAR, ID_PLCOPENEDITOREDITORTOOLBAR, 
   127  ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITOREDITORMENUTOOLBAR, 
   128 ] = [wx.NewId() for _init_ctrls in range(16)]
   128  ID_PLCOPENEDITOREDITORTOOLBAR, 
       
   129 ] = [wx.NewId() for _init_ctrls in range(17)]
   129 
   130 
   130 # Define PLCOpenEditor FileMenu extra items id
   131 # Define PLCOpenEditor FileMenu extra items id
   131 [ID_PLCOPENEDITORFILEMENUGENERATE, 
   132 [ID_PLCOPENEDITORFILEMENUGENERATE, 
   132 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
   133 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
   133 
   134 
   303                 remove_function(self.Controler, name)
   304                 remove_function(self.Controler, name)
   304         else:
   305         else:
   305             self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name)
   306             self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name)
   306     return DeleteElementFunction
   307     return DeleteElementFunction
   307 
   308 
       
   309 def SimplifyTabOrganization(tabs, rect):
       
   310     for tab in tabs:
       
   311         if tab["pos"][0] == rect.x:
       
   312             others = [t for t in tabs if t != tab]
       
   313             others.sort(lambda x,y: cmp(x["pos"][0], y["pos"][0]))
       
   314             for other in others:
       
   315                 if (other["pos"][1] == tab["pos"][1] and 
       
   316                     other["size"][1] == tab["size"][1] and
       
   317                     other["pos"][0] == tab["pos"][0] + tab["size"][0] + 7):
       
   318                     
       
   319                     tab["size"] = (tab["size"][0] + other["size"][0] + 7, tab["size"][1])
       
   320                     tab["pages"].extend(other["pages"])
       
   321                     tabs.remove(other)
       
   322                     
       
   323                     if tab["size"][0] == rect.width:
       
   324                         return True
       
   325                     
       
   326         elif tab["pos"][1] == rect.y:
       
   327             others = [t for t in tabs if t != tab]
       
   328             others.sort(lambda x,y: cmp(x["pos"][1], y["pos"][1]))
       
   329             for other in others:
       
   330                 if (other["pos"][0] == tab["pos"][0] and 
       
   331                     other["size"][0] == tab["size"][0] and
       
   332                     other["pos"][1] == tab["pos"][1] + tab["size"][1] + 7):
       
   333                     
       
   334                     tab["size"] = (tab["size"][0], tab["size"][1] + other["size"][1] + 7)
       
   335                     tab["pages"].extend(other["pages"])
       
   336                     tabs.remove(other)
       
   337                     
       
   338                     if tab["size"][1] == rect.height:
       
   339                         return True
       
   340     return False
       
   341     
   308 def ComputeTabsOrganization(tabs, rect):
   342 def ComputeTabsOrganization(tabs, rect):
       
   343     if len(tabs) == 0:
       
   344         return tabs
   309     if len(tabs) == 1:
   345     if len(tabs) == 1:
   310         return tabs[0]
   346         return tabs[0]
   311     split = None
   347     split = None
   312     for idx, tab in enumerate(tabs):
   348     for idx, tab in enumerate(tabs):
   313         if tab["size"][0] == rect.width:
   349         if tab["size"][0] == rect.width:
   333     if split != None:
   369     if split != None:
   334         split_tab = tabs.pop(idx)
   370         split_tab = tabs.pop(idx)
   335         return {"split": split,
   371         return {"split": split,
   336                 "tab": split_tab, 
   372                 "tab": split_tab, 
   337                 "others": ComputeTabsOrganization(tabs, split_rect)}
   373                 "others": ComputeTabsOrganization(tabs, split_rect)}
       
   374     else:
       
   375         if SimplifyTabOrganization(tabs, rect):
       
   376             return ComputeTabsOrganization(tabs, rect)
   338     return tabs
   377     return tabs
   339 
   378 
   340 #-------------------------------------------------------------------------------
   379 #-------------------------------------------------------------------------------
   341 #                              IDEFrame Base Class
   380 #                              IDEFrame Base Class
   342 #-------------------------------------------------------------------------------
   381 #-------------------------------------------------------------------------------
   467         self._init_coll_FileMenu_Items(self.FileMenu)
   506         self._init_coll_FileMenu_Items(self.FileMenu)
   468         self._init_coll_EditMenu_Items(self.EditMenu)
   507         self._init_coll_EditMenu_Items(self.EditMenu)
   469         self._init_coll_DisplayMenu_Items(self.DisplayMenu)
   508         self._init_coll_DisplayMenu_Items(self.DisplayMenu)
   470         self._init_coll_HelpMenu_Items(self.HelpMenu)
   509         self._init_coll_HelpMenu_Items(self.HelpMenu)
   471 
   510 
   472     def _init_coll_MainLibrarySizer_Items(self, parent):
       
   473         parent.AddWindow(self.LibraryTree, 0, border=0, flag=wx.GROW)
       
   474         parent.AddSizer(self.LibraryComment, 0, border=0, flag=wx.GROW)
       
   475 
       
   476     def _init_coll_MainLibrarySizer_Growables(self, parent):
       
   477         parent.AddGrowableCol(0)
       
   478         parent.AddGrowableRow(0)
       
   479 
       
   480     def _init_sizers(self):
       
   481         self.MainLibrarySizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
       
   482         
       
   483         self._init_coll_MainLibrarySizer_Growables(self.MainLibrarySizer)
       
   484         self._init_coll_MainLibrarySizer_Items(self.MainLibrarySizer)
       
   485         
       
   486         self.LibraryPanel.SetSizer(self.MainLibrarySizer)
       
   487     
       
   488     def _init_ctrls(self, prnt):
   511     def _init_ctrls(self, prnt):
   489         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame',
   512         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame',
   490               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   513               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   491               style=wx.DEFAULT_FRAME_STYLE)
   514               style=wx.DEFAULT_FRAME_STYLE)
   492         self.SetClientSize(wx.Size(1000, 600))
   515         self.SetClientSize(wx.Size(1000, 600))
   535                   Right().Layer(0).
   558                   Right().Layer(0).
   536                   BestSize(wx.Size(250, 400)).CloseButton(False))
   559                   BestSize(wx.Size(250, 400)).CloseButton(False))
   537             
   560             
   538             self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED, 
   561             self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED, 
   539                   style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON)
   562                   style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON)
   540             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING,
   563             #self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING,
   541                     self.OnPouSelectedChanging)
   564             #        self.OnPouSelectedChanging)
   542             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   565             #self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   543                     self.OnPouSelectedChanged)
   566             #        self.OnPouSelectedChanged)
   544             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
   567             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
   545                     self.OnPageClose)
   568                     self.OnPageClose)
   546             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
   569             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
   547                     self.OnPageDragged)
   570                     self.OnPageDragged)
   548             self.AUIManager.AddPane(self.TabsOpened, 
   571             self.AUIManager.AddPane(self.TabsOpened, 
   703         
   726         
   704         #-----------------------------------------------------------------------
   727         #-----------------------------------------------------------------------
   705         #                            Creating Library Panel
   728         #                            Creating Library Panel
   706         #-----------------------------------------------------------------------
   729         #-----------------------------------------------------------------------
   707         
   730         
   708         self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   731         self.LibraryPanel = LibraryPanel(self, True)
   709               name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0,
       
   710               0), size=wx.Size(0, 0), style=0)
       
   711         self.MainTabs["LibraryPanel"] = (self.LibraryPanel, _("Library"))
   732         self.MainTabs["LibraryPanel"] = (self.LibraryPanel, _("Library"))
   712         self.RightNoteBook.AddPage(*self.MainTabs["LibraryPanel"])
   733         self.RightNoteBook.AddPage(*self.MainTabs["LibraryPanel"])
   713         
   734                 
   714         self.LibraryTree = wx.TreeCtrl(id=ID_PLCOPENEDITORLIBRARYTREE,
       
   715                   name='LibraryTree', parent=self.LibraryPanel, 
       
   716                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
       
   717                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_HIDE_ROOT|wx.TR_LINES_AT_ROOT)
       
   718         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnLibraryTreeItemSelected,
       
   719               id=ID_PLCOPENEDITORLIBRARYTREE)
       
   720         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnLibraryTreeBeginDrag,
       
   721               id=ID_PLCOPENEDITORLIBRARYTREE)
       
   722         
       
   723         self.LibraryComment = wx.TextCtrl(id=ID_PLCOPENEDITORLIBRARYCOMMENT,
       
   724               name='LibraryComment', parent=self.LibraryPanel, 
       
   725               pos=wx.Point(0, 0), size=wx.Size(0, 160), 
       
   726               style=wx.TE_READONLY|wx.TE_MULTILINE)
       
   727         
       
   728         self._init_utils()
   735         self._init_utils()
   729         self.SetMenuBar(self.MenuBar)
   736         self.SetMenuBar(self.MenuBar)
   730         
   737                 
   731         self._init_sizers()
       
   732         
       
   733         if self.EnableDebug:
   738         if self.EnableDebug:
   734             self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler)
   739             self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler)
   735             self.MainTabs["DebugVariablePanel"] = (self.DebugVariablePanel, _("Debugger"))
   740             self.MainTabs["DebugVariablePanel"] = (self.DebugVariablePanel, _("Debugger"))
   736             self.RightNoteBook.AddPage(*self.MainTabs["DebugVariablePanel"])
   741             self.RightNoteBook.AddPage(*self.MainTabs["DebugVariablePanel"])
   737         
   742         
   832             self.Starting = False
   837             self.Starting = False
   833             self.RefreshEditor()
   838             self.RefreshEditor()
   834         event.Skip()
   839         event.Skip()
   835     
   840     
   836     def GetProjectConfiguration(self):
   841     def GetProjectConfiguration(self):
   837         if self.Config.HasEntry("projects"):
   842         projects = {}
   838             projects = cPickle.loads(str(self.Config.Read("projects")))
   843         try:
   839         else:
   844             if self.Config.HasEntry("projects"):
   840             projects = {}
   845                 projects = cPickle.loads(str(self.Config.Read("projects")))
   841         
   846         except:
   842         return projects.setdefault(os.path.realpath(self.Controler.GetFilePath()), {})
   847             pass
       
   848         
       
   849         return projects.get(os.path.realpath(self.Controler.GetFilePath()), {})
   843     
   850     
   844     def SavePageState(self, page):
   851     def SavePageState(self, page):
   845         state = page.GetState()
   852         state = page.GetState()
   846         if state is not None:
   853         if state is not None:
   847             if self.Config.HasEntry("projects"):
   854             if self.Config.HasEntry("projects"):
   940                 page_idx = self.LoadTab(notebook, page_infos)
   947                 page_idx = self.LoadTab(notebook, page_infos)
   941                 if page_selected:
   948                 if page_selected:
   942                     selected = page_idx
   949                     selected = page_idx
   943             if selected is not None:
   950             if selected is not None:
   944                 wx.CallAfter(notebook.SetSelection, selected)
   951                 wx.CallAfter(notebook.SetSelection, selected)
   945         
   952     
       
   953     def ResetPerspective(self):
       
   954     	if USE_AUI and self.DefaultPerspective is not None:
       
   955             self.AUIManager.LoadPerspective(self.DefaultPerspective["perspective"])
       
   956         
       
   957             for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
       
   958                 for idx in xrange(notebook.GetPageCount()):
       
   959                     notebook.RemovePage(0)
       
   960                         
       
   961             notebooks = self.DefaultPerspective["notebooks"]
       
   962             for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
       
   963                                          (self.BottomNoteBook, "bottomnotebook"),
       
   964                                          (self.RightNoteBook, "rightnotebook")]:
       
   965                 self.LoadTabOrganization(notebook, notebooks.get(entry_name))
       
   966     
   946     def RestoreLastState(self):
   967     def RestoreLastState(self):
   947         frame_size = None
   968         frame_size = None
   948         if self.Config.HasEntry("framesize"):
   969         if self.Config.HasEntry("framesize"):
   949             frame_size = cPickle.loads(str(self.Config.Read("framesize")))
   970             frame_size = cPickle.loads(str(self.Config.Read("framesize")))
   950         
   971         
   964             self.DefaultPerspective = {
   985             self.DefaultPerspective = {
   965                 "perspective": self.AUIManager.SavePerspective(),
   986                 "perspective": self.AUIManager.SavePerspective(),
   966                 "notebooks": notebooks,
   987                 "notebooks": notebooks,
   967             }
   988             }
   968             
   989             
   969             if self.Config.HasEntry("perspective"):
   990             try:
   970                 self.AUIManager.LoadPerspective(str(self.Config.Read("perspective")))
   991                 if self.Config.HasEntry("perspective"):
   971         
   992                     self.AUIManager.LoadPerspective(str(self.Config.Read("perspective")))
   972             if self.Config.HasEntry("notebooks"):
   993             
   973                 notebooks = cPickle.loads(str(self.Config.Read("notebooks")))
   994                 if self.Config.HasEntry("notebooks"):
   974                 
   995                     notebooks = cPickle.loads(str(self.Config.Read("notebooks")))
   975                 for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
   996                     
   976                     for idx in xrange(notebook.GetPageCount()):
   997                     for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
   977                         notebook.RemovePage(0)
   998                         for idx in xrange(notebook.GetPageCount()):
   978                         
   999                             notebook.RemovePage(0)
   979                 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
  1000                             
   980                                              (self.BottomNoteBook, "bottomnotebook"),
  1001                     for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
   981                                              (self.RightNoteBook, "rightnotebook")]:
  1002                                                  (self.BottomNoteBook, "bottomnotebook"),
   982                     self.LoadTabOrganization(notebook, notebooks.get(entry_name))
  1003                                                  (self.RightNoteBook, "rightnotebook")]:
   983     
  1004                         self.LoadTabOrganization(notebook, notebooks.get(entry_name))
       
  1005             except:
       
  1006         		self.ResetPerspective()
       
  1007         	
   984             self.LoadProjectOrganization()
  1008             self.LoadProjectOrganization()
   985     
  1009     
   986     def SaveLastState(self):
  1010     def SaveLastState(self):
   987         if not self.IsMaximized():
  1011         if not self.IsMaximized():
   988             self.Config.Write("framesize", cPickle.dumps(self.GetClientSize()))
  1012             self.Config.Write("framesize", cPickle.dumps(self.GetClientSize()))
  1008 
  1032 
  1009     def SaveProjectOrganization(self):
  1033     def SaveProjectOrganization(self):
  1010         if USE_AUI and self.Controler is not None:
  1034         if USE_AUI and self.Controler is not None:
  1011             tabs = []
  1035             tabs = []
  1012             
  1036             
  1013             if self.Config.HasEntry("projects"):
  1037             projects = {}
  1014                 projects = cPickle.loads(str(self.Config.Read("projects")))
  1038             try:
  1015             else:
  1039              	if self.Config.HasEntry("projects"):
  1016                 projects = {}
  1040                 	projects = cPickle.loads(str(self.Config.Read("projects")))
       
  1041             except:
       
  1042             	pass
  1017             
  1043             
  1018             project_infos = projects.setdefault(os.path.realpath(self.Controler.GetFilePath()), {})
  1044             project_infos = projects.setdefault(os.path.realpath(self.Controler.GetFilePath()), {})
  1019             project_infos["tabs"] = self.SaveTabOrganization(self.TabsOpened)
  1045             project_infos["tabs"] = self.SaveTabOrganization(self.TabsOpened)
  1020             if self.EnableDebug:
  1046             if self.EnableDebug:
  1021                 project_infos["debug_vars"] = self.DebugVariablePanel.GetDebugVariables()
  1047                 project_infos["debug_vars"] = self.DebugVariablePanel.GetDebugVariables()
  1022                 
  1048             
  1023             self.Config.Write("projects", cPickle.dumps(projects))
  1049             self.Config.Write("projects", cPickle.dumps(projects))
  1024             self.Config.Flush()
  1050             self.Config.Flush()
  1025     
  1051     
  1026     def LoadProjectOrganization(self):
  1052     def LoadProjectOrganization(self):
  1027         if USE_AUI and self.Controler is not None and self.Config.HasEntry("projects"):
  1053         if USE_AUI and self.Controler is not None:
  1028             projects = cPickle.loads(str(self.Config.Read("projects")))
  1054             project = self.GetProjectConfiguration()
  1029             
  1055 		    
  1030             project = projects.get(os.path.realpath(self.Controler.GetFilePath()))
  1056             try:
  1031             if project is not None:
  1057                 if project.has_key("tabs"):
  1032                 self.LoadTabOrganization(self.TabsOpened, project["tabs"])
  1058                     self.LoadTabOrganization(self.TabsOpened, project["tabs"])
  1033             
  1059             except:
  1034                 if self.EnableDebug:
  1060             	self.DeleteAllPages()
  1035                     for variable in project["debug_vars"]:
  1061             	
       
  1062             if self.EnableDebug:
       
  1063             	try:
       
  1064                     for variable in project.get("debug_vars", []):
  1036                         self.DebugVariablePanel.InsertValue(variable, force=True)
  1065                         self.DebugVariablePanel.InsertValue(variable, force=True)
       
  1066             	except:
       
  1067             		self.DebugVariablePanel.ResetGrid()
  1037             
  1068             
  1038 #-------------------------------------------------------------------------------
  1069 #-------------------------------------------------------------------------------
  1039 #                               General Functions
  1070 #                               General Functions
  1040 #-------------------------------------------------------------------------------
  1071 #-------------------------------------------------------------------------------
  1041 
  1072 
  1046             FILEMENU : self.RefreshFileMenu,
  1077             FILEMENU : self.RefreshFileMenu,
  1047             EDITMENU : self.RefreshEditMenu,
  1078             EDITMENU : self.RefreshEditMenu,
  1048             DISPLAYMENU : self.RefreshDisplayMenu,
  1079             DISPLAYMENU : self.RefreshDisplayMenu,
  1049             TYPESTREE : self.RefreshTypesTree,
  1080             TYPESTREE : self.RefreshTypesTree,
  1050             INSTANCESTREE : self.RefreshInstancesTree, 
  1081             INSTANCESTREE : self.RefreshInstancesTree, 
  1051             LIBRARYTREE : self.RefreshLibraryTree,
  1082             LIBRARYTREE : self.RefreshLibraryPanel,
  1052             SCALING : self.RefreshScaling,
  1083             SCALING : self.RefreshScaling,
  1053             PAGETITLES: self.RefreshPageTitles}
  1084             PAGETITLES: self.RefreshPageTitles}
  1054 
  1085 
  1055     ## Call PLCOpenEditor refresh functions.
  1086     ## Call PLCOpenEditor refresh functions.
  1056     #  @param elements List of elements to refresh.
  1087     #  @param elements List of elements to refresh.
  1230 
  1261 
  1231     def ResetView(self):
  1262     def ResetView(self):
  1232         self.DeleteAllPages()
  1263         self.DeleteAllPages()
  1233         self.TypesTree.DeleteAllItems()
  1264         self.TypesTree.DeleteAllItems()
  1234         self.InstancesTree.DeleteAllItems()
  1265         self.InstancesTree.DeleteAllItems()
  1235         self.LibraryTree.DeleteAllItems()
  1266         self.LibraryPanel.ResetTree()
       
  1267         self.LibraryPanel.SetControler(None)
  1236         self.Controler = None
  1268         self.Controler = None
  1237 
  1269 
  1238     def OnCloseTabMenu(self, event):
  1270     def OnCloseTabMenu(self, event):
  1239         selected = self.TabsOpened.GetSelection()
  1271         selected = self.TabsOpened.GetSelection()
  1240         if selected >= 0:
  1272         if selected >= 0:
  1491                 window.RefreshScrollBars()
  1523                 window.RefreshScrollBars()
  1492             event.Skip()
  1524             event.Skip()
  1493         return ZoomFunction
  1525         return ZoomFunction
  1494 
  1526 
  1495     def OnResetPerspective(self, event):
  1527     def OnResetPerspective(self, event):
  1496         if USE_AUI and self.DefaultPerspective is not None:
  1528         self.ResetPerspective()
  1497             self.AUIManager.LoadPerspective(self.DefaultPerspective["perspective"])
       
  1498         
       
  1499             for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
       
  1500                 for idx in xrange(notebook.GetPageCount()):
       
  1501                     notebook.RemovePage(0)
       
  1502                         
       
  1503             notebooks = self.DefaultPerspective["notebooks"]
       
  1504             for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
       
  1505                                          (self.BottomNoteBook, "bottomnotebook"),
       
  1506                                          (self.RightNoteBook, "rightnotebook")]:
       
  1507                 self.LoadTabOrganization(notebook, notebooks.get(entry_name))
       
  1508 
  1529 
  1509 #-------------------------------------------------------------------------------
  1530 #-------------------------------------------------------------------------------
  1510 #                      Project Editor Panels Management Functions
  1531 #                      Project Editor Panels Management Functions
  1511 #-------------------------------------------------------------------------------
  1532 #-------------------------------------------------------------------------------
  1512     
  1533     
  1747                         messageDialog.Destroy()
  1768                         messageDialog.Destroy()
  1748                     if not abort:
  1769                     if not abort:
  1749                         self.Controler.ChangePouName(old_name, new_name)
  1770                         self.Controler.ChangePouName(old_name, new_name)
  1750                         self.RefreshEditorNames(self.Controler.ComputePouName(old_name), 
  1771                         self.RefreshEditorNames(self.Controler.ComputePouName(old_name), 
  1751                                                 self.Controler.ComputePouName(new_name))
  1772                                                 self.Controler.ComputePouName(new_name))
  1752                         self.RefreshLibraryTree()
  1773                         self.RefreshLibraryPanel()
  1753                         self.RefreshPageTitles()
  1774                         self.RefreshPageTitles()
  1754                 elif itemtype == ITEM_TRANSITION:
  1775                 elif itemtype == ITEM_TRANSITION:
  1755                     pou_name = GetParentName(self.TypesTree, item, ITEM_POU)
  1776                     pou_name = GetParentName(self.TypesTree, item, ITEM_POU)
  1756                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1777                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1757                         message = _("A POU named \"%s\" already exists!")%new_name
  1778                         message = _("A POU named \"%s\" already exists!")%new_name
  2322     def AddDebugVariable(self, iec_path):
  2343     def AddDebugVariable(self, iec_path):
  2323         if self.EnableDebug:
  2344         if self.EnableDebug:
  2324             self.DebugVariablePanel.InsertValue(iec_path)
  2345             self.DebugVariablePanel.InsertValue(iec_path)
  2325             
  2346             
  2326 #-------------------------------------------------------------------------------
  2347 #-------------------------------------------------------------------------------
  2327 #                         Library Tree Management Functions
  2348 #                         Library Panel Management Function
  2328 #-------------------------------------------------------------------------------
  2349 #-------------------------------------------------------------------------------
  2329 
  2350 
  2330     def RefreshLibraryTree(self):
  2351     def RefreshLibraryPanel(self):
  2331         if self.Controler is not None:
  2352         self.LibraryPanel.RefreshTree()
  2332             to_delete = []
  2353         
  2333             selected_name = None
       
  2334             selected = self.LibraryTree.GetSelection()
       
  2335             if selected.IsOk():
       
  2336                 selected_pydata = self.LibraryTree.GetPyData(selected)
       
  2337                 if selected_pydata is not None and selected_pydata["type"] != CATEGORY:
       
  2338                     selected_name = self.LibraryTree.GetItemText(selected)
       
  2339             blocktypes = self.Controler.GetBlockTypes()
       
  2340             root = self.LibraryTree.GetRootItem()
       
  2341             if not root.IsOk():
       
  2342                 root = self.LibraryTree.AddRoot("")
       
  2343             if wx.VERSION >= (2, 6, 0):
       
  2344                 category_item, root_cookie = self.LibraryTree.GetFirstChild(root)
       
  2345             else:
       
  2346                 category_item, root_cookie = self.LibraryTree.GetFirstChild(root, 0)
       
  2347             for category in blocktypes:
       
  2348                 category_name = category["name"]
       
  2349                 if not category_item.IsOk():
       
  2350                     category_item = self.LibraryTree.AppendItem(root, _(category_name))
       
  2351                     if wx.Platform != '__WXMSW__':
       
  2352                         category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
       
  2353                 else:
       
  2354                     self.LibraryTree.SetItemText(category_item, _(category_name))
       
  2355                 self.LibraryTree.SetPyData(category_item, {"type" : CATEGORY})
       
  2356                 if wx.VERSION >= (2, 6, 0):
       
  2357                     blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item)
       
  2358                 else:
       
  2359                     blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item, 0)        
       
  2360                 for blocktype in category["list"]:
       
  2361                     if not blocktype_item.IsOk():
       
  2362                         blocktype_item = self.LibraryTree.AppendItem(category_item, blocktype["name"])
       
  2363                         if wx.Platform != '__WXMSW__':
       
  2364                             blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
       
  2365                     else:
       
  2366                         self.LibraryTree.SetItemText(blocktype_item, blocktype["name"])
       
  2367                     self.LibraryTree.SetPyData(blocktype_item, {"type" : BLOCK, "block_type" : blocktype["type"], "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]])})
       
  2368                     if selected_name == blocktype["name"]:
       
  2369                         self.LibraryTree.SelectItem(blocktype_item)
       
  2370                         comment = blocktype["comment"]
       
  2371                         self.LibraryComment.SetValue(_(comment) + blocktype.get("usage", ""))
       
  2372                     blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
       
  2373                 while blocktype_item.IsOk():
       
  2374                     to_delete.append(blocktype_item)
       
  2375                     blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
       
  2376                 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
       
  2377             while category_item.IsOk():
       
  2378                 to_delete.append(category_item)
       
  2379                 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
       
  2380             for item in to_delete:
       
  2381                 self.LibraryTree.Delete(item)
       
  2382 
       
  2383     def OnLibraryTreeItemSelected(self, event):
       
  2384         selected = event.GetItem()
       
  2385         pydata = self.LibraryTree.GetPyData(selected)
       
  2386         if pydata is not None and pydata["type"] != CATEGORY:
       
  2387             blocktype = self.Controler.GetBlockType(self.LibraryTree.GetItemText(selected), pydata["inputs"])
       
  2388             if blocktype:
       
  2389                 comment = blocktype["comment"]
       
  2390                 self.LibraryComment.SetValue(_(comment) + blocktype.get("usage", ""))
       
  2391             else:
       
  2392                 self.LibraryComment.SetValue("")
       
  2393         else:
       
  2394             self.LibraryComment.SetValue("")
       
  2395         event.Skip()
       
  2396 
       
  2397     def OnLibraryTreeBeginDrag(self, event):
       
  2398         selected = event.GetItem()
       
  2399         pydata = self.LibraryTree.GetPyData(selected)
       
  2400         if pydata is not None and pydata["type"] == BLOCK:
       
  2401             data = wx.TextDataObject(str((self.LibraryTree.GetItemText(selected), 
       
  2402                 pydata["block_type"], "", pydata["inputs"])))
       
  2403             dragSource = wx.DropSource(self.LibraryTree)
       
  2404             dragSource.SetData(data)
       
  2405             dragSource.DoDragDrop()
       
  2406 
       
  2407 #-------------------------------------------------------------------------------
  2354 #-------------------------------------------------------------------------------
  2408 #                          ToolBars Management Functions
  2355 #                          ToolBars Management Functions
  2409 #-------------------------------------------------------------------------------
  2356 #-------------------------------------------------------------------------------
  2410 
  2357 
  2411     def AddToMenuToolBar(self, items):
  2358     def AddToMenuToolBar(self, items):
  2982         if fileOpen is not None and os.path.isfile(fileOpen):
  2929         if fileOpen is not None and os.path.isfile(fileOpen):
  2983             # Create a new controller
  2930             # Create a new controller
  2984             self.Controler = PLCControler()
  2931             self.Controler = PLCControler()
  2985             result = self.Controler.OpenXMLFile(fileOpen)
  2932             result = self.Controler.OpenXMLFile(fileOpen)
  2986             if result is None:
  2933             if result is None:
       
  2934             	self.LibraryPanel.SetControler(self.Controler)
  2987                 self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE)
  2935                 self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE)
  2988         
  2936         
  2989         # Define PLCOpenEditor icon
  2937         # Define PLCOpenEditor icon
  2990         self.SetIcon(wx.Icon(os.path.join(CWD,"Images", "poe.ico"),wx.BITMAP_TYPE_ICO))
  2938         self.SetIcon(wx.Icon(os.path.join(CWD,"Images", "poe.ico"),wx.BITMAP_TYPE_ICO))
  2991 
  2939 
  3071         if dialog.ShowModal() == wx.ID_OK:
  3019         if dialog.ShowModal() == wx.ID_OK:
  3072             properties = dialog.GetValues()
  3020             properties = dialog.GetValues()
  3073             self.ResetView()
  3021             self.ResetView()
  3074             self.Controler = PLCControler()
  3022             self.Controler = PLCControler()
  3075             self.Controler.CreateNewProject(properties)
  3023             self.Controler.CreateNewProject(properties)
       
  3024             self.LibraryPanel.SetControler(self.Controler)
  3076             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, 
  3025             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, 
  3077                           LIBRARYTREE)
  3026                           LIBRARYTREE)
  3078 
  3027 
  3079     def OnOpenProjectMenu(self, event):
  3028     def OnOpenProjectMenu(self, event):
  3080         if self.Controler is not None and not self.CheckSaveBeforeClosing():
  3029         if self.Controler is not None and not self.CheckSaveBeforeClosing():
  3095             if os.path.isfile(filepath):
  3044             if os.path.isfile(filepath):
  3096                 self.ResetView()
  3045                 self.ResetView()
  3097                 self.Controler = PLCControler()
  3046                 self.Controler = PLCControler()
  3098                 result = self.Controler.OpenXMLFile(filepath)
  3047                 result = self.Controler.OpenXMLFile(filepath)
  3099                 if result is None:
  3048                 if result is None:
       
  3049                     self.LibraryPanel.SetControler(self.Controler)
  3100                     self.LoadProjectOrganization()
  3050                     self.LoadProjectOrganization()
  3101                     self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE)
  3051                     self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE)
  3102             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  3052             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  3103         dialog.Destroy()
  3053         dialog.Destroy()
  3104         
  3054