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: |
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 |
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. |
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): |