Code archives/BlitzPlus Gui/BambooBasic Editor

This code has been declared by its author to be Public Domain code.

Download source code

BambooBasic Editor by Dabhand2014
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):-

https://sourceforge.net/projects/bamboobasic/

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
SuperStrict

Framework wx.wxApp
Import wx.wxScintilla
Import wx.wxMouseEvent
Import wx.wxFrame
Import wx.wxPanel
Import wx.wxButton
Import wx.wxStaticText
Import wx.wxTextCtrl
Import wx.wxNotebook
Import wx.wxToolBar
Import wx.wxBitmap
Import wx.wxHtmlWindow
Import wx.wxFileDialog
Import wx.wxDirDialog
Import wx.wxDialog 
Import wx.wxListCtrl
Import wx.wxcheckbox
Import wx.wxProcess

Import wx.wxTaskBarIcon

Import brl.retro
Import brl.map
Import brl.Standardio

'Import bah.volumes
Import MaxGUI.Drivers

Import "bambooiconres.o"


Global moduleList:TList
Global functionMap:TMap
Global variableMap:TMap
Global projectPath:String = ""
Global projectFilePath:String = ""

Include "types.bmx"
Include "common.bmx"
Include "Lex.bmx"
Include "NewProject.bmx"
Include "ProjectSettings.bmx"
Include "ProjectExplorer.bmx"

Global gframe:GLBWorkFrame

'Load config file
LoadConfig()

Const ideversion:String = "v1.3"
Const header:String = "BambooBasic " + ideversion

Const Main_Frame:Int = 1
Const Home_Frame:Int = 2
Const Output_Frame:Int = 3

Const TREEVIEW:Int = 9000

Const Menu_File_New_Project:Int = 101
Const Menu_File_New_File:Int = 102
Const Menu_File_Open_Project:Int = 103
Const Menu_File_Open_File:Int = 104
Const Menu_File_Save:Int = 105
Const Menu_File_Save_As:Int = 106
Const Menu_File_Save_Project:Int = 107
Const Menu_File_Close_File:Int = 108
Const Menu_File_Close_Project:Int = 109
Const Menu_File_Remove_File:Int = 110
Const Menu_File_Quit:Int = 111

Const Menu_File_About:Int = 201

Const BOOKCTRL:Int = 2001

Const Tool_New_Project:Int = 3001
Const Tool_Open_Project:Int = 3002
Const Tool_New_File:Int = 3003
Const Tool_Save_File:Int = 3004
Const Tool_Save_All:Int = 3005
Const Tool_Open_File:Int = 3006
Const Tool_Close_File:Int = 3007
Const Tool_Open_Project_Folder:Int = 3008
Const Tool_Project_Explorer:Int = 3009

Const Tool_Cut:Int = 3110
Const Tool_Copy:Int = 3111
Const Tool_Paste:Int = 3112
Const Tool_Select_All:Int = 3113
Const Tool_Undo:Int = 3114
Const Tool_Redo:Int = 3115

Const Tool_Build:Int = 3201
Const Tool_Start:Int = 3202
Const Tool_Settings:Int = 3203
Const Tool_Open_Output_Folder:Int = 3204

Const Tool_Browser_Home:Int = 3301
Const Tool_Browser_Back:Int = 3302
Const Tool_Browser_Forward:Int = 3303

New GLBWork.Run()

Type GLBWork Extends wxApp
	Field frame:GLBWorkFrame

	Method OnInit:Int()
		' Create application frame
		frame = GLBWorkFrame(New GLBWorkFrame.Create(, Main_Frame, header, 0, 0, 800, 600))
		 
		' open application frame
		frame.Center()
		frame.Layout()
		frame.Show(True)
		SetTopWindow(frame)
		
		Return True
	End Method
	
End Type

Global editPages:TList
Global notebook:wxNotebook

