plugins/c_ext/CFileEditor.py
changeset 630 91b2ae63ea3d
parent 626 2b9bd5dcf8d2
child 637 c19557ec2c5a
--- a/plugins/c_ext/CFileEditor.py	Mon Oct 17 09:04:13 2011 +0200
+++ b/plugins/c_ext/CFileEditor.py	Tue Nov 08 22:01:39 2011 +0100
@@ -1,8 +1,11 @@
-import  wx, wx.grid
-import  wx.stc  as  stc
 import keyword
 
-from controls import CustomGrid
+import wx
+import wx.grid
+import wx.stc as stc
+import wx.lib.buttons
+
+from controls import CustomGrid, EditorPanel
 
 if wx.Platform == '__WXMSW__':
     faces = { 'times': 'Times New Roman',
@@ -69,7 +72,7 @@
     
     def __init__(self, parent, name, window, controler):
         stc.StyledTextCtrl.__init__(self, parent, ID_CPPEDITOR, wx.DefaultPosition, 
-                 wx.DefaultSize, 0)
+                 wx.Size(0, 0), 0)
 
         self.SetMarginType(1, stc.STC_MARGIN_NUMBER)
         self.SetMarginWidth(1, 25)
@@ -231,6 +234,7 @@
             self.ParentWindow.RefreshTitle()
             self.ParentWindow.RefreshFileMenu()
             self.ParentWindow.RefreshEditMenu()
+            self.ParentWindow.RefreshPageTitles()
     
     def StartBuffering(self):
         self.Controler.StartBuffering()
@@ -238,6 +242,7 @@
             self.ParentWindow.RefreshTitle()
             self.ParentWindow.RefreshFileMenu()
             self.ParentWindow.RefreshEditMenu()
+            self.ParentWindow.RefreshPageTitles()
     
     def ResetBuffer(self):
         if self.CurrentAction != None:
@@ -262,6 +267,9 @@
         
         self.Colourise(0, -1)
 
+    def DoGetBestSize(self):
+        return self.ParentWindow.GetPanelBestSize()
+
     def RefreshModel(self):
         self.Controler.SetPartText(self.Name, self.GetText())
 
