298 NOTEBOOK_BORDER = 6 |
298 NOTEBOOK_BORDER = 6 |
299 else: |
299 else: |
300 TAB_BORDER = 7 |
300 TAB_BORDER = 7 |
301 NOTEBOOK_BORDER = 2 |
301 NOTEBOOK_BORDER = 2 |
302 |
302 |
303 def SimplifyTabOrganization(tabs, rect): |
303 def SimplifyTabLayout(tabs, rect): |
304 for tab in tabs: |
304 for tab in tabs: |
305 if tab["pos"][0] == rect.x: |
305 if tab["pos"][0] == rect.x: |
306 others = [t for t in tabs if t != tab] |
306 others = [t for t in tabs if t != tab] |
307 others.sort(lambda x,y: cmp(x["pos"][0], y["pos"][0])) |
307 others.sort(lambda x,y: cmp(x["pos"][0], y["pos"][0])) |
308 for other in others: |
308 for other in others: |
364 break |
364 break |
365 if split != None: |
365 if split != None: |
366 split_tab = tabs.pop(idx) |
366 split_tab = tabs.pop(idx) |
367 return {"split": split, |
367 return {"split": split, |
368 "tab": split_tab, |
368 "tab": split_tab, |
369 "others": ComputeTabsOrganization(tabs, split_rect)} |
369 "others": ComputeTabsLayout(tabs, split_rect)} |
370 else: |
370 else: |
371 if SimplifyTabOrganization(tabs, rect): |
371 if SimplifyTabLayout(tabs, rect): |
372 return ComputeTabsOrganization(tabs, rect) |
372 return ComputeTabsLayout(tabs, rect) |
373 return tabs |
373 return tabs |
374 |
374 |
375 #------------------------------------------------------------------------------- |
375 #------------------------------------------------------------------------------- |
376 # IDEFrame Base Class |
376 # IDEFrame Base Class |
377 #------------------------------------------------------------------------------- |
377 #------------------------------------------------------------------------------- |
768 # Saving and restoring frame organization functions |
768 # Saving and restoring frame organization functions |
769 #------------------------------------------------------------------------------- |
769 #------------------------------------------------------------------------------- |
770 |
770 |
771 def OnResize(self, event): |
771 def OnResize(self, event): |
772 if self.Starting: |
772 if self.Starting: |
773 self.RestoreLastOrganization() |
773 self.RestoreLastLayout() |
774 if wx.Platform == '__WXMSW__': |
774 if wx.Platform == '__WXMSW__': |
775 wx.CallAfter(self.ResetStarting) |
775 wx.CallAfter(self.ResetStarting) |
776 else: |
776 else: |
777 self.ResetStarting() |
777 self.ResetStarting() |
778 wx.CallAfter(self.RefreshEditor) |
778 wx.CallAfter(self.RefreshEditor) |
817 for page_name, (page_ref, page_title) in self.MainTabs.iteritems(): |
817 for page_name, (page_ref, page_title) in self.MainTabs.iteritems(): |
818 if page_ref == tab: |
818 if page_ref == tab: |
819 return ("main", page_name) |
819 return ("main", page_name) |
820 return None |
820 return None |
821 |
821 |
822 def SaveTabOrganization(self, notebook): |
822 def SaveTabLayout(self, notebook): |
823 tabs = [] |
823 tabs = [] |
824 for child in notebook.GetChildren(): |
824 for child in notebook.GetChildren(): |
825 if isinstance(child, wx.aui.AuiTabCtrl): |
825 if isinstance(child, wx.aui.AuiTabCtrl): |
826 pos = child.GetPosition() |
826 pos = child.GetPosition() |
827 tab = {"pos": (pos.x, pos.y), "pages": []} |
827 tab = {"pos": (pos.x, pos.y), "pages": []} |
834 if tab_infos is not None: |
834 if tab_infos is not None: |
835 tab["pages"].append((tab_infos, page_idx == child.GetActivePage())) |
835 tab["pages"].append((tab_infos, page_idx == child.GetActivePage())) |
836 tabs.append(tab) |
836 tabs.append(tab) |
837 tabs.sort(lambda x, y: cmp(x["pos"], y["pos"])) |
837 tabs.sort(lambda x, y: cmp(x["pos"], y["pos"])) |
838 size = notebook.GetSize() |
838 size = notebook.GetSize() |
839 return ComputeTabsOrganization(tabs, wx.Rect(1, 1, size[0] - NOTEBOOK_BORDER, size[1] - NOTEBOOK_BORDER)) |
839 return ComputeTabsLayout(tabs, wx.Rect(1, 1, size[0] - NOTEBOOK_BORDER, size[1] - NOTEBOOK_BORDER)) |
840 |
840 |
841 def LoadTab(self, notebook, page_infos): |
841 def LoadTab(self, notebook, page_infos): |
842 if page_infos[0] == "main": |
842 if page_infos[0] == "main": |
843 infos = self.MainTabs.get(page_infos[1]) |
843 infos = self.MainTabs.get(page_infos[1]) |
844 if infos is not None: |
844 if infos is not None: |
856 instance_infos = self.Controler.GetInstanceInfos(instance_path, self.EnableDebug) |
856 instance_infos = self.Controler.GetInstanceInfos(instance_path, self.EnableDebug) |
857 if instance_infos is not None: |
857 if instance_infos is not None: |
858 return notebook.GetPageIndex(self.OpenDebugViewer(instance_infos["class"], instance_path, instance_infos["type"])) |
858 return notebook.GetPageIndex(self.OpenDebugViewer(instance_infos["class"], instance_path, instance_infos["type"])) |
859 return None |
859 return None |
860 |
860 |
861 def LoadTabOrganization(self, notebook, tabs, mode="all", first_index=None): |
861 def LoadTabLayout(self, notebook, tabs, mode="all", first_index=None): |
862 if isinstance(tabs, ListType): |
862 if isinstance(tabs, ListType): |
863 if len(tabs) == 0: |
863 if len(tabs) == 0: |
864 return |
864 return |
865 raise ValueError, "Not supported" |
865 raise ValueError, "Not supported" |
866 |
866 |
867 if tabs.has_key("split"): |
867 if tabs.has_key("split"): |
868 self.LoadTabOrganization(notebook, tabs["others"]) |
868 self.LoadTabLayout(notebook, tabs["others"]) |
869 |
869 |
870 split_dir, split_ratio = tabs["split"] |
870 split_dir, split_ratio = tabs["split"] |
871 first_index = self.LoadTabOrganization(notebook, tabs["tab"], mode="first") |
871 first_index = self.LoadTabLayout(notebook, tabs["tab"], mode="first") |
872 notebook.Split(first_index, split_dir) |
872 notebook.Split(first_index, split_dir) |
873 self.LoadTabOrganization(notebook, tabs["tab"], mode="others", first_index=first_index) |
873 self.LoadTabLayout(notebook, tabs["tab"], mode="others", first_index=first_index) |
874 |
874 |
875 elif mode == "first": |
875 elif mode == "first": |
876 return self.LoadTab(notebook, tabs["pages"][0][0]) |
876 return self.LoadTab(notebook, tabs["pages"][0][0]) |
877 else: |
877 else: |
878 selected = first_index |
878 selected = first_index |
897 |
897 |
898 notebooks = self.DefaultPerspective["notebooks"] |
898 notebooks = self.DefaultPerspective["notebooks"] |
899 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
899 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
900 (self.BottomNoteBook, "bottomnotebook"), |
900 (self.BottomNoteBook, "bottomnotebook"), |
901 (self.RightNoteBook, "rightnotebook")]: |
901 (self.RightNoteBook, "rightnotebook")]: |
902 self.LoadTabOrganization(notebook, notebooks.get(entry_name)) |
902 self.LoadTabLayout(notebook, notebooks.get(entry_name)) |
903 |
903 |
904 def RestoreLastState(self): |
904 def RestoreLastState(self): |
905 frame_size = None |
905 frame_size = None |
906 if self.Config.HasEntry("framesize"): |
906 if self.Config.HasEntry("framesize"): |
907 frame_size = cPickle.loads(str(self.Config.Read("framesize"))) |
907 frame_size = cPickle.loads(str(self.Config.Read("framesize"))) |
910 if frame_size is None: |
910 if frame_size is None: |
911 self.Maximize() |
911 self.Maximize() |
912 else: |
912 else: |
913 self.SetClientSize(frame_size) |
913 self.SetClientSize(frame_size) |
914 |
914 |
915 def RestoreLastOrganization(self): |
915 def RestoreLastLayout(self): |
916 notebooks = {} |
916 notebooks = {} |
917 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
917 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
918 (self.BottomNoteBook, "bottomnotebook"), |
918 (self.BottomNoteBook, "bottomnotebook"), |
919 (self.RightNoteBook, "rightnotebook")]: |
919 (self.RightNoteBook, "rightnotebook")]: |
920 notebooks[entry_name] = self.SaveTabOrganization(notebook) |
920 notebooks[entry_name] = self.SaveTabLayout(notebook) |
921 self.DefaultPerspective = { |
921 self.DefaultPerspective = { |
922 "perspective": self.AUIManager.SavePerspective(), |
922 "perspective": self.AUIManager.SavePerspective(), |
923 "notebooks": notebooks, |
923 "notebooks": notebooks, |
924 } |
924 } |
925 |
925 |
935 notebook.RemovePage(0) |
935 notebook.RemovePage(0) |
936 |
936 |
937 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
937 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
938 (self.BottomNoteBook, "bottomnotebook"), |
938 (self.BottomNoteBook, "bottomnotebook"), |
939 (self.RightNoteBook, "rightnotebook")]: |
939 (self.RightNoteBook, "rightnotebook")]: |
940 self.LoadTabOrganization(notebook, notebooks.get(entry_name)) |
940 self.LoadTabLayout(notebook, notebooks.get(entry_name)) |
941 except: |
941 except: |
942 self.ResetPerspective() |
942 self.ResetPerspective() |
943 |
943 |
944 self.LoadProjectOrganization() |
944 self.LoadProjectLayout() |
945 |
945 |
946 def SaveLastState(self): |
946 def SaveLastState(self): |
947 if not self.IsMaximized(): |
947 if not self.IsMaximized(): |
948 self.Config.Write("framesize", cPickle.dumps(self.GetClientSize())) |
948 self.Config.Write("framesize", cPickle.dumps(self.GetClientSize())) |
949 elif self.Config.HasEntry("framesize"): |
949 elif self.Config.HasEntry("framesize"): |
951 |
951 |
952 notebooks = {} |
952 notebooks = {} |
953 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
953 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"), |
954 (self.BottomNoteBook, "bottomnotebook"), |
954 (self.BottomNoteBook, "bottomnotebook"), |
955 (self.RightNoteBook, "rightnotebook")]: |
955 (self.RightNoteBook, "rightnotebook")]: |
956 notebooks[entry_name] = self.SaveTabOrganization(notebook) |
956 notebooks[entry_name] = self.SaveTabLayout(notebook) |
957 self.Config.Write("notebooks", cPickle.dumps(notebooks)) |
957 self.Config.Write("notebooks", cPickle.dumps(notebooks)) |
958 |
958 |
959 self.Config.Write("perspective", self.AUIManager.SavePerspective()) |
959 self.Config.Write("perspective", self.AUIManager.SavePerspective()) |
960 |
960 |
961 self.SaveProjectOrganization() |
961 self.SaveProjectLayout() |
962 |
962 |
963 for i in xrange(self.TabsOpened.GetPageCount()): |
963 for i in xrange(self.TabsOpened.GetPageCount()): |
964 self.SavePageState(self.TabsOpened.GetPage(i)) |
964 self.SavePageState(self.TabsOpened.GetPage(i)) |
965 |
965 |
966 self.Config.Flush() |
966 self.Config.Flush() |
967 |
967 |
968 def SaveProjectOrganization(self): |
968 def SaveProjectLayout(self): |
969 if self.Controler is not None: |
969 if self.Controler is not None: |
970 tabs = [] |
970 tabs = [] |
971 |
971 |
972 projects = {} |
972 projects = {} |
973 try: |
973 try: |
975 projects = cPickle.loads(str(self.Config.Read("projects"))) |
975 projects = cPickle.loads(str(self.Config.Read("projects"))) |
976 except: |
976 except: |
977 pass |
977 pass |
978 |
978 |
979 project_infos = projects.setdefault(os.path.realpath(self.Controler.GetFilePath()), {}) |
979 project_infos = projects.setdefault(os.path.realpath(self.Controler.GetFilePath()), {}) |
980 project_infos["tabs"] = self.SaveTabOrganization(self.TabsOpened) |
980 project_infos["tabs"] = self.SaveTabLayout(self.TabsOpened) |
981 if self.EnableDebug: |
981 if self.EnableDebug: |
982 project_infos["debug_vars"] = self.DebugVariablePanel.GetDebugVariables() |
982 project_infos["debug_vars"] = self.DebugVariablePanel.GetDebugVariables() |
983 |
983 |
984 self.Config.Write("projects", cPickle.dumps(projects)) |
984 self.Config.Write("projects", cPickle.dumps(projects)) |
985 self.Config.Flush() |
985 self.Config.Flush() |
986 |
986 |
987 def LoadProjectOrganization(self): |
987 def LoadProjectLayout(self): |
988 if self.Controler is not None: |
988 if self.Controler is not None: |
989 project = self.GetProjectConfiguration() |
989 project = self.GetProjectConfiguration() |
990 |
990 |
991 try: |
991 try: |
992 if project.has_key("tabs"): |
992 if project.has_key("tabs"): |
993 self.LoadTabOrganization(self.TabsOpened, project["tabs"]) |
993 self.LoadTabLayout(self.TabsOpened, project["tabs"]) |
994 except: |
994 except: |
995 self.DeleteAllPages() |
995 self.DeleteAllPages() |
996 |
996 |
997 if self.EnableDebug: |
997 if self.EnableDebug: |
998 try: |
998 try: |
2810 if result is None: |
2810 if result is None: |
2811 self.Controler = controler |
2811 self.Controler = controler |
2812 self.LibraryPanel.SetControler(controler) |
2812 self.LibraryPanel.SetControler(controler) |
2813 self.ProjectTree.Enable(True) |
2813 self.ProjectTree.Enable(True) |
2814 self.PouInstanceVariablesPanel.SetController(controler) |
2814 self.PouInstanceVariablesPanel.SetController(controler) |
2815 self.LoadProjectOrganization() |
2815 self.LoadProjectLayout() |
2816 self._Refresh(PROJECTTREE, LIBRARYTREE) |
2816 self._Refresh(PROJECTTREE, LIBRARYTREE) |
2817 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU) |
2817 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU) |
2818 dialog.Destroy() |
2818 dialog.Destroy() |
2819 |
2819 |
2820 if result is not None: |
2820 if result is not None: |
2821 self.ShowErrorMessage(result) |
2821 self.ShowErrorMessage(result) |
2822 |
2822 |
2823 def OnCloseProjectMenu(self, event): |
2823 def OnCloseProjectMenu(self, event): |
2824 if not self.CheckSaveBeforeClosing(): |
2824 if not self.CheckSaveBeforeClosing(): |
2825 return |
2825 return |
2826 self.SaveProjectOrganization() |
2826 self.SaveProjectLayout() |
2827 self.ResetView() |
2827 self.ResetView() |
2828 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU) |
2828 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU) |
2829 |
2829 |
2830 def OnSaveProjectMenu(self, event): |
2830 def OnSaveProjectMenu(self, event): |
2831 self.SaveProject() |
2831 self.SaveProject() |