PLCOpenEditor.py
changeset 691 361389f3ad2b
parent 690 a32548167224
child 695 8848ffb7ae2a
equal deleted inserted replaced
690:a32548167224 691:361389f3ad2b
   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:
   331                     
   331                     
   332                     if tab["size"][1] == rect.height:
   332                     if tab["size"][1] == rect.height:
   333                         return True
   333                         return True
   334     return False
   334     return False
   335     
   335     
   336 def ComputeTabsOrganization(tabs, rect):
   336 def ComputeTabsLayout(tabs, rect):
   337     if len(tabs) == 0:
   337     if len(tabs) == 0:
   338         return tabs
   338         return tabs
   339     if len(tabs) == 1:
   339     if len(tabs) == 1:
   340         return tabs[0]
   340         return tabs[0]
   341     split = None
   341     split = None
   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()