Type GLBWorkFrame Extends wxFrame
	Field menu:wxMenu
	
	Field m_toolBar1:wxToolBar
	Field icon:wxBitmap
	Field home:wxHtmlWindow
	Field outputWindow:wxTextCtrl
	
	Method OnInit()
		wxInitAllImageHandlers()
		CreateStatusBar(1)
		Connect(, wxEVT_CLOSE_WINDOW, onCloseBoxQuit)
		wxInitAllImageHandlers()
		
		editPages = New TList
		
		Local fileMenu:wxMenu = New wxMenu.Create()
		
		Local fileNewMenu:wxMenu = New wxMenu.Create()
		fileNewMenu.Append(Menu_File_New_Project, "New Project")
		fileNewMenu.Append(Menu_File_New_File, "New File")
		fileMenu.AppendSubMenu(fileNewMenu, "New...")
		
		fileMenu.AppendSeparator()
		Local fileMenuOpenProject:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Open_Project, "Open Project")
		fileMenu.AppendItem(fileMenuOpenProject)
		Local fileMenuOpenFile:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Open_File, "Open File")
		fileMenu.AppendItem(fileMenuOpenFile)
		fileMenu.AppendSeparator()
		
		Local fileMenuSave:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Save, "Save")
		fileMenu.AppendItem(fileMenuSave)
		
		Local fileMenuSaveAs:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Save_As, "Save as...")
		fileMenu.AppendItem(fileMenuSaveAs)
		
		Local fileMenuSaveProject:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Save_Project, "Save Project")
		fileMenu.AppendItem(fileMenuSaveProject)
		
		fileMenu.AppendSeparator()
		
		Local fileMenuCloseFilet:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Close_File, "Close File")
		fileMenu.AppendItem(fileMenuCloseFilet)
		
		Local fileMenuCloseProject:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Close_Project, "Close Project")
		fileMenu.AppendItem(fileMenuCloseProject)
		
		fileMenu.AppendSeparator()
				
		Local fileMenuRemoveFile:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Remove_File, "Remove File")
		fileMenu.AppendItem(fileMenuRemoveFile)
		
		fileMenu.AppendSeparator()
		
		Local fileMenuQuit:wxMenuItem = New wxMenuItem.Create(fileMenu, Menu_File_Quit, "Exit BambooBasic")
		fileMenu.AppendItem(fileMenuQuit)
		
		Local menuBar:wxMenuBar = New wxMenuBar.Create( wxMB_DOCKABLE )
		menuBar.Append(fileMenu, "&File")
		
		' associate the menu bar with the frame
		'SetMenuBar(menuBar)
		
		Connect(Menu_File_Quit,wxEVT_COMMAND_MENU_SELECTED, OnQuit)
		Connect(Menu_File_New_Project, wxEVT_COMMAND_MENU_SELECTED, OnNewProject)
		Connect(Menu_File_New_File, wxEVT_COMMAND_MENU_SELECTED, OnNewFile)
		Connect(Menu_File_Open_Project, wxEVT_COMMAND_MENU_SELECTED, OnOpenProject)
		Connect(Menu_File_Open_File, wxEVT_COMMAND_MENU_SELECTED, OnOpenFile)
		Connect(Menu_File_Save, wxEVT_COMMAND_MENU_SELECTED, OnSaveFile)
		Connect(Menu_File_Save_As, wxEVT_COMMAND_MENU_SELECTED, OnSaveFileAs)
		Connect(Menu_File_Save_Project, wxEVT_COMMAND_MENU_SELECTED, OnSaveProject)
		Connect(Menu_File_Close_File, wxEVT_COMMAND_MENU_SELECTED, OnCloseFile)
		Connect(Menu_File_Close_Project, wxEVT_COMMAND_MENU_SELECTED, OnCloseProject)
		Connect(Menu_File_Remove_File, wxEVT_COMMAND_MENU_SELECTED, OnRemoveFile)
		icon = wxBitmap.CreateBitmap()
		
		Local editMenu:wxMenu = New wxMenu.Create()
		menuBar.Append(editMenu, "Edit")
		
		Local editUndo:wxMenuItem = New wxMenuItem.Create(editMenu, Tool_Undo, "Undo")
		editMenu.AppendItem(editUndo)
		
		Local editRedo:wxMenuItem = New wxMenuItem.Create(editMenu, Tool_Redo, "Redo")
		editMenu.AppendItem(editRedo)
		
		editMenu.AppendSeparator()
		
		Local editCut:wxMenuItem = New wxMenuItem.Create(editMenu, Tool_Cut, "Cut")
		editMenu.AppendItem(editCut)
		
		Local editCopy:wxMenuItem = New wxMenuItem.Create(editMenu, Tool_Copy, "Copy")
		editMenu.AppendItem(editCopy)
		
		Local editPaste:wxMenuItem = New wxMenuItem.Create(editMenu, Tool_Paste, "Paste")
		editMenu.AppendItem(editPaste)
		
		editMenu.AppendSeparator()
		
		Local editSelectAll:wxMenuItem = New wxMenuItem.Create(editMenu, Tool_Select_All, "Select All")
		editMenu.AppendItem(editSelectAll)
		
		Connect(Tool_Undo, wxEVT_COMMAND_MENU_SELECTED, OnUndo)
		Connect(Tool_Redo, wxEVT_COMMAND_MENU_SELECTED, OnRedo)
		Connect(Tool_Cut, wxEVT_COMMAND_MENU_SELECTED, OnCut)
		Connect(Tool_Copy, wxEVT_COMMAND_MENU_SELECTED, OnCopy)
		Connect(Tool_Paste, wxEVT_COMMAND_MENU_SELECTED, OnPaste)
		Connect(Tool_Select_All, wxEVT_COMMAND_MENU_SELECTED, OnSelectAll)
		
		'Local viewMenu:wxMenu = New wxMenu.Create()
		'menuBar.Append(viewMenu, "View")
		
		Local projectMenu:wxMenu = New wxMenu.Create()
		menuBar.Append(projectMenu, "Project")
		
		Local projectMenuProjectExplorer:wxMenuItem = New wxMenuItem.Create(projectMenu, Tool_Project_Explorer, "Project Explorer")
		projectMenu.AppendItem(projectMenuProjectExplorer)
		
		projectMenu.AppendSeparator()
		
		Local projectMenuBuild:wxMenuItem = New wxMenuItem.Create(projectMenu, Tool_Build, "Build Project")
		projectMenu.AppendItem(projectMenuBuild)
		
		projectMenu.AppendSeparator()
		
		Local projectMenuStart:wxMenuItem = New wxMenuItem.Create(projectMenu, Tool_Start, "Build and Run Project")
		projectMenu.AppendItem(projectMenuStart)
		
		projectMenu.AppendSeparator()
		
		Local projectMenuOutputFolder:wxMenuItem = New wxMenuItem.Create(projectMenu, Tool_Open_Output_Folder, "Open Output Directory")
		projectMenu.AppendItem(projectMenuOutputFolder)
		
		projectMenu.AppendSeparator()
		
		Local projectMenuSettings:wxMenuItem = New wxMenuItem.Create(projectMenu, Tool_Settings, "Project Settings")
		projectMenu.AppendItem(projectMenuSettings)
		
		Connect(Tool_Project_Explorer, wxEVT_COMMAND_MENU_SELECTED, OnProjectExplorer)
		Connect(Tool_Build, wxEVT_COMMAND_MENU_SELECTED, OnBuild)
		Connect(Tool_Start, wxEVT_COMMAND_MENU_SELECTED, onStart)
		Connect(Tool_Settings, wxEVT_COMMAND_MENU_SELECTED, OnSettings)
		Connect(Tool_Open_Output_Folder, wxEVT_COMMAND_MENU_SELECTED, OnOpenOutputFolder)
		
		Local helpMenu:wxMenu = New wxMenu.Create()
		menuBar.Append(helpMenu, "Twaddle")
		
		Local helpAboutMenu:wxMenuItem = New wxMenuItem.Create(helpMenu, Menu_File_About, "About")
		helpMenu.AppendItem(helpAboutMenu)
		
		Connect(Menu_File_About, wxEVT_COMMAND_MENU_SELECTED, OnAbout)
		
		SetMenuBar(menuBar)
		
		Connect(Tool_Open_Output_Folder, wxEVT_COMMAND_MENU_SELECTED, OnOpenOutputFolder)
		
		Local m_panel1:wxPanel
		Local m_panel2:wxPanel
		
		Local bSizer4:wxBoxSizer
		bSizer4 = New wxBoxSizer.Create(wxVERTICAL)

		m_panel1 = New wxPanel.Create(Self, wxID_ANY,,,,, wxTAB_TRAVERSAL)

		Local bSizer5:wxBoxSizer
		bSizer5 = New wxBoxSizer.Create(wxVERTICAL)
		
		notebook = wxNotebook.CreateNotebook(m_panel1, BOOKCTRL, wxID_ANY)
		
		Connect(-1, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, OnPageChanging)
		Connect(-1, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
		
		m_panel2 = New wxPanel.Create(notebook, wxID_ANY,,, ,, wxTAB_TRAVERSAL)
		
		home = New wxHtmlWindow.CreateHtmlWindow(m_panel2, Home_Frame,,,,,wxHW_SCROLLBAR_AUTO)
		home.LoadPage(AppDir:String + "\doc\index.html")
		
		Local bSizer6:wxBoxSizer
		bSizer6 = New wxBoxSizer.Create(wxVERTICAL)

		bSizer6.Add(home, 1, wxEXPAND | wxALL, 5)

		m_panel2.SetSizer(bSizer6)
		m_panel2.Layout()
		bSizer6.Fit(m_panel2)
		
		' the first page
		notebook.AddPage(m_panel2, "Home", True)
		
		bSizer5.Add(notebook, 4, wxEXPAND | wxALL, 5)
		outputWindow:wxTextCtrl = New wxTextCtrl.Create(m_panel1, 5000, "Welcome to BambooBasic...",,,,,wxTE_MULTILINE)
		bSizer5.Add(outputWindow, 1, wxEXPAND | wxALL, 5)
		
		'Add home stuff below
		m_panel1.SetSizer(bSizer5)
		m_panel1.Layout()
		bSizer5.Fit(m_panel1)
		bSizer4.Add(m_panel1, 1, wxEXPAND | wxALL, 5)
		
		m_toolBar1 = CreateToolbar(wxTB_HORIZONTAL, wxID_ANY)
		m_toolBar1.SetToolBitmapSize(24, 24)
		icon.LoadFile("config\newproject.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_New_Project, "NewProject", icon,,, "New Project")
		Connect(Tool_New_Project,wxEVT_COMMAND_TOOL_CLICKED,OnNewProject)
		
		icon.LoadFile("config\openproject.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Open_Project, "OpenProject", icon,,, "Open Project")
		Connect(Tool_Open_Project, wxEVT_COMMAND_TOOL_CLICKED, onOpenProject)
		
		m_toolBar1.AddSeparator()
		
		icon.LoadFile("config\newfile.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_New_File, "NewFile", icon,,, "New File")
		Connect(Tool_New_File, wxEVT_COMMAND_TOOL_CLICKED, OnNewFile)
		
		icon.LoadFile("config\openfile.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Open_File, "OpenFile", icon,,, "Open File")
		Connect(Tool_Open_File, wxEVT_COMMAND_TOOL_CLICKED, OnOpenFile)
		
		icon.LoadFile("config\savefile.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Save_File, "SaveFile", icon,,, "Save File")
		Connect(Tool_Save_File, wxEVT_COMMAND_TOOL_CLICKED, OnSaveFile)
		
		icon.LoadFile("config\saveall.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Save_All, "SaveAll", icon,,, "Save All")
		Connect(Tool_Save_All, wxEVT_COMMAND_TOOL_CLICKED, OnSaveProject)
		
		icon.LoadFile("config\closefile.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Close_File, "CloseFile", icon,,, "Close File")
		Connect(Tool_Close_File, wxEVT_COMMAND_TOOL_CLICKED, OnCloseFile)
		
		'Tool_Project_Explorer
		icon.LoadFile("config\projectexplorer.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Project_Explorer, "ProjectExplorer", icon,,, "Project Explorer")
		Connect(Tool_Project_Explorer, wxEVT_COMMAND_TOOL_CLICKED, OnProjectExplorer)
		
		icon.LoadFile("config\opencontainingfolder.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Open_Project_Folder, "OpenProjectFolder", icon,,, "Open Project Folder")
		Connect(Tool_Open_Project_Folder, wxEVT_COMMAND_TOOL_CLICKED, OnOpenProjectFolder)
		
		m_toolBar1.AddSeparator()
		
		icon.LoadFile("config\cut.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Cut, "Cut", icon,,, "Cut Text")
		Connect(Tool_Cut, wxEVT_COMMAND_TOOL_CLICKED, OnCut)
		
		icon.LoadFile("config\copy.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Copy, "Copy", icon,,, "Copy Text")
		Connect(Tool_Copy, wxEVT_COMMAND_TOOL_CLICKED, OnCopy)
		
		icon.LoadFile("config\paste.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Paste, "Paste", icon,,, "Paste Text")
		Connect(Tool_Paste, wxEVT_COMMAND_TOOL_CLICKED, OnPaste)
		
		m_toolBar1.AddSeparator()
		
		icon.LoadFile("config\settings.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Settings, "ProjectSettings", icon,,, "Project Settings")
		Connect(Tool_Settings, wxEVT_COMMAND_TOOL_CLICKED, OnSettings)
		
		icon.LoadFile("config\start.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Start, "StartProject", icon,,, "Build and run")
		Connect(Tool_Start, wxEVT_COMMAND_TOOL_CLICKED, OnStart)
		
		icon.LoadFile("config\build.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Build, "BuildProject", icon,,, "Build only")
		Connect(Tool_Build, wxEVT_COMMAND_TOOL_CLICKED, OnBuild)
		
		icon.LoadFile("config\openoutputdir.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Open_Output_Folder, "OutputFolder", icon,,, "Open output folder")
		Connect(Tool_Open_Output_Folder, wxEVT_COMMAND_TOOL_CLICKED, OnOpenOutputFolder)
		
		m_toolBar1.AddSeparator()
		
		icon.LoadFile("config\home.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Browser_Home, "HomeTab", icon,,, "Open home page")
		Connect(Tool_Browser_Home, wxEVT_COMMAND_TOOL_CLICKED, OnHome)
		
		icon.LoadFile("config\back.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Browser_Back, "Back", icon,,, "Back one home page")
		Connect(Tool_Browser_Back, wxEVT_COMMAND_TOOL_CLICKED, OnBack)
		
		icon.LoadFile("config\forward.bmp", wxBITMAP_TYPE_BMP)
		m_toolBar1.AddTool(Tool_Browser_Forward, "Forward", icon,,, "Forward one home page")
		Connect(Tool_Browser_Forward, wxEVT_COMMAND_TOOL_CLICKED, OnForward)
		
		m_toolBar1.Realize()
		
		
		SetSizer(bSizer4)
		Layout()
		Center(wxBOTH)
		
		gframe = Self
		
	End Method
	
	Function OnAbout(events:wxEvent)
		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..."
	End Function
	
	Function OnProjectExplorer(events:wxEvent)
		
		If projectFilePath = ""
			wxMessageBox "You need to create or load a project!", "BambooEditor Message"
			Return
		EndIf
		
		Local frame:ProjectExplorer
		frame = ProjectExplorer(New ProjectExplorer.Create(,, "Project Explorer...", 0, 0, 400, 500, wxCLOSE_BOX | wxCAPTION))
		frame.CenterOnParent()
		frame.Layout()
		frame.Show(True)
	End Function
	
	Function OnHome(event:wxEvent)
		notebook.SetSelection(0)
		Local page:Int = notebook.GetSelection()
		If page = 0
			gframe.home.LoadPage(AppDir:String + "\doc\index.html")
		EndIf
	End Function
	
	Function OnBack(event:wxEvent)
		Local page:Int = notebook.GetSelection()
		If page = 0
			If gframe.home.HistoryCanBack()
				gframe.home.HistoryBack()
			EndIf
		EndIf 
	End Function
	
	Function OnForward(event:wxEvent)
		Local page:Int = notebook.GetSelection()
		If page = 0
			If gframe.home.HistoryCanForward()
				gframe.home.HistoryForward()
			EndIf
		EndIf 
	End Function
	
	Function OnCloseBoxQuit(event:wxEvent)
		If projectFilePath <> ""
			projectProperties.SaveProject()
		End If
		End
	End Function

	Function OnQuit(event:wxEvent)
		If projectFilePath <> ""
			projectProperties.SaveProject()
		End If
		wxFrame(event.parent).Close(True)
	End Function
	
	Function OnSettings(events:wxEvent)
		
		If projectFilePath = ""
			wxMessageBox "You need to create or load a project!", "BambooEditor Message"
			Return
		EndIf
		
		Local frame:ProjectSettingsFrame
		frame = ProjectSettingsFrame(New ProjectSettingsFrame.Create(,, "Project Settings...", 0, 0, 300, 240, wxCLOSE_BOX | wxCAPTION))
		frame.CenterOnParent()
		frame.Layout()
		frame.Show(True)
	End Function
	
	Function CallBSG(run:Int = False)
		If projectPath <> ""
			gframe.SaveAll()
			'ChangeDir(AppDir$)
			
			gframe.outputWindow.Clear()

			Local cmdstring:String
			
			cmdstring = AppDir:String + "\bin\bsg_win"
			
			
			
			cmdstring = cmdstring + " -s ~q" + projectPath + "\" + projectProperties.editFile + "~q"
			cmdstring = cmdstring + " -o ~q" + projectProperties.outputDir + "~q"
			
			If run = True
				cmdstring = cmdstring + " -b ~q" + projectProperties.localURL + "~q"
			EndIf 
			
			If projectProperties.useBambooHeader Then cmdstring = cmdstring + " -httphead"
			If projectProperties.doTrace Then cmdstring = cmdstring + " -t"
			If projectProperties.outputComments Then cmdstring = cmdstring + " -c"
			
			Local m_versionProcess:wxProcess = New wxProcess.CreateWithFlags(wxPROCESS_REDIRECT)
			
			Local m_pid:Int = wxExecute(cmdstring, wxEXEC_SYNC, m_versionProcess )
			
			Local p_in:wxInputStream = m_versionProcess.GetInputStream()
		
			If p_in Then
				Local textInput:wxTextInputStream = New wxTextInputStream.Create(p_in)
				
				While Not p_in.Eof()
					gframe.outputWindow.AppendText(textInput.ReadLine() +"~n")
				Wend
				
			End If

			m_versionProcess.free()
			
			gframe.outputWindow.Enable()
			gframe.setfocus()
		EndIf 
	End Function 
	
	Function OnBuild(event:wxEvent)
		CallBSG()
	End Function
	
	Function OnStart(event:wxEvent)
		CallBSG(True)
	End Function
	
	Function OnUndo(event:wxEvent)
		Local page:Int = notebook.GetSelection()
		If page = 0
			wxMessageBox "Cannot redo here!", "BambooEditor Message"
			Return
		End If
		
		For Local loopEditIDs:Edit = EachIn editPages
			If loopEditIDs.id = page
				loopEditIDs.Undo()
				Exit
			EndIf
		Next
	End Function
	
	Function OnRedo(event:wxEvent)
		Local page:Int = notebook.GetSelection()
		If page = 0
			wxMessageBox "Cannot redo here!", "BambooEditor Message"
			Return
		End If
		
		For Local loopEditIDs:Edit = EachIn editPages
			If loopEditIDs.id = page
				loopEditIDs.Redo()
				Exit
			EndIf
		Next
	End Function
	
	Function OnCut(event:wxEvent)
		Local page:Int = notebook.GetSelection()
		If page = 0
			wxMessageBox "Cannot cut here!", "BambooEditor Message"
			Return
		End If
		
		For Local loopEditIDs:Edit = EachIn editPages
			If loopEditIDs.id = page
				loopEditIDs.Cut()
				Exit
			EndIf
		Next
	End Function
	
	Function OnCopy(event:wxEvent)
		Local page:Int = notebook.GetSelection()
		If page = 0
		wxMessageBox "Cannot copy here!", "BambooEditor Message"
			Return
		End If
		
		For Local loopEditIDs:Edit = EachIn editPages
			If loopEditIDs.id = page
				loopEditIDs.Copy()
				Exit
			EndIf
		Next
	End Function
	
	Function OnPaste(event:wxEvent)
		Local page:Int = notebook.GetSelection()
		If page = 0
		wxMessageBox "Cannot paste here!", "BambooEditor Message"
			Return
		End If
		
		For Local loopEditIDs:Edit = EachIn editPages
			If loopEditIDs.id = page
				loopEditIDs.Paste()
				Exit
			EndIf
		Next
	End Function
	
	Function OnSelectAll(event:wxEvent)
		Local page:Int = notebook.GetSelection()
		If page = 0
			wxMessageBox "Cannot select text here!", "BambooEditor Message"
			Return
		End If
		
		For Local loopEditIDs:Edit = EachIn editPages
			If loopEditIDs.id = page
				loopEditIDs.SelectAll()
				Exit
			EndIf
		Next
		
	End Function
	
	Function OnOpenOutputFolder(event:wxEvent)
		If projectFilePath = ""
			wxMessageBox "You need to create or load a project!", "BambooEditor Message"
			Return
		EndIf
		
		DebugLog(projectProperties.outputDir)
		
		?MacOs
			system_("open "+projectProperties.outputDir)
		?Win32
			OpenURL(projectProperties.outputDir)
		?Linux
			system_("xdg-open "+projectProperties.outputDir)
		?
	End Function
	
	Function OnOpenProjectFolder(event:wxEvent)
		If projectPath = "" Then Return
		
		?MacOs
			system_("open "+projectPath)
		?Win32
			OpenURL(projectPath)
		?Linux
			system_("xdg-open "+projectPath)
		?
	End Function
	
	Function OnRemoveFile(event:wxEvent)
		Local page:Int = notebook.GetSelection()
		If page = 0
			wxMessageBox "You cannot remove the 'Home' tab.", "BambooEditor Message"
			Return 
		EndIf
		
		If projectProperties.editFiles.Count() < 2
			wxMessageBox "You need at least one file open in the editor project!", "BambooEditor Message"
			Return
		EndIf
		
		Local result:Int = wxMessageBox("Are you sure you want to remove this file from the project?", "BambooEditor Message",wxICON_QUESTION | wxYES_NO)
		
		If result = wxNo
			Return
		EndIf
		
		Local doExit:Int = False
		For Local loopEditIDs:Edit = EachIn editPages
			If loopEditIDs.id = page 
				For Local loopEditFiles:String = EachIn projectProperties.editFiles
					If loopEditFiles = loopEditIDs.filename
						
						If loopEditFiles = projectProperties.appName
							wxMessageBox("This is the entry file to your application.~n~nYou cannot remove this file from the project.", "BambooEditor Message")
							Return
						EndIf
						
						projectProperties.editFiles.Remove(loopEditFiles)
						projectProperties.srcFiles.Remove(loopEditFiles)
						editPages.Remove(loopEditIDs)
						projectProperties.SaveProject()
						notebook.DeletePage(page)
						
						For loopEditIDs:Edit = EachIn editPages
							If loopEditIDs.id >= page
								loopEditIDs.id = loopEditIDs.id - 1
							End If
						Next
						doExit = True
						Exit
					EndIf
				Next
				If doExit = True Then Exit
			End If
		Next
		
		wxMessageBox "Note: File removed from project, but still exists in your project folder!", "BambooEditor Message"
	End Function
	
	Function OnCloseProject(event:wxEvent)		
		If projectFilePath = ""
			wxMessageBox "There is no project to close!", "BambooEditor Message"
			Return
		EndIf
		
		Local result:Int = wxMessageBox("Are you sure you want to close this project?", "BambooEditor Message",wxICON_QUESTION | wxYES_NO)
			
		If result = wxYES
			gframe.SaveAll()
		Else
			Return
		EndIf
		
		gframe.SetLabel(header)
		CloseProject()
	End Function
	
	Function CloseProject()
		If projectPath <> ""
			projectFilePath = ""
			projectPath = ""
			functionMap.Clear()
			variableMap.Clear()
			projectProperties.appName = ""
			projectProperties.companyName = ""
			projectProperties.editFile = ""
	
			For Local removePages:Int = notebook.GetPageCount() To 1 Step - 1
				notebook.DeletePage(removePages)
			Next
			
			projectProperties.editFiles.Clear()
			projectProperties.srcFiles.Clear()
			editPages.Clear()
		EndIf 		
	End Function
	
	Function OnCloseFile(event:wxEvent)
		Local page:Int = notebook.GetSelection()
		If page = 0
			wxMessageBox "You cannot close the Home tab!", "BambooEditor Message"	
			Return 
		EndIf
		
		If projectProperties.editFiles.Count() < 2
			wxMessageBox "You need at least one file open in the project!", "BambooEditor Message"
			Return
		EndIf
		
		Local doExit:Int = False
		For Local loopEditIDs:Edit = EachIn editPages
			If loopEditIDs.id = page 
				For Local loopEditFiles:String = EachIn projectProperties.editFiles
					If loopEditFiles = loopEditIDs.filename
						projectProperties.editFiles.Remove(loopEditFiles)
						editPages.Remove(loopEditIDs)
						projectProperties.SaveProject()
						notebook.DeletePage(page)
						
						For loopEditIDs:Edit = EachIn editPages
							If loopEditIDs.id >= page
								loopEditIDs.id = loopEditIDs.id - 1
							End If
						Next
						doExit = True
						Exit
					EndIf
				Next
				If doExit = True Then Exit
			End If
		Next
		
	End Function

	Function OnPageChanging(event:wxEvent)
		'Print "Old page is: " + wxNotebookEvent(event).GetOldSelection()
	End Function 
	
	Function OnPageChanged(event:wxEvent)
		'Print "New page is now: " + wxNotebookEvent(event).GetSelection()
	End Function 
	
	Function OnSaveFileAs(event:wxEvent)
		Local page:Int = notebook.GetSelection()
		If page = 0
			Return
		EndIf
		
		If projectFilePath = ""
			wxMessageBox "You need to create or load a project!", "BambooEditor Message"
			Return
		EndIf
				
		Local filename:String =  wxFileSelector( "Save file as...", projectPath, "", "bam","BambooBasic Source File (*.bam)|*.bam", wxFD_SAVE | wxFD_OVERWRITE_PROMPT )

		If filename = "" Then Return
		Local path:String = filename
		
		filename = Replace(filename, projectPath + "\", "")

		Local fileExists:Int = False
		
		For Local checkFiles:String = EachIn projectProperties.editFiles
			If checkFiles = filename
				fileExists = True
				Exit
			End If
		Next
		
		If fileExists = False
			projectProperties.editFiles.AddLast(filename)
			
			fileExists = False
			For Local checkFiles:String = EachIn projectProperties.srcFiles
				If checkFiles = filename
					fileExists = True
					Exit
				End If
			Next
			
			If fileExists = False
				projectProperties.srcFiles.AddLast(filename)
			End If
			
		Else
			For Local loopeditors:Edit = EachIn editPages
				If loopeditors.filename = filename
					wxMessageBox "There is a matching filename in the editor, please close it!", "BambooEditor Message"
					notebook.SetSelection(loopeditors.id)
					Return
				EndIf	
			Next
		EndIf
		
		projectProperties.SaveProject()
		
		For Local loopEditIDs:Edit = EachIn editPages
			If loopEditIDs.id = page
				SaveSource(path, page)
				Exit
			EndIf
		Next
		
		page = notebook.GetPageCount()
		
		Local m_panel2:wxPanel
		
		m_panel2 = New wxPanel.Create(notebook, wxID_ANY,,, ,, wxTAB_TRAVERSAL)
		Local newEdit:Edit = Edit(New Edit.Create(m_panel2, wxID_ANY,,, ,, wxWANTS_CHARS))
		Local bSizer6:wxBoxSizer
		bSizer6 = New wxBoxSizer.Create(wxVERTICAL)

		bSizer6.Add(newEdit, 1, wxEXPAND | wxALL, 5)

		m_panel2.SetSizer(bSizer6)
		m_panel2.Layout()
		bSizer6.Fit(m_panel2)
		notebook.InsertPage(page, m_panel2, StripDir(filename), False)
		notebook.SetSelection(page)
		
		newEdit.id = page
		newEdit.filename = filename
		Local formattedText:String = gframe.LoadSource(path)
		newEdit.AddText(formattedText)
		editPages.AddLast(newEdit)
		newEdit.SetFocus()
		
	End Function
	
	Function OnSaveFile(event:wxEvent)
		Local page:Int = notebook.GetSelection()
		If page = 0
			Return
		EndIf
		
		gframe.SaveAll()
	End Function
	
	Function OnSaveProject(event:wxEvent)
		For Local filesloop:Int = notebook.GetPageCount() To 1 Step - 1
			For Local loopEditFiles:Edit = EachIn editPages
				If filesloop = loopEditFiles.id
					SaveSource(projectPath + "\" + loopEditFiles.filename, filesloop)
					Exit
				End If
			Next
		Next
	End Function
	
	Function SaveAll()
		For Local filesloop:Int = notebook.GetPageCount() To 1 Step - 1
			For Local loopEditFiles:Edit = EachIn editPages
				If filesloop = loopEditFiles.id
					SaveSource(projectPath + "\" + loopEditFiles.filename, filesloop)
					Exit
				End If
			Next
		Next
	End Function
	
	Function OpenSourceFile(filename:String)
		
		filename = Replace(filename, projectPath + "\", "")
		
		Local fileExists:Int = False
		
		For Local checkFiles:String = EachIn projectProperties.editFiles
			If checkFiles = filename
				fileExists = True
				Exit
			End If
		Next
		
		If fileExists = False
			projectProperties.editFiles.AddLast(filename)
			
			fileExists = False
			For Local checkFiles:String = EachIn projectProperties.srcFiles
				If checkFiles = filename
					fileExists = True
					Exit
				End If
			Next
			
			If fileExists = False
				projectProperties.srcFiles.AddLast(filename)
			End If
			
		Else
			For Local loopeditors:Edit = EachIn editPages
				If loopeditors.filename = filename
					notebook.SetSelection(loopeditors.id)
					Return
				EndIf	
			Next
		EndIf
		
		projectProperties.SaveProject()
		
		Local page:Int = notebook.GetPageCount()
		
		Local m_panel2:wxPanel
		
		m_panel2 = New wxPanel.Create(notebook, wxID_ANY,,, ,, wxTAB_TRAVERSAL)
		Local newEdit:Edit = Edit(New Edit.Create(m_panel2, wxID_ANY,,, ,, wxWANTS_CHARS))
		Local bSizer6:wxBoxSizer
		bSizer6 = New wxBoxSizer.Create(wxVERTICAL)

		bSizer6.Add(newEdit, 1, wxEXPAND | wxALL, 5)

		m_panel2.SetSizer(bSizer6)
		m_panel2.Layout()
		bSizer6.Fit(m_panel2)
		notebook.InsertPage(page, m_panel2, StripDir(filename), False)
		notebook.SetSelection(page)
		
		newEdit.id = page
		newEdit.filename = filename
		Local formattedText:String = gframe.LoadSource(projectPath + "\" + filename)
		
		newEdit.Cancel()
		newEdit.SetUndoCollection(False)
		newEdit.AddText(formattedText)
		newEdit.SetUndoCollection(True)
		newEdit.EmptyUndoBuffer()
		newEdit.SetSavePoint()
		
		editPages.AddLast(newEdit)
		newEdit.SetFocus()
	End Function 
	
	Function OnOpenFile(event:wxEvent)
		If projectFilePath = ""
			wxMessageBox "You need to create or load a project!", "BambooEditor Message"
			Return
		EndIf
		Local filename:String =  wxFileSelector( "Open source file.", projectFilePath, "", "bam","BambooBasic Source File (*.bam)|*.bam", wxFD_OPEN)
		
		If filename = "" Then Return
		
		If(Instr(filename, projectPath) = 0) 
			wxMessageBox "File to be opened needs to be in the project root folder.", "BambooEditor Message"
			Return
		EndIf
		
		DebugLog "Open File: " + filename
		OpenSourceFile(filename)
	End Function
	
	Function onOpenProject(event:wxEvent)
		If projectFilePath <> ""
			Local result:Int = Confirm("Do you really want to open an existing project?")
			If result = False Then Return
			result = Confirm("Save any unsaved files in project?")
			If result
				gframe.SaveAll()
			EndIf
			
			gframe.CloseProject()
		End If
		
		
		
		gframe.SetLabel(header)
		
		Local filename:String =  wxFileSelector( "Open project.", CurrentDir$(), "", "bbp","BambooBasic Projects (*.bbp)|*.bbp", wxFD_OPEN)
	
		If filename = "" Then Return
		
		CloseProject() 
		projectProperties = Null
		projectProperties = TProject.OpenProject(filename)
		
		
		For Local openeditfiles:String = EachIn projectProperties.editFiles
			Local filepath:String = projectPath + "\" + openeditfiles
			
			Local page:Int = notebook.GetPageCount()
		
			Local m_panel2:wxPanel
			
			m_panel2 = New wxPanel.Create(notebook, wxID_ANY,,, ,, wxTAB_TRAVERSAL)
			Local newEdit:Edit = Edit(New Edit.Create(m_panel2, wxID_ANY,,, ,, wxWANTS_CHARS))
			Local bSizer6:wxBoxSizer
			bSizer6 = New wxBoxSizer.Create(wxVERTICAL)
	
			bSizer6.Add(newEdit, 1, wxEXPAND | wxALL, 5)
	
			m_panel2.SetSizer(bSizer6)
			m_panel2.Layout()
			bSizer6.Fit(m_panel2)
			notebook.InsertPage(page, m_panel2, StripDir(filepath), False)
			notebook.SetSelection(page)
			
			newEdit.id = page
			newEdit.filename = openeditfiles
			
			DebugLog "Loading Source"
			Local formattedText:String = gframe.LoadSource(filepath)
			DebugLog "Source Loaded"
			newEdit.Cancel()
			newEdit.SetUndoCollection(False)
			newEdit.AddText(formattedText)
			newEdit.SetUndoCollection(True)
			newEdit.EmptyUndoBuffer()
			newEdit.SetSavePoint()
			
			editPages.AddLast(newEdit)
			newEdit.SetFocus()
		Next
		
		projectProperties.SaveProject()
	End Function
	
	Function OnNewProject(event:wxEvent)
		If projectFilePath <> ""
			Local result:Int = Confirm("Do you really want to create a new project?")
			If result = False Then Return
			
			result = Confirm("Save any unsaved files in project?")
			If result
				gframe.SaveAll()
			EndIf
			
			gframe.CloseProject()
		End If
		
		
		
		Local frame:GLBWorkNewProjectFrame
		frame = GLBWorkNewProjectFrame(New GLBWorkNewProjectFrame.Create(,, "New BambooBasic Project...", 0, 0, 300, 325, wxCLOSE_BOX | wxCAPTION))
		frame.CenterOnParent()
		frame.Layout()
		frame.Show(True)
	End Function
	
	Function OnNewFile(event:wxEvent)
		If projectFilePath = ""
			wxMessageBox "You need to create or load a project first.", "BambooEditor Message"
			Return
		EndIf
		
		Local filename:String =  wxFileSelector( "Save file to...", projectPath, "", "bam","BambooBasic Source File (*.bam)|*.bam", wxFD_SAVE | wxFD_OVERWRITE_PROMPT )
		If filename = "" Then Return
		
		If(Instr(filename, projectPath) = 0)
			wxMessageBox "New file needs to be created in the project root folder.", "BambooEditor Message"
			Return
		EndIf
		
		If Lower$(Right$(filename,4)) <> ".bam" Then filename = filename + ".bam"
		
		Local filepath:String = filename 	
		
		filename = Replace(filename, projectPath + "\", "")
		
		Local fileExists:Int = False
		
		For Local checkFiles:String = EachIn projectProperties.editFiles
			If checkFiles = filename
				fileExists = True
				Exit
			End If
		Next
		
		If fileExists = False
			projectProperties.editFiles.AddLast(filename)
			
			fileExists = False
			For Local checkFiles:String = EachIn projectProperties.srcFiles
				If checkFiles = filename
					fileExists = True
					Exit
				End If
			Next
			
			If fileExists = False
				projectProperties.srcFiles.AddLast(filename)
			End If
			
		Else
			For Local loopeditors:Edit = EachIn editPages
				If loopeditors.filename = filename
					wxMessageBox "Please manually close file in editor first.", "BambooEditor Message"
					notebook.SetSelection(loopeditors.id)
					Return
				EndIf	
			Next
		EndIf
		
		projectProperties.SaveProject()

		Local fileout:TStream = WriteFile(filepath)
			WriteLine(fileout, "'------------------------")
			WriteLine(fileout, "'File: " + filename)
			WriteLine(fileout, "'Company: " + projectProperties.companyName)
			WriteLine(fileout, "'Created: " + CurrentDate())
		CloseFile fileout
		
		Local page:Int = notebook.GetPageCount()
		
		Local m_panel2:wxPanel
		
		m_panel2 = New wxPanel.Create(notebook, wxID_ANY,,, ,, wxTAB_TRAVERSAL)
		Local newEdit:Edit = Edit(New Edit.Create(m_panel2, wxID_ANY,,, ,, wxWANTS_CHARS))
		Local bSizer6:wxBoxSizer
		bSizer6 = New wxBoxSizer.Create(wxVERTICAL)

		bSizer6.Add(newEdit, 1, wxEXPAND | wxALL, 5)

		m_panel2.SetSizer(bSizer6)
		m_panel2.Layout()
		bSizer6.Fit(m_panel2)
		notebook.InsertPage(page, m_panel2, StripDir(filename), False)
		notebook.SetSelection(page)
		
		newEdit.id = page
		newEdit.filename = filename
		
		Local formattedText:String = gframe.LoadSource(projectPath + "\" + filename)
		
		newEdit.Cancel()
		newEdit.SetUndoCollection(False)
		newEdit.AddText(formattedText)
		newEdit.SetUndoCollection(True)
		newEdit.EmptyUndoBuffer()
		newEdit.SetSavePoint()
		
		editPages.AddLast(newEdit)
		newEdit.SetFocus()
		
	End Function
	
	Function LoadSource:String(unformattedSourceFile:String)
		Local fileContents:String
		DebugLog "Load Source: " + unformattedSourceFile
		Local filein:TStream = ReadFile(unformattedSourceFile)
		
		
		Repeat
			Local line:String = ReadLine(filein)
			fileContents = fileContents + line + Chr:String(13) + Chr:String(10)
		Until Eof(filein)
		
		CloseFile filein
		
		fileContents = Left(fileContents, Len(fileContents) - 2)
		
		Return fileContents
	End Function
	
	Function SaveSource(formattedSourceFile:String, page:Int)
		For Local loopEditIDs:Edit = EachIn editPages
			If loopEditIDs.id = page
		
				Local fileout:TStream = WriteFile(formattedSourceFile)
		
				Local lines:Int = loopEditIDs.GetLineCount() - 1
				
				Local inrem:Int = False
				For Local loopLine:Int = 0 To lines
					Local line:String = loopEditIDs.GetLine(loopLine)
					Local inComment:Int = False
					Local lineStr:String
					For Local loopChars:Int = 1 To Len(line)
						Local char:String = Mid:String(line, loopChars, 1)
						
						lineStr = lineStr + char
					Next
					lineStr = Replace(lineStr, Chr:String(13), "")
					lineStr = Replace(lineStr, Chr:String(10), "")
					WriteLine fileout, lineStr
				Next
					
				CloseFile fileout
				Return
			EndIf
		Next
	End Function
End Type


Type Edit Extends wxScintilla
	' "keys" holds the BlitzMax command list
	Global keys:String
	' the callback functions needs access to wxScintilla, a global object makes the job
	Field editControl:Edit
	Global moduleFunctionWords:String[]
	'Global keyList:String[]
	
	Field showCallTip:Int = False
	Field callTipString:String
	Field currentWords:String
	Field checkForMembers:Int
	Field filename:String
	Field id:Int
	
	Method OnInit()
		moduleList = New TList
		functionMap= New TMap
		variableMap= New TMap 
		keys:String = CreateCMDList()
		Self.editControl = Self
		
		Self.SetSelection(0, 0)
		
		ConnectAny(wxEVT_SCI_MARGINCLICK, onMarginClick)
		ConnectAny(wxEVT_SCI_CHARADDED, onCharAdd)
		ConnectAny(wxEVT_SCI_AUTOCOMP_SELECTION, onAutoCompSelection)
		ConnectAny(wxEVT_KEY_DOWN, OnKeyDown)
		
		
		SetLexerLanguage("blitzmax")
		SetKeyWords(0, keys.toLower())
		
		Local FONT:wxFont = New wxFont.CreateWithAttribs(12, wxTELETYPE, wxNORMAL, wxBOLD)
		Local kw:wxFont = New wxFont.CreateWithAttribs(12, wxTELETYPE, wxNORMAL, wxBOLD)
		StyleSetFontFont(wxSCI_STYLE_DEFAULT, FONT) 
		StyleSetFontFont(wxSCI_B_KEYWORD, kw) 
		
		StyleSetBackground(wxSCI_STYLE_DEFAULT, New wxColour.CreateNamedColour("RGB(51,68,85)"))
		StyleSetForeground(wxSCI_STYLE_DEFAULT, New wxColour.CreateNamedColour("RGB(255,255,255)"))
		StyleClearAll()
		
		SetCaretForeground(New wxColour.CreateNamedColour("RGB(255,255,255)"))
		SetCaretLineBackground(New wxColour.CreateNamedColour("RGB(51,68,85)"))
		Self.SetCaretLineVisible(True)
		
		StyleSetBackground(wxSCI_B_KEYWORD, New wxColour.CreateNamedColour("RGB(51,68,85)"))
		StyleSetBackground(wxSCI_B_STRING, New wxColour.CreateNamedColour("RGB(51,68,85)"))
		StyleSetBackground(wxSCI_B_COMMENT, New wxColour.CreateNamedColour("RGB(51,68,85)"))
		StyleSetBackground(wxSCI_B_NUMBER, New wxColour.CreateNamedColour("RGB(51,68,85)"))
		
		StyleSetForeground(wxSCI_B_KEYWORD, New wxColour.CreateNamedColour("RGB(255, 255, 0)"))
		StyleSetForeground(wxSCI_B_COMMENT, New wxColour.CreateNamedColour("RGB(187, 238, 255)"))
		StyleSetForeground(wxSCI_B_STRING, New wxColour.CreateNamedColour("RGB(0, 255, 102)"))
		StyleSetForeground(wxSCI_B_NUMBER, New wxColour.CreateNamedColour("RGB(64, 255, 255)"))
		StyleSetForeground(wxSCI_B_COMMENTREM, New wxColour.CreateNamedColour("RGB(187, 238, 255)"))
		StyleSetForeground(wxSCI_B_INLINE, New wxColour.CreateNamedColour("RGB(230,230,230)"))
		
		StyleSetBold(wxSCI_B_KEYWORD, True)
		StyleSetBold(wxSCI_B_STRING, True)
		StyleSetBold(wxSCI_B_COMMENT, True)
		StyleSetBold(wxSCI_B_NUMBER, True)
		
		SetTabWidth(4)
		SetIndent(0)
		SetTabIndents(1)
		SetBackSpaceUnIndents(1)
		Self.editControl.SetIndentationGuides(2)
		
		StyleSetForeground(wxSCI_STYLE_INDENTGUIDE, New wxColour.CreateNamedColour("RGB(145, 145, 0)"))
		
		
		' Linenumber Margin	
		setmargintype(0, wxSCI_MARGIN_NUMBER)
		SetMarginWidth(0, TextWidth(wxSCI_STYLE_LINENUMBER, "_999999"))
		StyleSetForeground(wxSCI_STYLE_LINENUMBER, New wxColour.CreateNamedColour("RGB(50,50,50)"))
		
		AutoCompSetSeparator(Asc(" "))
		AutoCompSetAutoHide(False)
		AutoCompSetIgnoreCase(True)
		AutoCompSetChooseSingle(True)
		AutoCompSetFillUps(" (\")
		
		moduleFunctionWords = keys.Split(" ")
		
		UsePopUp(1)
		SetLayoutCache(wxSCI_CACHE_PAGE)
		SetBufferedDraw(1)
		
	End Method
	
	Function GetControl:Edit()
		Local selection:Int = notebook.GetSelection()
		
		For Local loopEditors:Edit = EachIn editPages
			If loopEditors.id = selection
				Return(loopEditors.editControl)
			EndIf
		Next 
		
		Return(Null)
	EndFunction
	
	Function OnKeyDown(event:wxEvent)
		Local ed:Edit = GetControl()
		Local evt:wxKeyEvent = wxKeyEvent(event)
		
		If evt.GetKeyCode() = WXK_RETURN And Not ed.AutoCompActive()
			Local strLine:String
			Local iPos:Int = ed.GetCurrentPos()
	 		Local iLine:Int = ed.LineFromPosition(iPos)
			
			Local tabCount:Int = 0
			strLine = ed.GetLine(iLine)
			For Local checkTabs:Int = 1 To Len(strLine)
				If Mid:String(strLine, checkTabs, 1) = "~t"
					tabCount = tabCount + 1
				Else
					Exit
				EndIf
			Next
			
			ed.NewLine()
			For Local tabLoop:Int = 1 To tabCount
				ed.Tab()
			Next
			
			event.Skip(False)
			Return
		EndIf
		
		event.Skip()
	End Function
	
	Function onAutoCompSelection(event:wxEvent)
		event.Skip()
	End Function
	
	Function CheckForString:Int(currentPos:Int)
		Local ed:Edit = GetControl()
		Local result:Int = False
		Local quoteCount:Int = 0
		Local iLine:Int = ed.LineFromPosition(currentPos)
		Local strLine:String = ed.GetLine(iLine)
		
		For Local index:Int = Len(strLine) To 1 Step -1
			Local char:String = Mid$(strLine,index,1)
			
			If char = "~q"
				quoteCount = quoteCount + 1
				result = quoteCount Mod 2
			EndIf
			
			If char = "'" And result = False
				Return(False)
			End If 
		Next
		
		Return (Not result)
	End Function
	
	Function onCharAdd(event:wxEvent)
		Local ed:Edit = GetControl()
		
		Local iPos:Int = ed.GetCurrentPos()
		
		If CheckForString(iPos) = True
			Local charAtLeft:String = Chr:String(ed.GetCharAt(iPos - 1))
			
			Self.Intellisense(iPos, charAtLeft)
		
		EndIf 
		
		ed.BeginUndoAction()
		ed.EndUndoAction()
			
		event.Skip()
	End Function
	
	Function onMarginClick(event:wxEvent)
		Local ed:Edit = GetControl()
		Local p:Int = wxScintillaEvent(event).getPosition()
		ed.togglefold(ed.linefromposition(p))
		
		event.Skip()
	End Function
	
	Function Intellisense(iPos:Int, charAtLeft:String)
	
		Local isCommand:Int = CheckForAutoCompCommands(iPos)
		
		If isCommand = False
			CheckForCallTips(iPos)	
		EndIf
		
	End Function
	
	Function RemoveUnwantedCallTip:Int(strLine:String)
		Local bracketCount:Int = 0
		
		If Instr(strLine, "(", 1)
			For Local Loop:Int = 1 To Len(strLine)
				Local char:String = Mid:String(strLine, Loop, 1)
			
				If char = "("
					bracketCount = bracketCount + 1
				EndIf
			
				If char = ")"
					bracketCount = bracketCount - 1
				EndIf
			Next
		
			If bracketCount = 0
				Return True
			EndIf
		EndIf
		Return False
	End Function
	
	Function CheckForCallTips(iPos:Int)
		Local ed:Edit = GetControl()
		
		Local strLine:String
	 	Local iLine:Int = ed.LineFromPosition(iPos)
		Local iStart:Int = ed.PositionFromLine(iLine)
		
		strLine = ed.GetTextRange(iStart, iPos)
		Local openBracketCount:Int
		Local closedBracketCount:Int
		Local bracketLoop:Int = 0
		Local callTipFound:Int = False
		'Sort out available words
		Local lex:TLexer = New TLexer
		lex.mLexLine(strLine)
		
		For Local loopTokens:Int = 0 To (lex.iTokenAmount + 1)
			If lex.TokenType[loopTokens] = lex.TYPE_SYMBOL
				If lex.sTokenBank[loopTokens] = "("
				 	If lex.TokenType[loopTokens - 1] = lex.TYPE_WORD
						openBracketCount = openBracketCount + 1
					End If
				EndIf
			EndIf
			
			If lex.sTokenBank[loopTokens] = ")"
				closedBracketCount = closedBracketCount + 1
			End If
		Next

		bracketLoop = openBracketCount
		
		For Local loopTokens:Int = (lex.iTokenAmount + 1) To 1 Step - 1
			If lex.TokenType[loopTokens] = lex.TYPE_SYMBOL
	
				If lex.sTokenBank[loopTokens] = "("
					If lex.TokenType[loopTokens - 1] = lex.TYPE_WORD
						If StringArrayContains(ed.moduleFunctionWords, lex.sTokenBank[loopTokens - 1])
							ed.CallTipCancel()
								If RemoveUnwantedCallTip(strLine) = False
									ed.CallTipShow(iPos, String(functionMap.ValueForKey(lex.sTokenBank[loopTokens - 1])))
									callTipFound = True
									Exit
								EndIf
							EndIf
						EndIf
					EndIf
				
				
				If lex.sTokenBank[loopTokens] = ")"
					For Local newLoop:Int = loopTokens To 1 Step - 1
						If lex.TokenType[newLoop] = lex.TYPE_SYMBOL
							If lex.sTokenBank[newLoop] = "("
								bracketLoop = bracketLoop - 1
								If lex.TokenType[newLoop - 1] = lex.TYPE_WORD And (bracketLoop = (openBracketCount - closedBracketCount))
								loopTokens = newLoop
								ed.CallTipCancel()
								Exit
								EndIf
							EndIf
						EndIf
					Next
					
				End If
			EndIf
		Next
	End Function
	
	Function CheckForAutoCompCommands:Int(iPos:Int)
	Local ed:Edit = GetControl()
	
	Local autoCompFireAmount:Int = 1
	Local token:String = ""
	Local objectToken:String = ""
	Local reversedToken:String = ""
	Local char:Int
	Local currentWords:String
	
	Local iLine:Int = ed.LineFromPosition(iPos)
	Local iStart:Int = ed.PositionFromLine(iLine)
	
	ed.checkForMembers = False
	Local loopLine:Int
	
			For loopLine = iPos To iStart Step - 1		
				char = ed.GetCharAt(loopLine)
				
				Select char
					Case Asc("~t")
						Exit
					Case 32
						Exit
					Case 10
						Exit
					Case Asc(",")
						Exit
					Case Asc("(")
						Exit
					Case Asc(".")
						ed.checkForMembers = True
						Exit
					Default
						token = token + Chr:String(char)
				End Select
			Next
			
			token = Right(token, Len(token) - 1)
			Local tempChar:String
			
			If ed.checkForMembers = True
				Local lex:TLexer = New TLexer
				Local strLine:String = ed.GetTextRange(iStart, loopLine)
				
				lex.mLexLine(strLine)
				objectToken = lex.sTokenBank[lex.iTokenAmount + 1]
				autoCompFireAmount = 0
			End If
			
			For Local Loop:Int = Len(token) To 1 Step - 1
				tempChar = Mid(token, Loop, 1)
				reversedToken = reversedToken + tempChar
			Next
			
			If ed.checkForMembers = True
				currentWords = ed.BuildAutoMemberList(reversedToken, objectToken, autoCompFireAmount)
			Else
				currentWords = ed.BuildAutoList(reversedToken, autoCompFireAmount)
			End If
			
			If currentWords <> ""
				Local tempString:String[] = currentWords.Split(" ") 
				tempString.Sort()
				currentWords = ""
				For Local remapList:String = EachIn tempString
					currentWords = currentWords + remapList + " "
				Next
				
				ed.AutoCompShow(Len(reversedToken), currentWords)
				ed.AutoCompSelect(reversedToken)
				
				If ed.checkForMembers = True
					gframe.SetStatusText("")
					For Local classes:TAutoCompContainer = EachIn classList
						If classes.className = objectToken
							For Local key:String = EachIn MapKeys(classes.fieldMap)
								Local autoIndex:Int = ed.AutoCompGetCurrent()
								If autoIndex <> - 1
									If autoIndex > 0 Then autoIndex = autoIndex + 1
									If key = tempString[autoIndex + 1]
										Local statusTip:String = Right(String(classes.fieldMap.ValueForKey(key)), Len(String(classes.fieldMap.ValueForKey(key))))
										gframe.SetStatusText(statusTip)
										Exit
									Else
										gframe.SetStatusText("")
									EndIf
								EndIf
							Next
						EndIf
					Next
				End If
				
				Return True
			End If
			
			
			Return False
		End Function

		Function StringArrayContains:Int(strArray:String[], matchString:String)
			For Local strLoop:Int = 0 To strArray.Length - 1
				If strArray[strLoop] = matchString Then Return True
			Next
			Return False
		End Function
		
		Function BuildAutoList:String(currentWord:String, fireBoundry:Int)
			Local ed:Edit = GetControl()
			
			Local autoWordList:String = ""
			currentWord = Lower(currentWord)
			If Len(currentWord) > fireBoundry
				'Add Functions to List
				For Local Loop:Int = 0 To Len(ed.moduleFunctionWords) - 1
					If Lower(Left(ed.moduleFunctionWords[Loop], Len(currentWord))) = currentWord
						autoWordList = autoWordList + (ed.moduleFunctionWords[Loop]) + " "
					EndIf
				Next
				
				'Add variables to List
				For Local key:String = EachIn MapKeys(variableMap)
					If Lower(Left(key, Len(currentWord))) = currentWord
						autoWordList = autoWordList + key + " "
					EndIf
				Next
				
			EndIf
			
			If autoWordList = ""
				ed.AutoCompCancel()
			EndIf
			
			Return autoWordList
		End Function
		
		Function BuildAutoMemberList:String(currentWord:String, objectToken:String, fireBoundry:Int)
			Local autoWordList:String = ""
			Local ed:Edit = GetControl()
			
			If Len(currentWord) > fireBoundry
				For Local classes:TAutoCompContainer = EachIn classList
					If classes.className = objectToken
							
						For Local key:String = EachIn MapKeys(classes.methodMap)
							If Len(currentWord) > 2
								If Left(key, Len(currentWord)) = currentWord
									autoWordList = autoWordList + (key + " ")
								EndIf
							Else
								autoWordList = autoWordList + (key + " ")
							EndIf
						Next
							
						For Local key:String = EachIn MapKeys(classes.fieldMap)
							If Len(currentWord) > 2
								If Left(key, Len(currentWord)) = currentWord
									autoWordList = autoWordList + (key + " ")
								EndIf
							Else
								autoWordList = autoWordList + (key + " ")
							EndIf
						Next
						Exit
					EndIf
				Next
			End If
			If autoWordList = ""
				ed.AutoCompCancel()
			EndIf
			
			Return autoWordList
		End Function
		
		Method OnSave()
			
		End Method
End Type

Comments

Dabhand2014
For shits and giggles, heres the vala version to compare:-



Dabz


therevills2014
Hey Dabz!

Always wondered what happened to BambooBasic... good to see that it didnt die :)

Steve

(PS Maybe use a code box in the first post)


Dabhand2014
Cheers Steve, hope everything is okay on your side of the planet matey! ;)

Tried to use codebox in the above, but, it ignores tags... Never mind, lol! :)

Dabz


therevills2014
Fair enough :)

No bad, Dabz thanks mate - bit hot this week with temps over 40C for the entire week... think I'm melting!


Code Archives Forum