wxScintilla Folding

BlitzMax Forums/Brucey's Modules/wxScintilla Folding

bruZard(Posted 2010) [#1]
at first: excuse my bad english ;)

My Question: Why is GetLine() always 0?
function onMarginClick(event:wxEvent)
		debuglog wxScintillaEvent(event).getLine()
	end function


i've set margin sensitivity and getPosition() gives me some values, but for folding i need the line where i've clicked.

anyone knows whats wrong or have a short example for folding? at now i'am at this stage:




bruZard(Posted 2010) [#2]
Aaaah ... i've got it. The secret is "LineFromPosition()"

function onMarginClick(event:wxEvent)
	local p:Int = wxScintillaEvent(event).getPosition()
	debuglog string(Edit.ed.linefromposition(p))
end function



rs22(Posted 2010) [#3]
Glad you got it working. Would you consider making an example of wxScintilla, so that those of us (me!) who can't figure out the beast that it is may learn from it?


bruZard(Posted 2010) [#4]
@rs22: i dont think that i know enough to do that ;)

another question: is it possible to highlight "Rem + End Rem" ?


bruZard(Posted 2010) [#5]
@rs22

maybe it helps you ... a example for highlighting and folding ... really basic.

SuperStrict

Framework wx.wxApp
Import wx.wxScintilla
Import wx.wxFrame
import brl.retro
import brl.map

' the map is not important and currently not used
global bm:TMap = createmap()

New TEd.Run()


Type TEd Extends wxApp
	Field frame:TEdFrame

	Method OnInit:Int()
		' Create application frame
		frame = TEdFrame(New TEdFrame.Create(,,"MaxEd", 0, 0, 800, 600))
		
		' open application frame
		frame.Layout()
		frame.Show(True)
		SetTopWindow(frame)
	
		Return True
	End Method
End Type


Type TEdFrame Extends wxFrame
	Field mEdit:Edit
	
	Method OnInit()
		mEdit = Edit(New Edit.Create(Self, -1))
		mEdit.SetFocus()
	End Method
End Type


Type Edit Extends wxScintilla
	' "keys" holds the BlitzMax command list
	global keys:String = CreateCMDList()
	
	' the callback functions needs access to wxScintilla, a global object makes the job
	global ed:Edit
	
	Method OnInit()		
		self.ed = self
		
		ConnectAny(wxEVT_CHAR, OnKeyDown)
		ConnectAny(wxEVT_SCI_MARGINCLICK, onMarginClick)
		
		SetLexerLanguage("blitzmax")
		SetKeyWords(0, keys.toLower())
		
		Local FONT:wxFont = New wxFont.CreateWithAttribs(10, wxTELETYPE, wxNORMAL, wxNORMAL) 
		Local kw:wxFont = New wxFont.CreateWithAttribs(10, wxTELETYPE, wxNORMAL, wxBOLD) 
		StyleSetFontFont(wxSCI_STYLE_DEFAULT, FONT) 
		StyleSetFontFont(wxSCI_B_KEYWORD, kw) 
		
		StyleSetForeGround(wxSCI_B_KEYWORD, New wxColour.CreateNamedColour("RGB(90, 190, 255)"))
		StyleSetForeGround(wxSCI_B_COMMENT, New wxColour.CreateNamedColour("GREY"))
		StyleSetForeGround(wxSCI_B_STRING, New wxColour.CreateNamedColour("GREEN"))
		 
		SetTabWidth(2) 
		
		' Linenumber Margin	
		setmargintype(0, wxSCI_MARGIN_NUMBER)
		SetMarginWidth(0, TextWidth(wxSCI_STYLE_LINENUMBER, "_999999"))
		
		' Folding Margin
		setproperty("fold", 1)
		setproperty("fold.comment", 1)
		setmargintype(1, wxSCI_MARGIN_SYMBOL)
		setmarginwidth(1, 0)
		setmarginmask(1, wxSCI_MASK_FOLDERS)
		SetMarginWidth(1, 20)
		SetMarginSensitive(1, 1)
		
		MarkerDefine(wxSCI_MARKNUM_FOLDER, wxSCI_MARK_BOXPLUS)
		MarkerSetBackground(wxSCI_MARKNUM_FOLDER, New wxColour.CreateNamedColour("BLACK"))
		MarkerSetForeground(wxSCI_MARKNUM_FOLDER, New wxColour.CreateNamedColour("WHITE"))
		MarkerDefine(wxSCI_MARKNUM_FOLDEROPEN, wxSCI_MARK_BOXMINUS)
		MarkerSetBackground(wxSCI_MARKNUM_FOLDEROPEN, New wxColour.CreateNamedColour("BLACK"))
		MarkerSetForeground(wxSCI_MARKNUM_FOLDEROPEN, New wxColour.CreateNamedColour("WHITE"))
		
		MarkerDefine(wxSCI_MARKNUM_FOLDERSUB, wxSCI_MARK_EMPTY)
		MarkerDefine(wxSCI_MARKNUM_FOLDEREND, wxSCI_MARK_SHORTARROW)
		MarkerDefine(wxSCI_MARKNUM_FOLDEROPENMID, wxSCI_MARK_ARROWDOWN)
		MarkerDefine(wxSCI_MARKNUM_FOLDERMIDTAIL, wxSCI_MARK_EMPTY)
		MarkerDefine(wxSCI_MARKNUM_FOLDERTAIL, wxSCI_MARK_EMPTY)
					
		UsePopUp(1)
		SetLayoutCache(wxSCI_CACHE_PAGE)
		SetBufferedDraw(1)
	End Method
	
	Function OnKeyDown(event:wxEvent)
		event.Skip()
	End Function
	
	function onMarginClick(event:wxEvent)
		local p:Int = wxScintillaEvent(event).getPosition()
		Edit.ed.togglefold(Edit.ed.linefromposition(p))
		
		event.Skip()
	end function
end type



function CreateCMDList:String()
	local stream:TStream = readfile("commands.txt")
	local cmdlist:String = stream.readline()
	stream.close()
	
	rem
	' create commands.txt from BMax
	local cmd:String			= "/home/bruzard/BlitzMax/docs/html/Modules/commands.txt"
	local cmdlist:String	= ""
	local commands:TList = new TList
	
	local stream:TStream	= readfile(cmd)
	if stream <> null
		while not stream.eof()
			local in:String = stream.readline().trim()
			' Klammer finden
			local f:int = 0
			f = in.Find("(")		; if f > 0 then in = in[..f]
			f = in.Find(":")		; if f > 0 then in = in[..f]
			f = in.Find("$")		; if f > 0 then in = in[..f]
			f = in.Find(" ")		; if f > 0 then in = in[..f]
			f = in.Find("|")		; if f > 0 then in = in[..f]
			
			local found:byte = false
			if commands <> null
				for local a:String = eachin commands
					if a = in
						found = true
						exit
					endif
				next
			endif
			
			if found = false
				commands.addlast(in)
				cmdlist:+ in.toLower() + " "
				mapinsert(bm, in.toLower(), in)
			endif
		wend
		stream.close()
		
		stream = writefile("commands.txt")
		if stream
			for local a:String = eachin commands
				stream.writestring(a + " ")
			next
			
			stream.close()
		endif
	else
		debuglog "cannot read " + cmd
	endif
	endrem
	
	return cmdlist
end function



rs22(Posted 2010) [#6]
That's really helpful, thanks!

I know it is possible to do block comment highlighting with Scintilla, but exactly how, I'm not sure.