300 remove_function(self.Controler, name) |
303 remove_function(self.Controler, name) |
301 else: |
304 else: |
302 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name) |
305 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name) |
303 return DeleteElementFunction |
306 return DeleteElementFunction |
304 |
307 |
|
308 def ComputeTabsOrganization(tabs, rect): |
|
309 if len(tabs) == 1: |
|
310 return tabs[0] |
|
311 split = None |
|
312 for idx, tab in enumerate(tabs): |
|
313 if tab["size"][0] == rect.width: |
|
314 if tab["pos"][1] == rect.y: |
|
315 split = (wx.TOP, float(tab["size"][1]) / float(rect.height)) |
|
316 split_rect = wx.Rect(rect.x, rect.y + tab["size"][1] + 7, |
|
317 rect.width, rect.height - tab["size"][1] - 7) |
|
318 elif tab["pos"][1] == rect.height + 1 - tab["size"][1]: |
|
319 split = (wx.BOTTOM, 1.0 - float(tab["size"][1]) / float(rect.height)) |
|
320 split_rect = wx.Rect(rect.x, rect.y, |
|
321 rect.width, rect.height - tab["size"][1] - 7) |
|
322 break |
|
323 elif tab["size"][1] == rect.height: |
|
324 if tab["pos"][0] == rect.x: |
|
325 split = (wx.LEFT, float(tab["size"][0]) / float(rect.width)) |
|
326 split_rect = wx.Rect(rect.x + tab["size"][0] + 7, rect.y, |
|
327 rect.width - tab["size"][0] - 7, rect.height) |
|
328 elif tab["pos"][0] == rect.width + 1 - tab["size"][0]: |
|
329 split = (wx.RIGHT, 1.0 - float(tab["size"][0]) / float(rect.width)) |
|
330 split_rect = wx.Rect(rect.x, rect.y, |
|
331 rect.width - tab["size"][0] - 7, rect.height) |
|
332 break |
|
333 if split != None: |
|
334 split_tab = tabs.pop(idx) |
|
335 return {"split": split, |
|
336 "tab": split_tab, |
|
337 "others": ComputeTabsOrganization(tabs, split_rect)} |
|
338 return tabs |
305 |
339 |
306 #------------------------------------------------------------------------------- |
340 #------------------------------------------------------------------------------- |
307 # IDEFrame Base Class |
341 # IDEFrame Base Class |
308 #------------------------------------------------------------------------------- |
342 #------------------------------------------------------------------------------- |
309 |
343 |
467 style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE| |
509 style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE| |
468 wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE) |
510 wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE) |
469 self.LeftNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, |
511 self.LeftNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, |
470 self.OnAllowNotebookDnD) |
512 self.OnAllowNotebookDnD) |
471 self.AUIManager.AddPane(self.LeftNoteBook, |
513 self.AUIManager.AddPane(self.LeftNoteBook, |
472 wx.aui.AuiPaneInfo().Caption(_("Project")).Left().Layer(1). |
514 wx.aui.AuiPaneInfo().Name("ProjectPane"). |
|
515 Caption(_("Project")).Left().Layer(1). |
473 BestSize(wx.Size(300, 500)).CloseButton(False)) |
516 BestSize(wx.Size(300, 500)).CloseButton(False)) |
474 |
517 |
475 self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK, |
518 self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK, |
476 style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE| |
519 style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE| |
477 wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE) |
520 wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE) |
478 self.BottomNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, |
521 self.BottomNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, |
479 self.OnAllowNotebookDnD) |
522 self.OnAllowNotebookDnD) |
480 self.AUIManager.AddPane(self.BottomNoteBook, |
523 self.AUIManager.AddPane(self.BottomNoteBook, |
481 wx.aui.AuiPaneInfo().Bottom().Layer(0). |
524 wx.aui.AuiPaneInfo().Name("ResultPane"). |
|
525 Bottom().Layer(0). |
482 BestSize(wx.Size(800, 300)).CloseButton(False)) |
526 BestSize(wx.Size(800, 300)).CloseButton(False)) |
483 |
527 |
484 self.RightNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORRIGHTNOTEBOOK, |
528 self.RightNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORRIGHTNOTEBOOK, |
485 style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE| |
529 style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE| |
486 wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE) |
530 wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE) |
487 self.RightNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, |
531 self.RightNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, |
488 self.OnAllowNotebookDnD) |
532 self.OnAllowNotebookDnD) |
489 self.AUIManager.AddPane(self.RightNoteBook, |
533 self.AUIManager.AddPane(self.RightNoteBook, |
490 wx.aui.AuiPaneInfo().Right().Layer(0). |
534 wx.aui.AuiPaneInfo().Name("LibraryPane"). |
|
535 Right().Layer(0). |
491 BestSize(wx.Size(250, 400)).CloseButton(False)) |
536 BestSize(wx.Size(250, 400)).CloseButton(False)) |
492 |
537 |
493 self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED, |
538 self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED, |
494 style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON) |
539 style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON) |
495 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING, |
540 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING, |
639 self.EditorToolBar.Realize() |
691 self.EditorToolBar.Realize() |
640 |
692 |
641 self.Bind(wx.EVT_MENU, self.OnSelectionTool, |
693 self.Bind(wx.EVT_MENU, self.OnSelectionTool, |
642 id=ID_PLCOPENEDITOREDITORTOOLBARSELECTION) |
694 id=ID_PLCOPENEDITOREDITORTOOLBARSELECTION) |
643 |
695 |
|
696 #----------------------------------------------------------------------- |
|
697 # Creating Search Panel |
|
698 #----------------------------------------------------------------------- |
|
699 |
644 self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self) |
700 self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self) |
645 self.BottomNoteBook.AddPage(self.SearchResultPanel, _("Search")) |
701 self.MainTabs["SearchResultPanel"] = (self.SearchResultPanel, _("Search")) |
646 |
702 self.BottomNoteBook.AddPage(*self.MainTabs["SearchResultPanel"]) |
|
703 |
|
704 #----------------------------------------------------------------------- |
|
705 # Creating Library Panel |
|
706 #----------------------------------------------------------------------- |
|
707 |
647 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL, |
708 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL, |
648 name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0, |
709 name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0, |
649 0), size=wx.Size(0, 0), style=0) |
710 0), size=wx.Size(0, 0), style=0) |
650 self.RightNoteBook.AddPage(self.LibraryPanel, _("Library")) |
711 self.MainTabs["LibraryPanel"] = (self.LibraryPanel, _("Library")) |
|
712 self.RightNoteBook.AddPage(*self.MainTabs["LibraryPanel"]) |
651 |
713 |
652 self.LibraryTree = wx.TreeCtrl(id=ID_PLCOPENEDITORLIBRARYTREE, |
714 self.LibraryTree = wx.TreeCtrl(id=ID_PLCOPENEDITORLIBRARYTREE, |
653 name='LibraryTree', parent=self.LibraryPanel, |
715 name='LibraryTree', parent=self.LibraryPanel, |
654 pos=wx.Point(0, 0), size=wx.Size(0, 0), |
716 pos=wx.Point(0, 0), size=wx.Size(0, 0), |
655 style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_HIDE_ROOT|wx.TR_LINES_AT_ROOT) |
717 style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_HIDE_ROOT|wx.TR_LINES_AT_ROOT) |
748 |
813 |
749 self.SetRefreshFunctions() |
814 self.SetRefreshFunctions() |
750 |
815 |
751 def Show(self): |
816 def Show(self): |
752 wx.Frame.Show(self) |
817 wx.Frame.Show(self) |
753 wx.CallAfter(self.RestoreFrameSize) |
818 wx.CallAfter(self.RestoreLastState) |
754 |
819 |
755 def OnActivated(self, event): |
820 def OnActivated(self, event): |
756 if event.GetActive(): |
821 if event.GetActive(): |
757 wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) |
822 wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) |
758 event.Skip() |
823 event.Skip() |
759 |
824 |
760 def RestoreFrameSize(self): |
825 #------------------------------------------------------------------------------- |
|
826 # Saving and restoring frame organization functions |
|
827 #------------------------------------------------------------------------------- |
|
828 |
|
829 def OnResize(self, event): |
|
830 if self.Starting: |
|
831 self.RestoreLastOrganization() |
|
832 self.Starting = False |
|
833 self.RefreshEditor() |
|
834 event.Skip() |
|
835 |
|
836 def GetTabInfos(self, tab): |
|
837 if isinstance(tab, EditorPanel): |
|
838 if tab.IsDebugging(): |
|
839 return ("debug", tab.GetInstancePath()) |
|
840 else: |
|
841 return ("editor", tab.GetTagName()) |
|
842 else: |
|
843 for page_name, (page_ref, page_title) in self.MainTabs.iteritems(): |
|
844 if page_ref == tab: |
|
845 return ("main", page_name) |
|
846 return None |
|
847 |
|
848 def SaveTabOrganization(self, notebook): |
|
849 tabs = [] |
|
850 for child in notebook.GetChildren(): |
|
851 if isinstance(child, wx.aui.AuiTabCtrl): |
|
852 pos = child.GetPosition() |
|
853 tab = {"pos": (pos.x, pos.y), "pages": []} |
|
854 tab_size = child.GetSize() |
|
855 for page_idx in xrange(child.GetPageCount()): |
|
856 page = child.GetWindowFromIdx(page_idx) |
|
857 if not tab.has_key("size"): |
|
858 tab["size"] = (tab_size[0], tab_size[1] + page.GetSize()[1]) |
|
859 tab_infos = self.GetTabInfos(page) |
|
860 if tab_infos is not None: |
|
861 tab["pages"].append((tab_infos, page_idx == child.GetActivePage())) |
|
862 tabs.append(tab) |
|
863 tabs.sort(lambda x, y: cmp(x["pos"], y["pos"])) |
|
864 size = notebook.GetSize() |
|
865 return ComputeTabsOrganization(tabs, wx.Rect(1, 1, size[0] - 2, size[1] - 2)) |
|
866 |
|
867 def LoadTab(self, notebook, page_infos): |
|
868 if page_infos[0] == "main": |
|
869 infos = self.MainTabs.get(page_infos[1]) |
|
870 if infos is not None: |
|
871 page_ref, page_title = infos |
|
872 notebook.AddPage(page_ref, page_title) |
|
873 return notebook.GetPageIndex(page_ref) |
|
874 elif page_infos[0] == "editor": |
|
875 tagname = page_infos[1] |
|
876 page_ref = self.EditProjectElement(self.Controler.GetElementType(tagname), tagname) |
|
877 page_ref.RefreshView() |
|
878 return notebook.GetPageIndex(page_ref) |
|
879 elif page_infos[0] == "debug": |
|
880 instance_path = page_infos[1] |
|
881 item = self.GetInstancesTreeItem(self.InstancesTree.GetRootItem(), instance_path) |
|
882 item_infos = self.InstancesTree.GetPyData(item) |
|
883 if item_infos[1] is not None: |
|
884 instance_type = item_infos[1] |
|
885 else: |
|
886 instance_type = self.InstancesTree.GetItemText(item).split(" (")[1].split(")")[0] |
|
887 return notebook.GetPageIndex(self.OpenDebugViewer(item_infos[0], instance_path, instance_type)) |
|
888 return None |
|
889 |
|
890 def LoadTabOrganization(self, notebook, tabs, mode="all", first_index=None): |
|
891 if isinstance(tabs, ListType): |
|
892 if len(tabs) == 0: |
|
893 return |
|
894 raise ValueError, "Not supported" |
|
895 |
|
896 if tabs.has_key("split"): |
|
897 self.LoadTabOrganization(notebook, tabs["others"]) |
|
898 |
|
899 split_dir, split_ratio = tabs["split"] |
|
900 first_index = self.LoadTabOrganization(notebook, tabs["tab"], mode="first") |
|
901 notebook.Split(first_index, split_dir) |
|
902 self.LoadTabOrganization(notebook, tabs["tab"], mode="others", first_index=first_index) |
|
903 |
|
904 elif mode == "first": |
|
905 return self.LoadTab(notebook, tabs["pages"][0][0]) |
|
906 else: |
|
907 selected = first_index |
|
908 if mode == "others": |
|
909 add_tabs = tabs["pages"][1:] |
|
910 else: |
|
911 add_tabs = tabs["pages"] |
|
912 for page_infos, page_selected in add_tabs: |
|
913 page_idx = self.LoadTab(notebook, page_infos) |
|
914 if page_selected: |
|
915 selected = page_idx |
|
916 if selected is not None: |
|
917 wx.CallAfter(notebook.SetSelection, selected) |
|
918 |
|
919 def RestoreLastState(self): |
761 frame_size = None |
920 frame_size = None |
762 if self.Config.HasEntry("framesize"): |
921 if self.Config.HasEntry("framesize"): |
763 frame_size = cPickle.loads(str(self.Config.Read("framesize"))) |
922 frame_size = cPickle.loads(str(self.Config.Read("framesize"))) |
764 |
923 |
|
924 self.Starting = True |
765 if frame_size is None: |
925 if frame_size is None: |
766 self.Maximize() |
926 self.Maximize() |
767 else: |
927 else: |
768 self.SetClientSize(frame_size) |
928 self.SetClientSize(frame_size) |
769 |
929 |
770 def SaveFrameSize(self): |
930 def RestoreLastOrganization(self): |
|
931 if USE_AUI: |
|
932 notebooks = {} |
|
933 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
|
934 (self.BottomNoteBook, "bottomnotebook"), |
|
935 (self.RightNoteBook, "rightnotebook")]: |
|
936 notebooks[entry_name] = self.SaveTabOrganization(notebook) |
|
937 self.DefaultPerspective = { |
|
938 "perspective": self.AUIManager.SavePerspective(), |
|
939 "notebooks": notebooks, |
|
940 } |
|
941 |
|
942 if self.Config.HasEntry("perspective"): |
|
943 self.AUIManager.LoadPerspective(str(self.Config.Read("perspective"))) |
|
944 |
|
945 if self.Config.HasEntry("notebooks"): |
|
946 notebooks = cPickle.loads(str(self.Config.Read("notebooks"))) |
|
947 |
|
948 for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]: |
|
949 for idx in xrange(notebook.GetPageCount()): |
|
950 notebook.RemovePage(0) |
|
951 |
|
952 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
|
953 (self.BottomNoteBook, "bottomnotebook"), |
|
954 (self.RightNoteBook, "rightnotebook")]: |
|
955 self.LoadTabOrganization(notebook, notebooks.get(entry_name)) |
|
956 |
|
957 self.LoadProjectOrganization() |
|
958 |
|
959 def SaveLastState(self): |
771 if not self.IsMaximized(): |
960 if not self.IsMaximized(): |
772 self.Config.Write("framesize", cPickle.dumps(self.GetClientSize())) |
961 self.Config.Write("framesize", cPickle.dumps(self.GetClientSize())) |
773 elif self.Config.HasEntry("framesize"): |
962 elif self.Config.HasEntry("framesize"): |
774 self.Config.DeleteEntry("framesize") |
963 self.Config.DeleteEntry("framesize") |
|
964 |
|
965 if USE_AUI: |
|
966 notebooks = {} |
|
967 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
|
968 (self.BottomNoteBook, "bottomnotebook"), |
|
969 (self.RightNoteBook, "rightnotebook")]: |
|
970 notebooks[entry_name] = self.SaveTabOrganization(notebook) |
|
971 self.Config.Write("notebooks", cPickle.dumps(notebooks)) |
|
972 |
|
973 self.Config.Write("perspective", self.AUIManager.SavePerspective()) |
|
974 |
|
975 self.SaveProjectOrganization() |
|
976 |
775 self.Config.Flush() |
977 self.Config.Flush() |
776 |
978 |
|
979 def SaveProjectOrganization(self): |
|
980 if USE_AUI and self.Controler is not None: |
|
981 tabs = [] |
|
982 |
|
983 if self.Config.HasEntry("projects"): |
|
984 projects = cPickle.loads(str(self.Config.Read("projects"))) |
|
985 else: |
|
986 projects = {} |
|
987 |
|
988 project_infos = { |
|
989 "tabs": self.SaveTabOrganization(self.TabsOpened) |
|
990 } |
|
991 if self.EnableDebug: |
|
992 project_infos["debug_vars"] = self.DebugVariablePanel.GetDebugVariables() |
|
993 |
|
994 projects[os.path.realpath(self.Controler.GetFilePath())] = project_infos |
|
995 |
|
996 self.Config.Write("projects", cPickle.dumps(projects)) |
|
997 self.Config.Flush() |
|
998 |
|
999 def LoadProjectOrganization(self): |
|
1000 if USE_AUI and self.Controler is not None and self.Config.HasEntry("projects"): |
|
1001 projects = cPickle.loads(str(self.Config.Read("projects"))) |
|
1002 |
|
1003 project = projects.get(os.path.realpath(self.Controler.GetFilePath())) |
|
1004 if project is not None: |
|
1005 self.LoadTabOrganization(self.TabsOpened, project["tabs"]) |
|
1006 |
|
1007 if self.EnableDebug: |
|
1008 for variable in project["debug_vars"]: |
|
1009 self.DebugVariablePanel.InsertValue(variable, force=True) |
|
1010 |
777 #------------------------------------------------------------------------------- |
1011 #------------------------------------------------------------------------------- |
778 # General Functions |
1012 # General Functions |
779 #------------------------------------------------------------------------------- |
1013 #------------------------------------------------------------------------------- |
780 |
1014 |
781 def SetRefreshFunctions(self): |
1015 def SetRefreshFunctions(self): |
1253 if pane.IsMaximized(): |
1500 if pane.IsMaximized(): |
1254 self.AUIManager.RestorePane(pane) |
1501 self.AUIManager.RestorePane(pane) |
1255 self.AUIManager.Update() |
1502 self.AUIManager.Update() |
1256 |
1503 |
1257 def OnPouSelectedChanging(self, event): |
1504 def OnPouSelectedChanging(self, event): |
|
1505 if not self.Starting: |
|
1506 selected = self.TabsOpened.GetSelection() |
|
1507 if selected >= 0: |
|
1508 window = self.TabsOpened.GetPage(selected) |
|
1509 if not window.IsDebugging(): |
|
1510 window.ResetBuffer() |
|
1511 event.Skip() |
|
1512 |
|
1513 def OnPouSelectedChanged(self, event): |
|
1514 if not self.Starting: |
|
1515 selected = self.TabsOpened.GetSelection() |
|
1516 if selected >= 0: |
|
1517 window = self.TabsOpened.GetPage(selected) |
|
1518 if not window.IsDebugging(): |
|
1519 wx.CallAfter(self.SelectTypesTreeItem, window.GetTagName()) |
|
1520 window.RefreshView() |
|
1521 else: |
|
1522 wx.CallAfter(self.SelectInstancesTreeItem, window.GetInstancePath()) |
|
1523 wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR) |
|
1524 event.Skip() |
|
1525 |
|
1526 def RefreshEditor(self): |
1258 selected = self.TabsOpened.GetSelection() |
1527 selected = self.TabsOpened.GetSelection() |
1259 if selected >= 0: |
1528 if selected >= 0: |
1260 window = self.TabsOpened.GetPage(selected) |
1529 window = self.TabsOpened.GetPage(selected) |
1261 if not window.IsDebugging(): |
1530 if not window.IsDebugging(): |
1262 window.ResetBuffer() |
1531 self.SelectTypesTreeItem(window.GetTagName()) |
1263 event.Skip() |
1532 else: |
1264 |
1533 self.SelectInstancesTreeItem(window.GetInstancePath()) |
1265 def OnPouSelectedChanged(self, event): |
1534 if USE_AUI: |
1266 selected = self.TabsOpened.GetSelection() |
1535 for child in self.TabsOpened.GetChildren(): |
1267 if selected >= 0: |
1536 if isinstance(child, wx.aui.AuiTabCtrl): |
1268 window = self.TabsOpened.GetPage(selected) |
1537 active_page = child.GetActivePage() |
1269 if not window.IsDebugging(): |
1538 if active_page >= 0: |
1270 wx.CallAfter(self.SelectTypesTreeItem, window.GetTagName()) |
1539 window = child.GetWindowFromIdx(active_page) |
|
1540 window.RefreshView() |
|
1541 else: |
1271 window.RefreshView() |
1542 window.RefreshView() |
1272 else: |
1543 self._Refresh(FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR) |
1273 wx.CallAfter(self.SelectInstancesTreeItem, window.GetInstancePath()) |
|
1274 wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR) |
|
1275 event.Skip() |
|
1276 |
|
1277 def RefreshEditor(self): |
|
1278 selected = self.TabsOpened.GetSelection() |
|
1279 if USE_AUI: |
|
1280 for child in self.TabsOpened.GetChildren(): |
|
1281 if isinstance(child, wx.aui.AuiTabCtrl): |
|
1282 active_page = child.GetActivePage() |
|
1283 if active_page >= 0: |
|
1284 window = child.GetWindowFromIdx(active_page) |
|
1285 window.RefreshView() |
|
1286 elif selected >= 0: |
|
1287 window = self.TabsOpened.GetPage(idx) |
|
1288 window.RefreshView() |
|
1289 |
1544 |
1290 def RefreshEditorNames(self, old_tagname, new_tagname): |
1545 def RefreshEditorNames(self, old_tagname, new_tagname): |
1291 for i in xrange(self.TabsOpened.GetPageCount()): |
1546 for i in xrange(self.TabsOpened.GetPageCount()): |
1292 editor = self.TabsOpened.GetPage(i) |
1547 editor = self.TabsOpened.GetPage(i) |
1293 if editor.GetTagName() == old_tagname: |
1548 if editor.GetTagName() == old_tagname: |
1852 |
2107 |
1853 def OnInstancesTreeItemActivated(self, event): |
2108 def OnInstancesTreeItemActivated(self, event): |
1854 if self.Controler.DebugAvailable(): |
2109 if self.Controler.DebugAvailable(): |
1855 selected_item = event.GetItem() |
2110 selected_item = event.GetItem() |
1856 selected_infos = self.InstancesTree.GetPyData(selected_item) |
2111 selected_infos = self.InstancesTree.GetPyData(selected_item) |
1857 if selected_item is not None and selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM, ITEM_TRANSITION, ITEM_ACTION]: |
2112 if selected_item is not None and ( |
1858 instance_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0] |
2113 selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM, ITEM_TRANSITION, ITEM_ACTION] or |
|
2114 selected_infos[0] in ITEMS_VARIABLE): |
|
2115 |
|
2116 instance_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (") |
|
2117 if selected_infos[1] is not None: |
|
2118 instance_type = selected_infos[1] |
|
2119 else: |
|
2120 instance_type = var_type.split(")")[0] |
1859 parent_item = self.InstancesTree.GetItemParent(selected_item) |
2121 parent_item = self.InstancesTree.GetItemParent(selected_item) |
1860 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: |
2122 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: |
1861 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] |
2123 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] |
1862 instance_path = "%s.%s"%(parent_name, instance_path) |
2124 instance_path = "%s.%s"%(parent_name, instance_path) |
1863 parent_item = self.InstancesTree.GetItemParent(parent_item) |
2125 parent_item = self.InstancesTree.GetItemParent(parent_item) |
1864 openedidx = self.IsOpened(instance_path) |
|
1865 if openedidx is not None: |
|
1866 old_selected = self.TabsOpened.GetSelection() |
|
1867 if old_selected != openedidx: |
|
1868 if old_selected >= 0: |
|
1869 self.TabsOpened.GetPage(old_selected).ResetBuffer() |
|
1870 self.TabsOpened.SetSelection(openedidx) |
|
1871 elif selected_infos[1] is not None: |
|
1872 bodytype = self.Controler.GetEditedElementBodyType(selected_infos[1], True) |
|
1873 if bodytype == "FBD": |
|
1874 new_window = Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path) |
|
1875 new_window.RefreshScaling(False) |
|
1876 elif bodytype == "LD": |
|
1877 new_window = LD_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path) |
|
1878 new_window.RefreshScaling(False) |
|
1879 elif bodytype == "SFC": |
|
1880 new_window = SFC_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path) |
|
1881 new_window.RefreshScaling(False) |
|
1882 else: |
|
1883 new_window = TextViewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path) |
|
1884 new_window.SetTextSyntax(bodytype) |
|
1885 if bodytype == "IL": |
|
1886 new_window.SetKeywords(IL_KEYWORDS) |
|
1887 else: |
|
1888 new_window.SetKeywords(ST_KEYWORDS) |
|
1889 if selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM]: |
|
1890 pou_type = self.Controler.GetEditedElementType(selected_infos[1], True)[1].upper() |
|
1891 icon = self.GenerateBitmap(pou_type, bodytype) |
|
1892 elif selected_infos[0] == ITEM_TRANSITION: |
|
1893 icon = self.GenerateBitmap("TRANSITION", bodytype) |
|
1894 elif selected_infos[0] == ITEM_ACTION: |
|
1895 icon = self.GenerateBitmap("ACTION", bodytype) |
|
1896 new_window.SetIcon(icon) |
|
1897 self.AddPage(new_window, "") |
|
1898 new_window.RefreshView() |
|
1899 new_window.SetFocus() |
|
1900 self.RefreshPageTitles() |
|
1901 if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE: |
|
1902 var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (") |
|
1903 var_type = var_type.split(")")[0] |
|
1904 |
2126 |
1905 if self.Controler.IsOfType(var_type, "ANY_NUM", True) or\ |
2127 self.OpenDebugViewer(selected_infos[0], instance_path, instance_type) |
1906 self.Controler.IsOfType(var_type, "ANY_BIT", True): |
2128 |
1907 parent_item = self.InstancesTree.GetItemParent(selected_item) |
|
1908 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: |
|
1909 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] |
|
1910 var_path = "%s.%s"%(parent_name, var_path) |
|
1911 parent_item = self.InstancesTree.GetItemParent(parent_item) |
|
1912 |
|
1913 self.OpenGraphicViewer(var_path) |
|
1914 event.Skip() |
2129 event.Skip() |
|
2130 |
|
2131 def OpenDebugViewer(self, instance_category, instance_path, instance_type): |
|
2132 openedidx = self.IsOpened(instance_path) |
|
2133 if openedidx is not None: |
|
2134 old_selected = self.TabsOpened.GetSelection() |
|
2135 if old_selected != openedidx: |
|
2136 if old_selected >= 0: |
|
2137 self.TabsOpened.GetPage(old_selected).ResetBuffer() |
|
2138 self.TabsOpened.SetSelection(openedidx) |
|
2139 |
|
2140 elif instance_category in ITEMS_VARIABLE: |
|
2141 if self.Controler.IsOfType(instance_type, "ANY_NUM", True) or\ |
|
2142 self.Controler.IsOfType(instance_type, "ANY_BIT", True): |
|
2143 |
|
2144 return self.OpenGraphicViewer(instance_path) |
|
2145 |
|
2146 else: |
|
2147 bodytype = self.Controler.GetEditedElementBodyType(instance_type, True) |
|
2148 new_window = None |
|
2149 if bodytype == "FBD": |
|
2150 new_window = Viewer(self.TabsOpened, instance_type, self, self.Controler, True, instance_path) |
|
2151 new_window.RefreshScaling(False) |
|
2152 elif bodytype == "LD": |
|
2153 new_window = LD_Viewer(self.TabsOpened, instance_type, self, self.Controler, True, instance_path) |
|
2154 new_window.RefreshScaling(False) |
|
2155 elif bodytype == "SFC": |
|
2156 new_window = SFC_Viewer(self.TabsOpened, instance_type, self, self.Controler, True, instance_path) |
|
2157 new_window.RefreshScaling(False) |
|
2158 else: |
|
2159 new_window = TextViewer(self.TabsOpened, instance_type, self, self.Controler, True, instance_path) |
|
2160 new_window.SetTextSyntax(bodytype) |
|
2161 if bodytype == "IL": |
|
2162 new_window.SetKeywords(IL_KEYWORDS) |
|
2163 else: |
|
2164 new_window.SetKeywords(ST_KEYWORDS) |
|
2165 if new_window is not None: |
|
2166 if instance_category in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM]: |
|
2167 pou_type = self.Controler.GetEditedElementType(instance_type, True)[1].upper() |
|
2168 icon = self.GenerateBitmap(pou_type, bodytype) |
|
2169 elif instance_category == ITEM_TRANSITION: |
|
2170 icon = self.GenerateBitmap("TRANSITION", bodytype) |
|
2171 elif instance_category == ITEM_ACTION: |
|
2172 icon = self.GenerateBitmap("ACTION", bodytype) |
|
2173 new_window.SetIcon(icon) |
|
2174 self.AddPage(new_window, "") |
|
2175 new_window.RefreshView() |
|
2176 new_window.SetFocus() |
|
2177 self.RefreshPageTitles() |
|
2178 return new_window |
|
2179 |
|
2180 return None |
1915 |
2181 |
1916 def OpenGraphicViewer(self, var_path): |
2182 def OpenGraphicViewer(self, var_path): |
1917 new_window = GraphicViewer(self.TabsOpened, self, self.Controler, var_path) |
2183 new_window = GraphicViewer(self.TabsOpened, self, self.Controler, var_path) |
1918 self.AddPage(new_window, "") |
2184 self.AddPage(new_window, "") |
1919 new_window.RefreshView() |
2185 new_window.RefreshView() |
1920 new_window.SetFocus() |
2186 new_window.SetFocus() |
1921 self.RefreshPageTitles() |
2187 self.RefreshPageTitles() |
|
2188 return new_window |
1922 |
2189 |
1923 def OnInstancesTreeRightUp(self, event): |
2190 def OnInstancesTreeRightUp(self, event): |
1924 if self.Controler.DebugAvailable(): |
2191 if self.Controler.DebugAvailable(): |
1925 if wx.Platform == '__WXMSW__': |
2192 if wx.Platform == '__WXMSW__': |
1926 selected_item = event.GetItem() |
2193 selected_item = event.GetItem() |