306 |
306 |
307 UNEDITABLE_NAMES_DICT = dict([(_(name), name) for name in UNEDITABLE_NAMES]) |
307 UNEDITABLE_NAMES_DICT = dict([(_(name), name) for name in UNEDITABLE_NAMES]) |
308 |
308 |
309 class IDEFrame(wx.Frame): |
309 class IDEFrame(wx.Frame): |
310 |
310 |
311 Starting = False |
|
312 |
|
313 # Compatibility function for wx versions < 2.6 |
311 # Compatibility function for wx versions < 2.6 |
314 if wx.VERSION < (2, 6, 0): |
312 if wx.VERSION < (2, 6, 0): |
315 def Bind(self, event, function, id = None): |
313 def Bind(self, event, function, id = None): |
316 if id is not None: |
314 if id is not None: |
317 event(self, id, function) |
315 event(self, id, function) |
455 wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame', |
453 wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame', |
456 parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600), |
454 parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600), |
457 style=wx.DEFAULT_FRAME_STYLE) |
455 style=wx.DEFAULT_FRAME_STYLE) |
458 self.SetClientSize(wx.Size(1000, 600)) |
456 self.SetClientSize(wx.Size(1000, 600)) |
459 self.Bind(wx.EVT_ACTIVATE, self.OnActivated) |
457 self.Bind(wx.EVT_ACTIVATE, self.OnActivated) |
460 self.Bind(wx.EVT_SIZE, self.OnResize) |
|
461 |
458 |
462 self.TabsImageList = wx.ImageList(31, 16) |
459 self.TabsImageList = wx.ImageList(31, 16) |
463 self.TabsImageListIndexes = {} |
460 self.TabsImageListIndexes = {} |
464 |
461 |
465 #----------------------------------------------------------------------- |
462 #----------------------------------------------------------------------- |
680 self.SearchParams = None |
677 self.SearchParams = None |
681 self.Highlights = {} |
678 self.Highlights = {} |
682 self.DrawingMode = FREEDRAWING_MODE |
679 self.DrawingMode = FREEDRAWING_MODE |
683 #self.DrawingMode = DRIVENDRAWING_MODE |
680 #self.DrawingMode = DRIVENDRAWING_MODE |
684 self.AuiTabCtrl = [] |
681 self.AuiTabCtrl = [] |
685 self.DefaultPerspective = None |
682 |
|
683 # Save default perspective |
|
684 notebooks = {} |
|
685 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
|
686 (self.BottomNoteBook, "bottomnotebook"), |
|
687 (self.RightNoteBook, "rightnotebook")]: |
|
688 notebooks[entry_name] = self.SaveTabLayout(notebook) |
|
689 self.DefaultPerspective = { |
|
690 "perspective": self.AUIManager.SavePerspective(), |
|
691 "notebooks": notebooks, |
|
692 } |
|
693 |
686 |
694 |
687 # Initialize Printing configuring elements |
695 # Initialize Printing configuring elements |
688 self.PrintData = wx.PrintData() |
696 self.PrintData = wx.PrintData() |
689 self.PrintData.SetPaperId(wx.PAPER_A4) |
697 self.PrintData.SetPaperId(wx.PAPER_A4) |
690 self.PrintData.SetPrintMode(wx.PRINT_MODE_PRINTER) |
698 self.PrintData.SetPrintMode(wx.PRINT_MODE_PRINTER) |
711 |
719 |
712 #------------------------------------------------------------------------------- |
720 #------------------------------------------------------------------------------- |
713 # Saving and restoring frame organization functions |
721 # Saving and restoring frame organization functions |
714 #------------------------------------------------------------------------------- |
722 #------------------------------------------------------------------------------- |
715 |
723 |
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): |
724 def GetTabInfos(self, tab): |
756 if isinstance(tab, EditorPanel): |
725 for page_name, (page_ref, page_title) in self.MainTabs.iteritems(): |
757 if tab.IsDebugging(): |
|
758 return ("debug", tab.GetInstancePath()) |
|
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: |
726 if page_ref == tab: |
764 return ("main", page_name) |
727 return ("main", page_name) |
765 return None |
728 return None |
766 |
729 |
767 def SaveTabLayout(self, notebook): |
730 def SaveTabLayout(self, notebook): |
857 self.Starting = True |
820 self.Starting = True |
858 if frame_size is None: |
821 if frame_size is None: |
859 self.Maximize() |
822 self.Maximize() |
860 else: |
823 else: |
861 self.SetClientSize(frame_size) |
824 self.SetClientSize(frame_size) |
862 wx.CallAfter(self.RestoreLastLayout) |
825 |
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): |
826 def SaveLastState(self): |
905 if not self.IsMaximized(): |
827 if not self.IsMaximized(): |
906 self.Config.Write("framesize", cPickle.dumps(self.GetClientSize())) |
828 self.Config.Write("framesize", cPickle.dumps(self.GetClientSize())) |
907 elif self.Config.HasEntry("framesize"): |
829 elif self.Config.HasEntry("framesize"): |
908 self.Config.DeleteEntry("framesize") |
830 self.Config.DeleteEntry("framesize") |
909 |
831 |
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() |
832 self.Config.Flush() |
929 |
833 |
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 #------------------------------------------------------------------------------- |
834 #------------------------------------------------------------------------------- |
967 # General Functions |
835 # General Functions |
968 #------------------------------------------------------------------------------- |
836 #------------------------------------------------------------------------------- |
969 |
837 |
970 def SetRefreshFunctions(self): |
838 def SetRefreshFunctions(self): |
996 selected = self.TabsOpened.GetSelection() |
864 selected = self.TabsOpened.GetSelection() |
997 if selected > -1: |
865 if selected > -1: |
998 window = self.TabsOpened.GetPage(selected) |
866 window = self.TabsOpened.GetPage(selected) |
999 |
867 |
1000 if window.CheckSaveBeforeClosing(): |
868 if window.CheckSaveBeforeClosing(): |
1001 if self.EnableSaveProjectState(): |
|
1002 self.SavePageState(window) |
|
1003 |
869 |
1004 # Refresh all window elements that have changed |
870 # Refresh all window elements that have changed |
1005 wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) |
871 wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) |
1006 wx.CallAfter(self.RefreshTabCtrlEvent) |
872 wx.CallAfter(self.RefreshTabCtrlEvent) |
1007 wx.CallAfter(self.CloseFindInPouDialog) |
873 wx.CallAfter(self.CloseFindInPouDialog) |
1859 elif element == ITEM_DATATYPE: |
1725 elif element == ITEM_DATATYPE: |
1860 new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler) |
1726 new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler) |
1861 new_window.SetIcon(GetBitmap("DATATYPE")) |
1727 new_window.SetIcon(GetBitmap("DATATYPE")) |
1862 self.AddPage(new_window, "") |
1728 self.AddPage(new_window, "") |
1863 if new_window is not None: |
1729 if new_window is not None: |
1864 if self.EnableSaveProjectState(): |
|
1865 project_infos = self.GetProjectConfiguration() |
|
1866 if project_infos.has_key("editors_state"): |
|
1867 if new_window.IsDebugging(): |
|
1868 state = project_infos["editors_state"].get(new_window.GetInstancePath()) |
|
1869 else: |
|
1870 state = project_infos["editors_state"].get(tagname) |
|
1871 if state is not None: |
|
1872 wx.CallAfter(new_window.SetState, state) |
|
1873 |
|
1874 openedidx = self.IsOpened(tagname) |
1730 openedidx = self.IsOpened(tagname) |
1875 old_selected = self.TabsOpened.GetSelection() |
1731 old_selected = self.TabsOpened.GetSelection() |
1876 if old_selected != openedidx: |
1732 if old_selected != openedidx: |
1877 if old_selected >= 0: |
1733 if old_selected >= 0: |
1878 self.TabsOpened.GetPage(old_selected).ResetBuffer() |
1734 self.TabsOpened.GetPage(old_selected).ResetBuffer() |
2071 icon = GetBitmap("TRANSITION", bodytype) |
1927 icon = GetBitmap("TRANSITION", bodytype) |
2072 elif instance_category == ITEM_ACTION: |
1928 elif instance_category == ITEM_ACTION: |
2073 icon = GetBitmap("ACTION", bodytype) |
1929 icon = GetBitmap("ACTION", bodytype) |
2074 |
1930 |
2075 if new_window is not None: |
1931 if new_window is not None: |
2076 if self.EnableSaveProjectState(): |
|
2077 project_infos = self.GetProjectConfiguration() |
|
2078 if project_infos.has_key("editors_state"): |
|
2079 state = project_infos["editors_state"].get(instance_path) |
|
2080 if state is not None: |
|
2081 wx.CallAfter(new_window.SetState, state) |
|
2082 |
|
2083 new_window.SetIcon(icon) |
1932 new_window.SetIcon(icon) |
2084 self.AddPage(new_window, "") |
1933 self.AddPage(new_window, "") |
2085 new_window.RefreshView() |
1934 new_window.RefreshView() |
2086 new_window.SetFocus() |
1935 new_window.SetFocus() |
2087 self.RefreshPageTitles() |
1936 self.RefreshPageTitles() |