IDEFrame.py
changeset 980 c7ba67d01d65
parent 970 0dd89c8eeef5
child 981 fc671a3e95a9
equal deleted inserted replaced
979:1a68113a323d 980:c7ba67d01d65
   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()