524 size=wx.Size(0, 0), style=wx.SP_3D) |
520 size=wx.Size(0, 0), style=wx.SP_3D) |
525 |
521 |
526 self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE, |
522 self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE, |
527 name='ProjectTree', parent=self.ProjectPanel, |
523 name='ProjectTree', parent=self.ProjectPanel, |
528 pos=wx.Point(0, 0), size=wx.Size(0, 0), |
524 pos=wx.Point(0, 0), size=wx.Size(0, 0), |
529 style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_EDIT_LABELS) |
525 style=wx.SUNKEN_BORDER, |
|
526 agwStyle=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.TR_EDIT_LABELS) |
530 self.ProjectTree.SetBackgroundBitmap(GetBitmap("custom_tree_background"), |
527 self.ProjectTree.SetBackgroundBitmap(GetBitmap("custom_tree_background"), |
531 wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM) |
528 wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM) |
532 add_menu = wx.Menu() |
529 add_menu = wx.Menu() |
533 self._init_coll_AddMenu_Items(add_menu) |
530 self._init_coll_AddMenu_Items(add_menu) |
534 self.ProjectTree.SetAddMenu(add_menu) |
531 self.ProjectTree.SetAddMenu(add_menu) |
535 if wx.Platform == '__WXMSW__': |
532 self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnProjectTreeRightUp, |
536 self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnProjectTreeRightUp, |
533 id=ID_PLCOPENEDITORPROJECTTREE) |
537 id=ID_PLCOPENEDITORPROJECTTREE) |
534 self.ProjectTree.Bind(wx.EVT_LEFT_UP, self.OnProjectTreeLeftUp) |
538 self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnProjectTreeItemSelected, |
535 self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnProjectTreeItemChanging, |
539 id=ID_PLCOPENEDITORPROJECTTREE) |
536 id=ID_PLCOPENEDITORPROJECTTREE) |
540 else: |
|
541 self.ProjectTree.Bind(wx.EVT_RIGHT_UP, self.OnProjectTreeRightUp) |
|
542 self.ProjectTree.Bind(wx.EVT_LEFT_UP, self.OnProjectTreeLeftUp) |
|
543 self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnProjectTreeItemChanging, |
|
544 id=ID_PLCOPENEDITORPROJECTTREE) |
|
545 self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnProjectTreeBeginDrag, |
537 self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnProjectTreeBeginDrag, |
546 id=ID_PLCOPENEDITORPROJECTTREE) |
538 id=ID_PLCOPENEDITORPROJECTTREE) |
547 self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnProjectTreeItemBeginEdit, |
539 self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnProjectTreeItemBeginEdit, |
548 id=ID_PLCOPENEDITORPROJECTTREE) |
540 id=ID_PLCOPENEDITORPROJECTTREE) |
549 self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnProjectTreeItemEndEdit, |
541 self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnProjectTreeItemEndEdit, |
550 id=ID_PLCOPENEDITORPROJECTTREE) |
542 id=ID_PLCOPENEDITORPROJECTTREE) |
551 self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnProjectTreeItemActivated, |
543 self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnProjectTreeItemActivated, |
552 id=ID_PLCOPENEDITORPROJECTTREE) |
544 id=ID_PLCOPENEDITORPROJECTTREE) |
|
545 self.ProjectTree.Bind(wx.EVT_MOTION, self.OnProjectTreeMotion) |
553 |
546 |
554 #----------------------------------------------------------------------- |
547 #----------------------------------------------------------------------- |
555 # Creating PLCopen Project POU Instance Variables Panel |
548 # Creating PLCopen Project POU Instance Variables Panel |
556 #----------------------------------------------------------------------- |
549 #----------------------------------------------------------------------- |
557 |
550 |
675 self.PouInstanceVariablesPanel.SetTreeImageList(self.TreeImageList) |
668 self.PouInstanceVariablesPanel.SetTreeImageList(self.TreeImageList) |
676 |
669 |
677 self.CurrentEditorToolBar = [] |
670 self.CurrentEditorToolBar = [] |
678 self.CurrentMenu = None |
671 self.CurrentMenu = None |
679 self.SelectedItem = None |
672 self.SelectedItem = None |
|
673 self.LastToolTipItem = None |
680 self.SearchParams = None |
674 self.SearchParams = None |
681 self.Highlights = {} |
675 self.Highlights = {} |
682 self.DrawingMode = FREEDRAWING_MODE |
676 self.DrawingMode = FREEDRAWING_MODE |
683 #self.DrawingMode = DRIVENDRAWING_MODE |
677 #self.DrawingMode = DRIVENDRAWING_MODE |
684 self.AuiTabCtrl = [] |
678 self.AuiTabCtrl = [] |
685 self.DefaultPerspective = None |
679 |
|
680 # Save default perspective |
|
681 notebooks = {} |
|
682 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
|
683 (self.BottomNoteBook, "bottomnotebook"), |
|
684 (self.RightNoteBook, "rightnotebook")]: |
|
685 notebooks[entry_name] = self.SaveTabLayout(notebook) |
|
686 self.DefaultPerspective = { |
|
687 "perspective": self.AUIManager.SavePerspective(), |
|
688 "notebooks": notebooks, |
|
689 } |
|
690 |
686 |
691 |
687 # Initialize Printing configuring elements |
692 # Initialize Printing configuring elements |
688 self.PrintData = wx.PrintData() |
693 self.PrintData = wx.PrintData() |
689 self.PrintData.SetPaperId(wx.PAPER_A4) |
694 self.PrintData.SetPaperId(wx.PAPER_A4) |
690 self.PrintData.SetPrintMode(wx.PRINT_MODE_PRINTER) |
695 self.PrintData.SetPrintMode(wx.PRINT_MODE_PRINTER) |
691 self.PageSetupData = wx.PageSetupDialogData(self.PrintData) |
696 self.PageSetupData = wx.PageSetupDialogData(self.PrintData) |
692 self.PageSetupData.SetMarginTopLeft(wx.Point(10, 15)) |
697 self.PageSetupData.SetMarginTopLeft(wx.Point(10, 15)) |
693 self.PageSetupData.SetMarginBottomRight(wx.Point(10, 20)) |
698 self.PageSetupData.SetMarginBottomRight(wx.Point(10, 20)) |
694 |
699 |
695 self.SetRefreshFunctions() |
700 self.SetRefreshFunctions() |
|
701 self.SetDeleteFunctions() |
696 |
702 |
697 def __del__(self): |
703 def __del__(self): |
698 self.FindDialog.Destroy() |
704 self.FindDialog.Destroy() |
699 |
|
700 def ResetStarting(self): |
|
701 self.Starting = False |
|
702 |
705 |
703 def Show(self): |
706 def Show(self): |
704 wx.Frame.Show(self) |
707 wx.Frame.Show(self) |
705 wx.CallAfter(self.RestoreLastState) |
708 wx.CallAfter(self.RestoreLastState) |
706 |
709 |
707 def OnActivated(self, event): |
710 def OnActivated(self, event): |
708 if event.GetActive(): |
711 if event.GetActive(): |
709 wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) |
712 wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) |
710 event.Skip() |
713 event.Skip() |
711 |
714 |
|
715 def SelectTab(self, tab): |
|
716 for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]: |
|
717 idx = notebook.GetPageIndex(tab) |
|
718 if idx != wx.NOT_FOUND and idx != notebook.GetSelection(): |
|
719 notebook.SetSelection(idx) |
|
720 return |
|
721 |
712 #------------------------------------------------------------------------------- |
722 #------------------------------------------------------------------------------- |
713 # Saving and restoring frame organization functions |
723 # Saving and restoring frame organization functions |
714 #------------------------------------------------------------------------------- |
724 #------------------------------------------------------------------------------- |
715 |
725 |
716 def OnResize(self, event): |
|
717 if self.Starting: |
|
718 self.RestoreLastLayout() |
|
719 event.Skip() |
|
720 |
|
721 def EnableSaveProjectState(self): |
|
722 return False |
|
723 |
|
724 def GetProjectConfiguration(self): |
|
725 projects = {} |
|
726 try: |
|
727 if self.Config.HasEntry("projects"): |
|
728 projects = cPickle.loads(str(self.Config.Read("projects"))) |
|
729 except: |
|
730 pass |
|
731 |
|
732 return projects.get( |
|
733 EncodeFileSystemPath(os.path.realpath(self.Controler.GetFilePath())), {}) |
|
734 |
|
735 def SavePageState(self, page): |
|
736 state = page.GetState() |
|
737 if state is not None: |
|
738 if self.Config.HasEntry("projects"): |
|
739 projects = cPickle.loads(str(self.Config.Read("projects"))) |
|
740 else: |
|
741 projects = {} |
|
742 |
|
743 project_infos = projects.setdefault( |
|
744 EncodeFileSystemPath(os.path.realpath(self.Controler.GetFilePath())), {}) |
|
745 editors_state = project_infos.setdefault("editors_state", {}) |
|
746 |
|
747 if page.IsDebugging(): |
|
748 editors_state[page.GetInstancePath()] = state |
|
749 else: |
|
750 editors_state[page.GetTagName()] = state |
|
751 |
|
752 self.Config.Write("projects", cPickle.dumps(projects)) |
|
753 self.Config.Flush() |
|
754 |
|
755 def GetTabInfos(self, tab): |
726 def GetTabInfos(self, tab): |
756 if isinstance(tab, EditorPanel): |
727 for page_name, (page_ref, page_title) in self.MainTabs.iteritems(): |
757 if tab.IsDebugging(): |
728 if page_ref == tab: |
758 return ("debug", tab.GetInstancePath()) |
729 return ("main", page_name) |
759 else: |
|
760 return ("editor", tab.GetTagName()) |
|
761 else: |
|
762 for page_name, (page_ref, page_title) in self.MainTabs.iteritems(): |
|
763 if page_ref == tab: |
|
764 return ("main", page_name) |
|
765 return None |
730 return None |
766 |
731 |
767 def SaveTabLayout(self, notebook): |
732 def SaveTabLayout(self, notebook): |
768 tabs = [] |
733 tabs = [] |
769 for child in notebook.GetChildren(): |
734 for child in notebook.GetChildren(): |
852 def RestoreLastState(self): |
817 def RestoreLastState(self): |
853 frame_size = None |
818 frame_size = None |
854 if self.Config.HasEntry("framesize"): |
819 if self.Config.HasEntry("framesize"): |
855 frame_size = cPickle.loads(str(self.Config.Read("framesize"))) |
820 frame_size = cPickle.loads(str(self.Config.Read("framesize"))) |
856 |
821 |
857 self.Starting = True |
|
858 if frame_size is None: |
822 if frame_size is None: |
859 self.Maximize() |
823 self.Maximize() |
860 else: |
824 else: |
861 self.SetClientSize(frame_size) |
825 self.SetClientSize(frame_size) |
862 wx.CallAfter(self.RestoreLastLayout) |
826 |
863 |
|
864 def RestoreLastLayout(self): |
|
865 notebooks = {} |
|
866 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
|
867 (self.BottomNoteBook, "bottomnotebook"), |
|
868 (self.RightNoteBook, "rightnotebook")]: |
|
869 notebooks[entry_name] = self.SaveTabLayout(notebook) |
|
870 self.DefaultPerspective = { |
|
871 "perspective": self.AUIManager.SavePerspective(), |
|
872 "notebooks": notebooks, |
|
873 } |
|
874 |
|
875 try: |
|
876 if self.Config.HasEntry("perspective"): |
|
877 self.AUIManager.LoadPerspective(unicode(self.Config.Read("perspective"))) |
|
878 |
|
879 if self.Config.HasEntry("notebooks"): |
|
880 notebooks = cPickle.loads(str(self.Config.Read("notebooks"))) |
|
881 |
|
882 for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]: |
|
883 for idx in xrange(notebook.GetPageCount()): |
|
884 notebook.RemovePage(0) |
|
885 |
|
886 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
|
887 (self.BottomNoteBook, "bottomnotebook"), |
|
888 (self.RightNoteBook, "rightnotebook")]: |
|
889 self.LoadTabLayout(notebook, notebooks.get(entry_name)) |
|
890 except: |
|
891 self.ResetPerspective() |
|
892 |
|
893 if self.EnableSaveProjectState(): |
|
894 self.LoadProjectLayout() |
|
895 |
|
896 self._Refresh(EDITORTOOLBAR) |
|
897 |
|
898 if wx.Platform == '__WXMSW__': |
|
899 wx.CallAfter(self.ResetStarting) |
|
900 else: |
|
901 self.ResetStarting() |
|
902 wx.CallAfter(self.RefreshEditor) |
|
903 |
|
904 def SaveLastState(self): |
827 def SaveLastState(self): |
905 if not self.IsMaximized(): |
828 if not self.IsMaximized(): |
906 self.Config.Write("framesize", cPickle.dumps(self.GetClientSize())) |
829 self.Config.Write("framesize", cPickle.dumps(self.GetClientSize())) |
907 elif self.Config.HasEntry("framesize"): |
830 elif self.Config.HasEntry("framesize"): |
908 self.Config.DeleteEntry("framesize") |
831 self.Config.DeleteEntry("framesize") |
909 |
832 |
910 notebooks = {} |
|
911 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
|
912 (self.BottomNoteBook, "bottomnotebook"), |
|
913 (self.RightNoteBook, "rightnotebook")]: |
|
914 notebooks[entry_name] = self.SaveTabLayout(notebook) |
|
915 self.Config.Write("notebooks", cPickle.dumps(notebooks)) |
|
916 |
|
917 pane = self.AUIManager.GetPane(self.TabsOpened) |
|
918 if pane.IsMaximized(): |
|
919 self.AUIManager.RestorePane(pane) |
|
920 self.Config.Write("perspective", self.AUIManager.SavePerspective()) |
|
921 |
|
922 if self.EnableSaveProjectState(): |
|
923 self.SaveProjectLayout() |
|
924 |
|
925 for i in xrange(self.TabsOpened.GetPageCount()): |
|
926 self.SavePageState(self.TabsOpened.GetPage(i)) |
|
927 |
|
928 self.Config.Flush() |
833 self.Config.Flush() |
929 |
834 |
930 def SaveProjectLayout(self): |
|
931 if self.Controler is not None: |
|
932 tabs = [] |
|
933 |
|
934 projects = {} |
|
935 try: |
|
936 if self.Config.HasEntry("projects"): |
|
937 projects = cPickle.loads(str(self.Config.Read("projects"))) |
|
938 except: |
|
939 pass |
|
940 |
|
941 project_infos = projects.setdefault( |
|
942 EncodeFileSystemPath(os.path.realpath(self.Controler.GetFilePath())), {}) |
|
943 project_infos["tabs"] = self.SaveTabLayout(self.TabsOpened) |
|
944 if self.EnableDebug: |
|
945 project_infos["debug_vars"] = self.DebugVariablePanel.GetDebugVariables() |
|
946 |
|
947 self.Config.Write("projects", cPickle.dumps(projects)) |
|
948 self.Config.Flush() |
|
949 |
|
950 def LoadProjectLayout(self): |
|
951 if self.Controler is not None: |
|
952 project = self.GetProjectConfiguration() |
|
953 |
|
954 try: |
|
955 if project.has_key("tabs"): |
|
956 self.LoadTabLayout(self.TabsOpened, project["tabs"]) |
|
957 except: |
|
958 self.DeleteAllPages() |
|
959 |
|
960 if self.EnableDebug: |
|
961 #try: |
|
962 self.DebugVariablePanel.SetDebugVariables(project.get("debug_vars", [])) |
|
963 #except: |
|
964 # self.DebugVariablePanel.ResetView() |
|
965 |
|
966 #------------------------------------------------------------------------------- |
835 #------------------------------------------------------------------------------- |
967 # General Functions |
836 # General Functions |
968 #------------------------------------------------------------------------------- |
837 #------------------------------------------------------------------------------- |
969 |
838 |
970 def SetRefreshFunctions(self): |
839 def SetRefreshFunctions(self): |
996 selected = self.TabsOpened.GetSelection() |
865 selected = self.TabsOpened.GetSelection() |
997 if selected > -1: |
866 if selected > -1: |
998 window = self.TabsOpened.GetPage(selected) |
867 window = self.TabsOpened.GetPage(selected) |
999 |
868 |
1000 if window.CheckSaveBeforeClosing(): |
869 if window.CheckSaveBeforeClosing(): |
1001 if self.EnableSaveProjectState(): |
|
1002 self.SavePageState(window) |
|
1003 |
870 |
1004 # Refresh all window elements that have changed |
871 # Refresh all window elements that have changed |
1005 wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) |
872 wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) |
1006 wx.CallAfter(self.RefreshTabCtrlEvent) |
873 wx.CallAfter(self.RefreshTabCtrlEvent) |
1007 wx.CallAfter(self.CloseFindInPouDialog) |
874 wx.CallAfter(self.CloseFindInPouDialog) |
1008 event.Skip() |
875 event.Skip() |
1009 else: |
876 else: |
1010 event.Veto() |
877 event.Veto() |
1011 |
878 |
1012 |
879 |
1013 def GetCopyBuffer(self): |
880 def GetCopyBuffer(self, primary_selection=False): |
1014 data = None |
881 data = None |
|
882 if primary_selection and wx.Platform == '__WXMSW__': |
|
883 return data |
|
884 else: |
|
885 wx.TheClipboard.UsePrimarySelection(primary_selection) |
1015 if wx.TheClipboard.Open(): |
886 if wx.TheClipboard.Open(): |
1016 dataobj = wx.TextDataObject() |
887 dataobj = wx.TextDataObject() |
1017 if wx.TheClipboard.GetData(dataobj): |
888 if wx.TheClipboard.GetData(dataobj): |
1018 data = dataobj.GetText() |
889 data = dataobj.GetText() |
1019 wx.TheClipboard.Close() |
890 wx.TheClipboard.Close() |
1020 return data |
891 return data |
1021 |
892 |
1022 def SetCopyBuffer(self, text): |
893 def SetCopyBuffer(self, text, primary_selection=False): |
|
894 if primary_selection and wx.Platform == '__WXMSW__': |
|
895 return |
|
896 else: |
|
897 wx.TheClipboard.UsePrimarySelection(primary_selection) |
1023 if wx.TheClipboard.Open(): |
898 if wx.TheClipboard.Open(): |
1024 data = wx.TextDataObject() |
899 data = wx.TextDataObject() |
1025 data.SetText(text) |
900 data.SetText(text) |
1026 wx.TheClipboard.SetData(data) |
901 wx.TheClipboard.SetData(data) |
1027 wx.TheClipboard.Flush() |
902 wx.TheClipboard.Flush() |
1315 elif isinstance(control, wx.TextCtrl): |
1190 elif isinstance(control, wx.TextCtrl): |
1316 control.SetSelection(0, control.GetLastPosition()) |
1191 control.SetSelection(0, control.GetLastPosition()) |
1317 elif isinstance(control, wx.ComboBox): |
1192 elif isinstance(control, wx.ComboBox): |
1318 control.SetMark(0, control.GetLastPosition() + 1) |
1193 control.SetMark(0, control.GetLastPosition() + 1) |
1319 |
1194 |
1320 DeleteFunctions = { |
1195 def SetDeleteFunctions(self): |
1321 ITEM_DATATYPE: GetDeleteElementFunction(PLCControler.ProjectRemoveDataType, check_function=PLCControler.DataTypeIsUsed), |
1196 self.DeleteFunctions = { |
1322 ITEM_POU: GetDeleteElementFunction(PLCControler.ProjectRemovePou, check_function=PLCControler.PouIsUsed), |
1197 ITEM_DATATYPE: GetDeleteElementFunction( |
1323 ITEM_TRANSITION: GetDeleteElementFunction(PLCControler.ProjectRemovePouTransition, ITEM_POU), |
1198 PLCControler.ProjectRemoveDataType, |
1324 ITEM_ACTION: GetDeleteElementFunction(PLCControler.ProjectRemovePouAction, ITEM_POU), |
1199 check_function=self.CheckDataTypeIsUsedBeforeDeletion), |
1325 ITEM_CONFIGURATION: GetDeleteElementFunction(PLCControler.ProjectRemoveConfiguration), |
1200 ITEM_POU: GetDeleteElementFunction( |
1326 ITEM_RESOURCE: GetDeleteElementFunction(PLCControler.ProjectRemoveConfigurationResource, ITEM_CONFIGURATION) |
1201 PLCControler.ProjectRemovePou, |
1327 } |
1202 check_function=self.CheckPouIsUsedBeforeDeletion), |
|
1203 ITEM_TRANSITION: GetDeleteElementFunction( |
|
1204 PLCControler.ProjectRemovePouTransition, ITEM_POU), |
|
1205 ITEM_ACTION: GetDeleteElementFunction( |
|
1206 PLCControler.ProjectRemovePouAction, ITEM_POU), |
|
1207 ITEM_CONFIGURATION: GetDeleteElementFunction( |
|
1208 PLCControler.ProjectRemoveConfiguration), |
|
1209 ITEM_RESOURCE: GetDeleteElementFunction( |
|
1210 PLCControler.ProjectRemoveConfigurationResource, ITEM_CONFIGURATION) |
|
1211 } |
1328 |
1212 |
1329 def OnDeleteMenu(self, event): |
1213 def OnDeleteMenu(self, event): |
1330 window = self.FindFocus() |
1214 window = self.FindFocus() |
1331 if window == self.ProjectTree or window is None: |
1215 if window == self.ProjectTree or window is None: |
1332 selected = self.ProjectTree.GetSelection() |
1216 selected = self.ProjectTree.GetSelection() |
1333 if selected.IsOk(): |
1217 if selected is not None and selected.IsOk(): |
1334 function = self.DeleteFunctions.get(self.ProjectTree.GetPyData(selected)["type"], None) |
1218 function = self.DeleteFunctions.get(self.ProjectTree.GetPyData(selected)["type"], None) |
1335 if function is not None: |
1219 if function is not None: |
1336 function(self, selected) |
1220 function(self, selected) |
1337 self.CloseTabsWithoutModel() |
1221 self.CloseTabsWithoutModel() |
1338 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, |
1222 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, |
1453 def EnsureTabVisible(self, tab): |
1337 def EnsureTabVisible(self, tab): |
1454 notebook = tab.GetParent() |
1338 notebook = tab.GetParent() |
1455 notebook.SetSelection(notebook.GetPageIndex(tab)) |
1339 notebook.SetSelection(notebook.GetPageIndex(tab)) |
1456 |
1340 |
1457 def OnPouSelectedChanging(self, event): |
1341 def OnPouSelectedChanging(self, event): |
1458 if not self.Starting: |
1342 selected = self.TabsOpened.GetSelection() |
1459 selected = self.TabsOpened.GetSelection() |
1343 if selected >= 0: |
1460 if selected >= 0: |
1344 window = self.TabsOpened.GetPage(selected) |
1461 window = self.TabsOpened.GetPage(selected) |
1345 if not window.IsDebugging(): |
1462 if not window.IsDebugging(): |
1346 window.ResetBuffer() |
1463 window.ResetBuffer() |
|
1464 event.Skip() |
1347 event.Skip() |
1465 |
1348 |
1466 def OnPouSelectedChanged(self, event): |
1349 def OnPouSelectedChanged(self, event): |
1467 if not self.Starting: |
1350 selected = self.TabsOpened.GetSelection() |
1468 selected = self.TabsOpened.GetSelection() |
1351 if selected >= 0: |
1469 if selected >= 0: |
1352 window = self.TabsOpened.GetPage(selected) |
1470 window = self.TabsOpened.GetPage(selected) |
1353 tagname = window.GetTagName() |
1471 tagname = window.GetTagName() |
1354 if not window.IsDebugging(): |
1472 if not window.IsDebugging(): |
1355 self.SelectProjectTreeItem(tagname) |
1473 wx.CallAfter(self.SelectProjectTreeItem, tagname) |
1356 self.PouInstanceVariablesPanel.SetPouType(tagname) |
1474 wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname) |
1357 window.RefreshView() |
1475 window.RefreshView() |
1358 self.EnsureTabVisible(self.LibraryPanel) |
1476 self.EnsureTabVisible(self.LibraryPanel) |
1359 else: |
1477 else: |
1360 instance_path = window.GetInstancePath() |
1478 instance_path = window.GetInstancePath() |
1361 if tagname == "": |
1479 if tagname == "": |
1362 instance_path = instance_path.rsplit(".", 1)[0] |
1480 instance_path = instance_path.rsplit(".", 1)[0] |
1363 tagname = self.Controler.GetPouInstanceTagName(instance_path, self.EnableDebug) |
1481 tagname = self.Controler.GetPouInstanceTagName(instance_path, self.EnableDebug) |
1364 self.EnsureTabVisible(self.DebugVariablePanel) |
1482 self.EnsureTabVisible(self.DebugVariablePanel) |
1365 wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname, instance_path) |
1483 wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname, instance_path) |
1366 wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR) |
1484 wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR) |
|
1485 event.Skip() |
1367 event.Skip() |
1486 |
1368 |
1487 def RefreshEditor(self): |
1369 def RefreshEditor(self): |
1488 selected = self.TabsOpened.GetSelection() |
1370 selected = self.TabsOpened.GetSelection() |
1489 if selected >= 0: |
1371 if selected >= 0: |
1542 #------------------------------------------------------------------------------- |
1424 #------------------------------------------------------------------------------- |
1543 # Types Tree Management Functions |
1425 # Types Tree Management Functions |
1544 #------------------------------------------------------------------------------- |
1426 #------------------------------------------------------------------------------- |
1545 |
1427 |
1546 def RefreshProjectTree(self): |
1428 def RefreshProjectTree(self): |
|
1429 # Extract current selected item tagname |
|
1430 selected = self.ProjectTree.GetSelection() |
|
1431 if selected is not None and selected.IsOk(): |
|
1432 item_infos = self.ProjectTree.GetPyData(selected) |
|
1433 tagname = item_infos.get("tagname", None) |
|
1434 else: |
|
1435 tagname = None |
|
1436 |
|
1437 # Refresh treectrl items according to project infos |
1547 infos = self.Controler.GetProjectInfos() |
1438 infos = self.Controler.GetProjectInfos() |
1548 root = self.ProjectTree.GetRootItem() |
1439 root = self.ProjectTree.GetRootItem() |
1549 if not root.IsOk(): |
1440 if root is None or not root.IsOk(): |
1550 root = self.ProjectTree.AddRoot(infos["name"]) |
1441 root = self.ProjectTree.AddRoot(infos["name"]) |
1551 self.GenerateProjectTreeBranch(root, infos) |
1442 self.GenerateProjectTreeBranch(root, infos) |
1552 self.ProjectTree.Expand(root) |
1443 self.ProjectTree.Expand(root) |
1553 |
1444 |
1554 def ResetSelectedItem(self): |
1445 # Select new item corresponding to previous selected item |
1555 self.SelectedItem = None |
1446 if tagname is not None: |
1556 |
1447 self.SelectProjectTreeItem(tagname) |
1557 def GenerateProjectTreeBranch(self, root, infos): |
1448 |
|
1449 def GenerateProjectTreeBranch(self, root, infos, item_alone=False): |
1558 to_delete = [] |
1450 to_delete = [] |
1559 item_name = infos["name"] |
1451 item_name = infos["name"] |
1560 if infos["type"] in ITEMS_UNEDITABLE: |
1452 if infos["type"] in ITEMS_UNEDITABLE: |
1561 if len(infos["values"]) == 1: |
1453 if len(infos["values"]) == 1: |
1562 return self.GenerateProjectTreeBranch(root, infos["values"][0]) |
1454 return self.GenerateProjectTreeBranch(root, infos["values"][0], True) |
1563 item_name = _(item_name) |
1455 item_name = _(item_name) |
1564 self.ProjectTree.SetItemText(root, item_name) |
1456 self.ProjectTree.SetItemText(root, item_name) |
1565 self.ProjectTree.SetPyData(root, infos) |
1457 self.ProjectTree.SetPyData(root, infos) |
1566 highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK)) |
1458 highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK)) |
1567 self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0]) |
1459 self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0]) |
1568 self.ProjectTree.SetItemTextColour(root, highlight_colours[1]) |
1460 self.ProjectTree.SetItemTextColour(root, highlight_colours[1]) |
|
1461 self.ProjectTree.SetItemExtraImage(root, None) |
1569 if infos["type"] == ITEM_POU: |
1462 if infos["type"] == ITEM_POU: |
1570 self.ProjectTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])]) |
1463 self.ProjectTree.SetItemImage(root, |
|
1464 self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])]) |
|
1465 if item_alone: |
|
1466 self.ProjectTree.SetItemExtraImage(root, self.Controler.GetPouType(infos["name"])) |
1571 elif infos.has_key("icon") and infos["icon"] is not None: |
1467 elif infos.has_key("icon") and infos["icon"] is not None: |
1572 icon_name = infos["icon"] |
1468 icon_name = infos["icon"] |
1573 if not self.TreeImageDict.has_key(icon_name): |
1469 if not self.TreeImageDict.has_key(icon_name): |
1574 self.TreeImageDict[icon_name] = self.TreeImageList.Add(GetBitmap(icon_name)) |
1470 self.TreeImageDict[icon_name] = self.TreeImageList.Add(GetBitmap(icon_name)) |
1575 self.ProjectTree.SetItemImage(root, self.TreeImageDict[icon_name]) |
1471 self.ProjectTree.SetItemImage(root, self.TreeImageDict[icon_name]) |
1576 elif self.TreeImageDict.has_key(infos["type"]): |
1472 elif self.TreeImageDict.has_key(infos["type"]): |
1577 self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]]) |
1473 self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]]) |
1578 |
1474 |
1579 if wx.VERSION >= (2, 6, 0): |
1475 item, root_cookie = self.ProjectTree.GetFirstChild(root) |
1580 item, root_cookie = self.ProjectTree.GetFirstChild(root) |
|
1581 else: |
|
1582 item, root_cookie = self.ProjectTree.GetFirstChild(root, 0) |
|
1583 for values in infos["values"]: |
1476 for values in infos["values"]: |
1584 if values["type"] not in ITEMS_UNEDITABLE or len(values["values"]) > 0: |
1477 if values["type"] not in ITEMS_UNEDITABLE or len(values["values"]) > 0: |
1585 if not item.IsOk(): |
1478 if item is None or not item.IsOk(): |
1586 item = self.ProjectTree.AppendItem(root, "") |
1479 item = self.ProjectTree.AppendItem(root, "") |
1587 if wx.Platform != '__WXMSW__': |
1480 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) |
1588 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) |
|
1589 self.GenerateProjectTreeBranch(item, values) |
1481 self.GenerateProjectTreeBranch(item, values) |
1590 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) |
1482 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) |
1591 while item.IsOk(): |
1483 while item is not None and item.IsOk(): |
1592 to_delete.append(item) |
1484 to_delete.append(item) |
1593 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) |
1485 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) |
1594 for item in to_delete: |
1486 for item in to_delete: |
1595 self.ProjectTree.Delete(item) |
1487 self.ProjectTree.Delete(item) |
1596 |
1488 |
|
1489 TagNamePartsItemTypes = { |
|
1490 "D": [ITEM_DATATYPE], |
|
1491 "P": [ITEM_POU], |
|
1492 "T": [ITEM_POU, ITEM_TRANSITION], |
|
1493 "A": [ITEM_POU, ITEM_ACTION], |
|
1494 "C": [ITEM_CONFIGURATION], |
|
1495 "R": [ITEM_CONFIGURATION, ITEM_RESOURCE]} |
|
1496 |
1597 def SelectProjectTreeItem(self, tagname): |
1497 def SelectProjectTreeItem(self, tagname): |
|
1498 result = False |
1598 if self.ProjectTree is not None: |
1499 if self.ProjectTree is not None: |
1599 root = self.ProjectTree.GetRootItem() |
1500 root = self.ProjectTree.GetRootItem() |
1600 if root.IsOk(): |
1501 if root is not None and root.IsOk(): |
1601 words = tagname.split("::") |
1502 words = tagname.split("::") |
1602 if words[0] == "D": |
1503 result = self.RecursiveProjectTreeItemSelection(root, |
1603 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_DATATYPE)]) |
1504 zip(words[1:], self.TagNamePartsItemTypes.get(words[0], []))) |
1604 elif words[0] == "P": |
1505 return result |
1605 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU)]) |
|
1606 elif words[0] == "T": |
|
1607 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)]) |
|
1608 elif words[0] == "A": |
|
1609 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)]) |
|
1610 elif words[0] == "C": |
|
1611 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION)]) |
|
1612 elif words[0] == "R": |
|
1613 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)]) |
|
1614 return False |
|
1615 |
1506 |
1616 def RecursiveProjectTreeItemSelection(self, root, items): |
1507 def RecursiveProjectTreeItemSelection(self, root, items): |
1617 found = False |
1508 found = False |
1618 if wx.VERSION >= (2, 6, 0): |
1509 item, root_cookie = self.ProjectTree.GetFirstChild(root) |
1619 item, root_cookie = self.ProjectTree.GetFirstChild(root) |
1510 while item is not None and item.IsOk() and not found: |
1620 else: |
|
1621 item, root_cookie = self.ProjectTree.GetFirstChild(root, 0) |
|
1622 while item.IsOk() and not found: |
|
1623 item_infos = self.ProjectTree.GetPyData(item) |
1511 item_infos = self.ProjectTree.GetPyData(item) |
1624 if (item_infos["name"].split(":")[-1].strip(), item_infos["type"]) == items[0]: |
1512 if (item_infos["name"].split(":")[-1].strip(), item_infos["type"]) == items[0]: |
1625 if len(items) == 1: |
1513 if len(items) == 1: |
1626 self.SelectedItem = item |
1514 self.SelectedItem = item |
1627 wx.CallAfter(self.ProjectTree.SelectItem, item) |
1515 self.ProjectTree.SelectItem(item) |
1628 wx.CallAfter(self.ResetSelectedItem) |
1516 self.ResetSelectedItem() |
1629 return True |
1517 return True |
1630 else: |
1518 else: |
1631 found = self.RecursiveProjectTreeItemSelection(item, items[1:]) |
1519 found = self.RecursiveProjectTreeItemSelection(item, items[1:]) |
1632 else: |
1520 else: |
1633 found = self.RecursiveProjectTreeItemSelection(item, items) |
1521 found = self.RecursiveProjectTreeItemSelection(item, items) |
1634 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) |
1522 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) |
1635 return found |
1523 return found |
1636 |
1524 |
|
1525 def ResetSelectedItem(self): |
|
1526 self.SelectedItem = None |
|
1527 |
1637 def OnProjectTreeBeginDrag(self, event): |
1528 def OnProjectTreeBeginDrag(self, event): |
1638 if wx.Platform == '__WXMSW__': |
1529 selected_item = (self.SelectedItem |
1639 self.SelectedItem = event.GetItem() |
1530 if self.SelectedItem is not None |
1640 if self.SelectedItem is not None and self.ProjectTree.GetPyData(self.SelectedItem)["type"] == ITEM_POU: |
1531 else event.GetItem()) |
1641 block_name = self.ProjectTree.GetItemText(self.SelectedItem) |
1532 if selected_item.IsOk() and self.ProjectTree.GetPyData(selected_item)["type"] == ITEM_POU: |
|
1533 block_name = self.ProjectTree.GetItemText(selected_item) |
1642 block_type = self.Controler.GetPouType(block_name) |
1534 block_type = self.Controler.GetPouType(block_name) |
1643 if block_type != "program": |
1535 if block_type != "program": |
1644 data = wx.TextDataObject(str((block_name, block_type, ""))) |
1536 data = wx.TextDataObject(str((block_name, block_type, ""))) |
1645 dragSource = wx.DropSource(self.ProjectTree) |
1537 dragSource = wx.DropSource(self.ProjectTree) |
1646 dragSource.SetData(data) |
1538 dragSource.SetData(data) |
1694 self.RefreshLibraryPanel() |
1586 self.RefreshLibraryPanel() |
1695 self.RefreshPageTitles() |
1587 self.RefreshPageTitles() |
1696 elif item_infos["type"] == ITEM_TRANSITION: |
1588 elif item_infos["type"] == ITEM_TRANSITION: |
1697 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]: |
1589 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]: |
1698 message = _("A POU named \"%s\" already exists!")%new_name |
1590 message = _("A POU named \"%s\" already exists!")%new_name |
1699 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]: |
1591 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames(pou_name) if name != old_name]: |
1700 message = _("A variable with \"%s\" as name already exists in this pou!")%new_name |
1592 message = _("A variable with \"%s\" as name already exists in this pou!")%new_name |
1701 else: |
1593 else: |
1702 words = item_infos["tagname"].split("::") |
1594 words = item_infos["tagname"].split("::") |
1703 self.Controler.ChangePouTransitionName(words[1], old_name, new_name) |
1595 self.Controler.ChangePouTransitionName(words[1], old_name, new_name) |
1704 self.RefreshEditorNames(self.Controler.ComputePouTransitionName(words[1], old_name), |
1596 self.RefreshEditorNames(self.Controler.ComputePouTransitionName(words[1], old_name), |
1705 self.Controler.ComputePouTransitionName(words[1], new_name)) |
1597 self.Controler.ComputePouTransitionName(words[1], new_name)) |
1706 self.RefreshPageTitles() |
1598 self.RefreshPageTitles() |
1707 elif item_infos["type"] == ITEM_ACTION: |
1599 elif item_infos["type"] == ITEM_ACTION: |
1708 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]: |
1600 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]: |
1709 message = _("A POU named \"%s\" already exists!")%new_name |
1601 message = _("A POU named \"%s\" already exists!")%new_name |
1710 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]: |
1602 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames(pou_name) if name != old_name]: |
1711 message = _("A variable with \"%s\" as name already exists in this pou!")%new_name |
1603 message = _("A variable with \"%s\" as name already exists in this pou!")%new_name |
1712 else: |
1604 else: |
1713 words = item_infos["tagname"].split("::") |
1605 words = item_infos["tagname"].split("::") |
1714 self.Controler.ChangePouActionName(words[1], old_name, new_name) |
1606 self.Controler.ChangePouActionName(words[1], old_name, new_name) |
1715 self.RefreshEditorNames(self.Controler.ComputePouActionName(words[1], old_name), |
1607 self.RefreshEditorNames(self.Controler.ComputePouActionName(words[1], old_name), |
1778 ITEM_TRANSITION, ITEM_ACTION]: |
1670 ITEM_TRANSITION, ITEM_ACTION]: |
1779 self.EditProjectElement(item_infos["type"], item_infos["tagname"]) |
1671 self.EditProjectElement(item_infos["type"], item_infos["tagname"]) |
1780 event.Skip() |
1672 event.Skip() |
1781 |
1673 |
1782 def ProjectTreeItemSelect(self, select_item): |
1674 def ProjectTreeItemSelect(self, select_item): |
1783 name = self.ProjectTree.GetItemText(select_item) |
1675 if select_item is not None and select_item.IsOk(): |
1784 item_infos = self.ProjectTree.GetPyData(select_item) |
1676 name = self.ProjectTree.GetItemText(select_item) |
1785 if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU, |
1677 item_infos = self.ProjectTree.GetPyData(select_item) |
1786 ITEM_CONFIGURATION, ITEM_RESOURCE, |
1678 if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU, |
1787 ITEM_TRANSITION, ITEM_ACTION]: |
1679 ITEM_CONFIGURATION, ITEM_RESOURCE, |
1788 self.EditProjectElement(item_infos["type"], item_infos["tagname"], True) |
1680 ITEM_TRANSITION, ITEM_ACTION]: |
1789 self.PouInstanceVariablesPanel.SetPouType(item_infos["tagname"]) |
1681 self.EditProjectElement(item_infos["type"], item_infos["tagname"], True) |
|
1682 self.PouInstanceVariablesPanel.SetPouType(item_infos["tagname"]) |
1790 |
1683 |
1791 def OnProjectTreeLeftUp(self, event): |
1684 def OnProjectTreeLeftUp(self, event): |
1792 if self.SelectedItem is not None: |
1685 if self.SelectedItem is not None: |
1793 self.ProjectTree.SelectItem(self.SelectedItem) |
1686 self.ProjectTree.SelectItem(self.SelectedItem) |
1794 self.ProjectTreeItemSelect(self.SelectedItem) |
1687 self.ProjectTreeItemSelect(self.SelectedItem) |
1795 wx.CallAfter(self.ResetSelectedItem) |
1688 self.ResetSelectedItem() |
1796 event.Skip() |
1689 event.Skip() |
1797 |
1690 |
1798 def OnProjectTreeItemSelected(self, event): |
1691 def OnProjectTreeMotion(self, event): |
1799 self.ProjectTreeItemSelect(event.GetItem()) |
1692 if not event.Dragging(): |
|
1693 pt = wx.Point(event.GetX(), event.GetY()) |
|
1694 item, flags = self.ProjectTree.HitTest(pt) |
|
1695 if item is not None and item.IsOk() and flags & wx.TREE_HITTEST_ONITEMLABEL: |
|
1696 item_infos = self.ProjectTree.GetPyData(item) |
|
1697 if item != self.LastToolTipItem and self.LastToolTipItem is not None: |
|
1698 self.ProjectTree.SetToolTip(None) |
|
1699 self.LastToolTipItem = None |
|
1700 if (self.LastToolTipItem != item and |
|
1701 item_infos["type"] in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]): |
|
1702 bodytype = self.Controler.GetEditedElementBodyType( |
|
1703 item_infos["tagname"]) |
|
1704 if item_infos["type"] == ITEM_POU: |
|
1705 block_type = { |
|
1706 "program": _("Program"), |
|
1707 "functionBlock": _("Function Block"), |
|
1708 "function": _("Function") |
|
1709 }[self.Controler.GetPouType(item_infos["name"])] |
|
1710 elif item_infos["type"] == ITEM_TRANSITION: |
|
1711 block_type = "Transition" |
|
1712 else: |
|
1713 block_type = "Action" |
|
1714 self.LastToolTipItem = item |
|
1715 wx.CallAfter(self.ProjectTree.SetToolTipString, |
|
1716 "%s : %s : %s" % ( |
|
1717 block_type, bodytype, item_infos["name"])) |
|
1718 elif self.LastToolTipItem is not None: |
|
1719 self.ProjectTree.SetToolTip(None) |
|
1720 self.LastToolTipItem = None |
1800 event.Skip() |
1721 event.Skip() |
1801 |
1722 |
1802 def OnProjectTreeItemChanging(self, event): |
1723 def OnProjectTreeItemChanging(self, event): |
1803 if self.ProjectTree.GetPyData(event.GetItem())["type"] not in ITEMS_UNEDITABLE and self.SelectedItem is None: |
1724 if self.ProjectTree.GetPyData(event.GetItem())["type"] not in ITEMS_UNEDITABLE and self.SelectedItem is None: |
1804 self.SelectedItem = event.GetItem() |
1725 self.SelectedItem = event.GetItem() |
2435 pou_xml = self.GetCopyBuffer() |
2342 pou_xml = self.GetCopyBuffer() |
2436 |
2343 |
2437 result = self.Controler.PastePou(pou_type, pou_xml) |
2344 result = self.Controler.PastePou(pou_type, pou_xml) |
2438 |
2345 |
2439 if not isinstance(result, TupleType): |
2346 if not isinstance(result, TupleType): |
2440 message = wx.MessageDialog(self, result, _("Error"), wx.OK|wx.ICON_ERROR) |
2347 self.ShowErrorMessage(result) |
2441 message.ShowModal() |
|
2442 message.Destroy() |
|
2443 else: |
2348 else: |
2444 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE) |
2349 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE) |
2445 self.EditProjectElement(ITEM_POU, result[0]) |
2350 self.EditProjectElement(ITEM_POU, result[0]) |
2446 |
2351 |
2447 #------------------------------------------------------------------------------- |
2352 #------------------------------------------------------------------------------- |
2448 # Remove Project Elements Functions |
2353 # Remove Project Elements Functions |
2449 #------------------------------------------------------------------------------- |
2354 #------------------------------------------------------------------------------- |
2450 |
2355 |
|
2356 def CheckElementIsUsedBeforeDeletion(self, check_function, title, name): |
|
2357 if not check_function(name): |
|
2358 return True |
|
2359 |
|
2360 dialog = wx.MessageDialog(self, |
|
2361 _("\"%s\" is used by one or more POUs. Do you wish to continue?") % name, |
|
2362 title, wx.YES_NO|wx.ICON_QUESTION) |
|
2363 answer = dialog.ShowModal() |
|
2364 dialog.Destroy() |
|
2365 return answer == wx.ID_YES |
|
2366 |
|
2367 def CheckDataTypeIsUsedBeforeDeletion(self, name): |
|
2368 return self.CheckElementIsUsedBeforeDeletion( |
|
2369 self.Controler.DataTypeIsUsed, |
|
2370 _("Remove Datatype"), name) |
|
2371 |
|
2372 def CheckPouIsUsedBeforeDeletion(self, name): |
|
2373 return self.CheckElementIsUsedBeforeDeletion( |
|
2374 self.Controler.PouIsUsed, |
|
2375 _("Remove Pou"), name) |
|
2376 |
2451 def OnRemoveDataTypeMenu(self, event): |
2377 def OnRemoveDataTypeMenu(self, event): |
2452 selected = self.ProjectTree.GetSelection() |
2378 selected = self.ProjectTree.GetSelection() |
2453 if self.ProjectTree.GetPyData(selected)["type"] == ITEM_DATATYPE: |
2379 if self.ProjectTree.GetPyData(selected)["type"] == ITEM_DATATYPE: |
2454 name = self.ProjectTree.GetItemText(selected) |
2380 name = self.ProjectTree.GetItemText(selected) |
2455 if not self.Controler.DataTypeIsUsed(name): |
2381 if self.CheckDataTypeIsUsedBeforeDeletion(name): |
2456 self.Controler.ProjectRemoveDataType(name) |
2382 self.Controler.ProjectRemoveDataType(name) |
2457 tagname = self.Controler.ComputeDataTypeName(name) |
2383 tagname = self.Controler.ComputeDataTypeName(name) |
2458 idx = self.IsOpened(tagname) |
2384 idx = self.IsOpened(tagname) |
2459 if idx is not None: |
2385 if idx is not None: |
2460 self.TabsOpened.DeletePage(idx) |
2386 self.TabsOpened.DeletePage(idx) |
2461 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE) |
2387 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE) |
2462 else: |
2388 |
2463 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")) |
|
2464 |
|
2465 def OnRenamePouMenu(self, event): |
2389 def OnRenamePouMenu(self, event): |
2466 selected = self.ProjectTree.GetSelection() |
2390 selected = self.ProjectTree.GetSelection() |
2467 if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: |
2391 if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: |
2468 wx.CallAfter(self.ProjectTree.EditLabel, selected) |
2392 wx.CallAfter(self.ProjectTree.EditLabel, selected) |
2469 |
2393 |
2470 def OnRemovePouMenu(self, event): |
2394 def OnRemovePouMenu(self, event): |
2471 selected = self.ProjectTree.GetSelection() |
2395 selected = self.ProjectTree.GetSelection() |
2472 if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: |
2396 if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: |
2473 name = self.ProjectTree.GetItemText(selected) |
2397 name = self.ProjectTree.GetItemText(selected) |
2474 if not self.Controler.PouIsUsed(name): |
2398 if self.CheckPouIsUsedBeforeDeletion(name): |
2475 self.Controler.ProjectRemovePou(name) |
2399 self.Controler.ProjectRemovePou(name) |
2476 tagname = self.Controler.ComputePouName(name) |
2400 tagname = self.Controler.ComputePouName(name) |
2477 idx = self.IsOpened(tagname) |
2401 idx = self.IsOpened(tagname) |
2478 if idx is not None: |
2402 if idx is not None: |
2479 self.TabsOpened.DeletePage(idx) |
2403 self.TabsOpened.DeletePage(idx) |
2480 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE) |
2404 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE) |
2481 else: |
|
2482 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")) |
|
2483 |
2405 |
2484 def OnRemoveTransitionMenu(self, event): |
2406 def OnRemoveTransitionMenu(self, event): |
2485 selected = self.ProjectTree.GetSelection() |
2407 selected = self.ProjectTree.GetSelection() |
2486 item_infos = self.ProjectTree.GetPyData(selected) |
2408 item_infos = self.ProjectTree.GetPyData(selected) |
2487 if item_infos["type"] == ITEM_TRANSITION: |
2409 if item_infos["type"] == ITEM_TRANSITION: |