@@ -622,7 +630,7 @@
 
     def _init_ctrls(self, prnt):
         wx.Panel.__init__(self, id=ID_VARIABLESEDITOR, name='', parent=prnt,
-              size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
+              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
         
         self.VariablesGrid = CustomGrid(id=ID_VARIABLESEDITORVARIABLESGRID,
               name='VariablesGrid', parent=self, pos=wx.Point(0, 0), 
@@ -719,12 +727,16 @@
         self.ParentWindow.RefreshTitle()
         self.ParentWindow.RefreshFileMenu()
         self.ParentWindow.RefreshEditMenu()
+        self.ParentWindow.RefreshPageTitles()
 
     def RefreshView(self):
         self.Table.SetData(self.Controler.GetVariables())
         self.Table.ResetView(self.VariablesGrid)
         self.VariablesGrid.RefreshButtons()
     
+    def DoGetBestSize(self):
+        return self.ParentWindow.GetPanelBestSize()
+    
     def OnVariablesGridCellChange(self, event):
         self.RefreshModel()
         self.RefreshView()
@@ -796,264 +808,257 @@
 #                          SVGUIEditor Main Frame Class
 #-------------------------------------------------------------------------------
 
-
-CFILE_PARTS = ["Includes", "Variables", "Globals", "Init", "CleanUp", "Retrieve", 
-               "Publish"]
+CFILE_PARTS = [
+    ("Includes", CppEditor), 
+    ("Variables", VariablesEditor), 
+    ("Globals", CppEditor), 
+    ("Init", CppEditor), 
+    ("CleanUp", CppEditor), 
+    ("Retrieve", CppEditor), 
+    ("Publish", CppEditor),
+]
+
+#----------------------------------------------------------------------
+# different icons for the collapsed/expanded states.
+# Taken from standard Windows XP collapsed/expanded states.
+#----------------------------------------------------------------------
+
+def GetCollapsedIconData():
+    return \
+'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
+\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
+\x00\x01\x8eIDAT8\x8d\xa5\x93-n\xe4@\x10\x85?g\x03\n6lh)\xc4\xd2\x12\xc3\x81\
+\xd6\xa2I\x90\x154\xb9\x81\x8f1G\xc8\x11\x16\x86\xcd\xa0\x99F\xb3A\x91\xa1\
+\xc9J&\x96L"5lX\xcc\x0bl\xf7v\xb2\x7fZ\xa5\x98\xebU\xbdz\xf5\\\x9deW\x9f\xf8\
+H\\\xbfO|{y\x9dT\x15P\x04\x01\x01UPUD\x84\xdb/7YZ\x9f\xa5\n\xce\x97aRU\x8a\
+\xdc`\xacA\x00\x04P\xf0!0\xf6\x81\xa0\xf0p\xff9\xfb\x85\xe0|\x19&T)K\x8b\x18\
+\xf9\xa3\xe4\xbe\xf3\x8c^#\xc9\xd5\n\xa8*\xc5?\x9a\x01\x8a\xd2b\r\x1cN\xc3\
+\x14\t\xce\x97a\xb2F0Ks\xd58\xaa\xc6\xc5\xa6\xf7\xdfya\xe7\xbdR\x13M2\xf9\
+\xf9qKQ\x1fi\xf6-\x00~T\xfac\x1dq#\x82,\xe5q\x05\x91D\xba@\xefj\xba1\xf0\xdc\
+zzW\xcff&\xb8,\x89\xa8@Q\xd6\xaaf\xdfRm,\xee\xb1BDxr#\xae\xf5|\xddo\xd6\xe2H\
+\x18\x15\x84\xa0q@]\xe54\x8d\xa3\xedf\x05M\xe3\xd8Uy\xc4\x15\x8d\xf5\xd7\x8b\
+~\x82\x0fh\x0e"\xb0\xad,\xee\xb8c\xbb\x18\xe7\x8e;6\xa5\x89\x04\xde\xff\x1c\
+\x16\xef\xe0p\xfa>\x19\x11\xca\x8d\x8d\xe0\x93\x1b\x01\xd8m\xf3(;x\xa5\xef=\
+\xb7w\xf3\x1d$\x7f\xc1\xe0\xbd\xa7\xeb\xa0(,"Kc\x12\xc1+\xfd\xe8\tI\xee\xed)\
+\xbf\xbcN\xc1{D\x04k\x05#\x12\xfd\xf2a\xde[\x81\x87\xbb\xdf\x9cr\x1a\x87\xd3\
+0)\xba>\x83\xd5\xb97o\xe0\xaf\x04\xff\x13?\x00\xd2\xfb\xa9`z\xac\x80w\x00\
+\x00\x00\x00IEND\xaeB`\x82' 
+
+def GetCollapsedIconBitmap():
+    return wx.BitmapFromImage(GetCollapsedIconImage())
+
+def GetCollapsedIconImage():
+    import cStringIO
+    stream = cStringIO.StringIO(GetCollapsedIconData())
+    return wx.ImageFromStream(stream)
+
+#----------------------------------------------------------------------
+def GetExpandedIconData():
+    return \
+'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
+\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
+\x00\x01\x9fIDAT8\x8d\x95\x93\xa1\x8e\xdc0\x14EO\xb2\xc4\xd0\xd2\x12\xb7(mI\
+\xa4%V\xd1lQT4[4-\x9a\xfe\xc1\xc2|\xc6\xc2~BY\x83:A3E\xd3\xa0*\xa4\xd2\x90H!\
+\x95\x0c\r\r\x1fK\x81g\xb2\x99\x84\xb4\x0fY\xd6\xbb\xc7\xf7>=\'Iz\xc3\xbcv\
+\xfbn\xb8\x9c\x15 \xe7\xf3\xc7\x0fw\xc9\xbc7\x99\x03\x0e\xfbn0\x99F+\x85R\
+\x80RH\x10\x82\x08\xde\x05\x1ef\x90+\xc0\xe1\xd8\ryn\xd0Z-\\A\xb4\xd2\xf7\
+\x9e\xfbwoF\xc8\x088\x1c\xbbae\xb3\xe8y&\x9a\xdf\xf5\xbd\xe7\xfem\x84\xa4\
+\x97\xccYf\x16\x8d\xdb\xb2a]\xfeX\x18\xc9s\xc3\xe1\x18\xe7\x94\x12cb\xcc\xb5\
+\xfa\xb1l8\xf5\x01\xe7\x84\xc7\xb2Y@\xb2\xcc0\x02\xb4\x9a\x88%\xbe\xdc\xb4\
+\x9e\xb6Zs\xaa74\xadg[6\x88<\xb7]\xc6\x14\x1dL\x86\xe6\x83\xa0\x81\xba\xda\
+\x10\x02x/\xd4\xd5\x06\r\x840!\x9c\x1fM\x92\xf4\x86\x9f\xbf\xfe\x0c\xd6\x9ae\
+\xd6u\x8d \xf4\xf5\x165\x9b\x8f\x04\xe1\xc5\xcb\xdb$\x05\x90\xa97@\x04lQas\
+\xcd*7\x14\xdb\x9aY\xcb\xb8\\\xe9E\x10|\xbc\xf2^\xb0E\x85\xc95_\x9f\n\xaa/\
+\x05\x10\x81\xce\xc9\xa8\xf6><G\xd8\xed\xbbA)X\xd9\x0c\x01\x9a\xc6Q\x14\xd9h\
+[\x04\xda\xd6c\xadFkE\xf0\xc2\xab\xd7\xb7\xc9\x08\x00\xf8\xf6\xbd\x1b\x8cQ\
+\xd8|\xb9\x0f\xd3\x9a\x8a\xc7\x08\x00\x9f?\xdd%\xde\x07\xda\x93\xc3{\x19C\
+\x8a\x9c\x03\x0b8\x17\xe8\x9d\xbf\x02.>\x13\xc0n\xff{PJ\xc5\xfdP\x11""<\xbc\
+\xff\x87\xdf\xf8\xbf\xf5\x17FF\xaf\x8f\x8b\xd3\xe6K\x00\x00\x00\x00IEND\xaeB\
+`\x82' 
+
+def GetExpandedIconBitmap():
+    return wx.BitmapFromImage(GetExpandedIconImage())
+
+def GetExpandedIconImage():
+    import cStringIO
+    stream = cStringIO.StringIO(GetExpandedIconData())
+    return wx.ImageFromStream(stream)
+
+class FoldPanelCaption(wx.lib.buttons.GenBitmapTextToggleButton):
+    
+    def GetBackgroundBrush(self, dc):
+        colBg = self.GetBackgroundColour()
+        brush = wx.Brush(colBg, wx.SOLID)
+        if self.style & wx.BORDER_NONE:
+            myAttr = self.GetDefaultAttributes()
+            parAttr = self.GetParent().GetDefaultAttributes()
+            myDef = colBg == myAttr.colBg
+            parDef = self.GetParent().GetBackgroundColour() == parAttr.colBg
+            if myDef and parDef:
+                if wx.Platform == "__WXMAC__":
+                    brush.MacSetTheme(1) # 1 == kThemeBrushDialogBackgroundActive
+                elif wx.Platform == "__WXMSW__":
+                    if self.DoEraseBackground(dc):
+                        brush = None
+            elif myDef and not parDef:
+                colBg = self.GetParent().GetBackgroundColour()
+                brush = wx.Brush(colBg, wx.SOLID)
+        return brush
+    
+    def DrawLabel(self, dc, width, height, dx=0, dy=0):
+        bmp = self.bmpLabel
+        if bmp is not None:     # if the bitmap is used
+            if self.bmpDisabled and not self.IsEnabled():
+                bmp = self.bmpDisabled
+            if self.bmpFocus and self.hasFocus:
+                bmp = self.bmpFocus
+            if self.bmpSelected and not self.up:
+                bmp = self.bmpSelected
+            bw,bh = bmp.GetWidth(), bmp.GetHeight()
+            hasMask = bmp.GetMask() is not None
+        else:
+            bw = bh = 0     # no bitmap -> size is zero
+        
+        dc.SetFont(self.GetFont())
+        if self.IsEnabled():
+            dc.SetTextForeground(self.GetForegroundColour())
+        else:
+            dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT))
+
+        label = self.GetLabel()
+        tw, th = dc.GetTextExtent(label)        # size of text
+        
+        if bmp is not None:
+            dc.DrawBitmap(bmp, width - bw - 2, (height-bh)/2, hasMask) # draw bitmap if available
+        
+        dc.DrawText(label, 2, (height-th)/2)      # draw the text
+
+        dc.SetPen(wx.Pen(self.GetForegroundColour()))
+        dc.SetBrush(wx.TRANSPARENT_BRUSH)
+        dc.DrawRectangle(0, 0, width, height)
 
 [ID_CFILEEDITOR, ID_CFILEEDITORMAINSPLITTER, 
  ID_CFILEEDITORCFILETREE, ID_CFILEEDITORPARTSOPENED, 
 ] = [wx.NewId() for _init_ctrls in range(4)]
 
-class CFileEditor(wx.Frame):
-    
-    if wx.VERSION < (2, 6, 0):
-        def Bind(self, event, function, id = None):
-            if id is not None:
-                event(self, id, function)
+class CFileEditor(EditorPanel):
+    
+    def _init_Editor(self, prnt):
+        self.Editor = wx.Panel(id=-1, parent=prnt, pos=wx.Point(0, 0), 
+                size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+        
+        self.Panels = {}
+        self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2 * len(CFILE_PARTS) + 1, vgap=0)
+        self.MainSizer.AddGrowableCol(0)
+        
+        for idx, (name, panel_class) in enumerate(CFILE_PARTS):
+            button_id = wx.NewId()
+            button = FoldPanelCaption(id=button_id, name='FoldPanelCaption_%s' % name, 
+                  label=name, bitmap=GetCollapsedIconBitmap(), parent=self.Editor, pos=wx.Point(0, 0),
+                  size=wx.Size(0, 20), style=wx.NO_BORDER|wx.ALIGN_LEFT)
+            button.SetBitmapSelected(GetExpandedIconBitmap())
+            button.Bind(wx.EVT_BUTTON, self.GenPanelButtonCallback(name), id=button_id)
+            self.MainSizer.AddWindow(button, 0, border=0, flag=wx.TOP|wx.GROW)
+            
+            if panel_class == VariablesEditor:
+                panel = VariablesEditor(self.Editor, self.ParentWindow, self.Controler)
             else:
-                event(self, function)
-    
-    def _init_coll_EditMenu_Items(self, parent):
-        AppendMenu(parent, help='', id=wx.ID_REFRESH,
-              kind=wx.ITEM_NORMAL, text=u'Refresh\tCTRL+R')
-        AppendMenu(parent, help='', id=wx.ID_UNDO,
-              kind=wx.ITEM_NORMAL, text=u'Undo\tCTRL+Z')
-        AppendMenu(parent, help='', id=wx.ID_REDO,
-              kind=wx.ITEM_NORMAL, text=u'Redo\tCTRL+Y')
-        self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
-        self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
-        self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
-    
-    def _init_coll_FileMenu_Items(self, parent):
-        AppendMenu(parent, help='', id=wx.ID_SAVE,
-              kind=wx.ITEM_NORMAL, text=u'Save\tCTRL+S')
-        self.Bind(wx.EVT_MENU, self.OnSaveMenu, id=wx.ID_SAVE)
-
-    def _init_coll_MenuBar_Menus(self, parent):
-        parent.Append(menu=self.FileMenu, title=u'&File')
-        parent.Append(menu=self.EditMenu, title=u'&Edit')
-    
-    def _init_utils(self):
-        self.MenuBar = wx.MenuBar()
-
-        self.FileMenu = wx.Menu(title='')
-        self.EditMenu = wx.Menu(title='')
-        
-        self._init_coll_MenuBar_Menus(self.MenuBar)
-        self._init_coll_FileMenu_Items(self.FileMenu)
-        self._init_coll_EditMenu_Items(self.EditMenu)
-        
-    def _init_ctrls(self, prnt):
-        wx.Frame.__init__(self, id=ID_CFILEEDITOR, name=u'CFileEditor',
-              parent=prnt, pos=wx.DefaultPosition, size=wx.Size(800, 650),
-              style=wx.DEFAULT_FRAME_STYLE, title=u'CFileEditor')
-        self._init_utils()
-        self.SetClientSize(wx.Size(1000, 600))
-        self.SetMenuBar(self.MenuBar)
-        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
-        
-        self.Bind(wx.EVT_MENU, self.OnSaveMenu, id=wx.ID_SAVE)
-        accel = wx.AcceleratorTable([wx.AcceleratorEntry(wx.ACCEL_CTRL, 83, wx.ID_SAVE)])
-        self.SetAcceleratorTable(accel)
-        
-        if wx.VERSION >= (2, 8, 0):
-            self.AUIManager = wx.aui.AuiManager(self)
-            self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
-        
-        if wx.VERSION < (2, 8, 0):
-            self.MainSplitter = wx.SplitterWindow(id=ID_CFILEEDITORMAINSPLITTER, 
-                  name='MainSplitter', parent=self, point=wx.Point(0, 0),
-                  size=wx.Size(-1, -1), style=wx.SP_3D)
-            self.MainSplitter.SetNeedUpdating(True)
-            self.MainSplitter.SetMinimumPaneSize(1)
-        
-            self.CFileTree = wx.TreeCtrl(id=ID_CFILEEDITORCFILETREE, 
-                  name='CFileTree', parent=self.MainSplitter, pos=wx.Point(0, 0),
-                  size=wx.Size(-1, -1), style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
-        else:
-            self.CFileTree = wx.TreeCtrl(id=ID_CFILEEDITORCFILETREE, 
-                  name='CFileTree', parent=self, pos=wx.Point(0, 0),
-                  size=wx.Size(-1, -1), style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
-            self.AUIManager.AddPane(self.CFileTree, wx.aui.AuiPaneInfo().Caption("CFile Tree").Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False))
-        self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnCFileTreeItemSelected, 
-              id=ID_CFILEEDITORCFILETREE)
-        self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnCFileTreeItemActivated,
-              id=ID_CFILEEDITORCFILETREE)
-        
-        if wx.VERSION < (2, 8, 0):
-            self.PartsOpened = wx.Notebook(id=ID_CFILEEDITORPARTSOPENED,
-                  name='PartsOpened', parent=self.MainSplitter, pos=wx.Point(0,
-                  0), size=wx.Size(0, 0), style=0)
-            if wx.VERSION >= (2, 6, 0):
-                self.PartsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
-                    self.OnPartSelectedChanged, id=ID_CFILEEDITORPARTSOPENED)
+                panel = panel_class(self.Editor, name, self.ParentWindow, self.Controler)
+            self.MainSizer.AddWindow(panel, 0, border=0, flag=wx.BOTTOM|wx.GROW)
+            panel.Hide()
+            
+            self.Panels[name] = {"button": button, "panel": panel, "expanded": False, "row": 2 * idx + 1}
+        
+        self.Spacer = wx.Panel(self.Editor, -1)
+        self.SpacerExpanded = True
+        self.MainSizer.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
+        
+        self.MainSizer.AddGrowableRow(2 * len(CFILE_PARTS))
+        
+        self.Editor.SetSizer(self.MainSizer)
+        
+    def __init__(self, parent, controler, window):
+        EditorPanel.__init__(self, parent, "", window, controler)
+        
+        img = wx.Bitmap(self.Controler.GetIconPath("Cfile.png"), wx.BITMAP_TYPE_PNG).ConvertToImage()
+        self.SetIcon(wx.BitmapFromImage(img.Rescale(16, 16)))
+        
+    def GetTitle(self):
+        filename = self.Controler.GetFilename()
+        if not self.Controler.CFileIsSaved():
+            return "~%s~" % filename
+        return filename
+    
+    def GetBufferState(self):
+        return self.Controler.GetBufferState()
+        
+    def Undo(self):
+        self.Controler.LoadPrevious()
+        self.RefreshView()
+            
+    def Redo(self):
+        self.Controler.LoadNext()
+        self.RefreshView()
+    
+    def HasNoModel(self):
+        return False
+
+    def RefreshView(self):
+        for infos in self.Panels.itervalues():
+            infos["panel"].RefreshView()
+
+    def GenPanelButtonCallback(self, name):
+        def PanelButtonCallback(event):
+            self.TogglePanel(name)
+        return PanelButtonCallback
+
+    def ExpandPanel(self, name):
+        infos = self.Panels.get(name, None)
+        if infos is not None and not infos["expanded"]:
+            infos["expanded"] = True
+            infos["button"].SetToggle(True)
+            infos["panel"].Show()
+            self.MainSizer.AddGrowableRow(infos["row"])
+        
+            self.RefreshSizerLayout()
+    
+    def CollapsePanel(self, name):
+        infos = self.Panels.get(name, None)
+        if infos is not None and infos["expanded"]:
+            infos["expanded"] = False
+            infos["button"].SetToggle(False)
+            infos["panel"].Hide()
+            self.MainSizer.RemoveGrowableRow(infos["row"])
+        
+            self.RefreshSizerLayout()
+        
+    def TogglePanel(self, name):
+        infos = self.Panels.get(name, None)
+        if infos is not None:
+            infos["expanded"] = not infos["expanded"]
+            infos["button"].SetToggle(infos["expanded"])
+            if infos["expanded"]:
+                infos["panel"].Show()
+                self.MainSizer.AddGrowableRow(infos["row"])
             else:
-                wx.EVT_NOTEBOOK_PAGE_CHANGED(self.PartsOpened, ID_CFILEEDITORPARTSOPENED,
-                    self.OnPartSelectedChanged)
+                infos["panel"].Hide()
+                self.MainSizer.RemoveGrowableRow(infos["row"])
             
-            self.MainSplitter.SplitVertically(self.ProjectTree, self.PartsOpened, 200)
-        else:
-            self.PartsOpened = wx.aui.AuiNotebook(self)
-            self.PartsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
-                    self.OnPartSelectedChanged)
-            self.AUIManager.AddPane(self.PartsOpened, wx.aui.AuiPaneInfo().CentrePane())
+            self.RefreshSizerLayout()
+    
+    def RefreshSizerLayout(self):
+        expand_spacer = True
+        for infos in self.Panels.itervalues():
+            expand_spacer = expand_spacer and not infos["expanded"]
+        
+        if self.SpacerExpanded != expand_spacer:
+            self.SpacerExpanded = expand_spacer
+            if expand_spacer:
+                self.Spacer.Show()
+                self.MainSizer.AddGrowableRow(2 * len(CFILE_PARTS))
+            else:
+                self.Spacer.Hide()
+                self.MainSizer.RemoveGrowableRow(2 * len(CFILE_PARTS))
+        
+        self.MainSizer.Layout()
             
