Code archives/BlitzPlus Gui/Multi-Column ListBox

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

Download source code

Multi-Column ListBox by MattVonFat2005
I needed one of these but didn't have another way to do it. I used the tutorial on gadgets by CS_TBL to create this. Also i apologise as the code is very messy! And there are probably bits that don't need to be there.

A limitation of this though is that at the moment you can only have one ListView in the app. Also there is nothing to deal with double clicking.

There are 9 functions:
CreateListView(x%,y%,width%,height%,parent%)
UpdateListView(listView%)
AddListViewColumn(listView%,columnName$,width%)
DeleteListViewColumn(listView%,column%)
AddListViewItem(listView%,items$)
DeleteListViewItem(listView%,item%)
ListViewRefresh(listView%,Event)
SelectedListViewItem()
SelectListViewItem(listView%,item%)

To create a ListView use:
lst = CreateListView(10, 10, 300, 300, window)


To add a column use:
AddListViewColumn(lst,"Column One",90)


To add an item:
AddListViewItem(lst,"Hello,Matthew")

Note that the item names are in one string separated by commas. So 'Hello' would be in the first column and 'Matthew' in the second.

To remove a column:
DeleteListViewColumn(lst,1)


To remove an item:
DeleteListViewItem(lst,1)


SelectedListViewItem and SelectListViewItem pretty much speak for them selves.

UpdateListViewItem doesn't need to be used as each function that changes something calls it anyway.

RefreshListViewItem should be included in a loop which recieves events and the EventID() should be passed to it as the second parameter. This lets the list view react to people clicking on it. It only uses the MouseUp, MouseDown and MouseMove Events.

Finally you need to include:
LoadCursor%( ID, Cursor ):"LoadCursorA"
SetCursor%( ID ):"SetCursor"

In the user23.decls file and:
Type column
	Field colWidth%
	Field colName$
	Field i.item
End Type

Type item
	Field col
	Field itemText$
End Type

Global c.column
Global listViewFont% = LoadFont("Tahoma",14), rows = 0, highrow%
Global mx, my
Dim words$(0)

At the top of the code.

And this is a quick bit of code that you can use to test out the listview:


That wraps that up so here are the functions:
;------------------------------------------------------
;CREATES A LISTVIEW
Function CreateListView(x%,y%,width%,height%,parent%)
	
	bank = CreateBank(12)
	canvas = CreateCanvas(x,y,width,height,parent)
	
	PokeInt bank, 0, canvas
	PokeInt bank, 4, x%
	PokeInt bank, 8, y%
		
	UpdateListView(bank)
	
	Return bank
	
End Function

;------------------------------------------------------
;UPDATES THE LISTVIEW
Function UpdateListView(bank%,params%=0)
	
	If bank<12 Then RuntimeError("Gadget ListView Error")
	
	canvas = PeekInt(bank,0)
	
	
	xwidth = 0
	width = ClientWidth(canvas)
	height = ClientHeight(canvas)
	
	colNum = 1
	
	SetBuffer CanvasBuffer(canvas)
	Cls
	For c.column = Each column
		Color 235, 234, 219
		Rect xwidth%, 0, xwidth%+c\colWidth%, 18, True
		Color 226, 222, 205
		Line xwidth%, 18, xwidth%+c\colWidth%, 18
		Color 214, 210, 194
		Line xwidth%, 19, xwidth%+c\colWidth%, 19
		Color 203, 199, 184
		Line xwidth%, 20, xwidth%+c\colWidth%, 20
		SetFont listViewFont%
		Color 0, 0, 0
		Text xwidth%+8, 3, c\colName%
		Color 255, 255, 255
		Rect xwidth%, 20, width%-xwidth%, height, True
		Color 199, 197, 178
		Line xwidth%+c\colWidth%-2, 3, xwidth%+c\colWidth%-2, 17
		Color 255, 255, 255
		Line xwidth%+c\colWidth%-1, 3, xwidth%+c\colWidth%-1, 17
		textStart% = 20
		highexist = False
		deleted = False
		For c\i.item = Each item
		If params = textStart% And deleted = False And c\i\col = colNum
			Delete c\i
			deleted = True
		Else
			If c\i\col = colNum
				If highrow% > textStart Or highrow% = textStart And highrow < textStart+20
					highExist = True
					Color 49, 106, 197
					Rect xwidth%, textStart, c\colWidth%, 20, True
					Color 255, 255, 255
					Text xwidth%+10, textStart+3, c\i\itemText$
				Else
					Color 0, 0, 0
					Text xwidth%+10, textStart+3, c\i\itemText$
				End If
				textStart = textStart + 20
			End If
		End If
		Next
		If highexist = False Then highrow = 0
		xwidth% = xwidth% + c\colWidth%
		colNum = colNum+1
	Next
	Color 235, 234, 219
	Rect xwidth%, 0, width%+50, 18, True
	Color 226, 222, 205
	Line xwidth%, 18, width%+50, 18
	Color 214, 210, 194
	Line xwidth%, 19, width%+50, 19
	Color 203, 199, 184
	Line xwidth%, 20, width%+50, 20
	Color 255, 255, 255
	Rect xwidth%, 20, width%+50, height, True
	Color 0, 0, 0
	Rect 0, 0, width%, height, False
	FlipCanvas(canvas)
	
	Return
	
