Ooops
November 28, 2020, 10:59:34 AM

Author Topic: [bmx] BambooBasic Editor by Dabhand [ 1+ years ago ]  (Read 645 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] BambooBasic Editor by Dabhand [ 1+ years ago ]
« on: June 29, 2017, 12:28:40 AM »
Title : BambooBasic Editor
Author : Dabhand
Posted : 1+ years ago

Description : The main source file for my BambooBasic editor, uses Bruceys excellent wxMax mod (Not the newest version mind)... For the full thing, I've chucked BambooBasic on SourceForge and you can download the lot there (Inc the old 'slightly' modified wxMax mod):-

<a href="https://sourceforge.net/projects/bamboobasic/" target="_blank">https://sourceforge.net/projects/bamboobasic/[/url]

The code editor itself does most things an editor would do, plus, in the download, there's Vala source code for pretty much the same editor on Linux Mint (Cinnamon) and Rasp Pi (Wheezy).

I just wanted to chuck this here as a general resource for peeps who might have a bit of bother starting out in wxMax, as, its a beast! :D

P.S. Windows build only... Cannot remember why, but wouldnt run correctly on OSX.

Dabz


Code :
Code: BlitzMax
  1. SuperStrict
  2.  
  3. Framework wx.wxApp
  4. Import wx.wxScintilla
  5. Import wx.wxMouseEvent
  6. Import wx.wxFrame
  7. Import wx.wxPanel
  8. Import wx.wxButton
  9. Import wx.wxStaticText
  10. Import wx.wxTextCtrl
  11. Import wx.wxNotebook
  12. Import wx.wxToolBar
  13. Import wx.wxBitmap
  14. Import wx.wxHtmlWindow
  15. Import wx.wxFileDialog
  16. Import wx.wxDirDialog
  17. Import wx.wxDialog
  18. Import wx.wxListCtrl
  19. Import wx.wxcheckbox
  20. Import wx.wxProcess
  21.  
  22. Import wx.wxTaskBarIcon
  23.  
  24. Import brl.retro
  25. Import brl.map
  26. Import brl.Standardio
  27.  
  28. 'Import bah.volumes
  29. Import MaxGUI.Drivers
  30.  
  31. Import "bambooiconres.o"
  32.  
  33.  
  34. Global moduleList:TList
  35. Global functionMap:TMap
  36. Global variableMap:TMap
  37. Global projectPath:String = ""
  38. Global projectFilePath:String = ""
  39.  
  40. Include "types.bmx"
  41. Include "common.bmx"
  42. Include "Lex.bmx"
  43. Include "NewProject.bmx"
  44. Include "ProjectSettings.bmx"
  45. Include "ProjectExplorer.bmx"
  46.  
  47. Global gframe:GLBWorkFrame
  48.  
  49. 'Load config file
  50. LoadConfig()
  51.  
  52. Const ideversion:String = "v1.3"
  53. Const header:String = "BambooBasic " + ideversion
  54.  
  55. Const Main_Frame:Int = 1
  56. Const Home_Frame:Int = 2
  57. Const Output_Frame:Int = 3
  58.  
  59. Const TREEVIEW:Int = 9000
  60.  
  61. Const Menu_File_New_Project:Int = 101
  62. Const Menu_File_New_File:Int = 102
  63. Const Menu_File_Open_Project:Int = 103
  64. Const Menu_File_Open_File:Int = 104
  65. Const Menu_File_Save:Int = 105
  66. Const Menu_File_Save_As:Int = 106
  67. Const Menu_File_Save_Project:Int = 107
  68. Const Menu_File_Close_File:Int = 108
  69. Const Menu_File_Close_Project:Int = 109
  70. Const Menu_File_Remove_File:Int = 110
  71. Const Menu_File_Quit:Int = 111
  72.  
  73. Const Menu_File_About:Int = 201
  74.  
  75. Const BOOKCTRL:Int = 2001
  76.  
  77. Const Tool_New_Project:Int = 3001
  78. Const Tool_Open_Project:Int = 3002
  79. Const Tool_New_File:Int = 3003
  80. Const Tool_Save_File:Int = 3004
  81. Const Tool_Save_All:Int = 3005
  82. Const Tool_Open_File:Int = 3006
  83. Const Tool_Close_File:Int = 3007
  84. Const Tool_Open_Project_Folder:Int = 3008
  85. Const Tool_Project_Explorer:Int = 3009
  86.  
  87. Const Tool_Cut:Int = 3110
  88. Const Tool_Copy:Int = 3111
  89. Const Tool_Paste:Int = 3112
  90. Const Tool_Select_All:Int = 3113
  91. Const Tool_Undo:Int = 3114
  92. Const Tool_Redo:Int = 3115
  93.  
  94. Const Tool_Build:Int = 3201
  95. Const Tool_Start:Int = 3202
  96. Const Tool_Settings:Int = 3203
  97. Const Tool_Open_Output_Folder:Int = 3204
  98.  
  99. Const Tool_Browser_Home:Int = 3301
  100. Const Tool_Browser_Back:Int = 3302
  101. Const Tool_Browser_Forward:Int = 3303
  102.  
  103. New GLBWork.Run()
  104.  
  105. Type GLBWork Extends wxApp
  106.         Field frame:GLBWorkFrame
  107.  
  108.         Method OnInit:Int()
  109.                 ' Create application frame
  110.                 frame = GLBWorkFrame(New GLBWorkFrame.Create(, Main_Frame, header, 0, 0, 800, 600))
  111.                  
  112.                 ' open application frame
  113.                 frame.Center()
  114.                 frame.Layout()
  115.                 frame.Show(True)
  116.                 SetTopWindow(frame)
  117.                
  118.                 Return True
  119.         End Method
  120.        
  121. End Type
  122.  
  123. Global editPages:TList
  124. Global notebook:wxNotebook
  125.  
  126. Type GLBWorkFrame Extends wxFrame
  127.         Field menu:wxMenu
  128.        
  129.         Field m_toolBar1:wxToolBar
  130.         Field icon:wxBitmap
  131.         Field home:wxHtmlWindow
  132.         Field outputWindow:wxTextCtrl
  133.        
  134.         Method OnInit()
  135.                 wxInitAllImageHandlers()
  136.                 CreateStatusBar(1)
  137.                 Connect(, wxEVT_CLOSE_WINDOW, onCloseBoxQuit)
  138.                 wxInitAllImageHandlers()
  139.                
  140.                 editPages = New TList
  141.                
  142.                 Local fileMenu:wxMenu = New wxMenu.Create()
  143.                
  144.                 Local fileNewMenu:wxMenu = New wxMenu.Create()
  145.                 fileNewMenu.Append(Menu_File_New_Project, "New Project")
  146.                 fileNewMenu.Append(Menu_File_New_File, "New File")
  147.                 fileMenu.AppendSubMenu(fileNewMenu, "New...")
  148.                
  149.                 fileMenu.AppendSeparator()
  150.                 Local fileMenuOpenProject:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Open_Project, "Open Project")
  151.                 fileMenu.AppendItem(fileMenuOpenProject)
  152.                 Local fileMenuOpenFile:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Open_File, "Open File")
  153.                 fileMenu.AppendItem(fileMenuOpenFile)
  154.                 fileMenu.AppendSeparator()
  155.                
  156.                 Local fileMenuSave:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Save, "Save")
  157.                 fileMenu.AppendItem(fileMenuSave)
  158.                
  159.                 Local fileMenuSaveAs:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Save_As, "Save as...")
  160.                 fileMenu.AppendItem(fileMenuSaveAs)
  161.                
  162.                 Local fileMenuSaveProject:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Save_Project, "Save Project")
  163.                 fileMenu.AppendItem(fileMenuSaveProject)
  164.                
  165.                 fileMenu.AppendSeparator()
  166.                
  167.                 Local fileMenuCloseFilet:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Close_File, "Close File")
  168.                 fileMenu.AppendItem(fileMenuCloseFilet)
  169.                
  170.                 Local fileMenuCloseProject:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Close_Project, "Close Project")
  171.                 fileMenu.AppendItem(fileMenuCloseProject)
  172.                
  173.                 fileMenu.AppendSeparator()
  174.                                
  175.                 Local fileMenuRemoveFile:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Remove_File, "Remove File")
  176.                 fileMenu.AppendItem(fileMenuRemoveFile)
  177.                
  178.                 fileMenu.AppendSeparator()
  179.                
  180.                 Local fileMenuQuit:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Quit, "Exit BambooBasic")
  181.                 fileMenu.AppendItem(fileMenuQuit)
  182.                
  183.                 Local menuBar:wxMenuBar = New wxMenuBar.Create( wxMB_DOCKABLE )
  184.                 menuBar.Append(fileMenu, "&File")
  185.                
  186.                 ' associate the menu bar with the frame
  187.                 'SetMenuBar(menuBar)
  188.                
  189.                 Connect(Menu_File_Quit,wxEVT_COMMAND_MENU_SELECTED, OnQuit)
  190.                 Connect(Menu_File_New_Project, wxEVT_COMMAND_MENU_SELECTED, OnNewProject)
  191.                 Connect(Menu_File_New_File, wxEVT_COMMAND_MENU_SELECTED, OnNewFile)
  192.                 Connect(Menu_File_Open_Project, wxEVT_COMMAND_MENU_SELECTED, OnOpenProject)
  193.                 Connect(Menu_File_Open_File, wxEVT_COMMAND_MENU_SELECTED, OnOpenFile)
  194.                 Connect(Menu_File_Save, wxEVT_COMMAND_MENU_SELECTED, OnSaveFile)
  195.                 Connect(Menu_File_Save_As, wxEVT_COMMAND_MENU_SELECTED, OnSaveFileAs)
  196.                 Connect(Menu_File_Save_Project, wxEVT_COMMAND_MENU_SELECTED, OnSaveProject)
  197.                 Connect(Menu_File_Close_File, wxEVT_COMMAND_MENU_SELECTED, OnCloseFile)
  198.                 Connect(Menu_File_Close_Project, wxEVT_COMMAND_MENU_SELECTED, OnCloseProject)
  199.                 Connect(Menu_File_Remove_File, wxEVT_COMMAND_MENU_SELECTED, OnRemoveFile)
  200.                 icon = wxBitmap.CreateBitmap()
  201.                
  202.                 Local editMenu:wxMenu = New wxMenu.Create()
  203.                 menuBar.Append(editMenu, "Edit")
  204.                
  205.                 Local editUndo:wxMenuItem = New wxMenuItem.Create(editMenu, Tool_Undo, "Undo")
  206.                 editMenu.AppendItem(editUndo)
  207.                
  208.                 Local editRedo:wxMenuItem = New wxMenuItem.Create(editMenu, Tool_Redo, "Redo")
  209.                 editMenu.AppendItem(editRedo)
  210.                
  211.                 editMenu.AppendSeparator()
  212.                
  213.                 Local editCut:wxMenuItem = New wxMenuItem.Create(editMenu, Tool_Cut, "Cut")
  214.                 editMenu.AppendItem(editCut)
  215.                
  216.                 Local editCopy:wxMenuItem = New wxMenuItem.Create(editMenu, Tool_Copy, "Copy")
  217.                 editMenu.AppendItem(editCopy)
  218.                
  219.                 Local editPaste:wxMenuItem = New wxMenuItem.Create(editMenu, Tool_Paste, "Paste")
  220.                 editMenu.AppendItem(editPaste)
  221.                
  222.                 editMenu.AppendSeparator()
  223.                
  224.                 Local editSelectAll:wxMenuItem = New wxMenuItem.Create(editMenu, Tool_Select_All, "Select All")
  225.                 editMenu.AppendItem(editSelectAll)
  226.                
  227.                 Connect(Tool_Undo, wxEVT_COMMAND_MENU_SELECTED, OnUndo)
  228.                 Connect(Tool_Redo, wxEVT_COMMAND_MENU_SELECTED, OnRedo)
  229.                 Connect(Tool_Cut, wxEVT_COMMAND_MENU_SELECTED, OnCut)
  230.                 Connect(Tool_Copy, wxEVT_COMMAND_MENU_SELECTED, OnCopy)
  231.                 Connect(Tool_Paste, wxEVT_COMMAND_MENU_SELECTED, OnPaste)
  232.                 Connect(Tool_Select_All, wxEVT_COMMAND_MENU_SELECTED, OnSelectAll)
  233.                
  234.                 'Local viewMenu:wxMenu = New wxMenu.Create()
  235.                 'menuBar.Append(viewMenu, "View")
  236.                
  237.                 Local projectMenu:wxMenu = New wxMenu.Create()
  238.                 menuBar.Append(projectMenu, "Project")
  239.                
  240.                 Local projectMenuProjectExplorer:wxMenuItem = New wxMenuItem.Create(projectMenu, Tool_Project_Explorer, "Project Explorer")
  241.                 projectMenu.AppendItem(projectMenuProjectExplorer)
  242.                
  243.                 projectMenu.AppendSeparator()
  244.                
  245.                 Local projectMenuBuild:wxMenuItem = New wxMenuItem.Create(projectMenu, Tool_Build, "Build Project")
  246.                 projectMenu.AppendItem(projectMenuBuild)
  247.                
  248.                 projectMenu.AppendSeparator()
  249.                
  250.                 Local projectMenuStart:wxMenuItem = New wxMenuItem.Create(projectMenu, Tool_Start, "Build and Run Project")
  251.                 projectMenu.AppendItem(projectMenuStart)
  252.                
  253.                 projectMenu.AppendSeparator()
  254.                
  255.                 Local projectMenuOutputFolder:wxMenuItem = New wxMenuItem.Create(projectMenu, Tool_Open_Output_Folder, "Open Output Directory")
  256.                 projectMenu.AppendItem(projectMenuOutputFolder)
  257.                
  258.                 projectMenu.AppendSeparator()
  259.                
  260.                 Local projectMenuSettings:wxMenuItem = New wxMenuItem.Create(projectMenu, Tool_Settings, "Project Settings")
  261.                 projectMenu.AppendItem(projectMenuSettings)
  262.                
  263.                 Connect(Tool_Project_Explorer, wxEVT_COMMAND_MENU_SELECTED, OnProjectExplorer)
  264.                 Connect(Tool_Build, wxEVT_COMMAND_MENU_SELECTED, OnBuild)
  265.                 Connect(Tool_Start, wxEVT_COMMAND_MENU_SELECTED, onStart)
  266.                 Connect(Tool_Settings, wxEVT_COMMAND_MENU_SELECTED, OnSettings)
  267.                 Connect(Tool_Open_Output_Folder, wxEVT_COMMAND_MENU_SELECTED, OnOpenOutputFolder)
  268.                
  269.                 Local helpMenu:wxMenu = New wxMenu.Create()
  270.                 menuBar.Append(helpMenu, "Twaddle")
  271.                
  272.                 Local helpAboutMenu:wxMenuItem = New wxMenuItem.Create(helpMenu, Menu_File_About, "About")
  273.                 helpMenu.AppendItem(helpAboutMenu)
  274.                
  275.                 Connect(Menu_File_About, wxEVT_COMMAND_MENU_SELECTED, OnAbout)
  276.                
  277.                 SetMenuBar(menuBar)
  278.                
  279.                 Connect(Tool_Open_Output_Folder, wxEVT_COMMAND_MENU_SELECTED, OnOpenOutputFolder)
  280.                
  281.                 Local m_panel1:wxPanel
  282.                 Local m_panel2:wxPanel
  283.                
  284.                 Local bSizer4:wxBoxSizer
  285.                 bSizer4 = New wxBoxSizer.Create(wxVERTICAL)
  286.  
  287.                 m_panel1 = New wxPanel.Create(Self, wxID_ANY,,,,, wxTAB_TRAVERSAL)
  288.  
  289.                 Local bSizer5:wxBoxSizer
  290.                 bSizer5 = New wxBoxSizer.Create(wxVERTICAL)
  291.                
  292.                 notebook = wxNotebook.CreateNotebook(m_panel1, BOOKCTRL, wxID_ANY)
  293.                
  294.                 Connect(-1, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, OnPageChanging)
  295.                 Connect(-1, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
  296.                
  297.                 m_panel2 = New wxPanel.Create(notebook, wxID_ANY,,, ,, wxTAB_TRAVERSAL)
  298.                
  299.                 home = New wxHtmlWindow.CreateHtmlWindow(m_panel2, Home_Frame,,,,,wxHW_SCROLLBAR_AUTO)
  300.                 home.LoadPage(AppDir:String + "docindex.html")
  301.                
  302.                 Local bSizer6:wxBoxSizer
  303.                 bSizer6 = New wxBoxSizer.Create(wxVERTICAL)
  304.  
  305.                 bSizer6.Add(home, 1, wxEXPAND | wxALL, 5)
  306.  
  307.                 m_panel2.SetSizer(bSizer6)
  308.                 m_panel2.Layout()
  309.                 bSizer6.Fit(m_panel2)
  310.                
  311.                 ' the first page
  312.                 notebook.AddPage(m_panel2, "Home", True)
  313.                
  314.                 bSizer5.Add(notebook, 4, wxEXPAND | wxALL, 5)
  315.                 outputWindow:wxTextCtrl = New wxTextCtrl.Create(m_panel1, 5000, "Welcome to BambooBasic...",,,,,wxTE_MULTILINE)
  316.                 bSizer5.Add(outputWindow, 1, wxEXPAND | wxALL, 5)
  317.                
  318.                 'Add home stuff below
  319.                 m_panel1.SetSizer(bSizer5)
  320.                 m_panel1.Layout()
  321.                 bSizer5.Fit(m_panel1)
  322.                 bSizer4.Add(m_panel1, 1, wxEXPAND | wxALL, 5)
  323.                
  324.                 m_toolBar1 = CreateToolbar(wxTB_HORIZONTAL, wxID_ANY)
  325.                 m_toolBar1.SetToolBitmapSize(24, 24)
  326.                 icon.LoadFile("config
  327. ewproject.bmp", wxBITMAP_TYPE_BMP)
  328.                 m_toolBar1.AddTool(Tool_New_Project, "NewProject", icon,,, "New Project")
  329.                 Connect(Tool_New_Project,wxEVT_COMMAND_TOOL_CLICKED,OnNewProject)
  330.                
  331.                 icon.LoadFile("configopenproject.bmp", wxBITMAP_TYPE_BMP)
  332.                 m_toolBar1.AddTool(Tool_Open_Project, "OpenProject", icon,,, "Open Project")
  333.                 Connect(Tool_Open_Project, wxEVT_COMMAND_TOOL_CLICKED, onOpenProject)
  334.                
  335.                 m_toolBar1.AddSeparator()
  336.                
  337.                 icon.LoadFile("config
  338. ewfile.bmp", wxBITMAP_TYPE_BMP)
  339.                 m_toolBar1.AddTool(Tool_New_File, "NewFile", icon,,, "New File")
  340.                 Connect(Tool_New_File, wxEVT_COMMAND_TOOL_CLICKED, OnNewFile)
  341.                
  342.                 icon.LoadFile("configopenfile.bmp", wxBITMAP_TYPE_BMP)
  343.                 m_toolBar1.AddTool(Tool_Open_File, "OpenFile", icon,,, "Open File")
  344.                 Connect(Tool_Open_File, wxEVT_COMMAND_TOOL_CLICKED, OnOpenFile)
  345.                
  346.                 icon.LoadFile("configsavefile.bmp", wxBITMAP_TYPE_BMP)
  347.                 m_toolBar1.AddTool(Tool_Save_File, "SaveFile", icon,,, "Save File")
  348.                 Connect(Tool_Save_File, wxEVT_COMMAND_TOOL_CLICKED, OnSaveFile)
  349.                
  350.                 icon.LoadFile("configsaveall.bmp", wxBITMAP_TYPE_BMP)
  351.                 m_toolBar1.AddTool(Tool_Save_All, "SaveAll", icon,,, "Save All")
  352.                 Connect(Tool_Save_All, wxEVT_COMMAND_TOOL_CLICKED, OnSaveProject)
  353.                
  354.                 icon.LoadFile("configclosefile.bmp", wxBITMAP_TYPE_BMP)
  355.                 m_toolBar1.AddTool(Tool_Close_File, "CloseFile", icon,,, "Close File")
  356.                 Connect(Tool_Close_File, wxEVT_COMMAND_TOOL_CLICKED, OnCloseFile)
  357.                
  358.                 'Tool_Project_Explorer
  359.                 icon.LoadFile("configprojectexplorer.bmp", wxBITMAP_TYPE_BMP)
  360.                 m_toolBar1.AddTool(Tool_Project_Explorer, "ProjectExplorer", icon,,, "Project Explorer")
  361.                 Connect(Tool_Project_Explorer, wxEVT_COMMAND_TOOL_CLICKED, OnProjectExplorer)
  362.                
  363.                 icon.LoadFile("configopencontainingfolder.bmp", wxBITMAP_TYPE_BMP)
  364.                 m_toolBar1.AddTool(Tool_Open_Project_Folder, "OpenProjectFolder", icon,,, "Open Project Folder")
  365.                 Connect(Tool_Open_Project_Folder, wxEVT_COMMAND_TOOL_CLICKED, OnOpenProjectFolder)
  366.                
  367.                 m_toolBar1.AddSeparator()
  368.                
  369.                 icon.LoadFile("configcut.bmp", wxBITMAP_TYPE_BMP)
  370.                 m_toolBar1.AddTool(Tool_Cut, "Cut", icon,,, "Cut Text")
  371.                 Connect(Tool_Cut, wxEVT_COMMAND_TOOL_CLICKED, OnCut)
  372.                
  373.                 icon.LoadFile("configcopy.bmp", wxBITMAP_TYPE_BMP)
  374.                 m_toolBar1.AddTool(Tool_Copy, "Copy", icon,,, "Copy Text")
  375.                 Connect(Tool_Copy, wxEVT_COMMAND_TOOL_CLICKED, OnCopy)
  376.                
  377.                 icon.LoadFile("configpaste.bmp", wxBITMAP_TYPE_BMP)
  378.                 m_toolBar1.AddTool(Tool_Paste, "Paste", icon,,, "Paste Text")
  379.                 Connect(Tool_Paste, wxEVT_COMMAND_TOOL_CLICKED, OnPaste)
  380.                
  381.                 m_toolBar1.AddSeparator()
  382.                
  383.                 icon.LoadFile("configsettings.bmp", wxBITMAP_TYPE_BMP)
  384.                 m_toolBar1.AddTool(Tool_Settings, "ProjectSettings", icon,,, "Project Settings")
  385.                 Connect(Tool_Settings, wxEVT_COMMAND_TOOL_CLICKED, OnSettings)
  386.                
  387.                 icon.LoadFile("configstart.bmp", wxBITMAP_TYPE_BMP)
  388.                 m_toolBar1.AddTool(Tool_Start, "StartProject", icon,,, "Build and run")
  389.                 Connect(Tool_Start, wxEVT_COMMAND_TOOL_CLICKED, OnStart)
  390.                
  391.                 icon.LoadFile("configuild.bmp", wxBITMAP_TYPE_BMP)
  392.                 m_toolBar1.AddTool(Tool_Build, "BuildProject", icon,,, "Build only")
  393.                 Connect(Tool_Build, wxEVT_COMMAND_TOOL_CLICKED, OnBuild)
  394.                
  395.                 icon.LoadFile("configopenoutputdir.bmp", wxBITMAP_TYPE_BMP)
  396.                 m_toolBar1.AddTool(Tool_Open_Output_Folder, "OutputFolder", icon,,, "Open output folder")
  397.                 Connect(Tool_Open_Output_Folder, wxEVT_COMMAND_TOOL_CLICKED, OnOpenOutputFolder)
  398.                
  399.                 m_toolBar1.AddSeparator()
  400.                
  401.                 icon.LoadFile("confighome.bmp", wxBITMAP_TYPE_BMP)
  402.                 m_toolBar1.AddTool(Tool_Browser_Home, "HomeTab", icon,,, "Open home page")
  403.                 Connect(Tool_Browser_Home, wxEVT_COMMAND_TOOL_CLICKED, OnHome)
  404.                
  405.                 icon.LoadFile("configack.bmp", wxBITMAP_TYPE_BMP)
  406.                 m_toolBar1.AddTool(Tool_Browser_Back, "Back", icon,,, "Back one home page")
  407.                 Connect(Tool_Browser_Back, wxEVT_COMMAND_TOOL_CLICKED, OnBack)
  408.                
  409.                 icon.LoadFile("configforward.bmp", wxBITMAP_TYPE_BMP)
  410.                 m_toolBar1.AddTool(Tool_Browser_Forward, "Forward", icon,,, "Forward one home page")
  411.                 Connect(Tool_Browser_Forward, wxEVT_COMMAND_TOOL_CLICKED, OnForward)
  412.                
  413.                 m_toolBar1.Realize()
  414.                
  415.                
  416.                 SetSizer(bSizer4)
  417.                 Layout()
  418.                 Center(wxBOTH)
  419.                
  420.                 gframe = Self
  421.                
  422.         End Method
  423.        
  424.         Function OnAbout(events:wxEvent)
  425.                 wxMessageBox "BambooBasic "+Chr$(169)+" Michael Denathorn 2012-2013~n~nVersion: "+ideversion+"~n~nFor updates, help and support, please visit www.bamboocoder.com~n~nwxWidgets wrapper by Bruce Henderson~nhttp://brucey.net/programming/blitz/~n~nSpecial thanks to: Steve Ancell (Bug hunter)","About BambooBasic..."
  426.         End Function
  427.        
  428.         Function OnProjectExplorer(events:wxEvent)
  429.                
  430.                 If projectFilePath = ""
  431.                         wxMessageBox "You need to create or load a project!", "BambooEditor Message"
  432.                         Return
  433.                 EndIf
  434.                
  435.                 Local frame:ProjectExplorer
  436.                 frame = ProjectExplorer(New ProjectExplorer.Create(,, "Project Explorer...", 0, 0, 400, 500, wxCLOSE_BOX | wxCAPTION))
  437.                 frame.CenterOnParent()
  438.                 frame.Layout()
  439.                 frame.Show(True)
  440.         End Function
  441.        
  442.         Function OnHome(event:wxEvent)
  443.                 notebook.SetSelection(0)
  444.                 Local page:Int = notebook.GetSelection()
  445.                 If page = 0
  446.                         gframe.home.LoadPage(AppDir:String + "docindex.html")
  447.                 EndIf
  448.         End Function
  449.        
  450.         Function OnBack(event:wxEvent)
  451.                 Local page:Int = notebook.GetSelection()
  452.                 If page = 0
  453.                         If gframe.home.HistoryCanBack()
  454.                                 gframe.home.HistoryBack()
  455.                         EndIf
  456.                 EndIf
  457.         End Function
  458.        
  459.         Function OnForward(event:wxEvent)
  460.                 Local page:Int = notebook.GetSelection()
  461.                 If page = 0
  462.                         If gframe.home.HistoryCanForward()
  463.                                 gframe.home.HistoryForward()
  464.                         EndIf
  465.                 EndIf
  466.         End Function
  467.        
  468.         Function OnCloseBoxQuit(event:wxEvent)
  469.                 If projectFilePath <> ""
  470.                         projectProperties.SaveProject()
  471.                 End If
  472.                 End
  473.         End Function
  474.  
  475.         Function OnQuit(event:wxEvent)
  476.                 If projectFilePath <> ""
  477.                         projectProperties.SaveProject()
  478.                 End If
  479.                 wxFrame(event.parent).Close(True)
  480.         End Function
  481.        
  482.         Function OnSettings(events:wxEvent)
  483.                
  484.                 If projectFilePath = ""
  485.                         wxMessageBox "You need to create or load a project!", "BambooEditor Message"
  486.                         Return
  487.                 EndIf
  488.                
  489.                 Local frame:ProjectSettingsFrame
  490.                 frame = ProjectSettingsFrame(New ProjectSettingsFrame.Create(,, "Project Settings...", 0, 0, 300, 240, wxCLOSE_BOX | wxCAPTION))
  491.                 frame.CenterOnParent()
  492.                 frame.Layout()
  493.                 frame.Show(True)
  494.         End Function
  495.        
  496.         Function CallBSG(run:Int = False)
  497.                 If projectPath <> ""
  498.                         gframe.SaveAll()
  499.                         'ChangeDir(AppDir$)
  500.                        
  501.                         gframe.outputWindow.Clear()
  502.  
  503.                         Local cmdstring:String
  504.                        
  505.                         cmdstring = AppDir:String + "insg_win"
  506.                        
  507.                        
  508.                        
  509.                         cmdstring = cmdstring + " -s ~q" + projectPath + "" + projectProperties.editFile + "~q"
  510.                         cmdstring = cmdstring + " -o ~q" + projectProperties.outputDir + "~q"
  511.                        
  512.                         If run = True
  513.                                 cmdstring = cmdstring + " -b ~q" + projectProperties.localURL + "~q"
  514.                         EndIf
  515.                        
  516.                         If projectProperties.useBambooHeader Then cmdstring = cmdstring + " -httphead"
  517.                         If projectProperties.doTrace Then cmdstring = cmdstring + " -t"
  518.                         If projectProperties.outputComments Then cmdstring = cmdstring + " -c"
  519.                        
  520.                         Local m_versionProcess:wxProcess = New wxProcess.CreateWithFlags(wxPROCESS_REDIRECT)
  521.                        
  522.                         Local m_pid:Int = wxExecute(cmdstring, wxEXEC_SYNC, m_versionProcess )
  523.                        
  524.                         Local p_in:wxInputStream = m_versionProcess.GetInputStream()
  525.                
  526.                         If p_in Then
  527.                                 Local textInput:wxTextInputStream = New wxTextInputStream.Create(p_in)
  528.                                
  529.                                 While Not p_in.Eof()
  530.                                         gframe.outputWindow.AppendText(textInput.ReadLine() +"~n")
  531.                                 Wend
  532.                                
  533.                         End If
  534.  
  535.                         m_versionProcess.free()
  536.                        
  537.                         gframe.outputWindow.Enable()
  538.                         gframe.setfocus()
  539.                 EndIf
  540.         End Function
  541.        
  542.         Function OnBuild(event:wxEvent)
  543.                 CallBSG()
  544.         End Function
  545.        
  546.         Function OnStart(event:wxEvent)
  547.                 CallBSG(True)
  548.         End Function
  549.        
  550.         Function OnUndo(event:wxEvent)
  551.                 Local page:Int = notebook.GetSelection()
  552.                 If page = 0
  553.                         wxMessageBox "Cannot redo here!", "BambooEditor Message"
  554.                         Return
  555.                 End If
  556.                
  557.                 For Local loopEditIDs:Edit = EachIn editPages
  558.                         If loopEditIDs.id = page
  559.                                 loopEditIDs.Undo()
  560.                                 Exit
  561.                         EndIf
  562.                 Next
  563.         End Function
  564.        
  565.         Function OnRedo(event:wxEvent)
  566.                 Local page:Int = notebook.GetSelection()
  567.                 If page = 0
  568.                         wxMessageBox "Cannot redo here!", "BambooEditor Message"
  569.                         Return
  570.                 End If
  571.                
  572.                 For Local loopEditIDs:Edit = EachIn editPages
  573.                         If loopEditIDs.id = page
  574.                                 loopEditIDs.Redo()
  575.                                 Exit
  576.                         EndIf
  577.                 Next
  578.         End Function
  579.        
  580.         Function OnCut(event:wxEvent)
  581.                 Local page:Int = notebook.GetSelection()
  582.                 If page = 0
  583.                         wxMessageBox "Cannot cut here!", "BambooEditor Message"
  584.                         Return
  585.                 End If
  586.                
  587.                 For Local loopEditIDs:Edit = EachIn editPages
  588.                         If loopEditIDs.id = page
  589.                                 loopEditIDs.Cut()
  590.                                 Exit
  591.                         EndIf
  592.                 Next
  593.         End Function
  594.        
  595.         Function OnCopy(event:wxEvent)
  596.                 Local page:Int = notebook.GetSelection()
  597.                 If page = 0
  598.                 wxMessageBox "Cannot copy here!", "BambooEditor Message"
  599.                         Return
  600.                 End If
  601.                
  602.                 For Local loopEditIDs:Edit = EachIn editPages
  603.                         If loopEditIDs.id = page
  604.                                 loopEditIDs.Copy()
  605.                                 Exit
  606.                         EndIf
  607.                 Next
  608.         End Function
  609.        
  610.         Function OnPaste(event:wxEvent)
  611.                 Local page:Int = notebook.GetSelection()
  612.                 If page = 0
  613.                 wxMessageBox "Cannot paste here!", "BambooEditor Message"
  614.                         Return
  615.                 End If
  616.                
  617.                 For Local loopEditIDs:Edit = EachIn editPages
  618.                         If loopEditIDs.id = page
  619.                                 loopEditIDs.Paste()
  620.                                 Exit
  621.                         EndIf
  622.                 Next
  623.         End Function
  624.        
  625.         Function OnSelectAll(event:wxEvent)
  626.                 Local page:Int = notebook.GetSelection()
  627.                 If page = 0
  628.                         wxMessageBox "Cannot select text here!", "BambooEditor Message"
  629.                         Return
  630.                 End If
  631.                
  632.                 For Local loopEditIDs:Edit = EachIn editPages
  633.                         If loopEditIDs.id = page
  634.                                 loopEditIDs.SelectAll()
  635.                                 Exit
  636.                         EndIf
  637.                 Next
  638.                
  639.         End Function
  640.        
  641.         Function OnOpenOutputFolder(event:wxEvent)
  642.                 If projectFilePath = ""
  643.                         wxMessageBox "You need to create or load a project!", "BambooEditor Message"
  644.                         Return
  645.                 EndIf
  646.                
  647.                 DebugLog(projectProperties.outputDir)
  648.                
  649.                 ?MacOs
  650.                         system_("open "+projectProperties.outputDir)
  651.                 ?Win32
  652.                         OpenURL(projectProperties.outputDir)
  653.                 ?Linux
  654.                         system_("xdg-open "+projectProperties.outputDir)
  655.                 ?
  656.         End Function
  657.        
  658.         Function OnOpenProjectFolder(event:wxEvent)
  659.                 If projectPath = "" Then Return
  660.                
  661.                 ?MacOs
  662.                         system_("open "+projectPath)
  663.                 ?Win32
  664.                         OpenURL(projectPath)
  665.                 ?Linux
  666.                         system_("xdg-open "+projectPath)
  667.                 ?
  668.         End Function
  669.        
  670.         Function OnRemoveFile(event:wxEvent)
  671.                 Local page:Int = notebook.GetSelection()
  672.                 If page = 0
  673.                         wxMessageBox "You cannot remove the 'Home' tab.", "BambooEditor Message"
  674.                         Return
  675.                 EndIf
  676.                
  677.                 If projectProperties.editFiles.Count() < 2
  678.                         wxMessageBox "You need at least one file open in the editor project!", "BambooEditor Message"
  679.                         Return
  680.                 EndIf
  681.                
  682.                 Local result:Int = wxMessageBox("Are you sure you want to remove this file from the project?", "BambooEditor Message",wxICON_QUESTION | wxYES_NO)
  683.                
  684.                 If result = wxNo
  685.                         Return
  686.                 EndIf
  687.                
  688.                 Local doExit:Int = False
  689.                 For Local loopEditIDs:Edit = EachIn editPages
  690.                         If loopEditIDs.id = page
  691.                                 For Local loopEditFiles:String = EachIn projectProperties.editFiles
  692.                                         If loopEditFiles = loopEditIDs.filename
  693.                                                
  694.                                                 If loopEditFiles = projectProperties.appName
  695.                                                         wxMessageBox("This is the entry file to your application.~n~nYou cannot remove this file from the project.", "BambooEditor Message")
  696.                                                         Return
  697.                                                 EndIf
  698.                                                
  699.                                                 projectProperties.editFiles.Remove(loopEditFiles)
  700.                                                 projectProperties.srcFiles.Remove(loopEditFiles)
  701.                                                 editPages.Remove(loopEditIDs)
  702.                                                 projectProperties.SaveProject()
  703.                                                 notebook.DeletePage(page)
  704.                                                
  705.                                                 For loopEditIDs:Edit = EachIn editPages
  706.                                                         If loopEditIDs.id >= page
  707.                                                                 loopEditIDs.id = loopEditIDs.id - 1
  708.                                                         End If
  709.                                                 Next
  710.                                                 doExit = True
  711.                                                 Exit
  712.                                         EndIf
  713.                                 Next
  714.                                 If doExit = True Then Exit
  715.                         End If
  716.                 Next
  717.                
  718.                 wxMessageBox "Note: File removed from project, but still exists in your project folder!", "BambooEditor Message"
  719.         End Function
  720.        
  721.         Function OnCloseProject(event:wxEvent)         
  722.                 If projectFilePath = ""
  723.                         wxMessageBox "There is no project to close!", "BambooEditor Message"
  724.                         Return
  725.                 EndIf
  726.                
  727.                 Local result:Int = wxMessageBox("Are you sure you want to close this project?", "BambooEditor Message",wxICON_QUESTION | wxYES_NO)
  728.                        
  729.                 If result = wxYES
  730.                         gframe.SaveAll()
  731.                 Else
  732.                         Return
  733.                 EndIf
  734.                
  735.                 gframe.SetLabel(header)
  736.                 CloseProject()
  737.         End Function
  738.        
  739.         Function CloseProject()
  740.                 If projectPath <> ""
  741.                         projectFilePath = ""
  742.                         projectPath = ""
  743.                         functionMap.Clear()
  744.                         variableMap.Clear()
  745.                         projectProperties.appName = ""
  746.                         projectProperties.companyName = ""
  747.                         projectProperties.editFile = ""
  748.        
  749.                         For Local removePages:Int = notebook.GetPageCount() To 1 Step - 1
  750.                                 notebook.DeletePage(removePages)
  751.                         Next
  752.                        
  753.                         projectProperties.editFiles.Clear()
  754.                         projectProperties.srcFiles.Clear()
  755.                         editPages.Clear()
  756.                 EndIf          
  757.         End Function
  758.        
  759.         Function OnCloseFile(event:wxEvent)
  760.                 Local page:Int = notebook.GetSelection()
  761.                 If page = 0
  762.                         wxMessageBox "You cannot close the Home tab!", "BambooEditor Message"  
  763.                         Return
  764.                 EndIf
  765.                
  766.                 If projectProperties.editFiles.Count() < 2
  767.                         wxMessageBox "You need at least one file open in the project!", "BambooEditor Message"
  768.                         Return
  769.                 EndIf
  770.                
  771.                 Local doExit:Int = False
  772.                 For Local loopEditIDs:Edit = EachIn editPages
  773.                         If loopEditIDs.id = page
  774.                                 For Local loopEditFiles:String = EachIn projectProperties.editFiles
  775.                                         If loopEditFiles = loopEditIDs.filename
  776.                                                 projectProperties.editFiles.Remove(loopEditFiles)
  777.                                                 editPages.Remove(loopEditIDs)
  778.                                                 projectProperties.SaveProject()
  779.                                                 notebook.DeletePage(page)
  780.                                                
  781.                                                 For loopEditIDs:Edit = EachIn editPages
  782.                                                         If loopEditIDs.id >= page
  783.                                                                 loopEditIDs.id = loopEditIDs.id - 1
  784.                                                         End If
  785.                                                 Next
  786.                                                 doExit = True
  787.                                                 Exit
  788.                                         EndIf
  789.                                 Next
  790.                                 If doExit = True Then Exit
  791.                         End If
  792.                 Next
  793.                
  794.         End Function
  795.  
  796.         Function OnPageChanging(event:wxEvent)
  797.                 'Print "Old page is: " + wxNotebookEvent(event).GetOldSelection()
  798.         End Function
  799.        
  800.         Function OnPageChanged(event:wxEvent)
  801.                 'Print "New page is now: " + wxNotebookEvent(event).GetSelection()
  802.         End Function
  803.        
  804.         Function OnSaveFileAs(event:wxEvent)
  805.                 Local page:Int = notebook.GetSelection()
  806.                 If page = 0
  807.                         Return
  808.                 EndIf
  809.                
  810.                 If projectFilePath = ""
  811.                         wxMessageBox "You need to create or load a project!", "BambooEditor Message"
  812.                         Return
  813.                 EndIf
  814.                                
  815.                 Local filename:String =  wxFileSelector( "Save file as...", projectPath, "", "bam","BambooBasic Source File (*.bam)|*.bam", wxFD_SAVE | wxFD_OVERWRITE_PROMPT )
  816.  
  817.                 If filename = "" Then Return
  818.                 Local path:String = filename
  819.                
  820.                 filename = Replace(filename, projectPath + "", "")
  821.  
  822.                 Local fileExists:Int = False
  823.                
  824.                 For Local checkFiles:String = EachIn projectProperties.editFiles
  825.                         If checkFiles = filename
  826.                                 fileExists = True
  827.                                 Exit
  828.                         End If
  829.                 Next
  830.                
  831.                 If fileExists = False
  832.                         projectProperties.editFiles.AddLast(filename)
  833.                        
  834.                         fileExists = False
  835.                         For Local checkFiles:String = EachIn projectProperties.srcFiles
  836.                                 If checkFiles = filename
  837.                                         fileExists = True
  838.                                         Exit
  839.                                 End If
  840.                         Next
  841.                        
  842.                         If fileExists = False
  843.                                 projectProperties.srcFiles.AddLast(filename)
  844.                         End If
  845.                        
  846.                 Else
  847.                         For Local loopeditors:Edit = EachIn editPages
  848.                                 If loopeditors.filename = filename
  849.                                         wxMessageBox "There is a matching filename in the editor, please close it!", "BambooEditor Message"
  850.                                         notebook.SetSelection(loopeditors.id)
  851.                                         Return
  852.                                 EndIf  
  853.                         Next
  854.                 EndIf
  855.                
  856.                 projectProperties.SaveProject()
  857.                
  858.                 For Local loopEditIDs:Edit = EachIn editPages
  859.                         If loopEditIDs.id = page
  860.                                 SaveSource(path, page)
  861.                                 Exit
  862.                         EndIf
  863.                 Next
  864.                
  865.                 page = notebook.GetPageCount()
  866.                
  867.                 Local m_panel2:wxPanel
  868.                
  869.                 m_panel2 = New wxPanel.Create(notebook, wxID_ANY,,, ,, wxTAB_TRAVERSAL)
  870.                 Local newEdit:Edit = Edit(New Edit.Create(m_panel2, wxID_ANY,,, ,, wxWANTS_CHARS))
  871.                 Local bSizer6:wxBoxSizer
  872.                 bSizer6 = New wxBoxSizer.Create(wxVERTICAL)
  873.  
  874.                 bSizer6.Add(newEdit, 1, wxEXPAND | wxALL, 5)
  875.  
  876.                 m_panel2.SetSizer(bSizer6)
  877.                 m_panel2.Layout()
  878.                 bSizer6.Fit(m_panel2)
  879.                 notebook.InsertPage(page, m_panel2, StripDir(filename), False)
  880.                 notebook.SetSelection(page)
  881.                
  882.                 newEdit.id = page
  883.                 newEdit.filename = filename
  884.                 Local formattedText:String = gframe.LoadSource(path)
  885.                 newEdit.AddText(formattedText)
  886.                 editPages.AddLast(newEdit)
  887.                 newEdit.SetFocus()
  888.                
  889.         End Function
  890.        
  891.         Function OnSaveFile(event:wxEvent)
  892.                 Local page:Int = notebook.GetSelection()
  893.                 If page = 0
  894.                         Return
  895.                 EndIf
  896.                
  897.                 gframe.SaveAll()
  898.         End Function
  899.        
  900.         Function OnSaveProject(event:wxEvent)
  901.                 For Local filesloop:Int = notebook.GetPageCount() To 1 Step - 1
  902.                         For Local loopEditFiles:Edit = EachIn editPages
  903.                                 If filesloop = loopEditFiles.id
  904.                                         SaveSource(projectPath + "" + loopEditFiles.filename, filesloop)
  905.                                         Exit
  906.                                 End If
  907.                         Next
  908.                 Next
  909.         End Function
  910.        
  911.         Function SaveAll()
  912.                 For Local filesloop:Int = notebook.GetPageCount() To 1 Step - 1
  913.                         For Local loopEditFiles:Edit = EachIn editPages
  914.                                 If filesloop = loopEditFiles.id
  915.                                         SaveSource(projectPath + "" + loopEditFiles.filename, filesloop)
  916.                                         Exit
  917.                                 End If
  918.                         Next
  919.                 Next
  920.         End Function
  921.        
  922.         Function OpenSourceFile(filename:String)
  923.                
  924.                 filename = Replace(filename, projectPath + "", "")
  925.                
  926.                 Local fileExists:Int = False
  927.                
  928.                 For Local checkFiles:String = EachIn projectProperties.editFiles
  929.                         If checkFiles = filename
  930.                                 fileExists = True
  931.                                 Exit
  932.                         End If
  933.                 Next
  934.                
  935.                 If fileExists = False
  936.                         projectProperties.editFiles.AddLast(filename)
  937.                        
  938.                         fileExists = False
  939.                         For Local checkFiles:String = EachIn projectProperties.srcFiles
  940.                                 If checkFiles = filename
  941.                                         fileExists = True
  942.                                         Exit
  943.                                 End If
  944.                         Next
  945.                        
  946.                         If fileExists = False
  947.                                 projectProperties.srcFiles.AddLast(filename)
  948.                         End If
  949.                        
  950.                 Else
  951.                         For Local loopeditors:Edit = EachIn editPages
  952.                                 If loopeditors.filename = filename
  953.                                         notebook.SetSelection(loopeditors.id)
  954.                                         Return
  955.                                 EndIf  
  956.                         Next
  957.                 EndIf
  958.                
  959.                 projectProperties.SaveProject()
  960.                
  961.                 Local page:Int = notebook.GetPageCount()
  962.                
  963.                 Local m_panel2:wxPanel
  964.                
  965.                 m_panel2 = New wxPanel.Create(notebook, wxID_ANY,,, ,, wxTAB_TRAVERSAL)
  966.                 Local newEdit:Edit = Edit(New Edit.Create(m_panel2, wxID_ANY,,, ,, wxWANTS_CHARS))
  967.                 Local bSizer6:wxBoxSizer
  968.                 bSizer6 = New wxBoxSizer.Create(wxVERTICAL)
  969.  
  970.                 bSizer6.Add(newEdit, 1, wxEXPAND | wxALL, 5)
  971.  
  972.                 m_panel2.SetSizer(bSizer6)
  973.                 m_panel2.Layout()
  974.                 bSizer6.Fit(m_panel2)
  975.                 notebook.InsertPage(page, m_panel2, StripDir(filename), False)
  976.                 notebook.SetSelection(page)
  977.                
  978.                 newEdit.id = page
  979.                 newEdit.filename = filename
  980.                 Local formattedText:String = gframe.LoadSource(projectPath + "" + filename)
  981.                
  982.                 newEdit.Cancel()
  983.                 newEdit.SetUndoCollection(False)
  984.                 newEdit.AddText(formattedText)
  985.                 newEdit.SetUndoCollection(True)
  986.                 newEdit.EmptyUndoBuffer()
  987.                 newEdit.SetSavePoint()
  988.                
  989.                 editPages.AddLast(newEdit)
  990.                 newEdit.SetFocus()
  991.         End Function
  992.        
  993.         Function OnOpenFile(event:wxEvent)
  994.                 If projectFilePath = ""
  995.                         wxMessageBox "You need to create or load a project!", "BambooEditor Message"
  996.                         Return
  997.                 EndIf
  998.                 Local filename:String =  wxFileSelector( "Open source file.", projectFilePath, "", "bam","BambooBasic Source File (*.bam)|*.bam", wxFD_OPEN)
  999.                
  1000.                 If filename = "" Then Return
  1001.                
  1002.                 If(Instr(filename, projectPath) = 0)
  1003.                         wxMessageBox "File to be opened needs to be in the project root folder.", "BambooEditor Message"
  1004.                         Return
  1005.                 EndIf
  1006.                
  1007.                 DebugLog "Open File: " + filename
  1008.                 OpenSourceFile(filename)
  1009.         End Function
  1010.        
  1011.         Function onOpenProject(event:wxEvent)
  1012.                 If projectFilePath <> ""
  1013.                         Local result:Int = Confirm("Do you really want to open an existing project?")
  1014.                         If result = False Then Return
  1015.                         result = Confirm("Save any unsaved files in project?")
  1016.                         If result
  1017.                                 gframe.SaveAll()
  1018.                         EndIf
  1019.                        
  1020.                         gframe.CloseProject()
  1021.                 End If
  1022.                
  1023.                
  1024.                
  1025.                 gframe.SetLabel(header)
  1026.                
  1027.                 Local filename:String =  wxFileSelector( "Open project.", CurrentDir$(), "", "bbp","BambooBasic Projects (*.bbp)|*.bbp", wxFD_OPEN)
  1028.        
  1029.                 If filename = "" Then Return
  1030.                
  1031.                 CloseProject()
  1032.                 projectProperties = Null
  1033.                 projectProperties = TProject.OpenProject(filename)
  1034.                
  1035.                
  1036.                 For Local openeditfiles:String = EachIn projectProperties.editFiles
  1037.                         Local filepath:String = projectPath + "" + openeditfiles
  1038.                        
  1039.                         Local page:Int = notebook.GetPageCount()
  1040.                
  1041.                         Local m_panel2:wxPanel
  1042.                        
  1043.                         m_panel2 = New wxPanel.Create(notebook, wxID_ANY,,, ,, wxTAB_TRAVERSAL)
  1044.                         Local newEdit:Edit = Edit(New Edit.Create(m_panel2, wxID_ANY,,, ,, wxWANTS_CHARS))
  1045.                         Local bSizer6:wxBoxSizer
  1046.                         bSizer6 = New wxBoxSizer.Create(wxVERTICAL)
  1047.        
  1048.                         bSizer6.Add(newEdit, 1, wxEXPAND | wxALL, 5)
  1049.        
  1050.                         m_panel2.SetSizer(bSizer6)
  1051.                         m_panel2.Layout()
  1052.                         bSizer6.Fit(m_panel2)
  1053.                         notebook.InsertPage(page, m_panel2, StripDir(filepath), False)
  1054.                         notebook.SetSelection(page)
  1055.                        
  1056.                         newEdit.id = page
  1057.                         newEdit.filename = openeditfiles
  1058.                        
  1059.                         DebugLog "Loading Source"
  1060.                         Local formattedText:String = gframe.LoadSource(filepath)
  1061.                         DebugLog "Source Loaded"
  1062.                         newEdit.Cancel()
  1063.                         newEdit.SetUndoCollection(False)
  1064.                         newEdit.AddText(formattedText)
  1065.                         newEdit.SetUndoCollection(True)
  1066.                         newEdit.EmptyUndoBuffer()
  1067.                         newEdit.SetSavePoint()
  1068.                        
  1069.                         editPages.AddLast(newEdit)
  1070.                         newEdit.SetFocus()
  1071.                 Next
  1072.                
  1073.                 projectProperties.SaveProject()
  1074.         End Function
  1075.        
  1076.         Function OnNewProject(event:wxEvent)
  1077.                 If projectFilePath <> ""
  1078.                         Local result:Int = Confirm("Do you really want to create a new project?")
  1079.                         If result = False Then Return
  1080.                        
  1081.                         result = Confirm("Save any unsaved files in project?")
  1082.                         If result
  1083.                                 gframe.SaveAll()
  1084.                         EndIf
  1085.                        
  1086.                         gframe.CloseProject()
  1087.                 End If
  1088.                
  1089.                
  1090.                
  1091.                 Local frame:GLBWorkNewProjectFrame
  1092.                 frame = GLBWorkNewProjectFrame(New GLBWorkNewProjectFrame.Create(,, "New BambooBasic Project...", 0, 0, 300, 325, wxCLOSE_BOX | wxCAPTION))
  1093.                 frame.CenterOnParent()
  1094.                 frame.Layout()
  1095.                 frame.Show(True)
  1096.         End Function
  1097.        
  1098.         Function OnNewFile(event:wxEvent)
  1099.                 If projectFilePath = ""
  1100.                         wxMessageBox "You need to create or load a project first.", "BambooEditor Message"
  1101.                         Return
  1102.                 EndIf
  1103.                
  1104.                 Local filename:String =  wxFileSelector( "Save file to...", projectPath, "", "bam","BambooBasic Source File (*.bam)|*.bam", wxFD_SAVE | wxFD_OVERWRITE_PROMPT )
  1105.                 If filename = "" Then Return
  1106.                
  1107.                 If(Instr(filename, projectPath) = 0)
  1108.                         wxMessageBox "New file needs to be created in the project root folder.", "BambooEditor Message"
  1109.                         Return
  1110.                 EndIf
  1111.                
  1112.                 If Lower$(Right$(filename,4)) <> ".bam" Then filename = filename + ".bam"
  1113.                
  1114.                 Local filepath:String = filename        
  1115.                
  1116.                 filename = Replace(filename, projectPath + "", "")
  1117.                
  1118.                 Local fileExists:Int = False
  1119.                
  1120.                 For Local checkFiles:String = EachIn projectProperties.editFiles
  1121.                         If checkFiles = filename
  1122.                                 fileExists = True
  1123.                                 Exit
  1124.                         End If
  1125.                 Next
  1126.                
  1127.                 If fileExists = False
  1128.                         projectProperties.editFiles.AddLast(filename)
  1129.                        
  1130.                         fileExists = False
  1131.                         For Local checkFiles:String = EachIn projectProperties.srcFiles
  1132.                                 If checkFiles = filename
  1133.                                         fileExists = True
  1134.                                         Exit
  1135.                                 End If
  1136.                         Next
  1137.                        
  1138.                         If fileExists = False
  1139.                                 projectProperties.srcFiles.AddLast(filename)
  1140.                         End If
  1141.                        
  1142.                 Else
  1143.                         For Local loopeditors:Edit = EachIn editPages
  1144.                                 If loopeditors.filename = filename
  1145.                                         wxMessageBox "Please manually close file in editor first.", "BambooEditor Message"
  1146.                                         notebook.SetSelection(loopeditors.id)
  1147.                                         Return
  1148.                                 EndIf  
  1149.                         Next
  1150.                 EndIf
  1151.                
  1152.                 projectProperties.SaveProject()
  1153.  
  1154.                 Local fileout:TStream = WriteFile(filepath)
  1155.                         WriteLine(fileout, "'------------------------")
  1156.                         WriteLine(fileout, "'File: " + filename)
  1157.                         WriteLine(fileout, "'Company: " + projectProperties.companyName)
  1158.                         WriteLine(fileout, "'Created: " + CurrentDate())
  1159.                 CloseFile fileout
  1160.                
  1161.                 Local page:Int = notebook.GetPageCount()
  1162.                
  1163.                 Local m_panel2:wxPanel
  1164.                
  1165.                 m_panel2 = New wxPanel.Create(notebook, wxID_ANY,,, ,, wxTAB_TRAVERSAL)
  1166.                 Local newEdit:Edit = Edit(New Edit.Create(m_panel2, wxID_ANY,,, ,, wxWANTS_CHARS))
  1167.                 Local bSizer6:wxBoxSizer
  1168.                 bSizer6 = New wxBoxSizer.Create(wxVERTICAL)
  1169.  
  1170.                 bSizer6.Add(newEdit, 1, wxEXPAND | wxALL, 5)
  1171.  
  1172.                 m_panel2.SetSizer(bSizer6)
  1173.                 m_panel2.Layout()
  1174.                 bSizer6.Fit(m_panel2)
  1175.                 notebook.InsertPage(page, m_panel2, StripDir(filename), False)
  1176.                 notebook.SetSelection(page)
  1177.                
  1178.                 newEdit.id = page
  1179.                 newEdit.filename = filename
  1180.                
  1181.                 Local formattedText:String = gframe.LoadSource(projectPath + "" + filename)
  1182.                
  1183.                 newEdit.Cancel()
  1184.                 newEdit.SetUndoCollection(False)
  1185.                 newEdit.AddText(formattedText)
  1186.                 newEdit.SetUndoCollection(True)
  1187.                 newEdit.EmptyUndoBuffer()
  1188.                 newEdit.SetSavePoint()
  1189.                
  1190.                 editPages.AddLast(newEdit)
  1191.                 newEdit.SetFocus()
  1192.                
  1193.         End Function
  1194.        
  1195.         Function LoadSource:String(unformattedSourceFile:String)
  1196.                 Local fileContents:String
  1197.                 DebugLog "Load Source: " + unformattedSourceFile
  1198.                 Local filein:TStream = ReadFile(unformattedSourceFile)
  1199.                
  1200.                
  1201.                 Repeat
  1202.                         Local line:String = ReadLine(filein)
  1203.                         fileContents = fileContents + line + Chr:String(13) + Chr:String(10)
  1204.                 Until Eof(filein)
  1205.                
  1206.                 CloseFile filein
  1207.                
  1208.                 fileContents = Left(fileContents, Len(fileContents) - 2)
  1209.                
  1210.                 Return fileContents
  1211.         End Function
  1212.        
  1213.         Function SaveSource(formattedSourceFile:String, page:Int)
  1214.                 For Local loopEditIDs:Edit = EachIn editPages
  1215.                         If loopEditIDs.id = page
  1216.                
  1217.                                 Local fileout:TStream = WriteFile(formattedSourceFile)
  1218.                
  1219.                                 Local lines:Int = loopEditIDs.GetLineCount() - 1
  1220.                                
  1221.                                 Local inrem:Int = False
  1222.                                 For Local loopLine:Int = 0 To lines
  1223.                                         Local line:String = loopEditIDs.GetLine(loopLine)
  1224.                                         Local inComment:Int = False
  1225.                                         Local lineStr:String
  1226.                                         For Local loopChars:Int = 1 To Len(line)
  1227.                                                 Local char:String = Mid:String(line, loopChars, 1)
  1228.                                                
  1229.                                                 lineStr = lineStr + char
  1230.                                         Next
  1231.                                         lineStr = Replace(lineStr, Chr:String(13), "")
  1232.                                         lineStr = Replace(lineStr, Chr:String(10), "")
  1233.                                         WriteLine fileout, lineStr
  1234.                                 Next
  1235.                                        
  1236.                                 CloseFile fileout
  1237.                                 Return
  1238.                         EndIf
  1239.                 Next
  1240.         End Function
  1241. End Type
  1242.  
  1243.  
  1244. Type Edit Extends wxScintilla
  1245.         ' "keys" holds the BlitzMax command list
  1246.         Global keys:String
  1247.         ' the callback functions needs access to wxScintilla, a global object makes the job
  1248.         Field editControl:Edit
  1249.         Global moduleFunctionWords:String[]
  1250.         'Global keyList:String[]
  1251.        
  1252.         Field showCallTip:Int = False
  1253.         Field callTipString:String
  1254.         Field currentWords:String
  1255.         Field checkForMembers:Int
  1256.         Field filename:String
  1257.         Field id:Int
  1258.        
  1259.         Method OnInit()
  1260.                 moduleList = New TList
  1261.                 functionMap= New TMap
  1262.                 variableMap= New TMap
  1263.                 keys:String = CreateCMDList()
  1264.                 Self.editControl = Self
  1265.                
  1266.                 Self.SetSelection(0, 0)
  1267.                
  1268.                 ConnectAny(wxEVT_SCI_MARGINCLICK, onMarginClick)
  1269.                 ConnectAny(wxEVT_SCI_CHARADDED, onCharAdd)
  1270.                 ConnectAny(wxEVT_SCI_AUTOCOMP_SELECTION, onAutoCompSelection)
  1271.                 ConnectAny(wxEVT_KEY_DOWN, OnKeyDown)
  1272.                
  1273.                
  1274.                 SetLexerLanguage("blitzmax")
  1275.                 SetKeyWords(0, keys.toLower())
  1276.                
  1277.                 Local FONT:wxFont = New wxFont.CreateWithAttribs(12, wxTELETYPE, wxNORMAL, wxBOLD)
  1278.                 Local kw:wxFont = New wxFont.CreateWithAttribs(12, wxTELETYPE, wxNORMAL, wxBOLD)
  1279.                 StyleSetFontFont(wxSCI_STYLE_DEFAULT, FONT)
  1280.                 StyleSetFontFont(wxSCI_B_KEYWORD, kw)
  1281.                
  1282.                 StyleSetBackground(wxSCI_STYLE_DEFAULT, New wxColour.CreateNamedColour("RGB(51,68,85)"))
  1283.                 StyleSetForeground(wxSCI_STYLE_DEFAULT, New wxColour.CreateNamedColour("RGB(255,255,255)"))
  1284.                 StyleClearAll()
  1285.                
  1286.                 SetCaretForeground(New wxColour.CreateNamedColour("RGB(255,255,255)"))
  1287.                 SetCaretLineBackground(New wxColour.CreateNamedColour("RGB(51,68,85)"))
  1288.                 Self.SetCaretLineVisible(True)
  1289.                
  1290.                 StyleSetBackground(wxSCI_B_KEYWORD, New wxColour.CreateNamedColour("RGB(51,68,85)"))
  1291.                 StyleSetBackground(wxSCI_B_STRING, New wxColour.CreateNamedColour("RGB(51,68,85)"))
  1292.                 StyleSetBackground(wxSCI_B_COMMENT, New wxColour.CreateNamedColour("RGB(51,68,85)"))
  1293.                 StyleSetBackground(wxSCI_B_NUMBER, New wxColour.CreateNamedColour("RGB(51,68,85)"))
  1294.                
  1295.                 StyleSetForeground(wxSCI_B_KEYWORD, New wxColour.CreateNamedColour("RGB(255, 255, 0)"))
  1296.                 StyleSetForeground(wxSCI_B_COMMENT, New wxColour.CreateNamedColour("RGB(187, 238, 255)"))
  1297.                 StyleSetForeground(wxSCI_B_STRING, New wxColour.CreateNamedColour("RGB(0, 255, 102)"))
  1298.                 StyleSetForeground(wxSCI_B_NUMBER, New wxColour.CreateNamedColour("RGB(64, 255, 255)"))
  1299.                 StyleSetForeground(wxSCI_B_COMMENTREM, New wxColour.CreateNamedColour("RGB(187, 238, 255)"))
  1300.                 StyleSetForeground(wxSCI_B_INLINE, New wxColour.CreateNamedColour("RGB(230,230,230)"))
  1301.                
  1302.                 StyleSetBold(wxSCI_B_KEYWORD, True)
  1303.                 StyleSetBold(wxSCI_B_STRING, True)
  1304.                 StyleSetBold(wxSCI_B_COMMENT, True)
  1305.                 StyleSetBold(wxSCI_B_NUMBER, True)
  1306.                
  1307.                 SetTabWidth(4)
  1308.                 SetIndent(0)
  1309.                 SetTabIndents(1)
  1310.                 SetBackSpaceUnIndents(1)
  1311.                 Self.editControl.SetIndentationGuides(2)
  1312.                
  1313.                 StyleSetForeground(wxSCI_STYLE_INDENTGUIDE, New wxColour.CreateNamedColour("RGB(145, 145, 0)"))
  1314.                
  1315.                
  1316.                 ' Linenumber Margin    
  1317.                 setmargintype(0, wxSCI_MARGIN_NUMBER)
  1318.                 SetMarginWidth(0, TextWidth(wxSCI_STYLE_LINENUMBER, "_999999"))
  1319.                 StyleSetForeground(wxSCI_STYLE_LINENUMBER, New wxColour.CreateNamedColour("RGB(50,50,50)"))
  1320.                
  1321.                 AutoCompSetSeparator(Asc(" "))
  1322.                 AutoCompSetAutoHide(False)
  1323.                 AutoCompSetIgnoreCase(True)
  1324.                 AutoCompSetChooseSingle(True)
  1325.                 AutoCompSetFillUps(" (")
  1326.                
  1327.                 moduleFunctionWords = keys.Split(" ")
  1328.                
  1329.                 UsePopUp(1)
  1330.                 SetLayoutCache(wxSCI_CACHE_PAGE)
  1331.                 SetBufferedDraw(1)
  1332.                
  1333.         End Method
  1334.        
  1335.         Function GetControl:Edit()
  1336.                 Local selection:Int = notebook.GetSelection()
  1337.                
  1338.                 For Local loopEditors:Edit = EachIn editPages
  1339.                         If loopEditors.id = selection
  1340.                                 Return(loopEditors.editControl)
  1341.                         EndIf
  1342.                 Next
  1343.                
  1344.                 Return(Null)
  1345.         EndFunction
  1346.        
  1347.         Function OnKeyDown(event:wxEvent)
  1348.                 Local ed:Edit = GetControl()
  1349.                 Local evt:wxKeyEvent = wxKeyEvent(event)
  1350.                
  1351.                 If evt.GetKeyCode() = WXK_RETURN And Not ed.AutoCompActive()
  1352.                         Local strLine:String
  1353.                         Local iPos:Int = ed.GetCurrentPos()
  1354.                         Local iLine:Int = ed.LineFromPosition(iPos)
  1355.                        
  1356.                         Local tabCount:Int = 0
  1357.                         strLine = ed.GetLine(iLine)
  1358.                         For Local checkTabs:Int = 1 To Len(strLine)
  1359.                                 If Mid:String(strLine, checkTabs, 1) = "~t"
  1360.                                         tabCount = tabCount + 1
  1361.                                 Else
  1362.                                         Exit
  1363.                                 EndIf
  1364.                         Next
  1365.                        
  1366.                         ed.NewLine()
  1367.                         For Local tabLoop:Int = 1 To tabCount
  1368.                                 ed.Tab()
  1369.                         Next
  1370.                        
  1371.                         event.Skip(False)
  1372.                         Return
  1373.                 EndIf
  1374.                
  1375.                 event.Skip()
  1376.         End Function
  1377.        
  1378.         Function onAutoCompSelection(event:wxEvent)
  1379.                 event.Skip()
  1380.         End Function
  1381.        
  1382.         Function CheckForString:Int(currentPos:Int)
  1383.                 Local ed:Edit = GetControl()
  1384.                 Local result:Int = False
  1385.                 Local quoteCount:Int = 0
  1386.                 Local iLine:Int = ed.LineFromPosition(currentPos)
  1387.                 Local strLine:String = ed.GetLine(iLine)
  1388.                
  1389.                 For Local index:Int = Len(strLine) To 1 Step -1
  1390.                         Local char:String = Mid$(strLine,index,1)
  1391.                        
  1392.                         If char = "~q"
  1393.                                 quoteCount = quoteCount + 1
  1394.                                 result = quoteCount Mod 2
  1395.                         EndIf
  1396.                        
  1397.                         If char = "'" And result = False
  1398.                                 Return(False)
  1399.                         End If
  1400.                 Next
  1401.                
  1402.                 Return (Not result)
  1403.         End Function
  1404.        
  1405.         Function onCharAdd(event:wxEvent)
  1406.                 Local ed:Edit = GetControl()
  1407.                
  1408.                 Local iPos:Int = ed.GetCurrentPos()
  1409.                
  1410.                 If CheckForString(iPos) = True
  1411.                         Local charAtLeft:String = Chr:String(ed.GetCharAt(iPos - 1))
  1412.                        
  1413.                         Self.Intellisense(iPos, charAtLeft)
  1414.                
  1415.                 EndIf
  1416.                
  1417.                 ed.BeginUndoAction()
  1418.                 ed.EndUndoAction()
  1419.                        
  1420.                 event.Skip()
  1421.         End Function
  1422.        
  1423.         Function onMarginClick(event:wxEvent)
  1424.                 Local ed:Edit = GetControl()
  1425.                 Local p:Int = wxScintillaEvent(event).getPosition()
  1426.                 ed.togglefold(ed.linefromposition(p))
  1427.                
  1428.                 event.Skip()
  1429.         End Function
  1430.        
  1431.         Function Intellisense(iPos:Int, charAtLeft:String)
  1432.        
  1433.                 Local isCommand:Int = CheckForAutoCompCommands(iPos)
  1434.                
  1435.                 If isCommand = False
  1436.                         CheckForCallTips(iPos) 
  1437.                 EndIf
  1438.                
  1439.         End Function
  1440.        
  1441.         Function RemoveUnwantedCallTip:Int(strLine:String)
  1442.                 Local bracketCount:Int = 0
  1443.                
  1444.                 If Instr(strLine, "(", 1)
  1445.                         For Local Loop:Int = 1 To Len(strLine)
  1446.                                 Local char:String = Mid:String(strLine, Loop, 1)
  1447.                        
  1448.                                 If char = "("
  1449.                                         bracketCount = bracketCount + 1
  1450.                                 EndIf
  1451.                        
  1452.                                 If char = ")"
  1453.                                         bracketCount = bracketCount - 1
  1454.                                 EndIf
  1455.                         Next
  1456.                
  1457.                         If bracketCount = 0
  1458.                                 Return True
  1459.                         EndIf
  1460.                 EndIf
  1461.                 Return False
  1462.         End Function
  1463.        
  1464.         Function CheckForCallTips(iPos:Int)
  1465.                 Local ed:Edit = GetControl()
  1466.                
  1467.                 Local strLine:String
  1468.                 Local iLine:Int = ed.LineFromPosition(iPos)
  1469.                 Local iStart:Int = ed.PositionFromLine(iLine)
  1470.                
  1471.                 strLine = ed.GetTextRange(iStart, iPos)
  1472.                 Local openBracketCount:Int
  1473.                 Local closedBracketCount:Int
  1474.                 Local bracketLoop:Int = 0
  1475.                 Local callTipFound:Int = False
  1476.                 'Sort out available words
  1477.                 Local lex:TLexer = New TLexer
  1478.                 lex.mLexLine(strLine)
  1479.                
  1480.                 For Local loopTokens:Int = 0 To (lex.iTokenAmount + 1)
  1481.                         If lex.TokenType[loopTokens] = lex.TYPE_SYMBOL
  1482.                                 If lex.sTokenBank[loopTokens] = "("
  1483.                                         If lex.TokenType[loopTokens - 1] = lex.TYPE_WORD
  1484.                                                 openBracketCount = openBracketCount + 1
  1485.                                         End If
  1486.                                 EndIf
  1487.                         EndIf
  1488.                        
  1489.                         If lex.sTokenBank[loopTokens] = ")"
  1490.                                 closedBracketCount = closedBracketCount + 1
  1491.                         End If
  1492.                 Next
  1493.  
  1494.                 bracketLoop = openBracketCount
  1495.                
  1496.                 For Local loopTokens:Int = (lex.iTokenAmount + 1) To 1 Step - 1
  1497.                         If lex.TokenType[loopTokens] = lex.TYPE_SYMBOL
  1498.        
  1499.                                 If lex.sTokenBank[loopTokens] = "("
  1500.                                         If lex.TokenType[loopTokens - 1] = lex.TYPE_WORD
  1501.                                                 If StringArrayContains(ed.moduleFunctionWords, lex.sTokenBank[loopTokens - 1])
  1502.                                                         ed.CallTipCancel()
  1503.                                                                 If RemoveUnwantedCallTip(strLine) = False
  1504.                                                                         ed.CallTipShow(iPos, String(functionMap.ValueForKey(lex.sTokenBank[loopTokens - 1])))
  1505.                                                                         callTipFound = True
  1506.                                                                         Exit
  1507.                                                                 EndIf
  1508.                                                         EndIf
  1509.                                                 EndIf
  1510.                                         EndIf
  1511.                                
  1512.                                
  1513.                                 If lex.sTokenBank[loopTokens] = ")"
  1514.                                         For Local newLoop:Int = loopTokens To 1 Step - 1
  1515.                                                 If lex.TokenType[newLoop] = lex.TYPE_SYMBOL
  1516.                                                         If lex.sTokenBank[newLoop] = "("
  1517.                                                                 bracketLoop = bracketLoop - 1
  1518.                                                                 If lex.TokenType[newLoop - 1] = lex.TYPE_WORD And (bracketLoop = (openBracketCount - closedBracketCount))
  1519.                                                                 loopTokens = newLoop
  1520.                                                                 ed.CallTipCancel()
  1521.                                                                 Exit
  1522.                                                                 EndIf
  1523.                                                         EndIf
  1524.                                                 EndIf
  1525.                                         Next
  1526.                                        
  1527.                                 End If
  1528.                         EndIf
  1529.                 Next
  1530.         End Function
  1531.        
  1532.         Function CheckForAutoCompCommands:Int(iPos:Int)
  1533.         Local ed:Edit = GetControl()
  1534.        
  1535.         Local autoCompFireAmount:Int = 1
  1536.         Local token:String = ""
  1537.         Local objectToken:String = ""
  1538.         Local reversedToken:String = ""
  1539.         Local char:Int
  1540.         Local currentWords:String
  1541.        
  1542.         Local iLine:Int = ed.LineFromPosition(iPos)
  1543.         Local iStart:Int = ed.PositionFromLine(iLine)
  1544.        
  1545.         ed.checkForMembers = False
  1546.         Local loopLine:Int
  1547.        
  1548.                         For loopLine = iPos To iStart Step - 1         
  1549.                                 char = ed.GetCharAt(loopLine)
  1550.                                
  1551.                                 Select char
  1552.                                         Case Asc("~t")
  1553.                                                 Exit
  1554.                                         Case 32
  1555.                                                 Exit
  1556.                                         Case 10
  1557.                                                 Exit
  1558.                                         Case Asc(",")
  1559.                                                 Exit
  1560.                                         Case Asc("(")
  1561.                                                 Exit
  1562.                                         Case Asc(".")
  1563.                                                 ed.checkForMembers = True
  1564.                                                 Exit
  1565.                                         Default
  1566.                                                 token = token + Chr:String(char)
  1567.                                 End Select
  1568.                         Next
  1569.                        
  1570.                         token = Right(token, Len(token) - 1)
  1571.                         Local tempChar:String
  1572.                        
  1573.                         If ed.checkForMembers = True
  1574.                                 Local lex:TLexer = New TLexer
  1575.                                 Local strLine:String = ed.GetTextRange(iStart, loopLine)
  1576.                                
  1577.                                 lex.mLexLine(strLine)
  1578.                                 objectToken = lex.sTokenBank[lex.iTokenAmount + 1]
  1579.                                 autoCompFireAmount = 0
  1580.                         End If
  1581.                        
  1582.                         For Local Loop:Int = Len(token) To 1 Step - 1
  1583.                                 tempChar = Mid(token, Loop, 1)
  1584.                                 reversedToken = reversedToken + tempChar
  1585.                         Next
  1586.                        
  1587.                         If ed.checkForMembers = True
  1588.                                 currentWords = ed.BuildAutoMemberList(reversedToken, objectToken, autoCompFireAmount)
  1589.                         Else
  1590.                                 currentWords = ed.BuildAutoList(reversedToken, autoCompFireAmount)
  1591.                         End If
  1592.                        
  1593.                         If currentWords <> ""
  1594.                                 Local tempString:String[] = currentWords.Split(" ")
  1595.                                 tempString.Sort()
  1596.                                 currentWords = ""
  1597.                                 For Local remapList:String = EachIn tempString
  1598.                                         currentWords = currentWords + remapList + " "
  1599.                                 Next
  1600.                                
  1601.                                 ed.AutoCompShow(Len(reversedToken), currentWords)
  1602.                                 ed.AutoCompSelect(reversedToken)
  1603.                                
  1604.                                 If ed.checkForMembers = True
  1605.                                         gframe.SetStatusText("")
  1606.                                         For Local classes:TAutoCompContainer = EachIn classList
  1607.                                                 If classes.className = objectToken
  1608.                                                         For Local key:String = EachIn MapKeys(classes.fieldMap)
  1609.                                                                 Local autoIndex:Int = ed.AutoCompGetCurrent()
  1610.                                                                 If autoIndex <> - 1
  1611.                                                                         If autoIndex > 0 Then autoIndex = autoIndex + 1
  1612.                                                                         If key = tempString[autoIndex + 1]
  1613.                                                                                 Local statusTip:String = Right(String(classes.fieldMap.ValueForKey(key)), Len(String(classes.fieldMap.ValueForKey(key))))
  1614.                                                                                 gframe.SetStatusText(statusTip)
  1615.                                                                                 Exit
  1616.                                                                         Else
  1617.                                                                                 gframe.SetStatusText("")
  1618.                                                                         EndIf
  1619.                                                                 EndIf
  1620.                                                         Next
  1621.                                                 EndIf
  1622.                                         Next
  1623.                                 End If
  1624.                                
  1625.                                 Return True
  1626.                         End If
  1627.                        
  1628.                        
  1629.                         Return False
  1630.                 End Function
  1631.  
  1632.                 Function StringArrayContains:Int(strArray:String[], matchString:String)
  1633.                         For Local strLoop:Int = 0 To strArray.Length - 1
  1634.                                 If strArray[strLoop] = matchString Then Return True
  1635.                         Next
  1636.                         Return False
  1637.                 End Function
  1638.                
  1639.                 Function BuildAutoList:String(currentWord:String, fireBoundry:Int)
  1640.                         Local ed:Edit = GetControl()
  1641.                        
  1642.                         Local autoWordList:String = ""
  1643.                         currentWord = Lower(currentWord)
  1644.                         If Len(currentWord) > fireBoundry
  1645.                                 'Add Functions to List
  1646.                                 For Local Loop:Int = 0 To Len(ed.moduleFunctionWords) - 1
  1647.                                         If Lower(Left(ed.moduleFunctionWords[Loop], Len(currentWord))) = currentWord
  1648.                                                 autoWordList = autoWordList + (ed.moduleFunctionWords[Loop]) + " "
  1649.                                         EndIf
  1650.                                 Next
  1651.                                
  1652.                                 'Add variables to List
  1653.                                 For Local key:String = EachIn MapKeys(variableMap)
  1654.                                         If Lower(Left(key, Len(currentWord))) = currentWord
  1655.                                                 autoWordList = autoWordList + key + " "
  1656.                                         EndIf
  1657.                                 Next
  1658.                                
  1659.                         EndIf
  1660.                        
  1661.                         If autoWordList = ""
  1662.                                 ed.AutoCompCancel()
  1663.                         EndIf
  1664.                        
  1665.                         Return autoWordList
  1666.                 End Function
  1667.                
  1668.                 Function BuildAutoMemberList:String(currentWord:String, objectToken:String, fireBoundry:Int)
  1669.                         Local autoWordList:String = ""
  1670.                         Local ed:Edit = GetControl()
  1671.                        
  1672.                         If Len(currentWord) > fireBoundry
  1673.                                 For Local classes:TAutoCompContainer = EachIn classList
  1674.                                         If classes.className = objectToken
  1675.                                                        
  1676.                                                 For Local key:String = EachIn MapKeys(classes.methodMap)
  1677.                                                         If Len(currentWord) > 2
  1678.                                                                 If Left(key, Len(currentWord)) = currentWord
  1679.                                                                         autoWordList = autoWordList + (key + " ")
  1680.                                                                 EndIf
  1681.                                                         Else
  1682.                                                                 autoWordList = autoWordList + (key + " ")
  1683.                                                         EndIf
  1684.                                                 Next
  1685.                                                        
  1686.                                                 For Local key:String = EachIn MapKeys(classes.fieldMap)
  1687.                                                         If Len(currentWord) > 2
  1688.                                                                 If Left(key, Len(currentWord)) = currentWord
  1689.                                                                         autoWordList = autoWordList + (key + " ")
  1690.                                                                 EndIf
  1691.                                                         Else
  1692.                                                                 autoWordList = autoWordList + (key + " ")
  1693.                                                         EndIf
  1694.                                                 Next
  1695.                                                 Exit
  1696.                                         EndIf
  1697.                                 Next
  1698.                         End If
  1699.                         If autoWordList = ""
  1700.                                 ed.AutoCompCancel()
  1701.                         EndIf
  1702.                        
  1703.                         Return autoWordList
  1704.                 End Function
  1705.                
  1706.                 Method OnSave()
  1707.                        
  1708.                 End Method
  1709. End Type


Comments :


Dabhand(Posted 1+ years ago)

 For shits and giggles, heres the vala version to compare:-
[code]
using Gtk;
using Gee;
using GLib;

public string appPath;
public string appDir;
public string projectPath;
public string projectFilePath;
public CProject currentProject = null;
public Notebook notebook;
public ArrayList<EditView> documents;
public TextView outputPane;
   
public class BambooEditor : Window {

    public BambooEditor () {
        this.title = "BambooBasic ('nix Edition)";
        set_default_size (640, 480);
        this.window_position = WindowPosition.CENTER;
       

        var toolbar = new Toolbar ();
        toolbar.get_style_context ().add_class (STYLE_CLASS_PRIMARY_TOOLBAR);

        this.CreateToolbar(toolbar);
      
      documents = new ArrayList<EditView>();
      
      notebook = new Gtk.Notebook();
      
      outputPane = new TextView ();
      outputPane.buffer.text = "Welcome to BambooBasic
The 'nix Edition (Version: 1.3)

Copyright (c) Michael Denathorn 2012-2013";
               
      var outputScroll = new ScrolledWindow (null, null);
        outputScroll.set_policy (PolicyType.AUTOMATIC, PolicyType.AUTOMATIC);
        outputScroll.add (outputPane);
      
        var vbox = new Box (Orientation.VERTICAL, 0);
        vbox.pack_start (toolbar, false, true, 5);
        vbox.pack_start (notebook, true, true, 5);
        vbox.pack_start (new Gtk.Label ("Output"), false, true, 0);
        vbox.pack_end (outputScroll, false, true, 5);
        add (vbox);
       
        projectPath = "";
      projectFilePath = "";
    }
   
   private void CreateToolbar(Toolbar toolbar)
   {
      //Load Icons
      var toolIconFactory = new IconFactory();
      toolIconFactory.add_default();
      
      var newProjectIcon = new Image.from_file(appDir+"/config/newproject.bmp");
      var newProjectIconSet = new IconSet.from_pixbuf(newProjectIcon.get_pixbuf());
      toolIconFactory.add("new-project-icon",newProjectIconSet);
      
      var openProjectIcon = new Image.from_file(appDir+"/config/openproject.bmp");
      var openProjectIconSet = new IconSet.from_pixbuf(openProjectIcon.get_pixbuf());
      toolIconFactory.add("open-project-icon",openProjectIconSet);
      
      var newFileIcon = new Image.from_file(appDir+"/config/newfile.bmp");
      var newFileIconSet = new IconSet.from_pixbuf(newFileIcon.get_pixbuf());
      toolIconFactory.add("new-file-icon",newFileIconSet);
      
      var openFileIcon = new Image.from_file(appDir+"/config/openfile.bmp");
      var openFileIconSet = new IconSet.from_pixbuf(openFileIcon.get_pixbuf());
      toolIconFactory.add("open-file-icon",openFileIconSet);
      
      var saveFileIcon = new Image.from_file(appDir+"/config/savefile.bmp");
      var saveFileIconSet = new IconSet.from_pixbuf(saveFileIcon.get_pixbuf());
      toolIconFactory.add("save-file-icon",saveFileIconSet);
      
      var saveAllIcon = new Image.from_file(appDir+"/config/saveall.bmp");
      var saveAllIconSet = new IconSet.from_pixbuf(saveAllIcon.get_pixbuf());
      toolIconFactory.add("save-all-icon",saveAllIconSet);
      
      var closeFileIcon = new Image.from_file(appDir+"/config/closefile.bmp");
      var closeFileIconSet = new IconSet.from_pixbuf(closeFileIcon.get_pixbuf());
      toolIconFactory.add("close-file-icon",closeFileIconSet);
      
      var projectExplorerIcon = new Image.from_file(appDir+"/config/projectexplorer.bmp");
      var projectExplorerIconSet = new IconSet.from_pixbuf(projectExplorerIcon.get_pixbuf());
      toolIconFactory.add("project-explorer-icon",projectExplorerIconSet);
      
      var openProjectFolderIcon = new Image.from_file(appDir+"/config/opencontainingfolder.bmp");
      var openProjectFolderIconSet = new IconSet.from_pixbuf(openProjectFolderIcon.get_pixbuf());
      toolIconFactory.add("open-project-folder-icon",openProjectFolderIconSet);
      
      var projectSettingsIcon = new Image.from_file(appDir+"/config/settings.bmp");
      var projectSettingsIconSet = new IconSet.from_pixbuf(projectSettingsIcon.get_pixbuf());
      toolIconFactory.add("project-settings-icon",projectSettingsIconSet);
      
      var startIcon = new Image.from_file(appDir+"/config/start.bmp");
      var startIconSet = new IconSet.from_pixbuf(startIcon.get_pixbuf());
      toolIconFactory.add("start-icon",startIconSet);
      
      var buildIcon = new Image.from_file(appDir+"/config/build.bmp");
      var buildIconSet = new IconSet.from_pixbuf(buildIcon.get_pixbuf());
      toolIconFactory.add("build-icon",buildIconSet);
      
      var openOutputDirIcon = new Image.from_file(appDir+"/config/openoutputdir.bmp");
      var openOutputDirIconSet = new IconSet.from_pixbuf(openOutputDirIcon.get_pixbuf());
      toolIconFactory.add("open-output-dir-icon",openOutputDirIconSet);
      
      var new_project_button = new ToolButton.from_stock ("new-project-icon");
      new_project_button.set_tooltip_text("Create a new project.");
        toolbar.add (new_project_button);
        new_project_button.clicked.connect (on_new_project_clicked);
       
        var open_project_button = new ToolButton.from_stock ("open-project-icon");
      open_project_button.set_tooltip_text("Open an existing project.");
        toolbar.add (open_project_button);
        open_project_button.clicked.connect (on_open_project_clicked);
       
        var sep1 = new SeparatorToolItem();
        toolbar.add (sep1);
       
        var new_file_button = new ToolButton.from_stock ("new-file-icon");
      new_file_button.set_tooltip_text("Create a new file.");
        toolbar.add (new_file_button);
        new_file_button.clicked.connect (on_new_file_clicked);
       
        var open_file_button = new ToolButton.from_stock ("open-file-icon");
      open_file_button.set_tooltip_text("Open an existing file.");
        toolbar.add (open_file_button);
        open_file_button.clicked.connect (on_open_clicked);
       
        var save_file_button = new ToolButton.from_stock ("save-file-icon");
      save_file_button.set_tooltip_text("Save the current file.");
        toolbar.add (save_file_button);
        save_file_button.clicked.connect (on_save_clicked);
       
        var save_all_button = new ToolButton.from_stock ("save-all-icon");
      save_all_button.set_tooltip_text("Save all opened files.");
        toolbar.add (save_all_button);
        save_all_button.clicked.connect (on_save__all_clicked);
       
        var close_file_button = new ToolButton.from_stock ("close-file-icon");
      close_file_button.set_tooltip_text("Close the current file.");
        toolbar.add (close_file_button);
        close_file_button.clicked.connect (on_close_file_clicked);
       
        //var sep2 = new SeparatorToolItem();
        //toolbar.add (sep2);
       
        var open_project_dir_button = new ToolButton.from_stock ("open-project-folder-icon");
      open_project_dir_button.set_tooltip_text("Explore the project's root folder.");
        toolbar.add (open_project_dir_button);
        open_project_dir_button.clicked.connect (on_open_project_dir_clicked);
       
        //var sep3 = new SeparatorToolItem();
        //toolbar.add (sep3);
       
        var sep4 = new SeparatorToolItem();
        toolbar.add (sep4);
       
        var project_settings_button = new ToolButton.from_stock ("project-settings-icon");
      project_settings_button.set_tooltip_text("Edit project settings.");
        toolbar.add (project_settings_button);
        project_settings_button.clicked.connect (on_project_settings_clicked);
       
        var start_button = new ToolButton.from_stock ("start-icon");
      start_button.set_tooltip_text("Build and run the project.");
        toolbar.add (start_button);
        start_button.clicked.connect (on_start_clicked);
       
        var build_button = new ToolButton.from_stock ("build-icon");
      build_button.set_tooltip_text("Build the project.");
        toolbar.add (build_button);
        build_button.clicked.connect (on_build_clicked);
       
        var open_output_dir_button = new ToolButton.from_stock ("open-output-dir-icon");
      open_output_dir_button.set_tooltip_text("Explore the output directory.");
        toolbar.add (open_output_dir_button);
        open_output_dir_button.clicked.connect (on_open_output_dir_clicked);
   }
   
   private void on_open_output_dir_clicked()
   {
      if(currentProject != null)
      {
         Posix.system("xdg-open "+currentProject.outputDir);
      }
   }
   
   private void on_build_clicked()
   {
      if(currentProject != null)
      {
         int documentsAmount = documents.size;
         
         for(int loop = 0; loop < documentsAmount; loop++)
         {
            EditView checkView = documents.get(loop);
            try {
               FileUtils.set_contents (checkView.filename, checkView.text_view.buffer.text);
            } catch (Error e) {
               Notify(e.message);
            }
         }
         
         CallBSG();
      }
   }
   
   private void on_start_clicked()
   {
      if(currentProject != null)
      {
         int documentsAmount = documents.size;
         
         for(int loop = 0; loop < documentsAmount; loop++)
         {
            EditView checkView = documents.get(loop);
            try {
               FileUtils.set_contents (checkView.filename, checkView.text_view.buffer.text);
            } catch (Error e) {
               Notify(e.message);
            }
         }
         
         CallBSG(true);
      }
   }
   
   private void CallBSG(bool run = false)
   {
      string cmdString = appDir+"/bin/bsg_pi";
      cmdString = cmdString + "|-s|"+projectPath+"/"+currentProject.editFile;
      cmdString = cmdString + "|-o|"+currentProject.outputDir;
      
      if(run == true)
      {
      cmdString = cmdString + "|-b|""+currentProject.localURL+""";         
      }
      
      if(currentProject.useBambooHeader) {cmdString = cmdString + "|-httphead";}
      if(currentProject.doTrace) {cmdString = cmdString + "|-t";}
      if(currentProject.outputComments) {cmdString = cmdString + "|-c";}
      
      outputPane.buffer.text = "";
      
      MainLoop loop = new MainLoop ();
      
      try {
         string[] spawn_args = cmdString.split("|");
         string[] spawn_env = null;
         
         Pid child_pid;

         int standard_input;
         int standard_output;
         int standard_error;
         
         Process.spawn_async_with_pipes (null,
            spawn_args,
            spawn_env,
            SpawnFlags.DO_NOT_REAP_CHILD,
            null,
            out child_pid,
            out standard_input,
            out standard_output,
            out standard_error);
            
            // stdout:
            IOChannel output = new IOChannel.unix_new (standard_output);
            output.add_watch (IOCondition.IN | IOCondition.HUP, (channel, condition) => {
               return process_line (channel, condition);
            });

            // stderr:
            IOChannel error = new IOChannel.unix_new (standard_error);
            error.add_watch (IOCondition.IN | IOCondit

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal