plugins/c_ext/CFileEditor.py
changeset 630 91b2ae63ea3d
parent 626 2b9bd5dcf8d2
child 637 c19557ec2c5a
equal deleted inserted replaced
628:2a8476222ba8 630:91b2ae63ea3d
     1 import  wx, wx.grid
       
     2 import  wx.stc  as  stc
       
     3 import keyword
     1 import keyword
     4 
     2 
     5 from controls import CustomGrid
     3 import wx
       
     4 import wx.grid
       
     5 import wx.stc as stc
       
     6 import wx.lib.buttons
       
     7 
       
     8 from controls import CustomGrid, EditorPanel
     6 
     9 
     7 if wx.Platform == '__WXMSW__':
    10 if wx.Platform == '__WXMSW__':
     8     faces = { 'times': 'Times New Roman',
    11     faces = { 'times': 'Times New Roman',
     9               'mono' : 'Courier New',
    12               'mono' : 'Courier New',
    10               'helv' : 'Arial',
    13               'helv' : 'Arial',
    67 
    70 
    68     fold_symbols = 3
    71     fold_symbols = 3
    69     
    72     
    70     def __init__(self, parent, name, window, controler):
    73     def __init__(self, parent, name, window, controler):
    71         stc.StyledTextCtrl.__init__(self, parent, ID_CPPEDITOR, wx.DefaultPosition, 
    74         stc.StyledTextCtrl.__init__(self, parent, ID_CPPEDITOR, wx.DefaultPosition, 
    72                  wx.DefaultSize, 0)
    75                  wx.Size(0, 0), 0)
    73 
    76 
    74         self.SetMarginType(1, stc.STC_MARGIN_NUMBER)
    77         self.SetMarginType(1, stc.STC_MARGIN_NUMBER)
    75         self.SetMarginWidth(1, 25)
    78         self.SetMarginWidth(1, 25)
    76 
    79 
    77         self.CmdKeyAssign(ord('B'), stc.STC_SCMOD_CTRL, stc.STC_CMD_ZOOMIN)
    80         self.CmdKeyAssign(ord('B'), stc.STC_SCMOD_CTRL, stc.STC_CMD_ZOOMIN)
   229         self.Controler.BufferCFile()
   232         self.Controler.BufferCFile()
   230         if self.ParentWindow:
   233         if self.ParentWindow:
   231             self.ParentWindow.RefreshTitle()
   234             self.ParentWindow.RefreshTitle()
   232             self.ParentWindow.RefreshFileMenu()
   235             self.ParentWindow.RefreshFileMenu()
   233             self.ParentWindow.RefreshEditMenu()
   236             self.ParentWindow.RefreshEditMenu()
       
   237             self.ParentWindow.RefreshPageTitles()
   234     
   238     
   235     def StartBuffering(self):
   239     def StartBuffering(self):
   236         self.Controler.StartBuffering()
   240         self.Controler.StartBuffering()
   237         if self.ParentWindow:
   241         if self.ParentWindow:
   238             self.ParentWindow.RefreshTitle()
   242             self.ParentWindow.RefreshTitle()
   239             self.ParentWindow.RefreshFileMenu()
   243             self.ParentWindow.RefreshFileMenu()
   240             self.ParentWindow.RefreshEditMenu()
   244             self.ParentWindow.RefreshEditMenu()
       
   245             self.ParentWindow.RefreshPageTitles()
   241     
   246     
   242     def ResetBuffer(self):
   247     def ResetBuffer(self):
   243         if self.CurrentAction != None:
   248         if self.CurrentAction != None:
   244             self.Controler.EndBuffering()
   249             self.Controler.EndBuffering()
   245             self.CurrentAction = None
   250             self.CurrentAction = None
   259         self.ScrollToColumn(0)
   264         self.ScrollToColumn(0)
   260         self.EmptyUndoBuffer()
   265         self.EmptyUndoBuffer()
   261         self.DisableEvents = False
   266         self.DisableEvents = False
   262         
   267         
   263         self.Colourise(0, -1)
   268         self.Colourise(0, -1)
       
   269 
       
   270     def DoGetBestSize(self):
       
   271         return self.ParentWindow.GetPanelBestSize()
   264 
   272 
   265     def RefreshModel(self):
   273     def RefreshModel(self):
   266         self.Controler.SetPartText(self.Name, self.GetText())
   274         self.Controler.SetPartText(self.Name, self.GetText())
   267 
   275 
   268     def OnKeyPressed(self, event):
   276     def OnKeyPressed(self, event):
   620         
   628         
   621         self.SetSizer(self.MainSizer)
   629         self.SetSizer(self.MainSizer)
   622 
   630 
   623     def _init_ctrls(self, prnt):
   631     def _init_ctrls(self, prnt):
   624         wx.Panel.__init__(self, id=ID_VARIABLESEDITOR, name='', parent=prnt,
   632         wx.Panel.__init__(self, id=ID_VARIABLESEDITOR, name='', parent=prnt,
   625               size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
   633               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   626         
   634         
   627         self.VariablesGrid = CustomGrid(id=ID_VARIABLESEDITORVARIABLESGRID,
   635         self.VariablesGrid = CustomGrid(id=ID_VARIABLESEDITORVARIABLESGRID,
   628               name='VariablesGrid', parent=self, pos=wx.Point(0, 0), 
   636               name='VariablesGrid', parent=self, pos=wx.Point(0, 0), 
   629               size=wx.Size(-1, -1), style=wx.VSCROLL)
   637               size=wx.Size(-1, -1), style=wx.VSCROLL)
   630         self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
   638         self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
   717     def RefreshBuffer(self):
   725     def RefreshBuffer(self):
   718         self.Controler.BufferCFile()
   726         self.Controler.BufferCFile()
   719         self.ParentWindow.RefreshTitle()
   727         self.ParentWindow.RefreshTitle()
   720         self.ParentWindow.RefreshFileMenu()
   728         self.ParentWindow.RefreshFileMenu()
   721         self.ParentWindow.RefreshEditMenu()
   729         self.ParentWindow.RefreshEditMenu()
       
   730         self.ParentWindow.RefreshPageTitles()
   722 
   731 
   723     def RefreshView(self):
   732     def RefreshView(self):
   724         self.Table.SetData(self.Controler.GetVariables())
   733         self.Table.SetData(self.Controler.GetVariables())
   725         self.Table.ResetView(self.VariablesGrid)
   734         self.Table.ResetView(self.VariablesGrid)
   726         self.VariablesGrid.RefreshButtons()
   735         self.VariablesGrid.RefreshButtons()
       
   736     
       
   737     def DoGetBestSize(self):
       
   738         return self.ParentWindow.GetPanelBestSize()
   727     
   739     
   728     def OnVariablesGridCellChange(self, event):
   740     def OnVariablesGridCellChange(self, event):
   729         self.RefreshModel()
   741         self.RefreshModel()
   730         self.RefreshView()
   742         self.RefreshView()
   731         event.Skip()
   743         event.Skip()
   794 
   806 
   795 #-------------------------------------------------------------------------------
   807 #-------------------------------------------------------------------------------
   796 #                          SVGUIEditor Main Frame Class
   808 #                          SVGUIEditor Main Frame Class
   797 #-------------------------------------------------------------------------------
   809 #-------------------------------------------------------------------------------
   798 
   810 
   799 
   811 CFILE_PARTS = [
   800 CFILE_PARTS = ["Includes", "Variables", "Globals", "Init", "CleanUp", "Retrieve", 
   812     ("Includes", CppEditor), 
   801                "Publish"]
   813     ("Variables", VariablesEditor), 
       
   814     ("Globals", CppEditor), 
       
   815     ("Init", CppEditor), 
       
   816     ("CleanUp", CppEditor), 
       
   817     ("Retrieve", CppEditor), 
       
   818     ("Publish", CppEditor),
       
   819 ]
       
   820 
       
   821 #----------------------------------------------------------------------
       
   822 # different icons for the collapsed/expanded states.
       
   823 # Taken from standard Windows XP collapsed/expanded states.
       
   824 #----------------------------------------------------------------------
       
   825 
       
   826 def GetCollapsedIconData():
       
   827     return \
       
   828 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
       
   829 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
       
   830 \x00\x01\x8eIDAT8\x8d\xa5\x93-n\xe4@\x10\x85?g\x03\n6lh)\xc4\xd2\x12\xc3\x81\
       
   831 \xd6\xa2I\x90\x154\xb9\x81\x8f1G\xc8\x11\x16\x86\xcd\xa0\x99F\xb3A\x91\xa1\
       
   832 \xc9J&\x96L"5lX\xcc\x0bl\xf7v\xb2\x7fZ\xa5\x98\xebU\xbdz\xf5\\\x9deW\x9f\xf8\
       
   833 H\\\xbfO|{y\x9dT\x15P\x04\x01\x01UPUD\x84\xdb/7YZ\x9f\xa5\n\xce\x97aRU\x8a\
       
   834 \xdc`\xacA\x00\x04P\xf0!0\xf6\x81\xa0\xf0p\xff9\xfb\x85\xe0|\x19&T)K\x8b\x18\
       
   835 \xf9\xa3\xe4\xbe\xf3\x8c^#\xc9\xd5\n\xa8*\xc5?\x9a\x01\x8a\xd2b\r\x1cN\xc3\
       
   836 \x14\t\xce\x97a\xb2F0Ks\xd58\xaa\xc6\xc5\xa6\xf7\xdfya\xe7\xbdR\x13M2\xf9\
       
   837 \xf9qKQ\x1fi\xf6-\x00~T\xfac\x1dq#\x82,\xe5q\x05\x91D\xba@\xefj\xba1\xf0\xdc\
       
   838 zzW\xcff&\xb8,\x89\xa8@Q\xd6\xaaf\xdfRm,\xee\xb1BDxr#\xae\xf5|\xddo\xd6\xe2H\
       
   839 \x18\x15\x84\xa0q@]\xe54\x8d\xa3\xedf\x05M\xe3\xd8Uy\xc4\x15\x8d\xf5\xd7\x8b\
       
   840 ~\x82\x0fh\x0e"\xb0\xad,\xee\xb8c\xbb\x18\xe7\x8e;6\xa5\x89\x04\xde\xff\x1c\
       
   841 \x16\xef\xe0p\xfa>\x19\x11\xca\x8d\x8d\xe0\x93\x1b\x01\xd8m\xf3(;x\xa5\xef=\
       
   842 \xb7w\xf3\x1d$\x7f\xc1\xe0\xbd\xa7\xeb\xa0(,"Kc\x12\xc1+\xfd\xe8\tI\xee\xed)\
       
   843 \xbf\xbcN\xc1{D\x04k\x05#\x12\xfd\xf2a\xde[\x81\x87\xbb\xdf\x9cr\x1a\x87\xd3\
       
   844 0)\xba>\x83\xd5\xb97o\xe0\xaf\x04\xff\x13?\x00\xd2\xfb\xa9`z\xac\x80w\x00\
       
   845 \x00\x00\x00IEND\xaeB`\x82' 
       
   846 
       
   847 def GetCollapsedIconBitmap():
       
   848     return wx.BitmapFromImage(GetCollapsedIconImage())
       
   849 
       
   850 def GetCollapsedIconImage():
       
   851     import cStringIO
       
   852     stream = cStringIO.StringIO(GetCollapsedIconData())
       
   853     return wx.ImageFromStream(stream)
       
   854 
       
   855 #----------------------------------------------------------------------
       
   856 def GetExpandedIconData():
       
   857     return \
       
   858 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
       
   859 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
       
   860 \x00\x01\x9fIDAT8\x8d\x95\x93\xa1\x8e\xdc0\x14EO\xb2\xc4\xd0\xd2\x12\xb7(mI\
       
   861 \xa4%V\xd1lQT4[4-\x9a\xfe\xc1\xc2|\xc6\xc2~BY\x83:A3E\xd3\xa0*\xa4\xd2\x90H!\
       
   862 \x95\x0c\r\r\x1fK\x81g\xb2\x99\x84\xb4\x0fY\xd6\xbb\xc7\xf7>=\'Iz\xc3\xbcv\
       
   863 \xfbn\xb8\x9c\x15 \xe7\xf3\xc7\x0fw\xc9\xbc7\x99\x03\x0e\xfbn0\x99F+\x85R\
       
   864 \x80RH\x10\x82\x08\xde\x05\x1ef\x90+\xc0\xe1\xd8\ryn\xd0Z-\\A\xb4\xd2\xf7\
       
   865 \x9e\xfbwoF\xc8\x088\x1c\xbbae\xb3\xe8y&\x9a\xdf\xf5\xbd\xe7\xfem\x84\xa4\
       
   866 \x97\xccYf\x16\x8d\xdb\xb2a]\xfeX\x18\xc9s\xc3\xe1\x18\xe7\x94\x12cb\xcc\xb5\
       
   867 \xfa\xb1l8\xf5\x01\xe7\x84\xc7\xb2Y@\xb2\xcc0\x02\xb4\x9a\x88%\xbe\xdc\xb4\
       
   868 \x9e\xb6Zs\xaa74\xadg[6\x88<\xb7]\xc6\x14\x1dL\x86\xe6\x83\xa0\x81\xba\xda\
       
   869 \x10\x02x/\xd4\xd5\x06\r\x840!\x9c\x1fM\x92\xf4\x86\x9f\xbf\xfe\x0c\xd6\x9ae\
       
   870 \xd6u\x8d \xf4\xf5\x165\x9b\x8f\x04\xe1\xc5\xcb\xdb$\x05\x90\xa97@\x04lQas\
       
   871 \xcd*7\x14\xdb\x9aY\xcb\xb8\\\xe9E\x10|\xbc\xf2^\xb0E\x85\xc95_\x9f\n\xaa/\
       
   872 \x05\x10\x81\xce\xc9\xa8\xf6><G\xd8\xed\xbbA)X\xd9\x0c\x01\x9a\xc6Q\x14\xd9h\
       
   873 [\x04\xda\xd6c\xadFkE\xf0\xc2\xab\xd7\xb7\xc9\x08\x00\xf8\xf6\xbd\x1b\x8cQ\
       
   874 \xd8|\xb9\x0f\xd3\x9a\x8a\xc7\x08\x00\x9f?\xdd%\xde\x07\xda\x93\xc3{\x19C\
       
   875 \x8a\x9c\x03\x0b8\x17\xe8\x9d\xbf\x02.>\x13\xc0n\xff{PJ\xc5\xfdP\x11""<\xbc\
       
   876 \xff\x87\xdf\xf8\xbf\xf5\x17FF\xaf\x8f\x8b\xd3\xe6K\x00\x00\x00\x00IEND\xaeB\
       
   877 `\x82' 
       
   878 
       
   879 def GetExpandedIconBitmap():
       
   880     return wx.BitmapFromImage(GetExpandedIconImage())
       
   881 
       
   882 def GetExpandedIconImage():
       
   883     import cStringIO
       
   884     stream = cStringIO.StringIO(GetExpandedIconData())
       
   885     return wx.ImageFromStream(stream)
       
   886 
       
   887 class FoldPanelCaption(wx.lib.buttons.GenBitmapTextToggleButton):
       
   888     
       
   889     def GetBackgroundBrush(self, dc):
       
   890         colBg = self.GetBackgroundColour()
       
   891         brush = wx.Brush(colBg, wx.SOLID)
       
   892         if self.style & wx.BORDER_NONE:
       
   893             myAttr = self.GetDefaultAttributes()
       
   894             parAttr = self.GetParent().GetDefaultAttributes()
       
   895             myDef = colBg == myAttr.colBg
       
   896             parDef = self.GetParent().GetBackgroundColour() == parAttr.colBg
       
   897             if myDef and parDef:
       
   898                 if wx.Platform == "__WXMAC__":
       
   899                     brush.MacSetTheme(1) # 1 == kThemeBrushDialogBackgroundActive
       
   900                 elif wx.Platform == "__WXMSW__":
       
   901                     if self.DoEraseBackground(dc):
       
   902                         brush = None
       
   903             elif myDef and not parDef:
       
   904                 colBg = self.GetParent().GetBackgroundColour()
       
   905                 brush = wx.Brush(colBg, wx.SOLID)
       
   906         return brush
       
   907     
       
   908     def DrawLabel(self, dc, width, height, dx=0, dy=0):
       
   909         bmp = self.bmpLabel
       
   910         if bmp is not None:     # if the bitmap is used
       
   911             if self.bmpDisabled and not self.IsEnabled():
       
   912                 bmp = self.bmpDisabled
       
   913             if self.bmpFocus and self.hasFocus:
       
   914                 bmp = self.bmpFocus
       
   915             if self.bmpSelected and not self.up:
       
   916                 bmp = self.bmpSelected
       
   917             bw,bh = bmp.GetWidth(), bmp.GetHeight()
       
   918             hasMask = bmp.GetMask() is not None
       
   919         else:
       
   920             bw = bh = 0     # no bitmap -> size is zero
       
   921         
       
   922         dc.SetFont(self.GetFont())
       
   923         if self.IsEnabled():
       
   924             dc.SetTextForeground(self.GetForegroundColour())
       
   925         else:
       
   926             dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT))
       
   927 
       
   928         label = self.GetLabel()
       
   929         tw, th = dc.GetTextExtent(label)        # size of text
       
   930         
       
   931         if bmp is not None:
       
   932             dc.DrawBitmap(bmp, width - bw - 2, (height-bh)/2, hasMask) # draw bitmap if available
       
   933         
       
   934         dc.DrawText(label, 2, (height-th)/2)      # draw the text
       
   935 
       
   936         dc.SetPen(wx.Pen(self.GetForegroundColour()))
       
   937         dc.SetBrush(wx.TRANSPARENT_BRUSH)
       
   938         dc.DrawRectangle(0, 0, width, height)
   802 
   939 
   803 [ID_CFILEEDITOR, ID_CFILEEDITORMAINSPLITTER, 
   940 [ID_CFILEEDITOR, ID_CFILEEDITORMAINSPLITTER, 
   804  ID_CFILEEDITORCFILETREE, ID_CFILEEDITORPARTSOPENED, 
   941  ID_CFILEEDITORCFILETREE, ID_CFILEEDITORPARTSOPENED, 
   805 ] = [wx.NewId() for _init_ctrls in range(4)]
   942 ] = [wx.NewId() for _init_ctrls in range(4)]
   806 
   943 
   807 class CFileEditor(wx.Frame):
   944 class CFileEditor(EditorPanel):
   808     
   945     
   809     if wx.VERSION < (2, 6, 0):
   946     def _init_Editor(self, prnt):
   810         def Bind(self, event, function, id = None):
   947         self.Editor = wx.Panel(id=-1, parent=prnt, pos=wx.Point(0, 0), 
   811             if id is not None:
   948                 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   812                 event(self, id, function)
   949         
       
   950         self.Panels = {}
       
   951         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2 * len(CFILE_PARTS) + 1, vgap=0)
       
   952         self.MainSizer.AddGrowableCol(0)
       
   953         
       
   954         for idx, (name, panel_class) in enumerate(CFILE_PARTS):
       
   955             button_id = wx.NewId()
       
   956             button = FoldPanelCaption(id=button_id, name='FoldPanelCaption_%s' % name, 
       
   957                   label=name, bitmap=GetCollapsedIconBitmap(), parent=self.Editor, pos=wx.Point(0, 0),
       
   958                   size=wx.Size(0, 20), style=wx.NO_BORDER|wx.ALIGN_LEFT)
       
   959             button.SetBitmapSelected(GetExpandedIconBitmap())
       
   960             button.Bind(wx.EVT_BUTTON, self.GenPanelButtonCallback(name), id=button_id)
       
   961             self.MainSizer.AddWindow(button, 0, border=0, flag=wx.TOP|wx.GROW)
       
   962             
       
   963             if panel_class == VariablesEditor:
       
   964                 panel = VariablesEditor(self.Editor, self.ParentWindow, self.Controler)
   813             else:
   965             else:
   814                 event(self, function)
   966                 panel = panel_class(self.Editor, name, self.ParentWindow, self.Controler)
   815     
   967             self.MainSizer.AddWindow(panel, 0, border=0, flag=wx.BOTTOM|wx.GROW)
   816     def _init_coll_EditMenu_Items(self, parent):
   968             panel.Hide()
   817         AppendMenu(parent, help='', id=wx.ID_REFRESH,
   969             
   818               kind=wx.ITEM_NORMAL, text=u'Refresh\tCTRL+R')
   970             self.Panels[name] = {"button": button, "panel": panel, "expanded": False, "row": 2 * idx + 1}
   819         AppendMenu(parent, help='', id=wx.ID_UNDO,
   971         
   820               kind=wx.ITEM_NORMAL, text=u'Undo\tCTRL+Z')
   972         self.Spacer = wx.Panel(self.Editor, -1)
   821         AppendMenu(parent, help='', id=wx.ID_REDO,
   973         self.SpacerExpanded = True
   822               kind=wx.ITEM_NORMAL, text=u'Redo\tCTRL+Y')
   974         self.MainSizer.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
   823         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
   975         
   824         self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
   976         self.MainSizer.AddGrowableRow(2 * len(CFILE_PARTS))
   825         self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
   977         
   826     
   978         self.Editor.SetSizer(self.MainSizer)
   827     def _init_coll_FileMenu_Items(self, parent):
   979         
   828         AppendMenu(parent, help='', id=wx.ID_SAVE,
   980     def __init__(self, parent, controler, window):
   829               kind=wx.ITEM_NORMAL, text=u'Save\tCTRL+S')
   981         EditorPanel.__init__(self, parent, "", window, controler)
   830         self.Bind(wx.EVT_MENU, self.OnSaveMenu, id=wx.ID_SAVE)
   982         
   831 
   983         img = wx.Bitmap(self.Controler.GetIconPath("Cfile.png"), wx.BITMAP_TYPE_PNG).ConvertToImage()
   832     def _init_coll_MenuBar_Menus(self, parent):
   984         self.SetIcon(wx.BitmapFromImage(img.Rescale(16, 16)))
   833         parent.Append(menu=self.FileMenu, title=u'&File')
   985         
   834         parent.Append(menu=self.EditMenu, title=u'&Edit')
   986     def GetTitle(self):
   835     
   987         filename = self.Controler.GetFilename()
   836     def _init_utils(self):
   988         if not self.Controler.CFileIsSaved():
   837         self.MenuBar = wx.MenuBar()
   989             return "~%s~" % filename
   838 
   990         return filename
   839         self.FileMenu = wx.Menu(title='')
   991     
   840         self.EditMenu = wx.Menu(title='')
   992     def GetBufferState(self):
   841         
   993         return self.Controler.GetBufferState()
   842         self._init_coll_MenuBar_Menus(self.MenuBar)
   994         
   843         self._init_coll_FileMenu_Items(self.FileMenu)
   995     def Undo(self):
   844         self._init_coll_EditMenu_Items(self.EditMenu)
   996         self.Controler.LoadPrevious()
   845         
   997         self.RefreshView()
   846     def _init_ctrls(self, prnt):
   998             
   847         wx.Frame.__init__(self, id=ID_CFILEEDITOR, name=u'CFileEditor',
   999     def Redo(self):
   848               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(800, 650),
  1000         self.Controler.LoadNext()
   849               style=wx.DEFAULT_FRAME_STYLE, title=u'CFileEditor')
  1001         self.RefreshView()
   850         self._init_utils()
  1002     
   851         self.SetClientSize(wx.Size(1000, 600))
  1003     def HasNoModel(self):
   852         self.SetMenuBar(self.MenuBar)
  1004         return False
   853         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
  1005 
   854         
  1006     def RefreshView(self):
   855         self.Bind(wx.EVT_MENU, self.OnSaveMenu, id=wx.ID_SAVE)
  1007         for infos in self.Panels.itervalues():
   856         accel = wx.AcceleratorTable([wx.AcceleratorEntry(wx.ACCEL_CTRL, 83, wx.ID_SAVE)])
  1008             infos["panel"].RefreshView()
   857         self.SetAcceleratorTable(accel)
  1009 
   858         
  1010     def GenPanelButtonCallback(self, name):
   859         if wx.VERSION >= (2, 8, 0):
  1011         def PanelButtonCallback(event):
   860             self.AUIManager = wx.aui.AuiManager(self)
  1012             self.TogglePanel(name)
   861             self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
  1013         return PanelButtonCallback
   862         
  1014 
   863         if wx.VERSION < (2, 8, 0):
  1015     def ExpandPanel(self, name):
   864             self.MainSplitter = wx.SplitterWindow(id=ID_CFILEEDITORMAINSPLITTER, 
  1016         infos = self.Panels.get(name, None)
   865                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
  1017         if infos is not None and not infos["expanded"]:
   866                   size=wx.Size(-1, -1), style=wx.SP_3D)
  1018             infos["expanded"] = True
   867             self.MainSplitter.SetNeedUpdating(True)
  1019             infos["button"].SetToggle(True)
   868             self.MainSplitter.SetMinimumPaneSize(1)
  1020             infos["panel"].Show()
   869         
  1021             self.MainSizer.AddGrowableRow(infos["row"])
   870             self.CFileTree = wx.TreeCtrl(id=ID_CFILEEDITORCFILETREE, 
  1022         
   871                   name='CFileTree', parent=self.MainSplitter, pos=wx.Point(0, 0),
  1023             self.RefreshSizerLayout()
   872                   size=wx.Size(-1, -1), style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
  1024     
   873         else:
  1025     def CollapsePanel(self, name):
   874             self.CFileTree = wx.TreeCtrl(id=ID_CFILEEDITORCFILETREE, 
  1026         infos = self.Panels.get(name, None)
   875                   name='CFileTree', parent=self, pos=wx.Point(0, 0),
  1027         if infos is not None and infos["expanded"]:
   876                   size=wx.Size(-1, -1), style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
  1028             infos["expanded"] = False
   877             self.AUIManager.AddPane(self.CFileTree, wx.aui.AuiPaneInfo().Caption("CFile Tree").Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False))
  1029             infos["button"].SetToggle(False)
   878         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnCFileTreeItemSelected, 
  1030             infos["panel"].Hide()
   879               id=ID_CFILEEDITORCFILETREE)
  1031             self.MainSizer.RemoveGrowableRow(infos["row"])
   880         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnCFileTreeItemActivated,
  1032         
   881               id=ID_CFILEEDITORCFILETREE)
  1033             self.RefreshSizerLayout()
   882         
  1034         
   883         if wx.VERSION < (2, 8, 0):
  1035     def TogglePanel(self, name):
   884             self.PartsOpened = wx.Notebook(id=ID_CFILEEDITORPARTSOPENED,
  1036         infos = self.Panels.get(name, None)
   885                   name='PartsOpened', parent=self.MainSplitter, pos=wx.Point(0,
  1037         if infos is not None:
   886                   0), size=wx.Size(0, 0), style=0)
  1038             infos["expanded"] = not infos["expanded"]
   887             if wx.VERSION >= (2, 6, 0):
  1039             infos["button"].SetToggle(infos["expanded"])
   888                 self.PartsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
  1040             if infos["expanded"]:
   889                     self.OnPartSelectedChanged, id=ID_CFILEEDITORPARTSOPENED)
  1041                 infos["panel"].Show()
       
  1042                 self.MainSizer.AddGrowableRow(infos["row"])
   890             else:
  1043             else:
   891                 wx.EVT_NOTEBOOK_PAGE_CHANGED(self.PartsOpened, ID_CFILEEDITORPARTSOPENED,
  1044                 infos["panel"].Hide()
   892                     self.OnPartSelectedChanged)
  1045                 self.MainSizer.RemoveGrowableRow(infos["row"])
   893             
  1046             
   894             self.MainSplitter.SplitVertically(self.ProjectTree, self.PartsOpened, 200)
  1047             self.RefreshSizerLayout()
   895         else:
  1048     
   896             self.PartsOpened = wx.aui.AuiNotebook(self)
  1049     def RefreshSizerLayout(self):
   897             self.PartsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
  1050         expand_spacer = True
   898                     self.OnPartSelectedChanged)
  1051         for infos in self.Panels.itervalues():
   899             self.AUIManager.AddPane(self.PartsOpened, wx.aui.AuiPaneInfo().CentrePane())
  1052             expand_spacer = expand_spacer and not infos["expanded"]
       
  1053         
       
  1054         if self.SpacerExpanded != expand_spacer:
       
  1055             self.SpacerExpanded = expand_spacer
       
  1056             if expand_spacer:
       
  1057                 self.Spacer.Show()
       
  1058                 self.MainSizer.AddGrowableRow(2 * len(CFILE_PARTS))
       
  1059             else:
       
  1060                 self.Spacer.Hide()
       
  1061                 self.MainSizer.RemoveGrowableRow(2 * len(CFILE_PARTS))
       
  1062         
       
  1063         self.MainSizer.Layout()
   900             
  1064             
   901         self.StatusBar = wx.StatusBar( name='HelpBar',
       
   902               parent=self, style=wx.ST_SIZEGRIP)
       
   903         self.SetStatusBar(self.StatusBar)
       
   904         
       
   905         if wx.VERSION >= (2, 8, 0):
       
   906             self.AUIManager.Update()
       
   907     
       
   908     def __init__(self, parent, controler):
       
   909         self._init_ctrls(parent)
       
   910         
       
   911         self.Controler = controler
       
   912 
       
   913         self.InitCFileTree()
       
   914         self.RefreshTitle()
       
   915         self.RefreshEditMenu()
       
   916 
       
   917     def OnCloseFrame(self, event):
       
   918         if wx.VERSION >= (2, 8, 0):
       
   919             self.AUIManager.UnInit()
       
   920         if getattr(self, "_onclose", None) is not None:
       
   921             self._onclose()
       
   922         event.Skip()
       
   923 
       
   924     def OnCloseTabMenu(self, event):
       
   925         selected = self.PartsOpened.GetSelection()
       
   926         if selected >= 0:
       
   927             self.PartsOpened.DeletePage(selected)
       
   928 
       
   929     def OnSaveMenu(self, event):
       
   930         if getattr(self, "_onsave", None) != None:
       
   931             self._onsave()
       
   932         self.RefreshTitle()
       
   933         self.RefreshEditMenu()
       
   934 
       
   935 #-------------------------------------------------------------------------------
       
   936 #                            Notebook Unified Functions
       
   937 #-------------------------------------------------------------------------------
       
   938     
       
   939     def DeleteAllPages(self):
       
   940         if wx.VERSION >= (2, 8, 0):
       
   941             for idx in xrange(self.PartsOpened.GetPageCount()):
       
   942                 self.PartsOpened.DeletePage(0)
       
   943         else:
       
   944             self.PartsOpened.DeleteAllPages()
       
   945 
       
   946     def SetPageBitmap(self, idx, bitmap):
       
   947         if wx.VERSION >= (2, 8, 0):
       
   948             return self.PartsOpened.SetPageBitmap(idx, bitmap)
       
   949         else:
       
   950             return self.PartsOpened.SetPageImage(idx, bitmap)
       
   951 
       
   952     def IsOpened(self, name):
       
   953         for idx in xrange(self.PartsOpened.GetPageCount()):
       
   954             if self.PartsOpened.GetPage(idx).IsViewing(name):
       
   955                 return idx
       
   956         return None
       
   957 
       
   958     def RefreshTitle(self):
       
   959         self.SetTitle("CFileEditor - %s"%self.Controler.GetFilename())
       
   960         
       
   961 #-------------------------------------------------------------------------------
       
   962 #                          Edit Project Menu Functions
       
   963 #-------------------------------------------------------------------------------
       
   964 
       
   965     def RefreshEditMenu(self):
       
   966         undo, redo = self.Controler.GetBufferState()
       
   967         self.EditMenu.Enable(wx.ID_UNDO, undo)
       
   968         self.EditMenu.Enable(wx.ID_REDO, redo)
       
   969 
       
   970     def OnRefreshMenu(self, event):
       
   971         selected = self.PartsOpened.GetSelection()
       
   972         if selected != -1:
       
   973             window = self.PartsOpened.GetPage(selected)
       
   974             window.RefreshView()
       
   975 
       
   976     def OnUndoMenu(self, event):
       
   977         self.Controler.LoadPrevious()
       
   978         selected = self.PartsOpened.GetSelection()        
       
   979         if selected != -1:
       
   980             window = self.PartsOpened.GetPage(selected)
       
   981             window.RefreshView()
       
   982         self.RefreshTitle()
       
   983         self.RefreshEditMenu()
       
   984     
       
   985     def OnRedoMenu(self, event):
       
   986         self.Controler.LoadNext()
       
   987         selected = self.PartsOpened.GetSelection()
       
   988         if selected != -1:
       
   989             window = self.PartsOpened.GetPage(selected)
       
   990             window.RefreshView()
       
   991         self.RefreshTitle()
       
   992         self.RefreshEditMenu()
       
   993         
       
   994 #-------------------------------------------------------------------------------
       
   995 #                          File Project Menu Functions
       
   996 #-------------------------------------------------------------------------------
       
   997     def RefreshFileMenu(self):
       
   998         self.FileMenu.Enable(wx.ID_SAVE, True)
       
   999     
       
  1000 #-------------------------------------------------------------------------------
       
  1001 #                      CFile Editor Panels Management Functions
       
  1002 #-------------------------------------------------------------------------------
       
  1003     
       
  1004     def OnPartSelectedChanged(self, event):
       
  1005         old_selected = self.PartsOpened.GetSelection()
       
  1006         if old_selected >= 0:
       
  1007             self.PartsOpened.GetPage(old_selected).ResetBuffer()
       
  1008         selected = event.GetSelection()
       
  1009         if selected >= 0:
       
  1010             window = self.PartsOpened.GetPage(selected)
       
  1011             window.RefreshView()
       
  1012         event.Skip()
       
  1013 
       
  1014 #-------------------------------------------------------------------------------
       
  1015 #                         CFile Tree Management Functions
       
  1016 #-------------------------------------------------------------------------------
       
  1017 
       
  1018     def InitCFileTree(self):
       
  1019         root = self.CFileTree.AddRoot("C File")
       
  1020         for name in CFILE_PARTS:
       
  1021             self.CFileTree.AppendItem(root, name)
       
  1022         self.CFileTree.Expand(root)
       
  1023 
       
  1024     def OnCFileTreeItemActivated(self, event):
       
  1025         self.EditCFilePart(self.CFileTree.GetItemText(event.GetItem()))
       
  1026         event.Skip()
       
  1027 
       
  1028     def OnCFileTreeItemSelected(self, event):
       
  1029         select_item = event.GetItem()
       
  1030         self.EditCFilePart(self.CFileTree.GetItemText(event.GetItem()), True)
       
  1031         event.Skip()
       
  1032         
       
  1033     def EditCFilePart(self, name, onlyopened = False):
       
  1034         openedidx = self.IsOpened(name)
       
  1035         if openedidx is not None:
       
  1036             old_selected = self.PartsOpened.GetSelection()
       
  1037             if old_selected != openedidx:
       
  1038                 if old_selected >= 0:
       
  1039                     self.PartsOpened.GetPage(old_selected).ResetBuffer()
       
  1040                 self.PartsOpened.SetSelection(openedidx)
       
  1041             self.PartsOpened.GetPage(openedidx).RefreshView()
       
  1042         elif not onlyopened:
       
  1043             if name == "Variables":
       
  1044                 new_window = VariablesEditor(self.PartsOpened, self, self.Controler)
       
  1045                 self.PartsOpened.AddPage(new_window, name)
       
  1046             else:
       
  1047                 new_window = CppEditor(self.PartsOpened, name, self, self.Controler)
       
  1048                 self.PartsOpened.AddPage(new_window, name)
       
  1049             openedidx = self.IsOpened(name)
       
  1050             old_selected = self.PartsOpened.GetSelection()
       
  1051             if old_selected != openedidx:
       
  1052                 if old_selected >= 0:
       
  1053                     self.PartsOpened.GetPage(old_selected).ResetBuffer()
       
  1054             for i in xrange(self.PartsOpened.GetPageCount()):
       
  1055                 window = self.PartsOpened.GetPage(i)
       
  1056                 if window.IsViewing(name):
       
  1057                     self.PartsOpened.SetSelection(i)
       
  1058                     window.RefreshView()
       
  1059                     window.SetFocus()