-        self.StatusBar = wx.StatusBar( name='HelpBar',
-              parent=self, style=wx.ST_SIZEGRIP)
-        self.SetStatusBar(self.StatusBar)
-        
-        if wx.VERSION >= (2, 8, 0):
-            self.AUIManager.Update()
-    
-    def __init__(self, parent, controler):
-        self._init_ctrls(parent)
-        
-        self.Controler = controler
-
-        self.InitCFileTree()
-        self.RefreshTitle()
-        self.RefreshEditMenu()
-
-    def OnCloseFrame(self, event):
-        if wx.VERSION >= (2, 8, 0):
-            self.AUIManager.UnInit()
-        if getattr(self, "_onclose", None) is not None:
-            self._onclose()
-        event.Skip()
-
-    def OnCloseTabMenu(self, event):
-        selected = self.PartsOpened.GetSelection()
-        if selected >= 0:
-            self.PartsOpened.DeletePage(selected)
-
-    def OnSaveMenu(self, event):
-        if getattr(self, "_onsave", None) != None:
-            self._onsave()
-        self.RefreshTitle()
-        self.RefreshEditMenu()
-
-#-------------------------------------------------------------------------------
-#                            Notebook Unified Functions
-#-------------------------------------------------------------------------------
-    
-    def DeleteAllPages(self):
-        if wx.VERSION >= (2, 8, 0):
-            for idx in xrange(self.PartsOpened.GetPageCount()):
-                self.PartsOpened.DeletePage(0)
-        else:
-            self.PartsOpened.DeleteAllPages()
-
-    def SetPageBitmap(self, idx, bitmap):
-        if wx.VERSION >= (2, 8, 0):
-            return self.PartsOpened.SetPageBitmap(idx, bitmap)
-        else:
-            return self.PartsOpened.SetPageImage(idx, bitmap)
-
-    def IsOpened(self, name):
-        for idx in xrange(self.PartsOpened.GetPageCount()):
-            if self.PartsOpened.GetPage(idx).IsViewing(name):
-                return idx
-        return None
-
-    def RefreshTitle(self):
-        self.SetTitle("CFileEditor - %s"%self.Controler.GetFilename())
-        
-#-------------------------------------------------------------------------------
-#                          Edit Project Menu Functions
-#-------------------------------------------------------------------------------
-
-    def RefreshEditMenu(self):
-        undo, redo = self.Controler.GetBufferState()
-        self.EditMenu.Enable(wx.ID_UNDO, undo)
-        self.EditMenu.Enable(wx.ID_REDO, redo)
-
-    def OnRefreshMenu(self, event):
-        selected = self.PartsOpened.GetSelection()
-        if selected != -1:
-            window = self.PartsOpened.GetPage(selected)
-            window.RefreshView()
-
-    def OnUndoMenu(self, event):
-        self.Controler.LoadPrevious()
-        selected = self.PartsOpened.GetSelection()        
-        if selected != -1:
-            window = self.PartsOpened.GetPage(selected)
-            window.RefreshView()
-        self.RefreshTitle()
-        self.RefreshEditMenu()
-    
-    def OnRedoMenu(self, event):
-        self.Controler.LoadNext()
-        selected = self.PartsOpened.GetSelection()
-        if selected != -1:
-            window = self.PartsOpened.GetPage(selected)
-            window.RefreshView()
-        self.RefreshTitle()
-        self.RefreshEditMenu()
-        
-#-------------------------------------------------------------------------------
-#                          File Project Menu Functions
-#-------------------------------------------------------------------------------
-    def RefreshFileMenu(self):
-        self.FileMenu.Enable(wx.ID_SAVE, True)
-    
-#-------------------------------------------------------------------------------
-#                      CFile Editor Panels Management Functions
-#-------------------------------------------------------------------------------
-    
-    def OnPartSelectedChanged(self, event):
-        old_selected = self.PartsOpened.GetSelection()
-        if old_selected >= 0:
-            self.PartsOpened.GetPage(old_selected).ResetBuffer()
-        selected = event.GetSelection()
-        if selected >= 0:
-            window = self.PartsOpened.GetPage(selected)
-            window.RefreshView()
-        event.Skip()
-
-#-------------------------------------------------------------------------------
-#                         CFile Tree Management Functions
-#-------------------------------------------------------------------------------
-
-    def InitCFileTree(self):
-        root = self.CFileTree.AddRoot("C File")
-        for name in CFILE_PARTS:
-            self.CFileTree.AppendItem(root, name)
-        self.CFileTree.Expand(root)
-
-    def OnCFileTreeItemActivated(self, event):
-        self.EditCFilePart(self.CFileTree.GetItemText(event.GetItem()))
-        event.Skip()
-
-    def OnCFileTreeItemSelected(self, event):
-        select_item = event.GetItem()
-        self.EditCFilePart(self.CFileTree.GetItemText(event.GetItem()), True)
-        event.Skip()
-        
-    def EditCFilePart(self, name, onlyopened = False):
-        openedidx = self.IsOpened(name)
-        if openedidx is not None:
-            old_selected = self.PartsOpened.GetSelection()
-            if old_selected != openedidx:
-                if old_selected >= 0:
-                    self.PartsOpened.GetPage(old_selected).ResetBuffer()
-                self.PartsOpened.SetSelection(openedidx)
-            self.PartsOpened.GetPage(openedidx).RefreshView()
-        elif not onlyopened:
-            if name == "Variables":
-                new_window = VariablesEditor(self.PartsOpened, self, self.Controler)
-                self.PartsOpened.AddPage(new_window, name)
-            else:
-                new_window = CppEditor(self.PartsOpened, name, self, self.Controler)
-                self.PartsOpened.AddPage(new_window, name)
-            openedidx = self.IsOpened(name)
-            old_selected = self.PartsOpened.GetSelection()
-            if old_selected != openedidx:
-                if old_selected >= 0:
-                    self.PartsOpened.GetPage(old_selected).ResetBuffer()
-            for i in xrange(self.PartsOpened.GetPageCount()):
-                window = self.PartsOpened.GetPage(i)
-                if window.IsViewing(name):
-                    self.PartsOpened.SetSelection(i)
-                    window.RefreshView()
-                    window.SetFocus()