End Function

;------------------------------------------------------
;ADDS A COLUMN TO THE LIST VIEW
Function AddListViewColumn(listView,columnName$,width%)
	
	c.column = New column
	c\colWidth% = width%
	c\colName$ = columnName$
	UpdateListView(listView)
	
End Function

;------------------------------------------------------
;REMOVES A COLUMN FROM A LISTVIEW
Function DeleteListViewColumn(listView,col1%)
	
	colNum% = 1
	
	For c.column = Each column
		If colNum% = col1%
			For c\i.item = Each item
				If c\i\col = col1%
					Delete c\i
				Else
					c\i\col = c\i\col-1
				End If
			Next
			Delete c
			Exit
		Else
			colNum% = colNum+1
		End If
	Next
		
	UpdateListView(listView)
			
End Function

;------------------------------------------------------
;ADDS AN ITEM TO LISTVIEW
Function AddListViewItem(listView,items$) ;A COMMA SEPARATED LIST OF VALUES
	
	off% = 0
	count% = 1
	Repeat
		pos% = Instr(items$,",",off%)
		If pos% = 0
			Exit
		Else
			count% = count% + 1
			off% = pos%+1
		End If
	Forever
	
	Dim words(count%)
	
	begin% = 0
	
	For a = 1 To count%
		pos% = Instr(items$,",",begin%)
		If pos% = 0
			words(a) = Mid(items$,begin,Len(items$)-begin+1)
		Else
			words(a) = Mid(items$,begin,pos%-begin)
			begin% = pos%+1
		End If
	Next
	
	count% = 1
	
	For c.column = Each column
		c\i.item = New item
		c\i\col = count%
		c\i\itemText$ = words(count%)
		count% = count%+1
	Next
	
	rows% = rows% + 1
	UpdateListView(listView)
	
End Function

;------------------------------------------------------
;REMOVES AN ITEM FROM LISTVIEW
Function DeleteListViewItem(listView,item%)
	
	rowDel% = (item%*20)
	UpdateListView(listView,rowDel%)

End Function

;------------------------------------------------------
;REFRESHES LISTVIEW
Function ListViewRefresh(listView,event)
	
	If event = $203
		If Not EventSource() = PeekInt(listView,0) Then Return
		
		mx = EventX()
		my = EventY()
		
		For c.column = Each column
			If mx > (c\colWidth%+x)-4 And mx < (c\colWidth%+x)+4 And my > 0 And my <20
				cursor = LoadCursor(0,32644)
				SetCursor(cursor)
			End If
			x = x + c\colWidth
		Next		
	ElseIf event = $201
		If Not EventSource() = PeekInt(listView,0) Then Return
		
		x = 0
		
		For c.column = Each column
			If mx > (c\colWidth%+x)-4 And mx < (c\colWidth%+x)+4 And my > 0 And my <20
				cursor = LoadCursor(0,32644)
				SetCursor(cursor)
				While WaitEvent() <> $202
					If EventID() = $203
						c\colWidth% = EventX()-x
					End If
				Wend
				UpdateListView(listView)
				Exit
			End If
			x = c\colWidth%
		Next
		
		If my > 20
			mystr$ = Str(my)
			rowstr$ = Left(mystr,Len(my)-1) + "0"
			highrow% = Int(rowstr$)
		End If
		
	End If
	
	UpdateListView(listView)
	
End Function

;------------------------------------------------------
;GETS SELECTED LISTVIEW ITEM
Function SelectedListViewItem()
	
	If highrow = 0 Then Return 0
	
	selected% = highrow/20
	Return selected%
	
End Function

;------------------------------------------------------
;SELECTS LIST VIEW ITEM
Function SelectListViewItem(listView,item%)
	
	highrow% = (item%*20)
	UpdateListView(listView)
	
End Function

Comments

None.

Code Archives Forum